feat(zoom): add KB connector for cloud recording transcripts, fix refresh token rotation#4735
Conversation
…resh token rotation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryMedium Risk Overview Listing walks 30-day date windows with cursor pagination, optional lookback and max recordings, and incremental sync with a 30-day overlap for late transcripts. Separately, Zoom OAuth is corrected so Reviewed by Cursor Bugbot for commit be5277a. Configure here. |
Greptile SummaryThis PR adds a Zoom cloud recording KB connector that syncs meeting transcripts (VTT) via OAuth with TRANSCRIPT → CC file-type fallback, and fixes
Confidence Score: 5/5Safe to merge — the OAuth fix is a correct one-liner, and the new connector is well-structured with proper error handling, defensive guards, and incremental sync logic. The supportsRefreshTokenRotation fix is straightforward and clearly correct. The new Zoom connector follows the established connector pattern faithfully: cursor-based windowed pagination, deferred content loading, a proper maxRecordings cap (fixed in a prior iteration), and safe UUID double-encoding. No logic paths that could corrupt data or break existing connectors were introduced. The formatDate function and CursorState boundary drift in apps/sim/connectors/zoom/zoom.ts are worth a second look, though neither can cause missing records given the overlap strategy. Important Files Changed
Sequence DiagramsequenceDiagram
participant F as Framework
participant Z as ZoomConnector
participant ZA as Zoom API
participant CDN as Zoom CDN
F->>Z: listDocuments(token, config, cursor?, syncContext)
Z->>Z: computeLookbackDays(config, lastSyncAt)
Z->>Z: "decodeCursor(cursor) → {windowIndex, pageToken}"
Z->>ZA: "GET /users/me/recordings?from=&to=&page_size=300"
ZA-->>Z: "{meetings[], next_page_token}"
Z->>Z: findTranscriptFile(recording_files) for each meeting
Z->>Z: Apply maxRecordings cap, update syncContext.totalDocsFetched
Z-->>F: "{documents (stubs, contentDeferred:true), nextCursor, hasMore}"
loop For each changed/new document
F->>Z: getDocument(token, config, externalId)
Z->>ZA: "GET /meetings/{uuid}/recordings"
ZA-->>Z: recording metadata + fresh download_url
Z->>CDN: GET download_url (Authorization: Bearer token)
CDN-->>Z: VTT content
Z->>Z: parseVtt() → strip timestamps/markup
Z->>Z: formatTranscriptContent(recording, transcript)
Z-->>F: ExternalDocument (full content)
end
Reviews (3): Last reviewed commit: "fix(zoom): widen incremental sync overla..." | Re-trigger Greptile |
|
@greptile |
|
@cursor review |
|
@greptile |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit be5277a. Configure here.
Summary
supportsRefreshTokenRotationfor Zoom (wasfalse) — Zoom rotates refresh tokens every refresh, so the old setting would force users to re-auth after first token refreshType of Change
Testing
Tested manually — type-check, lint, and connector test suite (86 tests) all pass. Live Zoom OAuth flow not exercised; needs sanity check with a real account that has cloud recordings.
Checklist