From b4d1ab14bdc4584417a82006284dd368930d91e6 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 10 Sep 2026 03:29:12 -0700 Subject: [PATCH] fix(search): tighten Google sync and invitation recovery --- apps/docs/content/docs/search/gmail.mdx | 28 ++-- .../content/docs/search/google-calendar.mdx | 21 +-- .../docs/content/docs/search/google-drive.mdx | 8 +- .../search/google-domain-delegation.png | Bin 126240 -> 0 bytes apps/sim/app/invite/[id]/invite.test.tsx | 98 ++++++++++++++ apps/sim/app/invite/[id]/invite.tsx | 20 ++- apps/sim/connectors/gmail/gmail.test.ts | 124 +++++++++++++++++- apps/sim/connectors/gmail/gmail.ts | 22 +--- .../queries/kb/connectors-cache.test.tsx | 122 +++++++++++++++++ apps/sim/hooks/queries/kb/connectors.test.ts | 11 +- apps/sim/hooks/queries/kb/connectors.ts | 13 +- .../selectors/server/providers/google.test.ts | 22 ++++ .../lib/selectors/server/providers/google.ts | 13 +- 13 files changed, 434 insertions(+), 68 deletions(-) delete mode 100644 apps/docs/public/static/search/google-domain-delegation.png diff --git a/apps/docs/content/docs/search/gmail.mdx b/apps/docs/content/docs/search/gmail.mdx index 8945c941261..b4ce9e2e53f 100644 --- a/apps/docs/content/docs/search/gmail.mdx +++ b/apps/docs/content/docs/search/gmail.mdx @@ -36,7 +36,7 @@ Open **Settings → Sources** and turn on **Gmail**. This allows personal connec ### Connect your account -Open **Integrations** and select **Connect** beside Gmail. Authorize the Google account matching your verified Sim email. The first connection creates the default sync configuration: the last 6 months across all labels, excluding Promotions, Social, Spam, and Trash. +Join the Sim organization, then open **Integrations** and select **Connect** beside Gmail. Authorize the Google account matching your verified Sim email. The first connection creates the default sync configuration: the last 6 months across all labels, excluding Promotions, Social, Spam, and Trash. Return to Integrations to see indexing status and your searchable document count. @@ -52,6 +52,8 @@ Configurations are additive: a narrower one does not restrict an existing broade +Admins can request member connections from **Manage → Accounts → Request connections**. These requests do not invite recipients to the Sim organization. See [Connect your account](/search/connect-your-account) for the shared connection and recovery steps. + ## Set up a central service account Open **Settings → Sources**, enable **Gmail**, and select **Manage → Advanced → Add sync configuration**. If personal connections are disabled for your organization, select **Add source** from the provider page instead. @@ -100,16 +102,6 @@ Teammates join the Sim organization with their matching verified primary email. -## Connect your account - -These steps apply to **Member accounts**. A central service-account source does not require a personal Gmail connection. - -1. Join the Sim organization and verify your Sim email address. Open **Integrations** and click **Connect** beside Gmail. -2. Complete the connection in the tab that opens. Choose the Google account whose verified email matches your Sim email, and grant the requested permissions. -3. Return to Integrations. The source shows its indexing status and the number of documents you can search. - -Teammates follow these same steps after joining the organization. Once an admin allows Gmail, the first connection can create its source with default filters. Admins can edit those filters afterward or request connections from **Manage → Accounts → Request connections**. A connection request does not invite the recipient to the Sim organization. - ## Source options An admin opens **Settings → Sources** and selects **Manage** beside **Gmail** to open its configuration list. Each row shows **Member accounts** or **Service account** beside its sync status. Open a configuration's **Settings** tab to edit its filters, then select **Save**. Filters apply separately to each mailbox in the source. **Documents** shows indexed threads and **Sync history** shows recent runs. @@ -121,11 +113,11 @@ An admin opens **Settings → Sources** and selects **Manage** beside **Gmail** | Labels | Optional comma-separated names or system IDs, such as `Engineering, INBOX`. A thread matching any listed label is included. Leave empty for all labels. Custom IDs such as `Label_7` belong to one mailbox and cannot be used for member or central setup. | | Directory administrator email | Required for central indexing. An active Workspace administrator who can read Directory users; this does not limit the crawl to the administrator's mailbox. | | Users | Central indexing only. Optional primary Workspace email addresses (up to 100); blank includes all active users in the customer. This selects which mailboxes to crawl. Each mailbox remains searchable only by its owner. | -| Date Range | Last 6 months by default for Search sources. Choose the last 7, 30, or 90 days, a year, or all time. A knowledge-base connector outside Search defaults to all time. | +| Date Range | Last 6 months (180 days) by default. Other options are rolling windows of 7, 30, or 90 days, 1 year (365 days), or all time. | | Exclude Promotions / Exclude Social | Both enabled by default. Choose **No** to include either category. | | Search Filter | Optional [Gmail query](https://developers.google.com/workspace/gmail/api/guides/filtering), such as `from:team@example.com subject:release`. This filters what is indexed; it is not a Sim Search query. Member-account sources with a search filter relist the mailbox on every sync instead of using Gmail's change history. | -In the add-source form, **More options** contains optional **Metadata tags**. Sync frequency and the general knowledge-base **Max Threads** setting are hidden in Search. +In the add-source form, **More options** also contains optional **Metadata tags**. ## What gets indexed @@ -137,13 +129,9 @@ Search schedules syncs hourly. The first sync lists every thread in scope and ca **Member accounts:** later syncs use each mailbox's Gmail change history, unless the configuration has a search filter. A full relisting runs about weekly, or sooner if Gmail no longer retains the saved history. -**Service account:** each sync revisits the selected active mailboxes and resumes unfinished listings. It does not reuse one mailbox's history cursor across the company. Only new or changed threads need their bodies fetched. Failed mailbox reads leave the crawl incomplete; they are not treated as an empty mailbox for deletion reconciliation. - -Updates, removals, and access refresh in the background, rather than being checked live for each search. - -An empty mailbox or filters with no matching threads complete normally with zero documents. +**Service account:** each sync revisits the selected active mailboxes and resumes unfinished listings. A failed mailbox read leaves the crawl incomplete; it does not cause existing indexed mail to be deleted from Search. -Threads that exceed indexing size limits are skipped and reconsidered when the thread changes. +Updates, removals, and access refresh in the background. Empty mailboxes and filters with no matches complete normally with zero documents. Threads exceeding indexing size limits are skipped and reconsidered when they change. ## Troubleshooting @@ -155,7 +143,7 @@ Threads that exceed indexing size limits are skipped and reconsidered when the t | Reconnect | Click **Reconnect** and authorize the same account again. | | Unavailable or needs admin attention | Ask your Sim admin to check source status and the deployment's Google OAuth configuration. | | Directory or delegation error | Check both central crawl scopes, the service-account key, and the Directory administrator's user-read privileges. A normal OAuth account cannot replace the central service account. | -| Gmail access fails for a selected user | Verify Gmail is enabled for that primary Workspace account and delegation is authorized. Narrow **Users** to accounts with Gmail enabled. Aliases and external accounts cannot be selected. | +| Gmail access fails for a selected user | Verify delegation is authorized and [Gmail is enabled](https://knowledge.workspace.google.com/admin/gmail/control-gmail-access-for-your-organizations-users) for that primary Workspace account. Set **Users** to accounts with Gmail enabled; leaving it blank includes all active users and can stop sync on a service-access error. Aliases and external accounts cannot be selected. | | A central source indexes mail but a teammate sees no results | Confirm their verified Sim email is the mailbox's primary email and they belong to the Sim organization. Administrators do not receive other people's mailbox access. | ## Self-hosted operator setup diff --git a/apps/docs/content/docs/search/google-calendar.mdx b/apps/docs/content/docs/search/google-calendar.mdx index 5435e41ebd8..37f427a369e 100644 --- a/apps/docs/content/docs/search/google-calendar.mdx +++ b/apps/docs/content/docs/search/google-calendar.mdx @@ -29,7 +29,7 @@ These are alternative setup paths. When only a central Calendar source is config ### Allow and connect Google Calendar -An admin opens **Settings → Sources** and turns on **Google Calendar**. Then each person opens **Integrations**, selects **Connect** beside Google Calendar, and authorizes their matching Google account. The first connection creates the default member-account sync configuration. +An admin opens **Settings → Sources** and turns on **Google Calendar**. Each person joins the Sim organization, opens **Integrations**, selects **Connect** beside Google Calendar, and authorizes the Google account matching their verified Sim email. The first connection creates the default member-account sync configuration. Return to Integrations to see indexing status and your searchable document count. @@ -50,6 +50,8 @@ The default date range covers the previous and next 30 days. Save any changes to +Admins can request member connections from **Manage → Accounts → Request connections**. These requests do not grant organization membership. Connecting Gmail or Drive does not replace the Calendar connection. See [Connect your account](/search/connect-your-account) for the shared connection and recovery steps. + `primary` means the connected or impersonated person's main calendar. A calendar selected from the list is a specific calendar ID, even when it is your main calendar. That same ID applies to every selected user, and only users with access to it can search its events. @@ -102,16 +104,6 @@ Sim verifies Directory access and selected users, then probes one selected user' -## Connect your account - -These steps apply to **Member accounts**. When only a central Calendar source is configured, teammates use Search or Home directly and are not offered a personal Calendar connection for that source. - -1. Join the Sim organization and verify your Sim email. Open **Integrations** and click **Connect** beside Google Calendar. -2. In the connection tab, choose the Google account whose verified email matches your Sim email. Grant the requested permissions. -3. Return to Integrations to see indexing status and your searchable document count. - -Teammates repeat only these connection steps after joining the organization. They do not need to configure the source. An admin can send connection requests from **Settings → Sources**: select **Manage** beside **Google Calendar**, then **Accounts → Request connections**. These requests do not grant organization membership. Connecting Gmail or Google Drive does not replace the Calendar connection. - ## Source options An admin opens **Settings → Sources** and selects **Manage** beside **Google Calendar** to open its configuration list. Each row shows **Member accounts** or **Service account** beside its sync status. Open a configuration's **Settings** tab to edit its filters, then select **Save**. **Documents** shows indexed events and **Sync history** shows recent runs. @@ -127,13 +119,13 @@ An admin opens **Settings → Sources** and selects **Manage** beside **Google C | Search Query | Optional text filter applied by Google to event titles, descriptions, locations, and organizer or attendee names and emails. Leave empty to include all matching events in the date range. | | Include Attendees | **Yes** by default. **No** omits organizer and attendee identity fields and keeps the attendee count. It does not redact names written into titles or descriptions. | -In the add-source form, **More options** contains optional **Metadata tags**. Search hides sync frequency and the general knowledge-base **Max Events** setting. +In the add-source form, **More options** also contains optional **Metadata tags**. ## What gets indexed -Sim indexes event titles, descriptions, times, locations, and the selected attendee information. All-day events and individual occurrences of recurring meetings are supported. An invitation you declined stays searchable and is marked `Response: declined`. Results link back to Google Calendar. +Sim indexes event titles, descriptions, times, locations, and the selected attendee information. All-day events and individual occurrences of recurring meetings are supported. Declined invitations returned by Google stay searchable and are marked `Response: declined`; hidden invitations are not requested. Results link back to Google Calendar. -Cancelled events, attachment contents, meeting recordings, and transcripts are not indexed. Status entries such as working location, out of office, focus time, and birthdays, and automatically generated reservation events from Gmail are not indexed. A shared calendar where you can see only free or busy times contributes nothing, since those blocks have no title or description. Events outside the selected date window are excluded. Private event details that Google withholds are not available in Search; see [Google's calendar sharing rules](https://developers.google.com/workspace/calendar/api/concepts/sharing). +Cancelled events, attachment contents, meeting recordings, and transcripts are not indexed. Status entries such as working location, out of office, focus time, and birthdays, and automatically generated reservation events from Gmail are not indexed. Events Google returns only as free/busy blocks, without searchable details, are not indexed. Events outside the selected date window are excluded. Private event details that Google withholds are not available in Search; see [Google's calendar sharing rules](https://developers.google.com/workspace/calendar/api/concepts/sharing). Search schedules syncs hourly. Event edits, cancellations, access changes, inactive or removed users, and events moving outside the date window are reconciled during completed background syncs. Central crawls page through each selected user and resume unfinished work before removing documents no longer listed. Authorization, quota, and provider failures stop the sync rather than treating unread calendars as empty. The first sync may take longer, and results appear as indexing progresses; Search is not a live Calendar read. @@ -148,6 +140,7 @@ Search schedules syncs hourly. Event edits, cancellations, access changes, inact | Reconnect | Click **Reconnect** and complete Google authorization again. Allow pop-ups if the connection tab does not open. | | Unavailable or needs admin attention | Ask your Sim admin to check source status and the deployment's Google OAuth configuration. | | Service-account authorization or Directory error | Confirm both delegated scopes, enabled APIs, and the Directory administrator's user-read privilege. Check whether delegation still awaits approval or propagation. | +| Calendar is disabled for a selected user | An active Workspace user may have Calendar turned off. [Enable Calendar](https://knowledge.workspace.google.com/admin/users/access/turn-calendar-on-or-off-for-users) for them, or set **Users** to accounts with Calendar enabled. Leaving **Users** blank includes all active users and can stop sync on a service-access error. | | User not found or inactive | Use an active primary email in the same Workspace customer. Aliases, external or guest accounts, suspended users, and archived users cannot be selected. | | A central source has no results for a teammate | Confirm their primary Workspace email matches their verified Sim email, they belong to the Sim organization, and they are included in **Users**. Check calendar IDs and **Sync history**. | diff --git a/apps/docs/content/docs/search/google-drive.mdx b/apps/docs/content/docs/search/google-drive.mdx index 8cde905b3e9..52ecfc4864b 100644 --- a/apps/docs/content/docs/search/google-drive.mdx +++ b/apps/docs/content/docs/search/google-drive.mdx @@ -21,7 +21,7 @@ Admin setup uses your organization's **Settings → Sources** page. Teammates co These are alternative setup paths. When only a central Drive source is configured, Integrations does not offer a personal Drive **Connect** action. Teammates use Search or Home directly. Existing member-account sources keep their connection actions. - A central crawl reads each selected employee's Drive through domain-wide delegation, including private My Drive files and shared-drive files they can access. Leave **Users** blank to include all active users in your Google Workspace customer, including secondary domains. Files keep their original user and group permissions; indexing a private file does not make it visible to other employees. + A central crawl includes each selected employee's private My Drive files and shared-drive files they can access. Files keep their original user and group permissions; indexing a private file does not make it visible to other employees. ## Connect member accounts @@ -38,7 +38,7 @@ An organization admin opens **Settings → Sources** and turns on **Google Drive ### Connect your account -Open **Integrations** in the main sidebar and select **Connect** beside Google Drive. Use the Google account matching your verified Sim email. The first personal connection can create a source with default filters. Teammates follow the same [connection steps](/search/connect-your-account). +Join the Sim organization, then open **Integrations** and select **Connect** beside Google Drive. Use the Google account matching your verified Sim email. The first personal connection can create a source with default filters. Return to Integrations to see indexing status and your searchable document count. @@ -52,6 +52,8 @@ Keep **Sync documents with → Connected members** unless a dedicated account sh +Admins can request member connections from **Manage → Accounts → Request connections**. These requests do not grant organization membership. See [Connect your account](/search/connect-your-account) for the shared connection and recovery steps. + ## Set up a central service account Open **Settings → Sources** and turn on **Google Drive**. Select **Manage → Advanced → Add sync configuration** to open the central service-account form directly. If personal connections are disabled for your organization, select **Add source** from the provider page instead. Teammates do not need a personal Drive connection for this source. @@ -80,8 +82,6 @@ Open the service account's **Keys** tab and choose **Add key → Create new key In the service account's **Details**, expand **Advanced settings** and copy its numeric **Client ID**. Sign in to the [Workspace Admin Console](https://admin.google.com/ac/owl/domainwidedelegation) as a super administrator. Open **Security → Access and data control → API controls → Manage Domain Wide Delegation → Add new**. -Google Workspace Admin Console Add a new client ID dialog with Client ID and OAuth scopes fields - Paste that Client ID into **Client ID**, then enter these exact scopes as a comma-separated list under **OAuth scopes**: ```text diff --git a/apps/docs/public/static/search/google-domain-delegation.png b/apps/docs/public/static/search/google-domain-delegation.png deleted file mode 100644 index b68680d0b82de247f34046162221cc2424164a83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126240 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%0D(z}S zI_J+w%`8}yI*zJ8kdC_fSAs5>4>!4vAtV5Fc;+q+bEMD|>j%fq*^m|zX5brSRtO$I zAv(0v;H+x|zP;y_P|(@fp#dt6jN{tR!?WCcJR>oQ??DkFS`KDstjwss;v%se*p=qBdk|KtZrYUWGCyinuo@OG_UW{J zgnVNCi2a^u>fC;oA!M5r=CNW+W9Z~9?DH$x0XK4t+=8Wsjd6ivh1H57?OX9zq$3|{ zy%U52De%!(8wxefvNEPj^#}RCWCk@OT#f}ofF{FYeeZCwqHM$^$cp7l6(~u|ah@h} z7__hOhn{FXQ7ZC7c|=LltrtE-qSLhbOiQz*UF&*jJd{e}`NT^sBxB1-q#VMOpshpi z{>dW$%@a%0(@}|SE%nL7Vo{29R^}^N4xW?I*e-Lu?VeHE6QiARX!{?+*)_KugQzHe z`ni)74vc!utK2+7{q?%_k)N!F94J$1Cj*v=CnV#G z<6`S*iFXx8E*(FP#W$~PBfiG%u#M*DrSgT)CX@%0AS{SKn%_}k23-BQovbM68LMTq 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 z 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 diff --git a/apps/sim/app/invite/[id]/invite.test.tsx b/apps/sim/app/invite/[id]/invite.test.tsx index 1a966c3f386..b04b3123473 100644 --- a/apps/sim/app/invite/[id]/invite.test.tsx +++ b/apps/sim/app/invite/[id]/invite.test.tsx @@ -276,6 +276,104 @@ afterEach(() => { }) describe('Invite', () => { + it.each([ + { status: 401, body: { error: 'Unauthorized' }, authRequired: true }, + { status: 403, body: { error: 'Forbidden' }, authRequired: true }, + { + status: 401, + code: 'UNRECOGNIZED_AUTH_CODE', + body: { error: 'Please authenticate' }, + authRequired: true, + }, + { status: 404, body: { error: 'Invitation not found' }, authRequired: false }, + ])('uses HTTP $status when the response has no known invitation code', async (response) => { + mockRequestJson.mockRejectedValue( + new ApiClientError({ ...response, message: 'Request failed' }) + ) + await renderInvite() + + if (response.authRequired) { + expect(container.textContent).toContain('Authentication Required') + expect(container.textContent).not.toContain('Invitation Error') + await clickAction('Sign in to continue') + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + } else { + expect(container.textContent).toContain('This invitation is invalid or no longer exists.') + expect(actionLabels()).not.toContain('Try Again') + } + }) + + it.each([ + { code: 'disclosure-outdated', body: { error: 'Your workspaces changed' } }, + { code: undefined, body: { error: 'disclosure-outdated' } }, + ])('preserves a known invitation error before the HTTP fallback: %j', async (response) => { + mockRequestJson.mockRejectedValue( + new ApiClientError({ ...response, status: 409, message: 'Review the updated disclosure' }) + ) + await renderInvite() + + expect(container.textContent).toContain('Review the updated notice and accept again.') + expect(container.textContent).not.toContain('Already Part of a Team') + expect(actionLabels()).toContain('Try Again') + }) + + it('offers sign-in if the session expires while accepting an invitation', async () => { + await renderInvite() + mockRequestJson.mockRejectedValueOnce( + new ApiClientError({ status: 401, body: { error: 'Unauthorized' }, message: 'Unauthorized' }) + ) + await clickAction('Accept Invitation') + + expect(container.textContent).toContain('Authentication Required') + expect(container.textContent).not.toContain('Welcome!') + expect(actionLabels()).not.toContain('Accept Invitation') + await clickAction('Sign in to continue') + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + }) + + it.each(['internal', 'external'] as const)( + 'offers an account switch to a token holder who is not the %s invitee', + async (intent) => { + membershipIntent = intent + joinPreview = null + mockUseSession.mockReturnValue({ + data: { user: { id: 'other-user', email: 'other@example.com' } }, + isPending: false, + }) + await renderInvite() + + expect(container.textContent).toContain('Wrong Account') + expect(container.textContent).not.toContain('We could not load how this invitation affects') + expect(actionLabels()).not.toContain('Accept Invitation') + expect(actionLabels()).not.toContain('Refresh invitation') + expect(mockRequestJson).not.toHaveBeenCalledWith( + expect.objectContaining({ method: 'POST' }), + expect.anything() + ) + await clickAction('Sign in with a different account') + expect(mockSignOut).toHaveBeenCalledOnce() + expect(mockClearUserData).toHaveBeenCalledOnce() + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + } + ) + + it('matches the invitation email with the same normalization as the server', async () => { + mockUseSession.mockReturnValue({ + data: { user: { id: 'user-1', email: ' INVITEE@EXAMPLE.COM ' } }, + isPending: false, + }) + await renderInvite() + + expect(container.textContent).not.toContain('Wrong Account') + expect(actionLabels()).toContain('Accept Invitation') + }) + it('clears the previous account cache before navigating to the invitation sign-in', async () => { mockRequestJson.mockRejectedValue( new ApiClientError({ diff --git a/apps/sim/app/invite/[id]/invite.tsx b/apps/sim/app/invite/[id]/invite.tsx index 09fe4ed825d..288c3f19eec 100644 --- a/apps/sim/app/invite/[id]/invite.tsx +++ b/apps/sim/app/invite/[id]/invite.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react' import { createLogger } from '@sim/logger' import { getErrorMessage } from '@sim/utils/errors' -import { formatQuotedNameList } from '@sim/utils/string' +import { formatQuotedNameList, normalizeEmail } from '@sim/utils/string' import { useQueryClient } from '@tanstack/react-query' import { useParams, useRouter, useSearchParams } from 'next/navigation' import { ApiClientError } from '@/lib/api/client/errors' @@ -263,9 +263,11 @@ function codeFromStatus(status: number): InviteErrorCode { } function codeFromApiClientError(error: ApiClientError): string { + if (error.code && getInviteError(error.code).code !== 'unknown') return error.code + if (error.body && typeof error.body === 'object') { const code = (error.body as { error?: unknown }).error - if (typeof code === 'string' && code.length > 0) return code + if (typeof code === 'string' && getInviteError(code).code !== 'unknown') return code } return codeFromStatus(error.status) @@ -316,6 +318,11 @@ export default function Invite({ registrationDisabled }: InviteProps) { }) const invitation = invitationQuery.data?.invitation ?? null const joinPreview = invitationQuery.data?.joinPreview ?? null + const isWrongAccount = Boolean( + invitation && + session?.user && + normalizeEmail(session.user.email || '') !== normalizeEmail(invitation.email) + ) const isDisclosureMissing = invitation?.membershipIntent === 'internal' && !joinPreview const isLoading = Boolean(session?.user) && (!isTokenResolved || invitationQuery.isPending) @@ -330,10 +337,15 @@ export default function Invite({ registrationDisabled }: InviteProps) { * Action errors (accept failures) outrank fetch errors; the URL error param * only shows until the invitation loads successfully. */ - const error = actionError ?? fetchError ?? (invitationQuery.data ? null : urlError) + const error = + actionError ?? + fetchError ?? + (isWrongAccount ? getInviteError('email-mismatch') : null) ?? + (invitationQuery.data ? null : urlError) const handleAcceptInvitation = async () => { - if (!session?.user || !invitation || isDisclosureMissing || isAccepting) return + if (!session?.user || !invitation || isWrongAccount || isDisclosureMissing || isAccepting) + return setIsAccepting(true) try { diff --git a/apps/sim/connectors/gmail/gmail.test.ts b/apps/sim/connectors/gmail/gmail.test.ts index 0623b164f61..346021bb07b 100644 --- a/apps/sim/connectors/gmail/gmail.test.ts +++ b/apps/sim/connectors/gmail/gmail.test.ts @@ -110,7 +110,7 @@ describe('gmail listDocuments with maxThreads 0 (unlimited, a per-member sync)', describe('Gmail listing checkpoints', () => { it('keeps a resumed query fixed when a relative date range crosses midnight', async () => { vi.useFakeTimers() - vi.setSystemTime(new Date(2026, 8, 1, 23, 59, 59)) + vi.setSystemTime(new Date('2026-09-01T23:59:59Z')) const urls = mockPages([ { threads: [{ id: 'thread-1', historyId: '10' }], nextPageToken: 'page-2' }, { threads: [{ id: 'thread-2', historyId: '20' }], nextPageToken: 'page-3' }, @@ -124,9 +124,9 @@ describe('Gmail listing checkpoints', () => { memberContext('alice') ) const initialQuery = new URL(urls[0]).searchParams.get('q') - expect(initialQuery).toContain('after:2026/08/25') + expect(initialQuery).toContain(`after:${Date.parse('2026-08-25T23:59:59Z') / 1000}`) - vi.setSystemTime(new Date(2026, 8, 2, 0, 0, 1)) + vi.setSystemTime(new Date('2026-09-02T00:00:01Z')) const resumed = await gmailConnector.listDocuments( 'token', sourceConfig, @@ -141,7 +141,9 @@ describe('Gmail listing checkpoints', () => { }) await gmailConnector.listDocuments('token', sourceConfig, undefined, memberContext('alice')) - expect(new URL(urls[2]).searchParams.get('q')).toContain('after:2026/08/26') + expect(new URL(urls[2]).searchParams.get('q')).toContain( + `after:${Date.parse('2026-08-26T00:00:01Z') / 1000}` + ) }) it('resumes with the saved label query rather than resolving a renamed label again', async () => { @@ -181,6 +183,19 @@ describe('Gmail listing checkpoints', () => { expect(new URL(urls[1]).searchParams.get('pageToken')).toBe('page-2') }) + it('replays an existing date-based checkpoint without changing its provider query', async () => { + const urls = mockPages([{ threads: [] }]) + const searchQuery = 'after:2026/08/25 -category:promotions -category:social' + await gmailConnector.listDocuments( + 'token', + { dateRange: '7d' }, + JSON.stringify({ pageToken: 'saved-page', searchQuery }), + memberContext('alice') + ) + expect(new URL(urls[0]).searchParams.get('q')).toBe(searchQuery) + expect(new URL(urls[0]).searchParams.get('pageToken')).toBe('saved-page') + }) + it('still accepts a legacy raw page token and upgrades the next checkpoint', async () => { const urls = mockPages([{ threads: [], nextPageToken: 'page-3' }]) const result = await gmailConnector.listDocuments('token', {}, 'page-2') @@ -1307,6 +1322,107 @@ describe('Gmail change feed', () => { }) }) + it('uses the same timezone-independent cutoff for full listings and history', async () => { + vi.setSystemTime(new Date('2026-09-10T12:00:00.987Z')) + const cutoff = new Date('2026-09-03T12:00:00Z').getTime() + const config = { dateRange: '7d', maxThreads: 0 } + const urls = mockPages([{ threads: [{ id: 'recent', historyId: '77' }] }]) + const listing = await gmailConnector.listDocuments( + 'token', + config, + undefined, + memberContext('member-a') + ) + expect(new URL(urls[0]).searchParams.get('q')).toContain(`after:${cutoff / 1000}`) + + mockFeed([historyPage(['earlier-that-day', 'recent'])], { + 'earlier-that-day': metadataThread('earlier-that-day', [ + { labelIds: ['INBOX'], internalDate: String(cutoff - 2 * 60 * 60 * 1000) }, + ]), + recent: metadataThread('recent', [ + { labelIds: ['INBOX'], internalDate: String(cutoff + 1000) }, + ]), + }) + const history = await gmailConnector.listChanges!( + 'token', + config, + '500', + memberContext('member-a') + ) + expect( + history.changes.filter(({ kind }) => kind === 'upsert').map(({ externalId }) => externalId) + ).toEqual(listing.documents.map(({ externalId }) => externalId)) + expect(history.changes).toContainEqual({ + kind: 'removed', + externalId: 'member:member-a:earlier-that-day', + }) + }) + + it('keeps a missing member label empty when moving from a full listing to history', async () => { + const config = { label: 'Engineering', maxThreads: 0 } + mockFetchWithRetry + .mockResolvedValueOnce(Response.json({ labels: [{ id: 'INBOX', name: 'INBOX' }] })) + .mockResolvedValueOnce(Response.json({ threads: [] })) + const listing = await gmailConnector.listDocuments( + 'token', + config, + undefined, + memberContext('member-a') + ) + expect(listing.documents).toEqual([]) + expect(listing.hasMore).toBe(false) + + mockFeed([historyPage(['unlabelled'])], { + unlabelled: metadataThread('unlabelled', [{ labelIds: ['INBOX'] }]), + }) + const page = await gmailConnector.listChanges!( + 'token', + config, + '500', + memberContext('member-a') + ) + expect(page.changes).toEqual([{ kind: 'removed', externalId: 'member:member-a:unlabelled' }]) + expect(JSON.parse(page.nextCursor)).toEqual({ historyId: '900' }) + expect(page.hasMore).toBe(false) + }) + + it('matches existing labels in an OR filter even when another label is absent', async () => { + mockFeed( + [historyPage(['match', 'unlabelled'])], + { + match: metadataThread('match', [{ labelIds: ['Label_7'] }]), + unlabelled: metadataThread('unlabelled', [{ labelIds: ['INBOX'] }]), + }, + [{ id: 'Label_7', name: 'Engineering' }] + ) + const page = await gmailConnector.listChanges!( + 'token', + { label: ['Engineering', 'Missing label'] }, + '500', + memberContext('member-a') + ) + expect(page.changes.map(({ kind, externalId }) => ({ kind, externalId }))).toEqual([ + { kind: 'upsert', externalId: 'member:member-a:match' }, + { kind: 'removed', externalId: 'member:member-a:unlabelled' }, + ]) + }) + + it.each([403, 503])( + 'does not treat a failed label lookup (%i) as an empty history scope', + async (status) => { + mockFetchWithRetry.mockResolvedValueOnce(new Response(null, { status })) + await expect( + gmailConnector.listChanges!( + 'token', + { label: 'Engineering' }, + '500', + memberContext('member-a') + ) + ).rejects.toThrow('cannot resolve the configured label filter') + expect(mockFetchWithRetry).toHaveBeenCalledOnce() + } + ) + it('keeps the start history id while paging and advances it once the feed drains', async () => { const requests = mockFeed( [ diff --git a/apps/sim/connectors/gmail/gmail.ts b/apps/sim/connectors/gmail/gmail.ts index 1f65f4354fe..c85f7df81c0 100644 --- a/apps/sim/connectors/gmail/gmail.ts +++ b/apps/sim/connectors/gmail/gmail.ts @@ -308,7 +308,7 @@ function buildSearchQuery( } const after = dateRangeStart(sourceConfig, new Date()) - if (after) parts.push(`after:${formatGmailDate(after)}`) + if (after) parts.push(`after:${after.getTime() / 1000}`) const excludePromotions = sourceConfig.excludePromotions !== 'false' if (excludePromotions) { @@ -350,21 +350,12 @@ function isBoundedDateRange(value: unknown): value is keyof typeof DATE_RANGE_DA return typeof value === 'string' && Object.hasOwn(DATE_RANGE_DAYS, value) } -/** The earliest message date the configured range admits, or undefined for all time. */ +/** Uses second precision so Gmail's epoch query and local history filtering share one cutoff. */ function dateRangeStart(sourceConfig: Record, now: Date): Date | undefined { const range = sourceConfig.dateRange - return isBoundedDateRange(range) ? daysAgo(now, DATE_RANGE_DAYS[range]) : undefined -} - -function daysAgo(now: Date, days: number): Date { - return new Date(now.getTime() - days * 24 * 60 * 60 * 1000) -} - -function formatGmailDate(date: Date): string { - const y = date.getFullYear() - const m = String(date.getMonth() + 1).padStart(2, '0') - const d = String(date.getDate()).padStart(2, '0') - return `${y}/${m}/${d}` + if (!isBoundedDateRange(range)) return undefined + const cutoffSeconds = Math.floor(now.getTime() / 1000) - DATE_RANGE_DAYS[range] * 24 * 60 * 60 + return new Date(cutoffSeconds * 1000) } /** @@ -766,8 +757,7 @@ function buildChangeScope( const labelIds = new Set() for (const value of configuredLabels) { const id = labelIndex.byId[value] ? value : labelIndex.idByLowerName[value.toLowerCase()] - if (!id) throw new Error(`Gmail label "${value}" does not exist in this mailbox`) - labelIds.add(id) + if (id) labelIds.add(id) } scope.labelIds = labelIds } diff --git a/apps/sim/hooks/queries/kb/connectors-cache.test.tsx b/apps/sim/hooks/queries/kb/connectors-cache.test.tsx index 7bce795ad62..89ee868601c 100644 --- a/apps/sim/hooks/queries/kb/connectors-cache.test.tsx +++ b/apps/sim/hooks/queries/kb/connectors-cache.test.tsx @@ -13,6 +13,16 @@ const mocks = vi.hoisted(() => ({ requestJson: vi.fn() })) vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.requestJson })) import { + type ConnectorDetailData, + getKnowledgeConnectorContract, + listKnowledgeConnectorsContract, + triggerKnowledgeConnectorSyncContract, +} from '@/lib/api/contracts/knowledge/connectors' +import { + CONNECTOR_SYNC_POLL_INTERVAL_MS, + connectorKeys, + useConnectorDetail, + useConnectorList, useConnectSimSearchConnector, useCreateConnector, useDeleteConnector, @@ -20,6 +30,7 @@ import { usePrepareSearchSource, useRestoreConnectorDocument, useStartConnectorMemberEnrollment, + useTriggerSync, useUpdateConnector, useUpdateConnectorAccess, } from '@/hooks/queries/kb/connectors' @@ -123,6 +134,117 @@ afterEach(() => { for (const root of mountedRoots.splice(0)) root.unmount() }) for (const queryClient of queryClients.splice(0)) queryClient.clear() + vi.useRealTimers() +}) + +describe('manual sync history reconciliation', () => { + it.each([false, true])( + 'resumes polling after an early idle response with connector list mounted=%s', + async (showList) => { + vi.useFakeTimers() + const client = createQueryClient() + const detailKey = connectorKeys.detail(KNOWLEDGE_BASE_ID, CONNECTOR_ID) + let serverDetail: ConnectorDetailData = { + id: CONNECTOR_ID, + knowledgeBaseId: KNOWLEDGE_BASE_ID, + connectorType: 'google_drive', + credentialId: 'credential-1', + sourceConfig: {}, + syncMode: 'full', + syncIntervalMinutes: 60, + status: 'active', + lastSyncAt: null, + lastSyncError: null, + lastSyncDocCount: 0, + nextSyncAt: null, + consecutiveFailures: 0, + accessMode: 'admin', + viewerMembership: null, + credentialGroupId: null, + credentialGroupOptionId: null, + memberSyncStatus: 'idle', + lastMemberSyncAt: null, + nextMemberSyncAt: null, + lastMemberSyncError: null, + memberSyncConsecutiveFailures: 0, + accessRewritePending: false, + createdAt: '2026-09-09T00:00:00Z', + updatedAt: '2026-09-09T00:00:00Z', + syncLogs: [], + memberSyncLogs: [], + members: { active: 0, suspended: 0, stale: 0 }, + } + client.setQueryData(detailKey, serverDetail) + client.setQueryData(connectorKeys.lists(KNOWLEDGE_BASE_ID), [serverDetail]) + const trigger = Promise.withResolvers() + mocks.requestJson.mockImplementation(async (contract) => { + if (contract === triggerKnowledgeConnectorSyncContract) return trigger.promise + if (contract === getKnowledgeConnectorContract) return { data: serverDetail } + if (contract === listKnowledgeConnectorsContract) return { data: [serverDetail] } + throw new Error('Unexpected request') + }) + const current = renderMutation(client, () => ({ + detail: useConnectorDetail(KNOWLEDGE_BASE_ID, CONNECTOR_ID), + list: useConnectorList(showList ? KNOWLEDGE_BASE_ID : undefined), + sync: useTriggerSync(), + })) + let mutation: Promise | undefined + await act(async () => { + mutation = current().sync.mutateAsync({ + knowledgeBaseId: KNOWLEDGE_BASE_ID, + connectorId: CONNECTOR_ID, + }) + await vi.advanceTimersByTimeAsync(0) + }) + expect(client.getQueryData(detailKey)?.status).toBe('pending') + + await act(async () => { + await vi.advanceTimersByTimeAsync(CONNECTOR_SYNC_POLL_INTERVAL_MS + 1) + }) + expect(current().detail.data?.status).toBe('active') + expect(current().sync.isPending).toBe(true) + serverDetail = { ...serverDetail, status: 'pending' } + await act(async () => { + trigger.resolve({ success: true }) + await mutation + await vi.advanceTimersByTimeAsync(1) + }) + expect(current().detail.data?.status).toBe('pending') + if (showList) expect(current().list.data?.[0].status).toBe('pending') + + serverDetail = { + ...serverDetail, + status: 'active', + syncLogs: [ + { + id: 'new-run', + connectorId: CONNECTOR_ID, + status: 'completed', + startedAt: '2026-09-10T00:00:00Z', + completedAt: '2026-09-10T00:01:00Z', + docsAdded: 0, + docsUpdated: 0, + docsDeleted: 0, + docsUnchanged: 3, + docsSkipped: 0, + docsFailed: 0, + errorMessage: null, + }, + ], + } + await act(async () => { + await vi.advanceTimersByTimeAsync(CONNECTOR_SYNC_POLL_INTERVAL_MS + 1) + }) + expect(current().detail.data?.syncLogs.map((log) => log.id)).toEqual(['new-run']) + expect(current().detail.data?.status).toBe('active') + const requestsAtCompletion = mocks.requestJson.mock.calls.length + await act(async () => { + await vi.advanceTimersByTimeAsync(CONNECTOR_SYNC_POLL_INTERVAL_MS * 2) + }) + expect(mocks.requestJson).toHaveBeenCalledTimes(requestsAtCompletion) + expectInvalidated(client, UNRELATED_KEY, false) + } + ) }) describe('connector account cache reconciliation', () => { diff --git a/apps/sim/hooks/queries/kb/connectors.test.ts b/apps/sim/hooks/queries/kb/connectors.test.ts index dac82a534f6..457a1c648fe 100644 --- a/apps/sim/hooks/queries/kb/connectors.test.ts +++ b/apps/sim/hooks/queries/kb/connectors.test.ts @@ -211,7 +211,11 @@ describe('useTriggerSync optimistic state', () => { function capturedMutationOptions() { return mocks.useMutation.mock.calls.at(-1)?.[0] as { onMutate: (vars: { knowledgeBaseId: string; connectorId: string }) => Promise - onSettled: () => Promise + onSettled: ( + data: undefined, + error: Error | null, + vars: { knowledgeBaseId: string; connectorId: string } + ) => Promise onSuccess: (data: undefined, vars: { knowledgeBaseId: string; connectorId: string }) => void onError: ( error: unknown, @@ -297,7 +301,10 @@ describe('useTriggerSync optimistic state', () => { it('reconciles server source summaries after either sync outcome', async () => { useTriggerSync() - await capturedMutationOptions().onSettled() + await capturedMutationOptions().onSettled(undefined, null, { + knowledgeBaseId: KB_ID, + connectorId: 'connector-1', + }) expect(mocks.invalidateQueries).toHaveBeenCalledWith({ queryKey: searchSourceKeys.lists() }) }) diff --git a/apps/sim/hooks/queries/kb/connectors.ts b/apps/sim/hooks/queries/kb/connectors.ts index 675d6e3e4f1..8c524b253fb 100644 --- a/apps/sim/hooks/queries/kb/connectors.ts +++ b/apps/sim/hooks/queries/kb/connectors.ts @@ -807,7 +807,18 @@ export function useTriggerSync() { queryKey: connectorKeys.progresses(knowledgeBaseId, connectorId), }) }, - onSettled: () => queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }), + /** An early poll can read idle before dispatch marks pending; reconcile after the request settles. */ + onSettled: (_data, error, { knowledgeBaseId, connectorId }) => + Promise.all([ + queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }), + queryClient.invalidateQueries({ + queryKey: connectorKeys.detail(knowledgeBaseId, connectorId), + exact: true, + }), + ...(!error + ? [queryClient.invalidateQueries({ queryKey: connectorKeys.lists(knowledgeBaseId) })] + : []), + ]), }) } diff --git a/apps/sim/lib/selectors/server/providers/google.test.ts b/apps/sim/lib/selectors/server/providers/google.test.ts index 318a68b1136..0f737ec42fa 100644 --- a/apps/sim/lib/selectors/server/providers/google.test.ts +++ b/apps/sim/lib/selectors/server/providers/google.test.ts @@ -150,6 +150,28 @@ describe('Google server selector adapters', () => { expect(mockFetch).toHaveBeenCalledTimes(2) }) + it.each([ + { files: [{ id: 'folder-1', name: 'Notes' }], nextPageToken: undefined }, + { files: [], nextPageToken: undefined }, + { files: [{ id: 'folder-1', name: 'Notes' }], nextPageToken: 'next' }, + ])('reports incomplete Drive searches without inventing pagination: %j', async (page) => { + mockFetch + .mockResolvedValueOnce(new Response(JSON.stringify({ drives: [] }))) + .mockResolvedValueOnce(new Response(JSON.stringify({ ...page, incompleteSearch: true }))) + const args = listArgs('google.drive') + args.context.mimeType = 'application/vnd.google-apps.folder' + + await expect(googleSelectorAttachments['google.drive'].execute(args)).resolves.toEqual({ + kind: 'list', + items: page.files.map((file) => ({ id: file.id, label: file.name })), + ...(page.nextPageToken ? { nextCursor: `f:${page.nextPageToken}` } : {}), + diagnostics: { truncated: { reason: 'provider-cap' } }, + }) + expect(mockFetch).toHaveBeenCalledTimes(2) + const fileUrl = new URL(String(mockFetch.mock.calls[1]?.[0])) + expect(fileUrl.searchParams.get('fields')).toContain('incompleteSearch') + }) + it('continues real folder pages after the final shared-drive page', async () => { mockFetch .mockResolvedValueOnce( diff --git a/apps/sim/lib/selectors/server/providers/google.ts b/apps/sim/lib/selectors/server/providers/google.ts index 8784433ffaa..37c92ecef0d 100644 --- a/apps/sim/lib/selectors/server/providers/google.ts +++ b/apps/sim/lib/selectors/server/providers/google.ts @@ -68,6 +68,7 @@ interface Sheet { interface GooglePage { items: T[] nextCursor?: string + truncated?: boolean } async function googleAccessToken(args: ExecuteServerSelectorArgs, serviceId: string) { @@ -297,9 +298,13 @@ async function listDriveFiles( url.searchParams.set('supportsAllDrives', 'true') url.searchParams.set('includeItemsFromAllDrives', 'true') url.searchParams.set('pageSize', '100') - url.searchParams.set('fields', 'nextPageToken,files(id,name,mimeType)') + url.searchParams.set('fields', 'nextPageToken,incompleteSearch,files(id,name,mimeType)') if (pageToken) url.searchParams.set('pageToken', pageToken) - const data = await fetchProviderJson<{ files?: DriveFile[]; nextPageToken?: string }>(url, { + const data = await fetchProviderJson<{ + files?: DriveFile[] + nextPageToken?: string + incompleteSearch?: boolean + }>(url, { headers: { Authorization: `Bearer ${accessToken}` }, signal: args.signal, }) @@ -308,6 +313,7 @@ async function listDriveFiles( return { items: [...sharedDrives, ...(data.files ?? [])], ...(nextPageToken ? { nextCursor: driveCursor('files', nextPageToken) } : {}), + ...(data.incompleteSearch === true ? { truncated: true } : {}), } } @@ -371,7 +377,8 @@ async function executeDrive(args: ExecuteServerSelectorArgs) { id: file.id, label: file.name, })), - result.nextCursor + result.nextCursor, + result.truncated ? { truncated: { reason: 'provider-cap' } } : undefined ) }