Repository navigation
Commit 068351a
Fellow connector public (#353)
* feat(google): parse attendee responses from METHOD:REPLY calendar parts
* fix(google): dedupe ICS line unfolding and correct backslash-escape ordering
Factor icsProp's and icsPropLine's shared RFC 5545 line-unfolding and regex
into one matchIcsLine helper. Fix unescapeIcsText's two-pass replacement,
which misread an escaped backslash followed by a literal 'n' (\\n) as a
newline escape; a single-pass scan now handles all four escapes correctly.
Adds tests locking the quoted-parameter colon-scoping invariant and the
backslash-escape ordering fix.
* feat(google): compose succinct notes for attendee responses
* docs(twister): describe NewNote.unread's three read-state behaviours
* feat(google): fold attendee responses onto the event thread
Google emails the meeting organizer a separate notification for every guest
response ("Declined: Team sync @ Tue Aug 4"), each importing as its own,
mostly-boilerplate email thread. The Gmail sync now folds each response onto
the calendar event's own thread as a short note instead, and only falls back
to creating a standalone email thread when the event hasn't synced yet or
when the conversation also carries real correspondence.
* fix(google): keep preview and facets on the surviving message after folding RSVPs
A mixed conversation (an RSVP notification plus a genuine human reply) kept
computing its preview and classifier facets from the notification's headers
and snippet even after that message's note was folded onto the event thread
and dropped. Restrict both to a message whose note survived the fold, falling
back to the previous behavior untouched when nothing was folded.
* docs(twister): clarify NewNote.unread interaction with scoped notes
* fix: keep Granola backfill from touching calendar-event read state
Granola summaries attach as a note to the calendar event's own thread
rather than creating a separate thread. During the initial backfill,
the note carried an unread:false hint intended for its own thread —
but since the note attaches to a thread Granola doesn't own, that hint
would mark the calendar event's thread read instead. Drop it so
backfilled summaries leave the event thread's read state untouched, as
they always have.
Also neutralizes a test fixture subject line in the Gmail connector's
RSVP-fold tests to a generic placeholder, consistent with the other
synthetic fixtures in that file.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQ7oQtGrvpDYqeEMVt1DRa
* Fellow AI Meeting Notes
* Google Connector Supports iCalUID no matter suffix
* fix(fellow): signal initial sync completion on every exit path
The platform re-stamps a connection's initial-sync-started marker (and
clears any completed marker) on every channel enable, so the "Syncing…"
indicator turns back on each time. Any path out of onChannelEnabled or
syncBatch that returned without reaching channelSyncCompleted left the
connection spinning until the stuck-sync watchdog gave up and mislabelled
a healthy connection as needing to be reconnected.
Four such paths are closed:
- onChannelEnabled's "already synced a wider range" early return now
signals completion. There is nothing to back-fill, so this IS the
enable's sync completing, trivially.
- The covered-history marker is now written only once the backfill
actually reaches the last page, instead of before the sync runs. Writing
it up front armed the early return above even for a sync that then died
mid-chain, permanently short-circuiting every later re-enable.
- onChannelDisabled clears that marker. Disabling archives every link, so
leaving it set made a re-enable take the early return and come back
with no notes at all.
- syncBatch's missing-state guard (an at-least-once redelivery of the
batch task) signals completion instead of returning silently.
Also carry syncHistoryMin forward into the continuation state. Dropping it
made every batch after the first re-query with no updated_at_start filter
— a wider result set than the cursor was issued against — so pagination
walked a different list than it started on and re-saved notes the first
batch had already written.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01No4H37BP9u8bYedFKhavoq
---------
Co-authored-by: Kris Braun <kris.braun@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: TobinBraun <your.email@example.com>1 parent 396323b commit 068351a
8 files changed
Lines changed: 1304 additions & 57 deletions
File tree
- .changeset
- connectors
- fellow/src
- google/src/calendar
- twister/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
59 | 114 | | |
60 | 115 | | |
61 | 116 | | |
| |||
83 | 138 | | |
84 | 139 | | |
85 | 140 | | |
86 | | - | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
87 | 146 | | |
88 | 147 | | |
89 | 148 | | |
| |||
147 | 206 | | |
148 | 207 | | |
149 | 208 | | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
150 | 219 | | |
151 | 220 | | |
152 | 221 | | |
| |||
0 commit comments