Skip to content

feat(zoom): add KB connector for cloud recording transcripts, fix refresh token rotation#4735

Merged
waleedlatif1 merged 3 commits into
stagingfrom
waleedlatif1/kb-connector-suggestions
May 26, 2026
Merged

feat(zoom): add KB connector for cloud recording transcripts, fix refresh token rotation#4735
waleedlatif1 merged 3 commits into
stagingfrom
waleedlatif1/kb-connector-suggestions

Conversation

@waleedlatif1
Copy link
Copy Markdown
Collaborator

Summary

  • adds Zoom knowledge base connector — syncs cloud meeting transcripts (VTT) via OAuth, with TRANSCRIPT → CC fallback, incremental sync, and 30-day window pagination
  • fixes supportsRefreshTokenRotation for Zoom (was false) — Zoom rotates refresh tokens every refresh, so the old setting would force users to re-auth after first token refresh

Type of Change

  • New feature
  • Bug fix

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

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

@vercel
Copy link
Copy Markdown

vercel Bot commented May 24, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Skipped Skipped May 26, 2026 4:50pm

Request Review

@cursor
Copy link
Copy Markdown

cursor Bot commented May 24, 2026

PR Summary

Medium Risk
New OAuth-backed external sync and token-refresh behavior affect long-lived Zoom connections; transcript download and VTT parsing add API and content-handling surface area.

Overview
Adds a Zoom knowledge-base connector that ingests cloud recording transcripts (WebVTT) via OAuth, and registers it in CONNECTOR_REGISTRY.

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. getDocument fetches recording metadata, prefers TRANSCRIPT over CC, downloads VTT, and normalizes text into plain documents with tags (topic, host, duration, meeting date).

Separately, Zoom OAuth is corrected so supportsRefreshTokenRotation is true, so rotated refresh tokens from Zoom are persisted instead of forcing re-auth after the first refresh.

Reviewed by Cursor Bugbot for commit be5277a. Configure here.

Comment thread apps/sim/connectors/zoom/zoom.ts
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 24, 2026

Greptile Summary

This PR adds a Zoom cloud recording KB connector that syncs meeting transcripts (VTT) via OAuth with TRANSCRIPT → CC file-type fallback, and fixes supportsRefreshTokenRotation for Zoom from falsetrue (Zoom rotates the refresh token on every use, so the old false value forced re-auth after the first token refresh).

  • New ZoomConnector (connectors/zoom/zoom.ts): incremental sync with a configurable lookback window (up to 180 days), 30-day sliding windows to stay within Zoom's API date-range limit, maxRecordings cap, deferred content via getDocument, VTT parsing with speaker-tag support, and safe UUID double-encoding for Zoom's special characters.
  • supportsRefreshTokenRotation fix (lib/oauth/oauth.ts): single-line change from falsetrue; without this, every call that exchanges a refresh token would invalidate the old token while the system kept using it, breaking all subsequent Zoom API calls after the first token refresh.
  • Registry (connectors/registry.ts + connectors/zoom/index.ts): standard registration of the new connector.

Confidence Score: 5/5

Safe 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

Filename Overview
apps/sim/connectors/zoom/zoom.ts New Zoom connector implementing listDocuments (sliding 30-day windows with cursor-based pagination and maxRecordings cap), getDocument (deferred VTT download and parsing), and validateConfig. Logic is well-structured; two minor issues: formatDate uses local-timezone methods rather than UTC, and window boundaries are recomputed from live Date.now() on each call.
apps/sim/lib/oauth/oauth.ts Single-line fix: supportsRefreshTokenRotation changed from false to true for Zoom — correct, since Zoom rotates the refresh token on every use.
apps/sim/connectors/registry.ts Standard connector registration — adds zoomConnector import and registry entry, no issues.
apps/sim/connectors/zoom/index.ts Barrel re-export file, no issues.

Sequence Diagram

sequenceDiagram
    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
Loading

Reviews (3): Last reviewed commit: "fix(zoom): widen incremental sync overla..." | Re-trigger Greptile

Comment thread apps/sim/connectors/zoom/zoom.ts Outdated
Comment thread apps/sim/connectors/zoom/zoom.ts
@waleedlatif1
Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1
Copy link
Copy Markdown
Collaborator Author

@cursor review

Comment thread apps/sim/connectors/zoom/zoom.ts
@waleedlatif1
Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1
Copy link
Copy Markdown
Collaborator Author

@cursor review

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ 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.

@waleedlatif1 waleedlatif1 merged commit d62f9ca into staging May 26, 2026
14 checks passed
@waleedlatif1 waleedlatif1 deleted the waleedlatif1/kb-connector-suggestions branch May 26, 2026 17:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant