From b4d8a65d709f4addbdf087e2cdbda82eae10f906 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 12:08:23 -0700 Subject: [PATCH 01/14] improvement(search): bound indexing and simplify source recovery --- .github/workflows/test-build.yml | 10 + .../platform/self-hosting/background-jobs.mdx | 15 +- apps/docs/content/docs/search/index.mdx | 10 +- .../[connectorId]/documents/route.ts | 4 +- .../app/api/knowledge/migrated-routes.test.ts | 13 +- .../sim-search/sources/overview/route.ts | 23 + .../sim-search/sources/progress/route.ts | 23 + .../sim-search/sources/route.test.ts | 87 +++- .../api/knowledge/sim-search/sources/route.ts | 2 +- apps/sim/app/invite/[id]/invite.test.tsx | 134 ++++- apps/sim/app/invite/[id]/invite.tsx | 35 +- apps/sim/app/invite/components/index.ts | 1 + .../components/invitation-disclosure.tsx | 86 ++++ .../invite/components/status-card.test.tsx | 42 ++ .../sim/app/invite/components/status-card.tsx | 3 + .../components/get-started/get-started.tsx | 9 +- .../home/organization-home.test.tsx | 4 +- .../integrations/integrations.test.tsx | 118 ++++- .../integrations/integrations.tsx | 53 +- .../o/[organizationId]/search/search.test.tsx | 2 +- .../organization-integrations-setup.tsx | 9 +- .../knowledge-search-results/index.ts | 1 - .../knowledge-search-results.test.tsx | 110 ++-- .../knowledge-search-results.tsx | 38 +- .../add-connector-modal.test.tsx | 21 +- .../add-connector-modal.tsx | 3 + .../connector-config-fields.tsx | 11 +- .../connector-selector-field.test.tsx | 86 ++++ .../connector-selector-field.tsx | 15 +- .../connector-documents-tab.test.tsx | 161 ++++++ .../connector-documents-tab.tsx | 180 +++++++ .../edit-connector-modal.tsx | 147 +----- .../use-connector-config-fields.test.tsx | 90 ++++ .../[id]/hooks/use-connector-config-fields.ts | 53 +- .../components/search-source-pagination.tsx | 40 ++ .../components/search-source-row.test.tsx | 9 + .../search/components/search-source-row.tsx | 2 + .../[workspaceId]/search/search.test.tsx | 12 +- .../workspace/[workspaceId]/search/search.tsx | 13 +- .../view-invitations-modal.test.tsx | 209 ++++++++ .../view-invitations-modal.tsx | 98 ++-- apps/sim/hooks/queries/kb/connectors.test.ts | 102 +++- apps/sim/hooks/queries/kb/connectors.ts | 186 ++++++- apps/sim/hooks/queries/kb/knowledge.ts | 3 + .../kb/search-source-progress.test.tsx | 166 ++++++ apps/sim/hooks/queries/search-integrations.ts | 17 +- .../lib/api/contracts/knowledge/connectors.ts | 75 ++- .../document-dispatch.integration.ts | 486 ++++++++++++++++++ .../search-source-pagination.integration.ts | 230 +++++++++ .../search-source-progress.integration.ts | 131 +++++ .../seed-source-access-fixture.ts | 4 +- .../lib/knowledge/__integration__/setup.ts | 4 +- .../knowledge/application/connectors.test.ts | 3 +- .../lib/knowledge/application/connectors.ts | 27 +- .../lib/knowledge/application/operations.ts | 18 + .../application/search-source-overview.ts | 139 +++++ .../application/search-source-progress.ts | 97 ++++ .../application/search-sources.test.ts | 271 +++++++++- .../knowledge/application/search-sources.ts | 93 +++- apps/sim/lib/knowledge/constants.ts | 7 + .../lib/sim-search/source-identity.test.ts | 99 +++- apps/sim/lib/sim-search/source-identity.ts | 126 +++++ apps/sim/stores/connector-setup/store.test.ts | 11 + apps/sim/stores/connector-setup/store.ts | 2 + 64 files changed, 3904 insertions(+), 375 deletions(-) create mode 100644 apps/sim/app/api/knowledge/sim-search/sources/overview/route.ts create mode 100644 apps/sim/app/api/knowledge/sim-search/sources/progress/route.ts create mode 100644 apps/sim/app/invite/components/invitation-disclosure.tsx create mode 100644 apps/sim/app/invite/components/status-card.test.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.test.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/search/components/search-source-pagination.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.test.tsx create mode 100644 apps/sim/hooks/queries/kb/search-source-progress.test.tsx create mode 100644 apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts create mode 100644 apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts create mode 100644 apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts create mode 100644 apps/sim/lib/knowledge/application/search-source-overview.ts create mode 100644 apps/sim/lib/knowledge/application/search-source-progress.ts diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 99e64b97f2b..6c0ddd9d5b8 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -153,6 +153,16 @@ jobs: lib/table/rows/secret-provenance.postgres.test.ts lib/memory/message-provenance.postgres.test.ts + - name: Verify Search dispatch, progress, and pagination in PostgreSQL + working-directory: apps/sim + env: + KNOWLEDGE_ACL_TEST_DATABASE_URL: postgresql://postgres:postgres@127.0.0.1:5432/sim_auth_scim + run: >- + bunx vitest run --mode integration + lib/knowledge/__integration__/document-dispatch.integration.ts + lib/knowledge/__integration__/search-source-progress.integration.ts + lib/knowledge/__integration__/search-source-pagination.integration.ts + test-build: name: Lint and Test runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-latest' }} diff --git a/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx b/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx index 385ad1175e4..b3c2aace756 100644 --- a/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx +++ b/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx @@ -5,7 +5,7 @@ description: Scheduled workflows, polling triggers, and the cron endpoints that import { Callout } from 'fumadocs-ui/components/callout' -A large part of Sim runs on a schedule rather than in response to a user request: scheduled workflows, every polling trigger, connector syncs, the outbox, data drains, and retention. All of it is driven by **HTTP endpoints that something external must call on a timer**. +A large part of Sim runs on a schedule rather than in response to a user request: scheduled workflows, every polling trigger, connector syncs, the outbox, data drains, and retention. The default self-hosted scheduler calls **HTTP endpoints on a timer**. Deployments using Trigger.dev also run the document-indexing tasks described below. Both deployments ship a scheduler and enable it by default: Kubernetes as CronJobs, Docker Compose as a `cron` service. Both authenticate with `CRON_SECRET`, and both use the same schedules. @@ -147,3 +147,16 @@ Scheduled execution volume is bounded per app instance by: Raise the schedule limit only alongside memory headroom: concurrent executions run in the app process, so throughput is bounded by the pod's memory before it is bounded by this number. + +## Trigger.dev document indexing + +If Trigger.dev is enabled, document indexing uses a durable dispatch queue. Large imports wait in the database, and organizations share the existing worker budget. Temporary provider-capacity waits retry later without keeping a worker occupied. Default self-hosted installs continue to process documents in the app. + +When upgrading a deployment that uses Trigger.dev: + +1. Apply the database migrations before starting the new workers or application. +2. Deploy the Trigger tasks from the same revision before deploying the application. New workers accept existing queued jobs as well as the new compact document references. +3. Confirm the application and workers use the same database and Trigger environment. Verify that the `knowledge-document-dispatch-schedule` task is enabled; it runs every minute to resume delayed work and recover missed dispatch notifications. +4. Sync a small source and confirm its documents become searchable. A successful sync only confirms the source was fetched; indexing can still be running. + +Enqueue and completion notifications normally start the next work promptly. The minute schedule provides recovery when a notification is missed; it does not repeatedly download documents. Keep the updated workers running until their durable queue has drained before rolling them back. diff --git a/apps/docs/content/docs/search/index.mdx b/apps/docs/content/docs/search/index.mdx index d7cfa88caf3..03a0cfd80ce 100644 --- a/apps/docs/content/docs/search/index.mdx +++ b/apps/docs/content/docs/search/index.mdx @@ -109,6 +109,14 @@ Workspace Search remains separate. Workspace admins add sources through **Search 3. Ask a teammate with different source access to repeat the search. Documents restricted to you should not appear for them. 4. Change or remove a test document's access in the source and check again after the next completed content and permission refresh. -Search runs background syncs on an hourly schedule. Large sources, provider limits, and indexing queues can delay completion. Results are indexed copies, so edits and access changes are not fetched live for every query. Admins can inspect errors and progress under **Manage**. +Search runs background syncs on an hourly schedule. Large sources, provider limits, and indexing queues can delay completion. Results are indexed copies, so edits and access changes are not fetched live for every query. + +## If indexing needs attention + +A completed sync means the source was checked; some documents may still be indexing. The source row shows how many documents you can search and whether indexing failed for any documents you can access. + +As an admin, open **Manage → Settings → Documents → Failed** to inspect those files. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; use the **Excluded** tab and **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. + +Temporary indexing-capacity waits retry automatically in the background. If automatic retries are exhausted, the document appears as failed so an admin can retry it. Other searchable documents remain available while this work finishes. These guides cover permission-aware Search sources. For a general knowledge base used by workflows, see [Knowledge-base connectors](/knowledgebase/connectors); its workspace access settings are a separate choice. diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts index 68f3fd82248..e0e41284ab0 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts @@ -25,11 +25,12 @@ export const GET = defineInternalJsonRoute({ knowledgeBaseId: params.id, connectorId: params.connectorId, includeExcluded: query.includeExcluded, + failedOnly: query.failedOnly, limit: query.limit, offset: query.offset, }), useCase: listKnowledgeConnectorDocuments, - present: ({ documents, counts }) => ({ + present: ({ documents, counts, hasMore }) => ({ success: true as const, data: { documents: documents.map((document) => ({ @@ -38,6 +39,7 @@ export const GET = defineInternalJsonRoute({ uploadedAt: document.uploadedAt.toISOString(), })), counts, + hasMore, }, }), }) diff --git a/apps/sim/app/api/knowledge/migrated-routes.test.ts b/apps/sim/app/api/knowledge/migrated-routes.test.ts index 2917e9b3830..f2b17f97357 100644 --- a/apps/sim/app/api/knowledge/migrated-routes.test.ts +++ b/apps/sim/app/api/knowledge/migrated-routes.test.ts @@ -299,7 +299,8 @@ describe('migrated internal Knowledge routes', () => { processingStatus: 'completed', }, ], - counts: { active: 1, excluded: 0 }, + counts: { active: 1, excluded: 0, failed: 0 }, + hasMore: false, }) const params = Promise.resolve({ id: 'knowledge-1', connectorId: 'connector-1' }) const listResponse = await listConnectorDocuments( @@ -314,12 +315,18 @@ describe('migrated internal Knowledge routes', () => { documents: [ expect.objectContaining({ id: 'document-1', uploadedAt: '2026-01-01T00:00:00.000Z' }), ], - counts: { active: 1, excluded: 0 }, + counts: { active: 1, excluded: 0, failed: 0 }, + hasMore: false, }, }) expect(mocks.listConnectorDocuments).toHaveBeenLastCalledWith( expect.objectContaining({ - input: expect.objectContaining({ includeExcluded: true, limit: 25, offset: 50 }), + input: expect.objectContaining({ + includeExcluded: true, + failedOnly: false, + limit: 25, + offset: 50, + }), }) ) diff --git a/apps/sim/app/api/knowledge/sim-search/sources/overview/route.ts b/apps/sim/app/api/knowledge/sim-search/sources/overview/route.ts new file mode 100644 index 00000000000..f6bdf9abb5e --- /dev/null +++ b/apps/sim/app/api/knowledge/sim-search/sources/overview/route.ts @@ -0,0 +1,23 @@ +import { readSearchSourceOverviewContract } from '@/lib/api/contracts/knowledge/connectors' +import { + defineInternalJsonRoute, + internalRateLimits, + internalSessionAuth, +} from '@/lib/api/server/routes' +import { internalKnowledgeErrorPolicies } from '@/lib/knowledge/api/route-policies' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { readSearchSourceOverview } from '@/lib/knowledge/application/search-source-overview' + +export const GET = defineInternalJsonRoute({ + contract: readSearchSourceOverviewContract, + auth: internalSessionAuth, + operation: knowledgeOperations.readSearchSourceOverview, + rateLimit: internalRateLimits.none({ + reason: 'Bounded provider existence probes for source setup and indexing progress', + }), + errorPolicy: internalKnowledgeErrorPolicies.connectors, + mapInput: ({ query }) => query, + useCase: readSearchSourceOverview, + present: (overview) => ({ success: true as const, data: overview }), + staticResponseHeaders: { 'Cache-Control': 'private, no-store' }, +}) diff --git a/apps/sim/app/api/knowledge/sim-search/sources/progress/route.ts b/apps/sim/app/api/knowledge/sim-search/sources/progress/route.ts new file mode 100644 index 00000000000..a6a793a28af --- /dev/null +++ b/apps/sim/app/api/knowledge/sim-search/sources/progress/route.ts @@ -0,0 +1,23 @@ +import { readSearchSourceProgressContract } from '@/lib/api/contracts/knowledge/connectors' +import { + defineInternalJsonRoute, + internalRateLimits, + internalSessionAuth, +} from '@/lib/api/server/routes' +import { internalKnowledgeErrorPolicies } from '@/lib/knowledge/api/route-policies' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { readSearchSourceProgress } from '@/lib/knowledge/application/search-source-progress' + +export const POST = defineInternalJsonRoute({ + contract: readSearchSourceProgressContract, + auth: internalSessionAuth, + operation: knowledgeOperations.readSearchSourceProgress, + rateLimit: internalRateLimits.none({ + reason: 'Bounded viewer-authorized indexing progress polling', + }), + errorPolicy: internalKnowledgeErrorPolicies.connectors, + mapInput: ({ body }) => body, + useCase: readSearchSourceProgress, + present: ({ sources }) => ({ success: true as const, data: sources }), + staticResponseHeaders: { 'Cache-Control': 'private, no-store' }, +}) diff --git a/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts b/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts index a90e2cc09d0..22d2f5eb374 100644 --- a/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts +++ b/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts @@ -2,7 +2,7 @@ import { authMockFns, createMockRequest } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const mocks = vi.hoisted(() => ({ execute: vi.fn(), connect: vi.fn() })) +const mocks = vi.hoisted(() => ({ execute: vi.fn(), connect: vi.fn(), overview: vi.fn() })) vi.mock('@/lib/knowledge/application/sim-search', () => ({ connectSimSearchConnector: { operation: { id: 'knowledge.simSearch.connect' }, @@ -12,6 +12,12 @@ vi.mock('@/lib/knowledge/application/sim-search', () => ({ vi.mock('@/lib/knowledge/application/search-sources', () => ({ listSearchSources: { operation: { id: 'knowledge.search.sources.list' }, execute: mocks.execute }, })) +vi.mock('@/lib/knowledge/application/search-source-overview', () => ({ + readSearchSourceOverview: { + operation: { id: 'knowledge.search.sources.overview' }, + execute: mocks.overview, + }, +})) vi.mock('@/lib/knowledge/application/search', () => ({ KnowledgeSearchProvenanceUnavailableError: class extends Error {}, })) @@ -21,6 +27,7 @@ vi.mock('@/lib/knowledge/application/upload-sessions', () => ({ import { NoWorkspaceAccessError } from '@/lib/core/application/workspace-authorization' import { POST as connectSource } from '@/app/api/knowledge/sim-search/connect/route' +import { GET as getOverview } from '@/app/api/knowledge/sim-search/sources/overview/route' import { GET } from '@/app/api/knowledge/sim-search/sources/route' const WORKSPACE_ID = '7d28e5e2-fb03-4118-9c52-4ab77ccff369' @@ -36,6 +43,7 @@ const source = { lastSyncAt: null, hasSyncError: false, viewerDocumentCount: 0, + viewerFailedDocumentCount: 0, viewerEmailVerified: true, connectionRequired: false, viewerMembership: null, @@ -47,7 +55,7 @@ beforeEach(() => { user: { id: 'reader' }, session: { id: 'session' }, }) - mocks.execute.mockResolvedValue({ sources: [source] }) + mocks.execute.mockResolvedValue({ sources: [source], nextCursor: null }) }) describe('GET Search sources', () => { @@ -93,6 +101,7 @@ describe('GET Search sources', () => { it('passes the authenticated subject into the registered operation and projects only the contract fields', async () => { mocks.execute.mockResolvedValue({ + nextCursor: null, sources: [ { ...source, @@ -113,8 +122,8 @@ describe('GET Search sources', () => { expect(response.status).toBe(200) expect(response.headers.get('Cache-Control')).toBe('private, no-store') const body = await response.json() - expect(body).toMatchObject({ success: true, data: [source] }) - expect(body.data[0]).toEqual(source) + expect(body).toMatchObject({ success: true, data: { sources: [source], nextCursor: null } }) + expect(body.data.sources[0]).toEqual(source) expect(mocks.execute).toHaveBeenCalledWith( expect.objectContaining({ principal: { kind: 'session', userId: 'reader', sessionId: 'session' }, @@ -153,3 +162,73 @@ describe('GET Search sources', () => { expect(body).not.toHaveProperty('data') }) }) + +describe('Search pagination boundary', () => { + it('forwards bounded source filters and opaque cursors to the authorized operation', async () => { + const response = await GET( + createMockRequest( + 'GET', + undefined, + {}, + `http://localhost/api/knowledge/sim-search/sources?workspaceId=${WORKSPACE_ID}&search=Handbook&mine=true&cursor=opaque` + ) + ) + expect(response.status).toBe(200) + expect(mocks.execute).toHaveBeenCalledWith( + expect.objectContaining({ + input: { workspaceId: WORKSPACE_ID, search: 'Handbook', mine: true, cursor: 'opaque' }, + }) + ) + }) + it.each([`search=${'x'.repeat(201)}`, `cursor=${'x'.repeat(1025)}`])( + 'rejects an oversized filter or cursor before source reads', + async (filter) => { + const response = await GET( + createMockRequest( + 'GET', + undefined, + {}, + `http://localhost/api/knowledge/sim-search/sources?workspaceId=${WORKSPACE_ID}&${filter}` + ) + ) + expect(response.status).toBe(400) + expect(mocks.execute).not.toHaveBeenCalled() + } + ) + it('serves only the bounded provider overview through the registered operation', async () => { + mocks.overview.mockResolvedValue({ + providers: [{ connectorType: 'google_drive', isSyncing: true }], + hasSearchableDocuments: false, + credentials: 'private', + }) + const response = await getOverview( + createMockRequest( + 'GET', + undefined, + {}, + `http://localhost/api/knowledge/sim-search/sources/overview?workspaceId=${WORKSPACE_ID}` + ) + ) + expect(response.status).toBe(200) + expect(response.headers.get('Cache-Control')).toBe('private, no-store') + expect(await response.json()).toEqual({ + success: true, + data: { + providers: [{ connectorType: 'google_drive', isSyncing: true }], + hasSearchableDocuments: false, + }, + }) + expect(mocks.overview).toHaveBeenCalledWith( + expect.objectContaining({ + principal: { kind: 'session', userId: 'reader', sessionId: 'session' }, + input: { workspaceId: WORKSPACE_ID }, + }) + ) + }) + it('authenticates before parsing the overview scope', async () => { + authMockFns.mockGetSession.mockResolvedValue(null) + const response = await getOverview(createMockRequest('GET')) + expect(response.status).toBe(401) + expect(mocks.overview).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/api/knowledge/sim-search/sources/route.ts b/apps/sim/app/api/knowledge/sim-search/sources/route.ts index fe64846acdd..69f7d9c36e8 100644 --- a/apps/sim/app/api/knowledge/sim-search/sources/route.ts +++ b/apps/sim/app/api/knowledge/sim-search/sources/route.ts @@ -18,6 +18,6 @@ export const GET = defineInternalJsonRoute({ errorPolicy: internalKnowledgeErrorPolicies.connectors, mapInput: ({ query }) => query, useCase: listSearchSources, - present: ({ sources }) => ({ success: true as const, data: sources }), + present: (page) => ({ success: true as const, data: page }), staticResponseHeaders: { 'Cache-Control': 'private, no-store' }, }) diff --git a/apps/sim/app/invite/[id]/invite.test.tsx b/apps/sim/app/invite/[id]/invite.test.tsx index 24363971dc4..0cac988bcd2 100644 --- a/apps/sim/app/invite/[id]/invite.test.tsx +++ b/apps/sim/app/invite/[id]/invite.test.tsx @@ -4,14 +4,18 @@ import { act, type ReactNode } from 'react' import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { ApiClientError } from '@/lib/api/client/errors' +import type { MyInvitation } from '@/lib/api/contracts/invitations' const { mockCancelQueries, + mockClearUserData, mockGetSession, mockInvalidateQueries, mockLogger, mockPush, mockRequestJson, + mockRefetch, mockSearchParams, mockSetActive, mockSetQueryData, @@ -19,6 +23,7 @@ const { mockUseSession, } = vi.hoisted(() => ({ mockCancelQueries: vi.fn(), + mockClearUserData: vi.fn(), mockGetSession: vi.fn(), mockInvalidateQueries: vi.fn(), mockLogger: { @@ -27,6 +32,7 @@ const { }, mockPush: vi.fn(), mockRequestJson: vi.fn(), + mockRefetch: vi.fn(), mockSearchParams: { current: new URLSearchParams('token=token-1') }, mockSetActive: vi.fn(), mockSetQueryData: vi.fn(), @@ -82,7 +88,7 @@ vi.mock('@tanstack/react-query', async () => { } // eslint-disable-next-line react-hooks/exhaustive-deps }, [enabled]) - return state + return { ...state, refetch: mockRefetch, isFetching: false } }, } }) @@ -91,6 +97,8 @@ vi.mock('@/lib/api/client/request', () => ({ requestJson: mockRequestJson, })) +vi.mock('@/stores', () => ({ clearUserData: mockClearUserData })) + vi.mock('@/lib/auth/auth-client', () => ({ client: { getSession: mockGetSession, @@ -100,24 +108,34 @@ vi.mock('@/lib/auth/auth-client', () => ({ useSession: mockUseSession, })) -vi.mock('@/app/invite/components', () => ({ +vi.mock('@/app/invite/components', async () => ({ + InvitationDisclosure: (await import('@/app/invite/components/invitation-disclosure')) + .InvitationDisclosure, InviteLayout: ({ children }: { children: ReactNode }) => children, InviteStatusCard: ({ actions = [], description, + details, title, type, }: { - actions?: Array<{ label: string; onClick: () => void }> + actions?: Array<{ label: string; onClick: () => void; disabled?: boolean }> description?: ReactNode + details?: ReactNode title: string type: string }) => ( <>
{title}
{description}
+ {details} {actions.map((action) => ( - ))} @@ -131,6 +149,7 @@ import { sessionKeys } from '@/hooks/queries/session' let container: HTMLDivElement let root: Root let membershipIntent: 'external' | 'internal' +let joinPreview: MyInvitation['joinPreview'] const EXTERNAL_REFRESHED_SESSION = { user: { id: 'user-1', email: 'invitee@example.com' }, @@ -197,12 +216,20 @@ beforeEach(() => { isPending: false, }) membershipIntent = 'external' + joinPreview = { + outcome: 'external', + organizationName: null, + workspaceIdsToMove: [], + workspacesToMove: [], + } mockCancelQueries.mockResolvedValue(undefined) + mockClearUserData.mockResolvedValue(true) mockGetSession.mockResolvedValue({ data: EXTERNAL_REFRESHED_SESSION }) mockInvalidateQueries.mockResolvedValue(undefined) mockRequestJson.mockImplementation((contract: { method?: string }) => { if (contract.method === 'GET') { return Promise.resolve({ + joinPreview, invitation: { id: 'invitation-1', kind: 'workspace', @@ -249,6 +276,105 @@ afterEach(() => { }) describe('Invite', () => { + it('clears the previous account cache before navigating to the invitation sign-in', async () => { + mockRequestJson.mockRejectedValue( + new ApiClientError({ + status: 403, + message: 'Wrong account', + body: { error: 'email-mismatch' }, + }) + ) + let completeCleanup: (result: boolean) => void = () => undefined + mockClearUserData.mockReturnValue( + new Promise((resolve) => { + completeCleanup = resolve + }) + ) + await renderInvite() + expect(container.textContent).toContain('Wrong Account') + await clickAction('Sign in with a different account') + expect(mockSignOut).toHaveBeenCalledOnce() + expect(mockClearUserData).toHaveBeenCalledOnce() + expect(mockPush).not.toHaveBeenCalled() + await act(async () => completeCleanup(true)) + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + }) + + it('renders the actual join target and complete migration before echoing that preview', async () => { + membershipIntent = 'internal' + joinPreview = { + outcome: 'will-join', + organizationName: 'Actual Organization', + workspacesToMove: ['Personal work', 'Archived project'], + workspaceIdsToMove: ['personal', 'archived'], + } + await renderInvite() + expect(container.textContent).toContain( + 'You will join Actual Organization as an organization admin' + ) + expect(container.textContent).toContain('including archived workspaces') + expect( + Array.from( + container.querySelectorAll('[aria-label="Workspaces moving into the organization"] li'), + (item) => item.textContent + ) + ).toEqual(['Personal work', 'Archived project']) + expect(container.textContent).toContain('External Workspace: admin access') + await clickAction('Accept Invitation') + expect(mockRequestJson).toHaveBeenCalledWith(expect.objectContaining({ method: 'POST' }), { + params: { id: 'invitation-1' }, + body: { + token: 'token-1', + disclosedWorkspaceIds: ['personal', 'archived'], + disclosedOutcome: 'will-join', + }, + }) + }) + + it.each([ + ['already-member', 'Your organization role will stay the same'], + ['external', 'workspace access without joining an organization'], + ['blocked', 'This invitation cannot currently be accepted'], + ] as const)('discloses %s without promising a membership change', async (outcome, message) => { + membershipIntent = 'internal' + joinPreview = { + outcome, + organizationName: null, + workspaceIdsToMove: [], + workspacesToMove: [], + } + await renderInvite() + expect(container.textContent).toContain(message) + expect(container.textContent).not.toContain('as an organization admin') + await clickAction('Accept Invitation') + expect(mockRequestJson).toHaveBeenCalledWith( + expect.objectContaining({ method: 'POST' }), + expect.objectContaining({ + body: { token: 'token-1', disclosedWorkspaceIds: [], disclosedOutcome: outcome }, + }) + ) + }) + + it('withholds internal acceptance and offers refresh when disclosure is missing', async () => { + membershipIntent = 'internal' + joinPreview = null + await renderInvite() + expect(container.textContent).toContain('We could not load how this invitation affects') + const accept = Array.from(container.querySelectorAll('button')).find( + (button) => button.textContent === 'Accept Invitation' + ) + expect(accept?.disabled).toBe(true) + await clickAction('Accept Invitation') + expect(mockRequestJson).not.toHaveBeenCalledWith( + expect.objectContaining({ method: 'POST' }), + expect.anything() + ) + await clickAction('Refresh invitation') + expect(mockRefetch).toHaveBeenCalledOnce() + }) + it('refreshes an external acceptance without replacing the viewer organization client-side', async () => { await acceptCurrentInvitation() diff --git a/apps/sim/app/invite/[id]/invite.tsx b/apps/sim/app/invite/[id]/invite.tsx index 945e0779d05..09fe4ed825d 100644 --- a/apps/sim/app/invite/[id]/invite.tsx +++ b/apps/sim/app/invite/[id]/invite.tsx @@ -12,12 +12,13 @@ import { acceptInvitationContract } from '@/lib/api/contracts/invitations' import { client, useSession } from '@/lib/auth/auth-client' import { APP_ENTRY_PATH } from '@/lib/navigation/paths' import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect' -import { InviteLayout, InviteStatusCard } from '@/app/invite/components' +import { InvitationDisclosure, InviteLayout, InviteStatusCard } from '@/app/invite/components' import { useInvitationDetails } from '@/hooks/queries/invitations' import { organizationKeys } from '@/hooks/queries/organization' import { refreshSessionQuery } from '@/hooks/queries/session' import { subscriptionKeys } from '@/hooks/queries/utils/subscription-keys' import { workspaceKeys } from '@/hooks/queries/workspace' +import { clearUserData } from '@/stores' const logger = createLogger('InviteById') @@ -315,6 +316,7 @@ export default function Invite({ registrationDisabled }: InviteProps) { }) const invitation = invitationQuery.data?.invitation ?? null const joinPreview = invitationQuery.data?.joinPreview ?? null + const isDisclosureMissing = invitation?.membershipIntent === 'internal' && !joinPreview const isLoading = Boolean(session?.user) && (!isTokenResolved || invitationQuery.isPending) const fetchError = invitationQuery.error @@ -331,7 +333,7 @@ export default function Invite({ registrationDisabled }: InviteProps) { const error = actionError ?? fetchError ?? (invitationQuery.data ? null : urlError) const handleAcceptInvitation = async () => { - if (!session?.user || !invitation) return + if (!session?.user || !invitation || isDisclosureMissing || isAccepting) return setIsAccepting(true) try { @@ -442,8 +444,19 @@ export default function Invite({ registrationDisabled }: InviteProps) { { label: 'Sign in with a different account', onClick: async () => { - await client.signOut() - router.push(inviteAuthLink('/login', callbackUrl)) + const loginUrl = inviteAuthLink('/login', callbackUrl) + let canNavigateInApp = false + try { + const [, inMemoryResetSucceeded] = await Promise.all([ + client.signOut(), + clearUserData(), + ]) + canNavigateInApp = inMemoryResetSucceeded + } catch (error) { + logger.error('Error signing out:', { error }) + } + if (canNavigateInApp) router.push(loginUrl) + else window.location.assign(loginUrl) }, }, { label: 'Return to Home', onClick: returnHome }, @@ -555,14 +568,26 @@ export default function Invite({ registrationDisabled }: InviteProps) { type='invitation' title={isOrg ? 'Organization Invitation' : 'Workspace Invitation'} description={`You've been invited to join ${displayName}.`} + details={ + invitation && + } icon={isOrg ? 'users' : 'mail'} actions={[ { label: 'Accept Invitation', onClick: handleAcceptInvitation, - disabled: isAccepting, + disabled: isAccepting || isDisclosureMissing, loading: isAccepting, }, + ...(isDisclosureMissing + ? [ + { + label: 'Refresh invitation', + onClick: () => void invitationQuery.refetch(), + disabled: invitationQuery.isFetching, + }, + ] + : []), { label: 'Return to Home', onClick: returnHome }, ]} /> diff --git a/apps/sim/app/invite/components/index.ts b/apps/sim/app/invite/components/index.ts index e980aa2cdb5..33d1fa04182 100644 --- a/apps/sim/app/invite/components/index.ts +++ b/apps/sim/app/invite/components/index.ts @@ -1,2 +1,3 @@ +export { InvitationDisclosure } from './invitation-disclosure' export { default as InviteLayout } from './layout' export { InviteStatusCard } from './status-card' diff --git a/apps/sim/app/invite/components/invitation-disclosure.tsx b/apps/sim/app/invite/components/invitation-disclosure.tsx new file mode 100644 index 00000000000..eab067718ed --- /dev/null +++ b/apps/sim/app/invite/components/invitation-disclosure.tsx @@ -0,0 +1,86 @@ +import type { InvitationDetails, MyInvitation } from '@/lib/api/contracts/invitations' + +interface InvitationDisclosureProps { + invitation: InvitationDetails + joinPreview: MyInvitation['joinPreview'] +} + +export function InvitationDisclosure({ invitation, joinPreview }: InvitationDisclosureProps) { + const outcome = + joinPreview?.outcome ?? (invitation.membershipIntent === 'external' ? 'external' : null) + const organizationName = + joinPreview?.organizationName ?? + (invitation.kind === 'organization' ? invitation.organizationName : null) ?? + 'the workspace’s organization' + + return ( +
+ {outcome === 'will-join' && ( + <> +

+ You will join {organizationName} as an + organization {invitation.role}. This uses one + organization seat. +

+ {joinPreview && joinPreview.workspaceIdsToMove.length > 0 ? ( +
+

+ Your owned personal workspaces, including archived workspaces, will move into the + organization. Its administrators will be able to manage them: +

+
    + {joinPreview.workspaceIdsToMove.map((id, index) => ( +
  • + {joinPreview.workspacesToMove[index] || 'Unnamed workspace'} +
  • + ))} +
+
+ ) : ( +

You have no personal workspaces to move into the organization.

+ )} + + )} + {outcome === 'already-member' && ( +

+ You already belong to this organization. Your organization role will stay the same. No + additional seat is used, and none of your personal workspaces will move. +

+ )} + {outcome === 'external' && ( +

+ You will receive workspace access without joining an organization or using one of its + seats. Your organization membership will stay the same, and none of your personal + workspaces will move. +

+ )} + {outcome === 'blocked' && ( +

+ This invitation cannot currently be accepted. Try accepting to see what needs to be + resolved, or contact the person who invited you. +

+ )} + {outcome === null && ( +

+ We could not load how this invitation affects your organization and personal workspaces. + Refresh the invitation to review these details before accepting. +

+ )} + {invitation.grants.length > 0 && ( +
+

Invited workspace access:

+
    + {invitation.grants.map((grant) => ( +
  • + {grant.workspaceName || 'Unnamed workspace'}: {grant.permission} access +
  • + ))} +
+
+ )} +
+ ) +} diff --git a/apps/sim/app/invite/components/status-card.test.tsx b/apps/sim/app/invite/components/status-card.test.tsx new file mode 100644 index 00000000000..357d773c086 --- /dev/null +++ b/apps/sim/app/invite/components/status-card.test.tsx @@ -0,0 +1,42 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { createRoot } from 'react-dom/client' +import { expect, it, vi } from 'vitest' + +vi.mock('next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }) })) +vi.mock('@/app/(auth)/components', async () => ({ + AuthSubmitButton: (await import('@/app/(auth)/components/auth-submit-button')).AuthSubmitButton, +})) + +import { InviteStatusCard } from '@/app/invite/components/status-card' + +it('places block disclosure content outside the description and before acceptance', async () => { + const container = document.createElement('div') + document.body.appendChild(container) + const root = createRoot(container) + try { + await act(async () => + root.render( + +
  • Personal work
  • + + } + actions={[{ label: 'Accept Invitation', onClick: vi.fn() }]} + /> + ) + ) + const disclosure = container.querySelector('[aria-label="Workspaces moving"]') + expect(disclosure?.closest('p')).toBeNull() + expect(disclosure?.compareDocumentPosition(container.querySelector('button')!)).toBe( + Node.DOCUMENT_POSITION_FOLLOWING + ) + } finally { + await act(async () => root.unmount()) + container.remove() + } +}) diff --git a/apps/sim/app/invite/components/status-card.tsx b/apps/sim/app/invite/components/status-card.tsx index 24e76392d43..f137111f4c1 100644 --- a/apps/sim/app/invite/components/status-card.tsx +++ b/apps/sim/app/invite/components/status-card.tsx @@ -12,6 +12,7 @@ interface InviteStatusCardProps { type: 'login' | 'loading' | 'error' | 'success' | 'invitation' | 'warning' title: string description: string | React.ReactNode + details?: React.ReactNode icon?: 'userPlus' | 'mail' | 'users' | 'error' | 'success' | 'warning' actions?: Array<{ label: string @@ -28,6 +29,7 @@ export function InviteStatusCard({ type, title, description, + details, icon: _icon, actions = EMPTY_ACTIONS, isExpiredError = false, @@ -54,6 +56,7 @@ export function InviteStatusCard({
    + {details} {isExpiredError && ( Request New Invitation diff --git a/apps/sim/app/o/[organizationId]/home/components/get-started/get-started.tsx b/apps/sim/app/o/[organizationId]/home/components/get-started/get-started.tsx index 46909b51c4f..9dd3e3fb56f 100644 --- a/apps/sim/app/o/[organizationId]/home/components/get-started/get-started.tsx +++ b/apps/sim/app/o/[organizationId]/home/components/get-started/get-started.tsx @@ -8,7 +8,7 @@ import type { ResourceScope } from '@/lib/core/resource-scope' import { organizationRoutes } from '@/lib/navigation/paths' import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' import { useApiKeys } from '@/hooks/queries/api-keys' -import { useSearchSources } from '@/hooks/queries/kb/connectors' +import { useSearchSourceOverview } from '@/hooks/queries/kb/connectors' type StepId = 'connect-integration' | 'connect-sim-search' @@ -72,7 +72,7 @@ export function GetStarted() { const { organization, viewer } = useOrganizationContext() const routes = organizationRoutes(organization.id) const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } - const { data: sources } = useSearchSources(scope) + const { data: overview } = useSearchSourceOverview(scope) const { data: apiKeys } = useApiKeys('', 'personal') const hrefs: Record = { @@ -82,10 +82,7 @@ export function GetStarted() { 'connect-sim-search': routes.settingsSection('search-mcp'), } const completed: Record = { - 'connect-integration': - sources?.some( - (source) => source.viewerMembership === 'connected' || !source.connectionRequired - ) ?? false, + 'connect-integration': overview?.hasSearchableDocuments === true, 'connect-sim-search': (apiKeys?.personalKeys.length ?? 0) > 0, } diff --git a/apps/sim/app/o/[organizationId]/home/organization-home.test.tsx b/apps/sim/app/o/[organizationId]/home/organization-home.test.tsx index d8a7d799875..36dac6131ca 100644 --- a/apps/sim/app/o/[organizationId]/home/organization-home.test.tsx +++ b/apps/sim/app/o/[organizationId]/home/organization-home.test.tsx @@ -28,7 +28,7 @@ vi.mock('@/hooks/queries/mothership-chats', () => ({ useMarkMothershipChatRead: () => ({ mutate: mocks.markRead }), })) vi.mock('@/app/o/[organizationId]/home/components/composer', () => ({ Composer: mocks.composer })) -vi.mock('@/hooks/queries/kb/connectors', () => ({ useSearchSources: mocks.sources })) +vi.mock('@/hooks/queries/kb/connectors', () => ({ useSearchSourceOverview: mocks.sources })) vi.mock('@/hooks/queries/api-keys', () => ({ useApiKeys: mocks.apiKeys })) vi.mock('@/app/workspace/[workspaceId]/home/components/mothership-chat', () => ({ MothershipChat: mocks.renderer, @@ -47,7 +47,7 @@ beforeEach(() => { searchAccess: { memberScoped: true }, viewer: { isAdmin: false }, }) - mocks.sources.mockReturnValue({ data: [] }) + mocks.sources.mockReturnValue({ data: { providers: [], hasSearchableDocuments: false } }) mocks.apiKeys.mockReturnValue({ data: { personalKeys: [] } }) mocks.chat.mockReturnValue({ messages: [], isChatHistoryPending: true, sendMessage: mocks.send }) mocks.composer.mockReturnValue(
    Question composer
    ) diff --git a/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx b/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx index 4369d9e8843..1c5126ff0ae 100644 --- a/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx @@ -7,21 +7,20 @@ import type { SearchSourceSummary } from '@/lib/api/contracts/knowledge/connecto const mocks = vi.hoisted(() => ({ context: vi.fn(), sources: vi.fn(), + overview: vi.fn(), integrations: vi.fn(), filters: vi.fn(), setSource: vi.fn(), connect: vi.fn(), + availability: vi.fn(), + refetchAvailability: vi.fn(), })) vi.mock('@/hooks/queries/search-integrations', () => ({ useSearchIntegrations: mocks.integrations, })) vi.mock('@/hooks/use-permission-config', () => ({ - usePermissionConfig: () => ({ - integrationAvailability: new Map(), - oauthServiceAvailability: new Map([['google-email', true]]), - isIntegrationAvailabilityReady: true, - }), + usePermissionConfig: mocks.availability, })) vi.mock('nuqs', () => ({ useQueryState: () => [null, mocks.setSource], @@ -50,6 +49,7 @@ vi.mock('@/app/workspace/[workspaceId]/integrations/components/integrations-show })) vi.mock('@/hooks/queries/kb/connectors', () => ({ useSearchSources: mocks.sources, + useSearchSourceOverview: mocks.overview, searchSourceKeys: { list: (scope: unknown) => ['sources', scope] }, })) vi.mock('@/hooks/use-member-enrollment', () => ({ @@ -110,7 +110,25 @@ describe('organization integrations role and source paths', () => { searchAccess: { memberScoped: true, sourceMirrored: true }, }) mocks.integrations.mockReturnValue({ data: [], isPending: false }) + mocks.availability.mockReturnValue({ + integrationAvailability: new Map(), + oauthServiceAvailability: new Map([['google-email', true]]), + isIntegrationAvailabilityReady: true, + integrationAvailabilityError: null, + isIntegrationAvailabilityFetching: false, + refetchIntegrationAvailability: mocks.refetchAvailability, + }) mocks.sources.mockReturnValue({ data: [memberSource, centralSource], isPending: false }) + mocks.overview.mockReturnValue({ + data: { + providers: [ + { connectorType: 'gmail', isSyncing: false }, + { connectorType: 'google_drive', isSyncing: false }, + ], + hasSearchableDocuments: false, + }, + isPending: false, + }) mocks.filters.mockReturnValue({ tab: null, search: '', setSearch: vi.fn() }) container = document.createElement('div') document.body.appendChild(container) @@ -135,7 +153,7 @@ describe('organization integrations role and source paths', () => { it('uses the actual organization and only asks members to connect identity-dependent sources', async () => { await render() - expect(mocks.sources).toHaveBeenCalledWith(scope) + expect(mocks.sources).toHaveBeenCalledWith(scope, { search: '', mine: false }) expect(buttons('Add source')).toHaveLength(0) expect(buttons('Manage')).toHaveLength(0) expect(buttons('Connect account')).toHaveLength(1) @@ -146,6 +164,10 @@ describe('organization integrations role and source paths', () => { it('offers an approved integration before any source is configured', async () => { mocks.sources.mockReturnValue({ data: [], isPending: false }) + mocks.overview.mockReturnValue({ + data: { providers: [], hasSearchableDocuments: false }, + isPending: false, + }) mocks.integrations.mockReturnValue({ data: [{ connectorType: 'gmail', approved: true }], isPending: false, @@ -169,8 +191,52 @@ describe('organization integrations role and source paths', () => { expect(buttons('Connect account')).toHaveLength(0) expect(document.body.textContent).toContain('Deactivated by an organization admin') }) + it('waits for availability before describing approved sources as needing admin setup', async () => { + mocks.sources.mockReturnValue({ data: [], isPending: false }) + mocks.overview.mockReturnValue({ + data: { providers: [], hasSearchableDocuments: false }, + isPending: false, + }) + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'gmail', approved: true }], + isPending: false, + }) + mocks.availability.mockReturnValue({ isIntegrationAvailabilityReady: false }) + await render() + expect(document.body.textContent).toContain('Loading sources') + expect(document.body.textContent).not.toContain('An admin needs to finish source setup') + expect(buttons('Connect account')).toHaveLength(0) + }) + + it('retries availability failures instead of asking an admin to finish setup', async () => { + mocks.sources.mockReturnValue({ data: [], isPending: false }) + mocks.overview.mockReturnValue({ + data: { providers: [], hasSearchableDocuments: false }, + isPending: false, + }) + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'gmail', approved: true }], + isPending: false, + }) + mocks.availability.mockReturnValue({ + isIntegrationAvailabilityReady: false, + integrationAvailabilityError: new Error('Connection availability failed'), + refetchIntegrationAvailability: mocks.refetchAvailability, + isIntegrationAvailabilityFetching: false, + }) + await render() + expect(document.body.textContent).toContain('Connection availability failed') + expect(document.body.textContent).not.toContain('An admin needs to finish source setup') + expect(buttons('Connect account')).toHaveLength(0) + await act(async () => buttons('Try again')[0].click()) + expect(mocks.refetchAvailability).toHaveBeenCalledOnce() + }) it('asks an admin to configure Slack before members can connect an approved source', async () => { mocks.sources.mockReturnValue({ data: [], isPending: false }) + mocks.overview.mockReturnValue({ + data: { providers: [], hasSearchableDocuments: false }, + isPending: false, + }) mocks.integrations.mockReturnValue({ data: [{ connectorType: 'slack', approved: true }], isPending: false, @@ -194,10 +260,12 @@ describe('organization integrations role and source paths', () => { it('lists only the sources the viewer connected under Mine', async () => { mocks.filters.mockReturnValue({ tab: 'mine', search: '', setSearch: vi.fn() }) + mocks.sources.mockReturnValue({ data: [], isPending: false }) await render() + expect(mocks.sources).toHaveBeenCalledWith(scope, { search: '', mine: true }) expect(document.body.textContent).toContain('You haven’t connected any sources yet.') mocks.sources.mockReturnValue({ - data: [{ ...memberSource, viewerMembership: 'connected' }, centralSource], + data: [{ ...memberSource, viewerMembership: 'connected' }], isPending: false, }) await render() @@ -215,8 +283,44 @@ describe('organization integrations role and source paths', () => { expect(buttons('Connect account')).toHaveLength(0) expect(document.body.textContent).toContain('Not available in this organization') mocks.sources.mockReturnValue({ data: [], isPending: false }) + mocks.overview.mockReturnValue({ + data: { providers: [], hasSearchableDocuments: false }, + isPending: false, + }) await render() expect(document.body.textContent).toContain('Ask an organization admin to get started') expect(buttons('Add source')).toHaveLength(0) }) + it('keeps sparse source pages navigable without claiming missing sources or duplicating configured providers', async () => { + const fetchNextPage = vi.fn() + mocks.sources.mockReturnValue({ data: [], isPending: false, hasNextPage: true, fetchNextPage }) + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'gmail', approved: true }], + isPending: false, + }) + await render() + expect(buttons('Load more')).toHaveLength(1) + expect(buttons('Connect account')).toHaveLength(0) + expect(document.body.textContent).not.toContain('hasn’t added any sources') + await act(async () => buttons('Load more')[0].click()) + expect(fetchNextPage).toHaveBeenCalledOnce() + }) + + it('retains loaded rows on a next-page failure and retries only that page', async () => { + const fetchNextPage = vi.fn() + mocks.sources.mockReturnValue({ + data: [centralSource], + isPending: false, + isError: true, + isFetchNextPageError: true, + hasNextPage: true, + error: new Error('Could not load more sources'), + fetchNextPage, + }) + await render() + expect(document.body.textContent).toContain('Engineering') + expect(document.body.textContent).toContain('Could not load more sources') + await act(async () => buttons('Try again')[0].click()) + expect(fetchNextPage).toHaveBeenCalledOnce() + }) }) diff --git a/apps/sim/app/o/[organizationId]/integrations/integrations.tsx b/apps/sim/app/o/[organizationId]/integrations/integrations.tsx index 6f97d138d01..8f5cdfa6634 100644 --- a/apps/sim/app/o/[organizationId]/integrations/integrations.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/integrations.tsx @@ -4,7 +4,6 @@ import { useMemo } from 'react' import { Chip } from '@sim/emcn' import type { ResourceScope } from '@/lib/core/resource-scope' import { - connectorDisplayName, getConnectorAccessAvailability, SEARCH_CONNECTORS, SEARCH_SOURCE_TYPES, @@ -14,6 +13,7 @@ import { useOrganizationPageFilters } from '@/app/o/[organizationId]/components/ import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' import { SourceSetupModal } from '@/app/workspace/[workspaceId]/home/components/search-sources/source-setup-modal' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' +import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' import { SearchSourceRow } from '@/app/workspace/[workspaceId]/search/components/search-source-row' import { SettingsEmptyState, @@ -23,7 +23,11 @@ import { RESOURCE_LIST_STACK, SettingsResourceRow, } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' -import { searchSourceKeys, useSearchSources } from '@/hooks/queries/kb/connectors' +import { + searchSourceKeys, + useSearchSourceOverview, + useSearchSources, +} from '@/hooks/queries/kb/connectors' import { useSearchIntegrations } from '@/hooks/queries/search-integrations' import { useMemberEnrollment } from '@/hooks/use-member-enrollment' import { useDesktopOAuthConnectListener, useOAuthReturnRouter } from '@/hooks/use-oauth-return' @@ -45,10 +49,11 @@ export function OrganizationIntegrations() { useDesktopOAuthConnectListener() const { organization, searchAccess } = useOrganizationContext() const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } - const sources = useSearchSources(scope) + const { tab, search } = useOrganizationPageFilters() + const sources = useSearchSources(scope, { search, mine: tab === 'mine' }) + const overview = useSearchSourceOverview(scope) const integrations = useSearchIntegrations(organization.id) const availability = usePermissionConfig() - const { tab, search } = useOrganizationPageFilters() const membershipQueryKeys = useMemo( () => [searchSourceKeys.list({ kind: 'organization', organizationId: organization.id })], [organization.id] @@ -65,21 +70,16 @@ export function OrganizationIntegrations() { const enrollment = useMemberEnrollment({ membershipQueryKeys, connectedConnectorIds }) const query = search.trim().toLowerCase() const mineOnly = tab === 'mine' - const visibleSources = - sources.data?.filter( - (source) => - (!mineOnly || source.viewerMembership === 'connected') && - `${connectorDisplayName(source.connectorType)} ${source.sourceDescription}` - .toLowerCase() - .includes(query) - ) ?? [] + const visibleSources = sources.data ?? [] const approvedTypes = new Set( integrations.data ?.filter((integration) => integration.approved) .map((integration) => integration.connectorType) ) - const configuredTypes = new Set(sources.data?.map((source) => source.connectorType)) + const configuredTypes = new Set( + overview.data?.providers.map((provider) => provider.connectorType) + ) const unconfigured = mineOnly ? [] : SEARCH_SOURCE_TYPES.filter( @@ -88,7 +88,14 @@ export function OrganizationIntegrations() { !configuredTypes.has(type) && meta.name.toLowerCase().includes(query) ) - const failedQuery = sources.isError ? sources : integrations.isError ? integrations : null + const failedQuery = + sources.isError && !sources.isFetchNextPageError + ? sources + : overview.isError + ? overview + : integrations.isError + ? integrations + : null return ( void failedQuery.refetch()} variant='inline' /> - ) : visibleSources.length > 0 || unconfigured.length > 0 ? ( + ) : availability.integrationAvailabilityError ? ( + void availability.refetchIntegrationAvailability()} + variant='inline' + /> + ) : sources.isPending || + overview.isPending || + integrations.isPending || + !availability.isIntegrationAvailabilityReady ? ( + Loading sources… + ) : visibleSources.length > 0 || unconfigured.length > 0 || sources.hasNextPage ? ( <> {unconfigured.map(([type, meta]) => { const connector = SEARCH_CONNECTORS.find((item) => item.type === type) @@ -162,8 +182,9 @@ export function OrganizationIntegrations() { onConnect={() => enrollment.connect(source.knowledgeBaseId, source.connectorId)} /> ))} + - ) : sources.isPending || integrations.isPending ? null : ( + ) : ( {query ? 'No matching sources.' diff --git a/apps/sim/app/o/[organizationId]/search/search.test.tsx b/apps/sim/app/o/[organizationId]/search/search.test.tsx index ffe23679d40..24ef1c21007 100644 --- a/apps/sim/app/o/[organizationId]/search/search.test.tsx +++ b/apps/sim/app/o/[organizationId]/search/search.test.tsx @@ -23,7 +23,7 @@ vi.mock('@/app/o/[organizationId]/providers/organization-provider', () => ({ vi.mock('@/hooks/queries/kb/knowledge', () => ({ useWorkspaceKnowledgeSearch: mocks.search })) vi.mock('@/hooks/queries/kb/connectors', () => ({ useSearchIndex: () => ({ data: { knowledgeBaseId: 'index-a' }, isPending: false }), - useSearchSources: () => ({ data: [] }), + useSearchSourceOverview: () => ({ data: { providers: [], hasSearchableDocuments: true } }), })) vi.mock('@/app/workspace/[workspaceId]/home/components/search-sources', () => ({ isIndexing: () => false, diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx index 18447f7bc37..c1a132931ee 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx @@ -8,6 +8,7 @@ import { getConnectorAccessAvailability, SEARCH_SOURCE_TYPES } from '@/lib/sim-s import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' import { OrganizationSlackAccountSetup } from '@/app/o/[organizationId]/settings/components/integrations/slack-account-setup' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' +import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' import { SearchSourceRow } from '@/app/workspace/[workspaceId]/search/components/search-source-row' import { SearchSourceSetup } from '@/app/workspace/[workspaceId]/search/components/search-source-setup' import { @@ -83,7 +84,12 @@ export function OrganizationIntegrationsSetup() { const approvals = new Map( integrations.data?.map((integration) => [integration.connectorType, integration.approved]) ) - const failedQuery = sources.isError ? sources : integrations.isError ? integrations : null + const failedQuery = + sources.isError && !sources.isFetchNextPageError + ? sources + : integrations.isError + ? integrations + : null const confirmApproval = () => { if (!pendingApproval) return @@ -202,6 +208,7 @@ export function OrganizationIntegrationsSetup() { ) }) )} + {!failedQuery && !integrationAvailabilityError && } {enrollment.error && (

    {enrollment.error}

    )} diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/index.ts b/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/index.ts index a170379c468..87b655dba7b 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/index.ts +++ b/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/index.ts @@ -1,5 +1,4 @@ export { groupResultsByDocument, - indexingSourceNames, KnowledgeSearchResults, } from './knowledge-search-results' diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.test.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.test.tsx index 0be852d394d..f41648b121d 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.test.tsx @@ -1,67 +1,71 @@ -/** - * @vitest-environment jsdom - */ -import { describe, expect, it, vi } from 'vitest' -import type { WorkspaceMemberConnector } from '@/hooks/queries/kb/connectors' +/** @vitest-environment jsdom */ +import { act } from 'react' +import { NuqsTestingAdapter } from 'nuqs/adapters/testing' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -vi.mock('@/hooks/queries/kb/connectors', () => ({ useWorkspaceMemberConnectors: vi.fn() })) -vi.mock('@/hooks/queries/kb/knowledge', () => ({ - useKnowledgeBasesQuery: vi.fn(), - useWorkspaceKnowledgeSearch: vi.fn(), +const mocks = vi.hoisted(() => ({ overview: vi.fn() })) +vi.mock('@/hooks/queries/kb/connectors', () => ({ + useSearchIndex: () => ({ data: { knowledgeBaseId: 'index' }, isPending: false }), + useSearchSourceOverview: mocks.overview, })) -vi.mock('@/app/workspace/[workspaceId]/providers/workspace-host-provider', () => ({ - useWorkspaceHostContext: vi.fn(), +vi.mock('@/hooks/queries/kb/knowledge', () => ({ + useWorkspaceKnowledgeSearch: () => ({ + data: [], + isPending: false, + isFetching: false, + isError: false, + }), })) vi.mock( '@/app/workspace/[workspaceId]/home/components/message-content/components/source-card', () => ({ SourceCard: () => null }) ) -import { indexingSourceNames } from '@/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results' +import { KnowledgeSearchResults } from '@/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results' -function memberConnector( - overrides: Partial = {} -): WorkspaceMemberConnector { - return { - knowledgeBaseId: 'kb-1', - knowledgeBaseName: 'Sim Search', - connectorId: 'connector-1', - connectorType: 'google_drive', - memberSyncStatus: 'running', - viewerMembership: 'connected', - viewerDocumentCount: 0, - ...overrides, - } -} - -describe('indexingSourceNames', () => { - it('names each source still indexing for the viewer once, in the searched bases only', () => { - const names = indexingSourceNames( - [ - memberConnector({ connectorId: 'a', connectorType: 'google_drive' }), - memberConnector({ - connectorId: 'b', - connectorType: 'google_drive', - knowledgeBaseId: 'kb-2', - }), - memberConnector({ connectorId: 'c', connectorType: 'slack', memberSyncStatus: 'pending' }), - memberConnector({ connectorId: 'd', connectorType: 'notion', knowledgeBaseId: 'kb-3' }), - ], - ['kb-1', 'kb-2'] +let root: Root +let container: HTMLDivElement +beforeEach(() => { + vi.clearAllMocks() + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + container = document.createElement('div') + root = createRoot(container) +}) +afterEach(() => { + act(() => root.unmount()) + vi.unstubAllGlobals() +}) +async function render() { + await act(async () => + root.render( + + + ) + ) +} - expect(names).toEqual(['Google Drive', 'Slack']) - }) - - it('ignores sources that are idle or not connected for the viewer', () => { - expect( - indexingSourceNames( - [ - memberConnector({ connectorId: 'a', memberSyncStatus: 'idle' }), - memberConnector({ connectorId: 'b', viewerMembership: 'invited' }), +describe('source indexing context in search results', () => { + it('uses provider overview state independently of loaded source pages', async () => { + mocks.overview.mockReturnValue({ + data: { + providers: [ + { connectorType: 'google_drive', isSyncing: true }, + { connectorType: 'slack', isSyncing: false }, ], - ['kb-1'] - ) - ).toEqual([]) + hasSearchableDocuments: false, + }, + }) + await render() + expect(mocks.overview).toHaveBeenCalledWith({ kind: 'workspace', workspaceId: 'workspace' }) + expect(container.textContent).toContain('Google Drive') + expect(container.textContent).not.toContain('Slack') + }) + it('does not invent indexing progress while the overview is unavailable', async () => { + mocks.overview.mockReturnValue({ data: undefined }) + await render() + expect(container.textContent).not.toContain('Still indexing') + expect(container.textContent).toContain('No documents you can read match') }) }) diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.tsx index f72a679abe5..ecaba9120c2 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/knowledge-search-results/knowledge-search-results.tsx @@ -16,17 +16,12 @@ import { isHttpUrl, type SourceTagData, } from '@/app/workspace/[workspaceId]/home/components/message-content/components/special-tags' -import { isIndexing } from '@/app/workspace/[workspaceId]/home/components/search-sources' import { resourceUrlKeys, searchFilterParsers, UPDATED_WINDOWS, } from '@/app/workspace/[workspaceId]/home/search-params' -import { - useSearchIndex, - useSearchSources, - type WorkspaceMemberConnector, -} from '@/hooks/queries/kb/connectors' +import { useSearchIndex, useSearchSourceOverview } from '@/hooks/queries/kb/connectors' import { useWorkspaceKnowledgeSearch } from '@/hooks/queries/kb/knowledge' /** Filters appear only once a list is long and mixed enough for them to help. */ @@ -52,25 +47,6 @@ export function groupResultsByDocument( return grouped } -/** - * The names of the sources still indexing for the viewer among the bases the - * search spans, each once. A base outside the search cannot grow its results, - * so its indexing is not the reader's concern here. - */ -export function indexingSourceNames( - memberConnectors: readonly WorkspaceMemberConnector[], - knowledgeBaseIds: readonly string[] -): string[] { - const searched = new Set(knowledgeBaseIds) - return [ - ...new Set( - memberConnectors - .filter((connection) => searched.has(connection.knowledgeBaseId) && isIndexing(connection)) - .map((connection) => connectorDisplayName(connection.connectorType)) - ), - ] -} - /** * A result as the source card renders it: the row's second line names the * source app, or the knowledge base for an upload. Without an HTTP(S) source @@ -162,14 +138,10 @@ export function KnowledgeSearchResults({ isError: searchFailed, refetch: refetchSearch, } = useWorkspaceKnowledgeSearch(scope, query, searchFilters) - const { data: sources = [] } = useSearchSources(scope) - const indexing = [ - ...new Set( - sources - .filter((source) => source.isSyncing) - .map((source) => connectorDisplayName(source.connectorType)) - ), - ] + const { data: overview } = useSearchSourceOverview(scope) + const indexing = (overview?.providers ?? []) + .filter((provider) => provider.isSyncing) + .map((provider) => connectorDisplayName(provider.connectorType)) const documents = useMemo(() => groupResultsByDocument(results ?? []), [results]) const sourceTypes = [ ...new Set([ diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx index 3eadd3aeb1f..3ea14b0499c 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx @@ -11,6 +11,7 @@ const mocks = vi.hoisted(() => ({ create: vi.fn(), accountsQuery: vi.fn(), configFields: vi.fn(), + resolveSourceConfig: vi.fn((): Record => ({})), credentials: [] as Pick[], memberAccess: true, mirroredAccess: true, @@ -149,7 +150,7 @@ vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config isFieldPopulated: () => true, handleFieldChange: vi.fn(), toggleCanonicalMode: vi.fn(), - resolveSourceConfig: () => ({}), + resolveSourceConfig: mocks.resolveSourceConfig, }), })) @@ -212,6 +213,24 @@ afterEach(async () => { }) describe('Slack member setup readiness', () => { + it('persists selector display metadata alongside the unchanged provider selection', async () => { + mocks.accountState = 'ready' + const sourceConfig = { + channel: ['channel-1'], + _sourceLabels: { + identity: 'saved-config-identity', + fields: { channel: [{ id: 'channel-1', label: 'Engineering' }] }, + }, + } + mocks.resolveSourceConfig.mockReturnValueOnce(sourceConfig) + await render() + await act(async () => button('Create & Invite').click()) + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ sourceConfig }), + expect.any(Object) + ) + }) + it('uses the organization account container and returns to organization setup', async () => { await render({ scope: { kind: 'organization', organizationId: 'org-1' } }) expect(mocks.accountsQuery).toHaveBeenCalledWith('org-1') diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx index 3647fff9111..a1cf0802f76 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx @@ -267,6 +267,7 @@ export function AddConnectorModal({ const { sourceConfig, setSourceConfig, + selectionLabels, canonicalModes, setCanonicalModes, canonicalGroups, @@ -280,6 +281,7 @@ export function AddConnectorModal({ accessMode: access.accessMode, initialSourceConfig: draft?.sourceConfig, initialCanonicalModes: draft?.canonicalModes, + initialSelectionLabels: draft?.selectionLabels, }) const indexingCredentialId = isApiKeyMode @@ -307,6 +309,7 @@ export function AddConnectorModal({ if (!setupDraftKey) return useConnectorSetupStore.getState().saveDraft(setupDraftKey, { sourceConfig, + selectionLabels, canonicalModes, accessMode: access.accessMode, credentialId: effectiveCredentialId, diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx index 949bf11d37d..693d235af7a 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx @@ -5,6 +5,7 @@ import { ArrowLeftRight, CircleInfo } from '@sim/emcn/icons' import type { ConnectorAccessMode } from '@/lib/api/contracts/knowledge/connectors' import type { ResourceScope } from '@/lib/core/resource-scope' import type { SelectorKey } from '@/lib/selectors/manifest' +import type { SourceSelectionLabel } from '@/lib/sim-search/source-identity' import { isConnectorFieldRequired } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access' import { ConnectorSelectorField } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field' import type { @@ -29,7 +30,11 @@ export interface ConnectorConfigFieldsProps { /** Visibility predicate honoring `condition` / canonical mode. */ isFieldVisible: (field: ConnectorConfigField) => boolean /** Field value change handler. */ - onFieldChange: (fieldId: string, value: ConfigFieldValue) => void + onFieldChange: ( + fieldId: string, + value: ConfigFieldValue, + selectedOptions?: SourceSelectionLabel[] + ) => void /** Swaps a canonical pair between selector and manual input. */ onToggleCanonicalMode: (canonicalId: string) => void /** Disables configuration fields during submission. */ @@ -129,7 +134,9 @@ export function ConnectorConfigFields({ scope={scope} field={field as ConnectorConfigField & { selectorKey: SelectorKey }} value={sourceConfig[field.id] ?? (field.multi ? [] : '')} - onChange={(value: ConfigFieldValue) => onFieldChange(field.id, value)} + onChange={(value, selectedOptions) => + onFieldChange(field.id, value, selectedOptions) + } credentialId={credentialId} sourceConfig={sourceConfig} configFields={connectorConfig.configFields} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx new file mode 100644 index 00000000000..3078031d695 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx @@ -0,0 +1,86 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { createRoot } from 'react-dom/client' +import { expect, it, vi } from 'vitest' +import type { ConnectorConfigField } from '@/connectors/types' + +const mocks = vi.hoisted(() => ({ + combobox: vi.fn((_props: ComboboxCallbacks) => null), + change: vi.fn(), +})) + +vi.mock('@sim/emcn', () => ({ ChipCombobox: mocks.combobox })) +vi.mock('next/navigation', () => ({ useParams: () => ({ workspaceId: 'workspace-1' }) })) +vi.mock('@/lib/selectors/context', () => ({ projectSelectorContext: () => ({}) })) +vi.mock('@/lib/selectors/manifest', () => ({ + getSelectorManifestEntry: () => ({ resolvesUnknownIds: false }), +})) +vi.mock('@/hooks/use-debounce', () => ({ useDebounce: (value: string) => value })) +vi.mock('@/hooks/queries/selectors', () => ({ + useSelectorOptions: () => ({ + data: [{ id: 'folder-b', label: 'Company docs', secret: 'not display metadata' }], + error: null, + truncated: false, + }), + useSelectorOptionDetails: () => ({ data: [{ id: 'folder-a', label: 'Engineering' }] }), + useSelectorOptionDetail: () => ({}), +})) + +import { ConnectorSelectorField } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field' + +interface ComboboxCallbacks { + onChange?: (value: string) => void + onMultiSelectChange?: (value: string[]) => void +} + +it.each([true, false])( + 'captures only selected ID/name pairs from existing options (multi: %s)', + async (multi) => { + const field: ConnectorConfigField & { selectorKey: 'google.drive' } = { + id: 'folderSelector', + title: 'Folders', + type: 'selector', + selectorKey: 'google.drive', + canonicalParamId: 'folderId', + multi, + } + const container = document.createElement('div') + document.body.appendChild(container) + const root = createRoot(container) + try { + await act(async () => + root.render( + + ) + ) + const callbacks = mocks.combobox.mock.lastCall![0] + if (multi) { + await act(async () => callbacks.onMultiSelectChange?.(['folder-a', 'folder-b'])) + expect(mocks.change).toHaveBeenLastCalledWith( + ['folder-a', 'folder-b'], + [ + { id: 'folder-a', label: 'Engineering' }, + { id: 'folder-b', label: 'Company docs' }, + ] + ) + } else { + await act(async () => callbacks.onChange?.('folder-b')) + expect(mocks.change).toHaveBeenLastCalledWith('folder-b', [ + { id: 'folder-b', label: 'Company docs' }, + ]) + } + } finally { + await act(async () => root.unmount()) + container.remove() + vi.clearAllMocks() + } + } +) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx index 4c338af4b09..536f8fe8e06 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx @@ -7,6 +7,7 @@ import { type ResourceScope, resourceScopeFromOwner } from '@/lib/core/resource- import { projectSelectorContext } from '@/lib/selectors/context' import { getSelectorManifestEntry, type SelectorKey } from '@/lib/selectors/manifest' import type { SelectorContext } from '@/lib/selectors/types' +import type { SourceSelectionLabel } from '@/lib/sim-search/source-identity' import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { getDependsOnFields } from '@/lib/workflows/subblocks/dependencies' import type { @@ -25,7 +26,7 @@ interface ConnectorSelectorFieldProps { scope?: ResourceScope field: ConnectorConfigField & { selectorKey: SelectorKey } value: ConfigFieldValue - onChange: (value: ConfigFieldValue) => void + onChange: (value: ConfigFieldValue, selectedOptions?: SourceSelectionLabel[]) => void credentialId: string | null sourceConfig: ConfigFieldMap configFields: ConnectorConfigField[] @@ -154,6 +155,14 @@ export function ConnectorSelectorField({ return extras.length > 0 ? [...extras, ...base] : base }, [options, selectedOptions, searchedOption]) + const handleChange = (nextValue: ConfigFieldValue) => { + const ids = new Set(Array.isArray(nextValue) ? nextValue : nextValue ? [nextValue] : []) + const selected = comboboxOptions + .filter((option) => ids.has(option.value)) + .map((option) => ({ id: option.value, label: option.label })) + onChange(nextValue, selected) + } + if (isMulti) { const multiValues = Array.isArray(value) ? value : value ? [value] : [] return ( @@ -161,7 +170,7 @@ export function ConnectorSelectorField({ multiSelect options={comboboxOptions} multiSelectValues={multiValues} - onMultiSelectChange={onChange} + onMultiSelectChange={handleChange} searchable onSearchChange={setSearchTerm} searchPlaceholder={`Search ${field.title.toLowerCase()}...`} @@ -189,7 +198,7 @@ export function ConnectorSelectorField({ ({ + query: vi.fn(), + retry: vi.fn(), + exclude: vi.fn(), + restore: vi.fn(), + refetch: vi.fn(), + fetchNextPage: vi.fn(), + excludeState: { error: null as Error | null, isPending: false, reset: vi.fn() }, + restoreState: { error: null as Error | null, isPending: false, reset: vi.fn() }, + retryState: { error: null as Error | null, isPending: false, reset: vi.fn() }, +})) +vi.mock('@/hooks/queries/kb/connectors', () => ({ + useConnectorDocuments: mocks.query, + useExcludeConnectorDocument: () => ({ ...mocks.excludeState, mutate: mocks.exclude }), + useRestoreConnectorDocument: () => ({ ...mocks.restoreState, mutate: mocks.restore }), +})) +vi.mock('@/hooks/queries/kb/knowledge', () => ({ + useUpdateDocument: () => ({ ...mocks.retryState, mutate: mocks.retry }), +})) + +import { ConnectorDocumentsTab } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab' + +let root: Root +function render() { + root = createRoot(document.createElement('div')) + rerender() +} +function rerender() { + act(() => + root.render( + + + + + + ) + ) +} +function button(name: string) { + const result = [...document.querySelectorAll('button')].find( + (node) => node.textContent?.trim() === name + ) + if (!result) throw new Error(`Missing button ${name}`) + return result +} +beforeEach(() => { + vi.clearAllMocks() + for (const state of [mocks.excludeState, mocks.restoreState, mocks.retryState]) { + state.error = null + state.isPending = false + state.reset.mockImplementation(() => { + state.error = null + }) + } + mocks.retry.mockReset() + mocks.query.mockReturnValue({ + data: { + pages: [ + { + documents: [ + { + id: 'failed', + filename: 'Handbook.txt', + processingStatus: 'failed', + userExcluded: false, + }, + { + id: 'ready', + filename: 'Guide.txt', + processingStatus: 'completed', + userExcluded: false, + }, + ], + counts: { active: 3, excluded: 0, failed: 1 }, + }, + ], + }, + isLoading: false, + isError: false, + isFetching: false, + hasNextPage: true, + isFetchingNextPage: false, + fetchNextPage: mocks.fetchNextPage, + refetch: mocks.refetch, + }) +}) +afterEach(() => { + if (root) act(() => root.unmount()) +}) + +describe('connector document recovery', () => { + it('shows the failed file and retries through the existing scoped document mutation', () => { + render() + expect(document.body.textContent).toContain('Indexing failed') + act(() => button('Retry indexing').click()) + expect(mocks.retry).toHaveBeenCalledWith({ + knowledgeBaseId: 'kb', + documentId: 'failed', + updates: { retryProcessing: true }, + }) + }) + it('requests failed documents from the server and hides healthy placeholder rows', () => { + render() + act(() => button('Failed (1)').click()) + expect(mocks.query).toHaveBeenLastCalledWith('kb', 'connector', { + includeExcluded: true, + failedOnly: true, + }) + expect(document.body.textContent).toContain('Handbook.txt') + expect(document.body.textContent).not.toContain('Guide.txt') + }) + it.each([false, true])( + 'clears prior action errors before retry (retry fails: %s)', + (retryFails) => { + mocks.excludeState.error = new Error('Previous exclusion failure') + if (retryFails) + mocks.retry.mockImplementation(() => { + mocks.retryState.error = new Error('New retry failure') + }) + render() + expect(document.body.textContent).toContain('Previous exclusion failure') + act(() => button('Retry indexing').click()) + rerender() + expect(document.body.textContent).not.toContain('Previous exclusion failure') + expect(document.body.textContent?.includes('New retry failure')).toBe(retryFails) + expect(mocks.excludeState.reset).toHaveBeenCalledOnce() + expect(mocks.restoreState.reset).toHaveBeenCalledOnce() + expect(mocks.retryState.reset).toHaveBeenCalledOnce() + } + ) + it('prevents conflicting recovery actions while any mutation is pending', () => { + mocks.excludeState.isPending = true + render() + expect(button('Retry indexing').disabled).toBe(true) + expect(button('Exclude').disabled).toBe(true) + }) + it('keeps the existing document pagination control', () => { + render() + act(() => button('Load more documents').click()) + expect(mocks.fetchNextPage).toHaveBeenCalledOnce() + }) + it('renders an actionable loading failure rather than claiming no documents exist', () => { + mocks.query.mockReturnValue({ + isError: true, + error: new Error('Unable to load'), + refetch: mocks.refetch, + isFetching: false, + }) + render() + expect(document.body.textContent).toContain('Unable to load') + expect(document.body.textContent).not.toContain('No documents yet') + act(() => button('Try again').click()) + expect(mocks.refetch).toHaveBeenCalledOnce() + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx new file mode 100644 index 00000000000..4f58a54b2b9 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx @@ -0,0 +1,180 @@ +'use client' + +import { useState } from 'react' +import { + ButtonGroup, + ButtonGroupItem, + Chip, + ChipLink, + ChipModalError, + ChipModalField, + Skeleton, +} from '@sim/emcn' +import { RefreshCw, SquareArrowUpRight } from '@sim/emcn/icons' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { + useConnectorDocuments, + useExcludeConnectorDocument, + useRestoreConnectorDocument, +} from '@/hooks/queries/kb/connectors' +import { useUpdateDocument } from '@/hooks/queries/kb/knowledge' + +interface ConnectorDocumentsTabProps { + knowledgeBaseId: string + connectorId: string +} + +export function ConnectorDocumentsTab({ + knowledgeBaseId, + connectorId, +}: ConnectorDocumentsTabProps) { + const [filter, setFilter] = useState<'active' | 'excluded' | 'failed'>('active') + const query = useConnectorDocuments(knowledgeBaseId, connectorId, { + includeExcluded: true, + failedOnly: filter === 'failed', + }) + const { data, isLoading, hasNextPage, isFetchingNextPage, fetchNextPage } = query + const excludeMutation = useExcludeConnectorDocument() + const restoreMutation = useRestoreConnectorDocument() + const retryMutation = useUpdateDocument() + const mutationError = excludeMutation.error ?? restoreMutation.error ?? retryMutation.error + const isRecoveryPending = + excludeMutation.isPending || restoreMutation.isPending || retryMutation.isPending + const documents = (data?.pages.flatMap((page) => page.documents) ?? []).filter((document) => + filter === 'excluded' + ? document.userExcluded + : !document.userExcluded && (filter !== 'failed' || document.processingStatus === 'failed') + ) + const counts = data?.pages[0]?.counts ?? { active: 0, excluded: 0, failed: 0 } + const visibleDocumentCount = counts[filter] + const hasMoreVisibleDocuments = Boolean(hasNextPage && documents.length < visibleDocumentCount) + + function resetRecoveryErrors() { + excludeMutation.reset() + restoreMutation.reset() + retryMutation.reset() + } + + if (isLoading) { + return ( + + + + + + ) + } + if (query.isError) { + return ( + query.refetch()} + fallback='Could not load documents' + /> + ) + } + + return ( + <> + + { + if (value === 'active' || value === 'excluded' || value === 'failed') setFilter(value) + }} + > + Active ({counts.active}) + Excluded ({counts.excluded}) + Failed ({counts.failed}) + +
    + {visibleDocumentCount === 0 ? ( + + {filter === 'excluded' + ? 'No excluded documents' + : filter === 'failed' + ? 'No failed documents' + : 'No documents yet'} + + ) : ( + documents.map((doc) => ( + + {doc.sourceUrl && ( + + )} + {doc.processingStatus === 'failed' && !doc.userExcluded && ( + { + resetRecoveryErrors() + retryMutation.mutate({ + knowledgeBaseId, + documentId: doc.id, + updates: { retryProcessing: true }, + }) + }} + > + Retry indexing + + )} + { + resetRecoveryErrors() + doc.userExcluded + ? restoreMutation.mutate({ + knowledgeBaseId, + connectorId, + documentIds: [doc.id], + }) + : excludeMutation.mutate({ + knowledgeBaseId, + connectorId, + documentIds: [doc.id], + }) + }} + > + {doc.userExcluded ? 'Restore' : 'Exclude'} + +
    + } + /> + )) + )} + {hasMoreVisibleDocuments && ( + fetchNextPage()}> + {isFetchingNextPage ? 'Loading…' : 'Load more documents'} + + )} +
    + + {mutationError?.message} + + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx index 60856bc70d6..4f8b2491e91 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx @@ -6,7 +6,6 @@ import { ButtonGroupItem, Chip, ChipCombobox, - ChipLink, ChipModal, ChipModalBody, ChipModalError, @@ -15,10 +14,8 @@ import { ChipModalHeader, ChipModalTabs, type ComboboxOption, - Skeleton, - Tooltip, } from '@sim/emcn' -import { Plus, RefreshCw, SquareArrowUpRight } from '@sim/emcn/icons' +import { Plus } from '@sim/emcn/icons' import { createLogger } from '@sim/logger' import type { ConnectorAccessMode } from '@/lib/api/contracts/knowledge/connectors' import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' @@ -29,6 +26,11 @@ import { type OAuthProvider, } from '@/lib/oauth' import { getConnectorAccessAvailability } from '@/lib/sim-search/connectors' +import { + readSourceSelectionLabels, + SOURCE_LABELS_KEY, + type SourceSelectionLabel, +} from '@/lib/sim-search/source-identity' import { ConnectServiceAccountModal, useServiceAccountConnectTarget, @@ -48,6 +50,7 @@ import { connectorSyncFrequencyHint, SYNC_INTERVALS, } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/consts' +import { ConnectorDocumentsTab } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab' import { MaxBadge } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/max-badge' import type { ConfigFieldMap, @@ -61,13 +64,7 @@ import { isConnectorCredentialTypeAllowed } from '@/connectors/auth' import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' import type { ConnectorConfigField, ConnectorMeta } from '@/connectors/types' import type { ConnectorData } from '@/hooks/queries/kb/connectors' -import { - useConnectorDocuments, - useExcludeConnectorDocument, - useRestoreConnectorDocument, - useUpdateConnector, - useUpdateConnectorAccess, -} from '@/hooks/queries/kb/connectors' +import { useUpdateConnector, useUpdateConnectorAccess } from '@/hooks/queries/kb/connectors' import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' import { usePermissionConfig } from '@/hooks/use-permission-config' @@ -82,7 +79,12 @@ const SWITCH_NOTICE: Record = { } /** Keys injected by the sync engine or modal state — not user-editable */ -const INTERNAL_CONFIG_KEYS = new Set(['tagSlotMapping', 'disabledTagIds', '_canonicalModes']) +const INTERNAL_CONFIG_KEYS = new Set([ + 'tagSlotMapping', + 'disabledTagIds', + '_canonicalModes', + SOURCE_LABELS_KEY, +]) const CANONICAL_MODES_KEY = '_canonicalModes' @@ -106,7 +108,7 @@ function readPersistedCanonicalModes( } /** - * Deep equality for sourceConfig values (string, string[], or undefined/null). + * Equality for sourceConfig values, including serialized source-label metadata. * * Empty string, empty array, and nullish are treated as equivalent to absence. * When either side is an array (multi-value field), both sides are normalized @@ -147,6 +149,7 @@ function valuesEqual(a: unknown, b: unknown): boolean { const setA = new Set(arrA) return arrB.every((v) => setA.has(v)) } + if (typeof a === 'object' || typeof b === 'object') return JSON.stringify(a) === JSON.stringify(b) return a === b } @@ -233,6 +236,9 @@ export function EditConnectorModal({ const [initialCanonicalModes] = useState>(() => readPersistedCanonicalModes(connector.sourceConfig) ) + const [initialSelectionLabels] = useState(() => + connectorConfig ? readSourceSelectionLabels(connectorConfig, connector.sourceConfig) : {} + ) const { sourceConfig, @@ -248,6 +254,7 @@ export function EditConnectorModal({ accessMode: access.accessMode, initialSourceConfig, initialCanonicalModes, + initialSelectionLabels, }) const { scope, canAdmin, memberAccessAvailable, mirroredAccessAvailable, hasMaxAccess } = @@ -380,6 +387,7 @@ export function EditConnectorModal({ } else { delete next[CANONICAL_MODES_KEY] } + if (next[SOURCE_LABELS_KEY] === null) delete next[SOURCE_LABELS_KEY] updates.sourceConfig = next } @@ -516,7 +524,7 @@ export function EditConnectorModal({ onWorkspaceCredentialChange={setWorkspaceCredentialId} /> ) : ( - + )} @@ -555,7 +563,11 @@ interface SettingsTabProps { canonicalGroups: Map canonicalModes: Record onToggleCanonicalMode: (canonicalId: string) => void - onFieldChange: (fieldId: string, value: ConfigFieldValue) => void + onFieldChange: ( + fieldId: string, + value: ConfigFieldValue, + selectedOptions?: SourceSelectionLabel[] + ) => void isFieldVisible: (field: ConnectorConfigField) => boolean syncInterval: number setSyncInterval: (v: number) => void @@ -859,108 +871,3 @@ function SettingsTab({ ) } - -interface DocumentsTabProps { - knowledgeBaseId: string - connectorId: string -} - -function DocumentsTab({ knowledgeBaseId, connectorId }: DocumentsTabProps) { - const [filter, setFilter] = useState<'active' | 'excluded'>('active') - - const { data, isLoading, hasNextPage, isFetchingNextPage, fetchNextPage } = useConnectorDocuments( - knowledgeBaseId, - connectorId, - { - includeExcluded: true, - } - ) - - const { mutate: excludeDoc, isPending: isExcluding } = useExcludeConnectorDocument() - const { mutate: restoreDoc, isPending: isRestoring } = useRestoreConnectorDocument() - - const documents = useMemo(() => { - const loadedDocuments = data?.pages.flatMap((page) => page.documents) ?? [] - return loadedDocuments.filter((document) => - filter === 'excluded' ? document.userExcluded : !document.userExcluded - ) - }, [data?.pages, filter]) - - const counts = data?.pages[0]?.counts ?? { active: 0, excluded: 0 } - const visibleDocumentCount = filter === 'excluded' ? counts.excluded : counts.active - const hasMoreVisibleDocuments = Boolean(hasNextPage && documents.length < visibleDocumentCount) - - if (isLoading) { - return ( -
    - - - - -
    - ) - } - - return ( -
    - setFilter(val as 'active' | 'excluded')}> - Active ({counts.active}) - Excluded ({counts.excluded}) - - -
    - {visibleDocumentCount === 0 ? ( -

    - {filter === 'excluded' ? 'No excluded documents' : 'No documents yet'} -

    - ) : ( -
    - {documents.map((doc) => ( -
    -
    - - {doc.filename} - - {doc.sourceUrl && ( - - - - - Open source document - - )} -
    - - doc.userExcluded - ? restoreDoc({ knowledgeBaseId, connectorId, documentIds: [doc.id] }) - : excludeDoc({ knowledgeBaseId, connectorId, documentIds: [doc.id] }) - } - > - {doc.userExcluded ? 'Restore' : 'Exclude'} - -
    - ))} - {hasMoreVisibleDocuments && ( - fetchNextPage()}> - {isFetchingNextPage ? 'Loading…' : 'Load more documents'} - - )} -
    - )} -
    -
    - ) -} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.test.tsx index 891a9178fbd..a78ea0bddc7 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.test.tsx @@ -7,6 +7,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('@/components/icons', () => ({ GmailIcon: () => null, GoogleDriveIcon: () => null })) +import { describeSearchSource, SOURCE_LABELS_KEY } from '@/lib/sim-search/source-identity' import { type UseConnectorConfigFieldsOptions, type UseConnectorConfigFieldsResult, @@ -168,4 +169,93 @@ describe('useConnectorConfigFields member configuration', () => { expect(current!.isFieldVisible(field)).toBe(true) expect(current!.resolveSourceConfig()).toMatchObject({ openSharing: 'domain' }) }) + + it('persists selector labels with the canonical IDs without changing provider values', () => { + render({ connectorConfig: googleDriveConnectorMeta }) + act(() => + current.handleFieldChange( + 'folderSelector', + ['folder-a'], + [{ id: 'folder-a', label: 'Engineering' }] + ) + ) + expect(current.resolveSourceConfig()).toMatchObject({ folderId: ['folder-a'] }) + expect(describeSearchSource(googleDriveConnectorMeta, current.resolveSourceConfig())).toBe( + 'Engineering' + ) + act(() => current.handleFieldChange('folderSelector', ['folder-b'])) + expect(current.resolveSourceConfig()[SOURCE_LABELS_KEY]).toBeNull() + expect(describeSearchSource(googleDriveConnectorMeta, current.resolveSourceConfig())).toBe( + '1 folder selected' + ) + }) + + it('discards names on manual mode changes and form resets', () => { + render({ connectorConfig: googleDriveConnectorMeta }) + act(() => + current.handleFieldChange( + 'folderSelector', + ['folder-a'], + [{ id: 'folder-a', label: 'Engineering' }] + ) + ) + act(() => current.toggleCanonicalMode('folderId')) + expect(current.selectionLabels).toEqual({}) + act(() => current.toggleCanonicalMode('folderId')) + expect(describeSearchSource(googleDriveConnectorMeta, current.resolveSourceConfig())).toBe( + '1 folder selected' + ) + act(() => + current.handleFieldChange( + 'folderSelector', + ['folder-a'], + [{ id: 'folder-a', label: 'Engineering' }] + ) + ) + act(() => current.setSourceConfig({})) + expect(current.selectionLabels).toEqual({}) + }) + + it('clears dependent selector labels together with their values', () => { + const meta: ConnectorMeta = { + ...googleDriveConnectorMeta, + configFields: [ + { id: 'host', title: 'Host', type: 'short-input' }, + ...googleDriveConnectorMeta.configFields.map((field) => + field.canonicalParamId === 'folderId' ? { ...field, dependsOn: ['host'] } : field + ), + ], + } + render({ connectorConfig: meta }) + act(() => current.handleFieldChange('host', 'one.example')) + act(() => + current.handleFieldChange( + 'folderSelector', + ['folder-a'], + [{ id: 'folder-a', label: 'Engineering' }] + ) + ) + act(() => current.handleFieldChange('host', 'two.example')) + expect(current.selectionLabels).toEqual({}) + expect(current.resolveSourceConfig()).toMatchObject({ folderId: [] }) + }) + + it('restores OAuth draft labels only when they match the restored selection', () => { + render({ + connectorConfig: googleDriveConnectorMeta, + initialSourceConfig: { folderSelector: ['folder-a'] }, + initialSelectionLabels: { folderId: [{ id: 'folder-a', label: 'Engineering' }] }, + }) + expect(describeSearchSource(googleDriveConnectorMeta, current.resolveSourceConfig())).toBe( + 'Engineering' + ) + act(() => + current.handleFieldChange( + 'folderSelector', + ['folder-a'], + [{ id: 'folder-b', label: 'Other docs' }] + ) + ) + expect(current.resolveSourceConfig()[SOURCE_LABELS_KEY]).toBeNull() + }) }) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.ts index d9c691186d2..66b298d6688 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields.ts @@ -2,6 +2,13 @@ import { useCallback, useMemo, useState } from 'react' import type { ConnectorAccessMode } from '@/lib/knowledge/connectors/access-modes' +import { + createSourceLabelMetadata, + normalizeSourceSelectionLabels, + SOURCE_LABELS_KEY, + type SourceSelectionLabel, + type SourceSelectionLabels, +} from '@/lib/sim-search/source-identity' import { getDependsOnFields } from '@/lib/workflows/subblocks/dependencies' import type { ConnectorConfigField, ConnectorMeta } from '@/connectors/types' @@ -13,17 +20,23 @@ export interface UseConnectorConfigFieldsOptions { accessMode?: ConnectorAccessMode initialSourceConfig?: ConfigFieldMap initialCanonicalModes?: Record + initialSelectionLabels?: SourceSelectionLabels } export interface UseConnectorConfigFieldsResult { sourceConfig: ConfigFieldMap + selectionLabels: SourceSelectionLabels setSourceConfig: React.Dispatch> canonicalModes: Record setCanonicalModes: React.Dispatch>> canonicalGroups: Map isFieldVisible: (field: ConnectorConfigField) => boolean isFieldPopulated: (field: ConnectorConfigField) => boolean - handleFieldChange: (fieldId: string, value: ConfigFieldValue) => void + handleFieldChange: ( + fieldId: string, + value: ConfigFieldValue, + selectedOptions?: SourceSelectionLabel[] + ) => void toggleCanonicalMode: (canonicalId: string) => void resolveSourceConfig: () => Record } @@ -74,8 +87,19 @@ export function useConnectorConfigFields({ accessMode = 'workspace', initialSourceConfig, initialCanonicalModes, + initialSelectionLabels, }: UseConnectorConfigFieldsOptions): UseConnectorConfigFieldsResult { - const [sourceConfig, setSourceConfig] = useState(() => initialSourceConfig ?? {}) + const [sourceConfig, setFieldValues] = useState(() => initialSourceConfig ?? {}) + const [selectionLabels, setSelectionLabels] = useState(() => + normalizeSourceSelectionLabels(initialSelectionLabels) + ) + const setSourceConfig = useCallback>>( + (value) => { + setFieldValues(value) + setSelectionLabels({}) + }, + [] + ) const [selectedCanonicalModes, setCanonicalModes] = useState< Record >(() => initialCanonicalModes ?? {}) @@ -167,8 +191,8 @@ export function useConnectorConfigFields({ ) const handleFieldChange = useCallback( - (fieldId: string, value: ConfigFieldValue) => { - setSourceConfig((prev) => { + (fieldId: string, value: ConfigFieldValue, selectedOptions?: SourceSelectionLabel[]) => { + setFieldValues((prev) => { const next: ConfigFieldMap = { ...prev, [fieldId]: value } const toClear = dependentFieldIds.get(fieldId) if (toClear) { @@ -176,11 +200,27 @@ export function useConnectorConfigFields({ } return next }) + setSelectionLabels((prev) => { + const next = { ...prev } + for (const id of [fieldId, ...(dependentFieldIds.get(fieldId) ?? [])]) { + delete next[fieldsById.get(id)?.canonicalParamId ?? id] + } + const canonicalId = fieldsById.get(fieldId)?.canonicalParamId ?? fieldId + return { + ...next, + ...normalizeSourceSelectionLabels({ [canonicalId]: selectedOptions }), + } + }) }, [dependentFieldIds, fieldsById] ) const toggleCanonicalMode = useCallback((canonicalId: string) => { + setSelectionLabels((prev) => { + const next = { ...prev } + delete next[canonicalId] + return next + }) setCanonicalModes((prev) => ({ ...prev, [canonicalId]: prev[canonicalId] === 'advanced' ? 'basic' : 'advanced', @@ -207,11 +247,14 @@ export function useConnectorConfigFields({ resolved[field.id] = coerceForField(field, raw) } } + resolved[SOURCE_LABELS_KEY] = + createSourceLabelMetadata(connectorConfig, resolved, selectionLabels) ?? null return resolved - }, [connectorConfig, canonicalGroups, canonicalModes, sourceConfig]) + }, [connectorConfig, canonicalGroups, canonicalModes, sourceConfig, selectionLabels]) return { sourceConfig, + selectionLabels, setSourceConfig, canonicalModes, setCanonicalModes, diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-pagination.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-pagination.tsx new file mode 100644 index 00000000000..eadc0096981 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-pagination.tsx @@ -0,0 +1,40 @@ +'use client' + +import { Chip } from '@sim/emcn' +import { SettingsQueryErrorState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' + +interface SearchSourcePaginationProps { + hasNextPage: boolean + isFetchingNextPage: boolean + isFetchNextPageError: boolean + error: Error | null + fetchNextPage: () => Promise +} + +/** Sparse filtered pages remain navigable until the server reaches the end of the source list. */ +export function SearchSourcePagination({ + hasNextPage, + isFetchingNextPage, + isFetchNextPageError, + error, + fetchNextPage, +}: SearchSourcePaginationProps) { + if (isFetchNextPageError) + return ( + void fetchNextPage()} + variant='inline' + /> + ) + if (!hasNextPage) return null + return ( +
    + void fetchNextPage()}> + {isFetchingNextPage ? 'Loading…' : 'Load more'} + +
    + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx index 0b63999ace1..68721239aff 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx @@ -28,6 +28,7 @@ function source(overrides: Partial = {}): SearchSourceSumma lastSyncAt: null, hasSyncError: false, viewerDocumentCount: 0, + viewerFailedDocumentCount: 0, viewerEmailVerified: true, connectionRequired: true, viewerMembership: 'invited', @@ -151,6 +152,14 @@ describe('Search source viewer actions', () => { status: 'Sync needs attention · 4 searchable documents', }, { change: { hasSyncError: true }, status: 'Sync needs admin attention' }, + { + change: { viewerFailedDocumentCount: 1 }, + status: "1 document couldn't be indexed", + }, + { + change: { viewerFailedDocumentCount: 2, viewerDocumentCount: 4 }, + status: "2 documents couldn't be indexed · 4 searchable documents", + }, { change: { isSyncing: true, viewerDocumentCount: 4 }, status: 'Indexing · 4 searchable documents', diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx index ddef9eaf919..52d08003e38 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx @@ -71,6 +71,8 @@ export function SearchSourceRow({ source.viewerDocumentCount > 0 ? `Sync needs attention · ${count}` : 'Sync needs admin attention' + else if (source.viewerFailedDocumentCount > 0) + status = `${source.viewerFailedDocumentCount} document${source.viewerFailedDocumentCount === 1 ? '' : 's'} couldn't be indexed${source.viewerDocumentCount > 0 ? ` · ${count}` : ''}` else if (source.isSyncing) status = source.viewerDocumentCount > 0 ? `Indexing · ${count}` : 'Indexing' else if (source.viewerDocumentCount > 0) status = count diff --git a/apps/sim/app/workspace/[workspaceId]/search/search.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/search.test.tsx index 4174837c1a9..5ae21c8ec08 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/search.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/search.test.tsx @@ -40,10 +40,14 @@ vi.mock('@/hooks/queries/workspace', () => ({ })) vi.mock('@/hooks/queries/kb/connectors', () => ({ searchSourceKeys: { list: (id: string) => ['search-sources', id] }, - useSearchSources: (id: string) => { - mocks.sourceQuery(id) + useSearchSources: (id: string, options: { search: string }) => { + mocks.sourceQuery(id, options) return { - data: mocks.sources, + data: mocks.sources.filter((source) => + `${source.connectorType.replaceAll('_', ' ')} ${source.sourceDescription}` + .toLowerCase() + .includes(options.search.trim().toLowerCase()) + ), isPending: mocks.sourcePending, isError: Boolean(mocks.sourceError), error: mocks.sourceError, @@ -168,7 +172,7 @@ describe('unified Search sources', () => { expect(button('Add source')).toBeUndefined() expect(button('Manage')).toBeUndefined() expect(button('Connect account')).toBeUndefined() - expect(mocks.sourceQuery).toHaveBeenCalledWith('workspace-1') + expect(mocks.sourceQuery).toHaveBeenCalledWith('workspace-1', { search: '' }) expect(mocks.setup).toHaveBeenLastCalledWith(expect.objectContaining({ canAdmin: false })) }) diff --git a/apps/sim/app/workspace/[workspaceId]/search/search.tsx b/apps/sim/app/workspace/[workspaceId]/search/search.tsx index ade6a98b472..76600a927b5 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/search.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/search.tsx @@ -11,6 +11,7 @@ import { IntegrationSection } from '@/app/workspace/[workspaceId]/integrations/c import { useScrollRestoration } from '@/app/workspace/[workspaceId]/integrations/hooks/use-scroll-restoration' import { useWorkspaceHostContext } from '@/app/workspace/[workspaceId]/providers/workspace-host-provider' import { MemberConnectorsSection } from '@/app/workspace/[workspaceId]/search/components/member-connectors-section/member-connectors-section' +import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' import { SearchSourceRow } from '@/app/workspace/[workspaceId]/search/components/search-source-row' import { SearchSourceSetup } from '@/app/workspace/[workspaceId]/search/components/search-source-setup' import { @@ -42,12 +43,12 @@ export function Search() { const mirroredAccessAvailable = features?.knowledgeSourceMirroredAccess === true const { data: permissions } = useWorkspacePermissionsQuery(workspaceId) const canAdmin = permissions?.viewer?.isAdmin ?? false - const sources = useSearchSources(workspaceId) const shared = useWorkspaceMemberConnectors(workspaceId, { enabled: memberAccessAvailable }) const [searchTerm, setSearchTermParam] = useQueryState(connectorSearchParam.key, { ...connectorSearchParam.parser, ...connectorSearchUrlKeys, }) + const sources = useSearchSources(workspaceId, { search: searchTerm }) const [, setSelectedType] = useQueryState( searchSetupParam.key, searchSetupParam.parser.withOptions({ history: 'replace' }) @@ -77,8 +78,7 @@ export function Search() { const normalizedSearch = searchTerm.trim().toLowerCase() const matches = (type: string, description: string) => `${connectorDisplayName(type)} ${description}`.toLowerCase().includes(normalizedSearch) - const visibleSources = - sources.data?.filter((source) => matches(source.connectorType, source.sourceDescription)) ?? [] + const visibleSources = sources.data ?? [] const sharedConnectors = memberAccessAvailable ? (shared.data?.filter( (source) => @@ -120,7 +120,7 @@ export function Search() { onChange={(event) => setSearchTerm(event.target.value)} /> - {sources.isError ? ( + {sources.isError && !sources.isFetchNextPageError ? ( void setManagedSource(source.connectorId, { history: 'push' })} /> )) - ) : ( + ) : !sources.hasNextPage ? ( {normalizedSearch ? 'No matching sources.' @@ -157,6 +157,9 @@ export function Search() { ? 'Add a source to start indexing documents for Search.' : 'Your workspace hasn’t added any sources yet. Ask a workspace admin to get started.'} + ) : null} + {(!sources.isError || sources.isFetchNextPageError) && ( + )} {memberAccessAvailable && diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.test.tsx new file mode 100644 index 00000000000..aa1203e2471 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.test.tsx @@ -0,0 +1,209 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { ToastProvider } from '@sim/emcn' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { MyInvitation } from '@/lib/api/contracts/invitations' + +const mocks = vi.hoisted(() => ({ + accept: vi.fn(), + decline: vi.fn(), + push: vi.fn(), + refetch: vi.fn(), + query: vi.fn(), + close: vi.fn(), +})) + +vi.mock('next/navigation', () => ({ + useRouter: () => ({ push: mocks.push }), + usePathname: () => '/workspace/workspace-1/home', +})) +vi.mock('@/hooks/queries/invitations', () => ({ + useMyPendingInvitations: mocks.query, + useAcceptMyInvitation: () => ({ isPending: false, mutateAsync: mocks.accept }), + useDeclineMyInvitation: () => ({ isPending: false, mutateAsync: mocks.decline }), +})) + +import { ViewInvitationsModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal' + +class ResizeObserverMock { + observe = vi.fn() + unobserve = vi.fn() + disconnect = vi.fn() +} + +let container: HTMLDivElement +let root: Root +let invitation: MyInvitation + +function button(label: string) { + return Array.from(document.body.querySelectorAll('button')).find( + (item) => item.textContent === label + ) +} + +async function renderModal() { + await act(async () => + root.render( + + + + ) + ) +} + +beforeEach(() => { + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + vi.stubGlobal('ResizeObserver', ResizeObserverMock) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + invitation = { + id: 'invitation-1', + kind: 'organization', + email: 'invitee@example.com', + organizationId: 'org-1', + organizationName: 'Target Team', + membershipIntent: 'internal', + role: 'admin', + status: 'pending', + expiresAt: '2026-10-01T00:00:00.000Z', + createdAt: '2026-09-01T00:00:00.000Z', + inviterName: 'Inviter', + inviterEmail: 'inviter@example.com', + grants: [], + joinPreview: { + outcome: 'will-join', + organizationName: 'Target Team', + workspacesToMove: ['Personal work', 'Archived project'], + workspaceIdsToMove: ['personal', 'archived'], + }, + } + mocks.query.mockImplementation(() => ({ + data: [invitation], + isPending: false, + isError: false, + isFetching: false, + refetch: mocks.refetch, + })) + mocks.accept.mockResolvedValue({ redirectPath: '/o/org-1/home' }) +}) + +afterEach(async () => { + await act(async () => root.unmount()) + container.remove() + vi.clearAllMocks() + vi.unstubAllGlobals() +}) + +describe('ViewInvitationsModal', () => { + it('discloses the complete migration and sends exactly those workspace IDs on acceptance', async () => { + await renderModal() + expect(document.body.textContent).toContain( + 'You will join Target Team as an organization admin' + ) + expect(document.body.textContent).toContain('including archived workspaces') + expect( + Array.from( + document.querySelectorAll('[aria-label="Workspaces moving into the organization"] li'), + (item) => item.textContent + ) + ).toEqual(['Personal work', 'Archived project']) + const disclosure = document.querySelector( + '[aria-label="Workspaces moving into the organization"]' + ) + expect(disclosure?.compareDocumentPosition(button('Accept')!)).toBe( + Node.DOCUMENT_POSITION_FOLLOWING + ) + expect(mocks.accept).not.toHaveBeenCalled() + await act(async () => button('Accept')?.click()) + expect(mocks.accept).toHaveBeenCalledWith({ + invitationId: 'invitation-1', + disclosedWorkspaceIds: ['personal', 'archived'], + disclosedOutcome: 'will-join', + }) + expect(mocks.push).toHaveBeenCalledWith('/o/org-1/home') + }) + + it('blocks an internal invitation with no preview and offers refresh', async () => { + invitation.joinPreview = null + await renderModal() + expect(document.body.textContent).toContain('We could not load how this invitation affects') + expect(button('Accept')?.disabled).toBe(true) + await act(async () => button('Accept')?.click()) + expect(mocks.accept).not.toHaveBeenCalled() + await act(async () => button('Refresh invitation')?.click()) + expect(mocks.refetch).toHaveBeenCalledOnce() + }) + + it.each([ + ['external', 'workspace access without joining an organization'], + ['already-member', 'Your organization role will stay the same'], + ['blocked', 'This invitation cannot currently be accepted'], + ] as const)('discloses %s and preserves its empty-set stale check', async (outcome, message) => { + invitation.joinPreview = { + outcome, + organizationName: null, + workspacesToMove: [], + workspaceIdsToMove: [], + } + await renderModal() + expect(document.body.textContent).toContain(message) + expect(document.body.textContent).not.toContain('as an organization admin') + await act(async () => button('Accept')?.click()) + expect(mocks.accept).toHaveBeenCalledWith({ + invitationId: 'invitation-1', + disclosedWorkspaceIds: [], + disclosedOutcome: outcome, + }) + }) + + it('describes an empty workspace migration without omitting its stale check', async () => { + invitation.joinPreview = { + outcome: 'will-join', + organizationName: 'Target Team', + workspacesToMove: [], + workspaceIdsToMove: [], + } + await renderModal() + expect(document.body.textContent).toContain('You have no personal workspaces to move') + await act(async () => button('Accept')?.click()) + expect(mocks.accept).toHaveBeenCalledWith({ + invitationId: 'invitation-1', + disclosedWorkspaceIds: [], + disclosedOutcome: 'will-join', + }) + }) + + it('shows loading rather than an empty list while invitations are pending', async () => { + mocks.query.mockReturnValue({ data: undefined, isPending: true, isError: false }) + await renderModal() + expect(document.body.textContent).toContain('Loading invitations') + expect(document.body.textContent).not.toContain('No pending invitations') + expect(button('Accept')).toBeUndefined() + }) + + it('retries fetch errors without claiming there are no invitations', async () => { + mocks.query.mockReturnValue({ + data: undefined, + isPending: false, + isError: true, + error: new Error('Invitations could not be loaded'), + isFetching: false, + refetch: mocks.refetch, + }) + await renderModal() + expect(document.body.textContent).toContain('Invitations could not be loaded') + expect(document.body.textContent).not.toContain('No pending invitations') + expect(button('Accept')).toBeUndefined() + await act(async () => button('Try again')?.click()) + expect(mocks.refetch).toHaveBeenCalledOnce() + }) + + it('shows an empty list only after a successful query', async () => { + mocks.query.mockReturnValue({ data: [], isPending: false, isError: false }) + await renderModal() + expect(document.body.textContent).toContain('No pending invitations') + expect(button('Accept')).toBeUndefined() + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.tsx index 090ca9e4b68..9dd8b438ef2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/pending-invitations/view-invitations-modal.tsx @@ -4,6 +4,7 @@ import { Chip, ChipModal, ChipModalBody, + ChipModalField, ChipModalFooter, ChipModalHeader, OverflowText, @@ -14,6 +15,11 @@ import { getErrorMessage } from '@sim/utils/errors' import { useRouter } from 'next/navigation' import type { MyInvitation } from '@/lib/api/contracts/invitations' import { getInvitationErrorMessage } from '@/lib/invitations/error-messages' +import { InvitationDisclosure } from '@/app/invite/components/invitation-disclosure' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' import { useAcceptMyInvitation, useDeclineMyInvitation, @@ -59,7 +65,8 @@ interface ViewInvitationsModalProps { * the joined workspace; declining keeps it open for the remaining rows. */ export function ViewInvitationsModal({ open, onOpenChange }: ViewInvitationsModalProps) { - const { data: invitations } = useMyPendingInvitations(open) + const invitationsQuery = useMyPendingInvitations(open) + const invitations = invitationsQuery.data ?? [] const acceptInvitation = useAcceptMyInvitation() const declineInvitation = useDeclineMyInvitation() const router = useRouter() @@ -67,6 +74,7 @@ export function ViewInvitationsModal({ open, onOpenChange }: ViewInvitationsModa const isBusy = acceptInvitation.isPending || declineInvitation.isPending const handleAccept = async (inv: MyInvitation) => { + if (isBusy || (inv.membershipIntent === 'internal' && !inv.joinPreview)) return try { const result = await acceptInvitation.mutateAsync({ invitationId: inv.id, @@ -102,39 +110,65 @@ export function ViewInvitationsModal({ open, onOpenChange }: ViewInvitationsModa onOpenChange(false)}>Invitations - {!invitations || invitations.length === 0 ? ( -

    No pending invitations.

    + {invitationsQuery.isError ? ( + void invitationsQuery.refetch()} + variant='inline' + /> + ) : invitationsQuery.isPending ? ( + Loading invitations… + ) : invitations.length === 0 ? ( + No pending invitations. ) : ( - invitations.map((inv) => ( -
    -
    - - + invitations.map((inv) => { + const isDisclosureMissing = inv.membershipIntent === 'internal' && !inv.joinPreview + return ( +
    +
    +
    + + +
    +
    + + + {isDisclosureMissing && ( + void invitationsQuery.refetch()} + > + Refresh invitation + + )} + +
    + void handleDecline(inv)} + aria-label={`Decline invitation to ${invitationLabel(inv)}`} + > + Decline + + void handleAccept(inv)} + > + Accept + +
    - void handleAccept(inv)} - className='shrink-0' - > - Accept - - void handleDecline(inv)} - aria-label={`Decline invitation to ${invitationLabel(inv)}`} - className='shrink-0' - > - Decline - -
    - )) + ) + }) )} ({ invalidateQueries: vi.fn(), })) +vi.mock('react', () => ({ useEffect: vi.fn() })) + vi.mock('@tanstack/react-query', () => ({ keepPreviousData: Symbol('keepPreviousData'), useInfiniteQuery: mocks.useInfiniteQuery, @@ -280,6 +282,34 @@ describe('useTriggerSync optimistic state', () => { * member-connector list, which has no poll of its own, so a members-mode * trigger patches that cache too and a refused trigger refetches it. */ + it('patches all loaded source pages without changing cursors or overview cache data', async () => { + mocks.getQueryData.mockReturnValue([makeConnector({ status: 'active' })]) + useTriggerSync() + await capturedMutationOptions().onMutate({ knowledgeBaseId: KB_ID, connectorId: 'connector-1' }) + const [filter, patch] = mocks.setQueriesData.mock.calls.find( + ([filter]) => filter.queryKey[0] === 'search-sources' + )! + const overviewKey = searchSourceKeys.overview('workspace-a') + const pagesKey = searchSourceKeys.pages('workspace-a', { search: '', mine: false }) + expect(filter.predicate({ queryKey: overviewKey })).toBe(false) + expect(filter.predicate({ queryKey: pagesKey })).toBe(true) + const cached = { + pageParams: [null, 'cursor'], + pages: [ + { sources: [{ connectorId: 'other', isSyncing: false }], nextCursor: 'cursor' }, + { sources: [{ connectorId: 'connector-1', isSyncing: false }], nextCursor: null }, + ], + } + expect(patch(cached)).toEqual({ + ...cached, + pages: [ + cached.pages[0], + { ...cached.pages[1], sources: [{ connectorId: 'connector-1', isSyncing: true }] }, + ], + }) + expect(patch(undefined)).toBeUndefined() + }) + it('queues a members connector in the workspace member-connector list as well', async () => { const existing = [ makeConnector({ id: 'connector-1', accessMode: 'members', memberSyncStatus: 'idle' }), @@ -359,10 +389,12 @@ describe('useConnectorDocuments', () => { const firstPage = { documents: [{ id: 'document-1' }, { id: 'document-2' }], counts: { active: 2, excluded: 1 }, + hasMore: true, } const finalPage = { documents: [{ id: 'document-3' }], counts: firstPage.counts, + hasMore: false, } mocks.requestJson.mockResolvedValue({ data: firstPage }) @@ -376,6 +408,7 @@ describe('useConnectorDocuments', () => { params: { id: 'knowledge-1', connectorId: 'connector-1' }, query: { includeExcluded: true, + failedOnly: false, limit: MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, offset: 200, }, @@ -399,7 +432,26 @@ describe('useConnectorDocuments', () => { }) }) +describe('connector document rolling compatibility', () => { + it('continues full legacy pages when the server omits continuation metadata', () => { + useConnectorDocuments(KB_ID, 'connector-1') + const options = mocks.useInfiniteQuery.mock.calls.at(-1)![0] + const page = { + documents: Array.from({ length: MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE }, (_, index) => ({ + id: `document-${index}`, + })), + } + expect(options.getNextPageParam(page, [page])).toBe(MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE) + expect(options.getNextPageParam({ documents: [] }, [page, { documents: [] }])).toBeUndefined() + expect(options.getNextPageParam({ ...page, hasMore: false }, [page])).toBeUndefined() + }) +}) + describe('useSearchSources', () => { + beforeEach(() => { + mocks.useQuery.mockReturnValue({ data: undefined, dataUpdatedAt: 0 }) + mocks.useInfiniteQuery.mockReturnValue({ data: undefined, dataUpdatedAt: 0 }) + }) it('isolates organization sources and resolves their index without listing workspace knowledge bases', async () => { const scope = { kind: 'organization' as const, organizationId: 'scope-1' } const signal = new AbortController().signal @@ -412,46 +464,66 @@ describe('useSearchSources', () => { signal, }) useSearchSources(scope) - const sources = mocks.useQuery.mock.calls.at(-1)?.[0] + const sources = mocks.useInfiniteQuery.mock.calls.at(-1)?.[0] expect(sources.queryKey).not.toEqual(searchSourceKeys.list('scope-1')) await sources.queryFn({ signal }) expect(mocks.requestJson).toHaveBeenLastCalledWith(listSearchSourcesContract, { - query: { organizationId: 'scope-1' }, + query: { organizationId: 'scope-1', search: '', mine: false }, signal, }) }) it('uses a workspace-specific key and forwards request cancellation', async () => { const signal = new AbortController().signal - mocks.requestJson.mockResolvedValueOnce({ data: [] }) + mocks.requestJson.mockResolvedValueOnce({ data: { sources: [], nextCursor: null } }) useSearchSources('workspace-a') - const options = mocks.useQuery.mock.calls.at(-1)?.[0] - expect(options.queryKey).toEqual(searchSourceKeys.list('workspace-a')) + const options = mocks.useInfiniteQuery.mock.calls.at(-1)?.[0] + expect(options.queryKey).toEqual( + searchSourceKeys.pages('workspace-a', { search: '', mine: false }) + ) expect(options.enabled).toBe(true) expect(options.staleTime).toBe(30_000) expect(options.placeholderData).toBeUndefined() - await expect(options.queryFn({ signal })).resolves.toEqual([]) + await expect(options.queryFn({ signal })).resolves.toEqual({ sources: [], nextCursor: null }) expect(mocks.requestJson).toHaveBeenCalledWith(listSearchSourcesContract, { - query: { workspaceId: 'workspace-a' }, + query: { workspaceId: 'workspace-a', search: '', mine: false }, signal, }) }) it('waits for a workspace and respects explicit disabling', () => { useSearchSources() - expect(mocks.useQuery.mock.calls.at(-1)?.[0].enabled).toBe(false) + expect(mocks.useInfiniteQuery.mock.calls.at(-1)?.[0].enabled).toBe(false) useSearchSources('') - expect(mocks.useQuery.mock.calls.at(-1)?.[0].enabled).toBe(false) + expect(mocks.useInfiniteQuery.mock.calls.at(-1)?.[0].enabled).toBe(false) useSearchSources('workspace-a', { enabled: false }) - expect(mocks.useQuery.mock.calls.at(-1)?.[0].enabled).toBe(false) + expect(mocks.useInfiniteQuery.mock.calls.at(-1)?.[0].enabled).toBe(false) }) it('polls while sources are syncing and stops after completion', () => { useSearchSources('workspace-a') - const options = mocks.useQuery.mock.calls.at(-1)?.[0] - expect(options.refetchInterval({ state: { data: [{ isSyncing: true }] } })).toBe( - CONNECTOR_SYNC_POLL_INTERVAL_MS - ) - expect(options.refetchInterval({ state: { data: [{ isSyncing: false }] } })).toBe(false) + const options = mocks.useInfiniteQuery.mock.calls.at(-1)?.[0] + expect( + options.refetchInterval({ state: { data: { pages: [{ sources: [{ isSyncing: true }] }] } } }) + ).toBe(30_000) + expect( + options.refetchInterval({ state: { data: { pages: [{ sources: [{ isSyncing: false }] }] } } }) + ).toBe(false) expect(options.refetchInterval({ state: {} })).toBe(false) }) + it('binds source pages to normalized filters and forwards the next cursor', async () => { + const signal = new AbortController().signal + useSearchSources('workspace-a', { search: ' Engineering ', mine: true }) + const options = mocks.useInfiniteQuery.mock.calls.at(-1)![0] + mocks.requestJson.mockResolvedValue({ data: { sources: [], nextCursor: 'next' } }) + await options.queryFn({ signal, pageParam: 'cursor' }) + expect(mocks.requestJson).toHaveBeenCalledWith(listSearchSourcesContract, { + query: { workspaceId: 'workspace-a', search: 'engineering', mine: true, cursor: 'cursor' }, + signal, + }) + expect(options.queryKey).toEqual( + searchSourceKeys.pages('workspace-a', { search: 'engineering', mine: true }) + ) + expect(options.getNextPageParam({ sources: [], nextCursor: 'next' })).toBe('next') + expect(options.getNextPageParam({ sources: [], nextCursor: null })).toBeNull() + }) }) diff --git a/apps/sim/hooks/queries/kb/connectors.ts b/apps/sim/hooks/queries/kb/connectors.ts index 7dee1f0a11e..149149a2771 100644 --- a/apps/sim/hooks/queries/kb/connectors.ts +++ b/apps/sim/hooks/queries/kb/connectors.ts @@ -1,4 +1,6 @@ +import { useEffect } from 'react' import { + type InfiniteData, keepPreviousData, type QueryClient, useInfiniteQuery, @@ -39,6 +41,10 @@ import { type PrepareSearchSourceBody, prepareSearchSourceContract, readSearchIndexContract, + readSearchSourceOverviewContract, + readSearchSourceProgressContract, + type SearchSourcePage, + type SearchSourceProgress, } from '@/lib/api/contracts/knowledge/connectors' import { type ResourceScope, @@ -46,7 +52,10 @@ import { resourceScopeFromOwner, resourceScopeKey, } from '@/lib/core/resource-scope' -import { MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE } from '@/lib/knowledge/constants' +import { + MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, + MAX_SEARCH_SOURCE_PROGRESS_ITEMS, +} from '@/lib/knowledge/constants' import { organizationAccountsKeys } from '@/hooks/queries/organization-accounts' import { credentialGroupKeys } from '@/hooks/queries/utils/credential-group-queries' import { knowledgeKeys } from '@/hooks/queries/utils/knowledge-keys' @@ -398,6 +407,17 @@ async function startConnectorMemberEnrollment({ export const searchSourceKeys = { all: ['search-sources'] as const, lists: () => [...searchSourceKeys.all, 'list'] as const, + progress: (scope: ResourceScope | undefined, connectorIds: string[]) => + [ + ...searchSourceKeys.all, + 'progress', + scope ? resourceScopeKey(scope) : '', + connectorIds, + ] as const, + pages: (scope: string | ResourceScope | undefined, filters: { search: string; mine: boolean }) => + [...searchSourceKeys.list(scope), 'pages', filters] as const, + overview: (scope?: string | ResourceScope) => + [...searchSourceKeys.list(scope), 'overview'] as const, list: (scope?: string | ResourceScope) => [ ...searchSourceKeys.lists(), @@ -429,29 +449,131 @@ export function useSearchIndex(scope: ResourceScope, options?: { enabled?: boole }) } -export function useSearchSources(owner?: string | ResourceScope, options?: { enabled?: boolean }) { +/** Full viewer counts update less often than bounded progress probes. */ +const SEARCH_SOURCE_SUMMARY_POLL_MS = 30_000 + +export function useSearchSourceOverview(scope: ResourceScope, options?: { enabled?: boolean }) { + return useQuery({ + queryKey: searchSourceKeys.overview(scope), + queryFn: async ({ signal }) => + ( + await requestJson(readSearchSourceOverviewContract, { + query: resourceScopeFields(scope), + signal, + }) + ).data, + enabled: options?.enabled ?? true, + staleTime: CONNECTOR_LIST_STALE_TIME, + refetchInterval: (query) => + query.state.data?.providers.some((provider) => provider.isSyncing) + ? SEARCH_SOURCE_SUMMARY_POLL_MS + : false, + }) +} + +export function useSearchSources( + owner?: string | ResourceScope, + options?: { enabled?: boolean; search?: string; mine?: boolean } +) { + const queryClient = useQueryClient() const scope = typeof owner === 'string' ? owner ? { kind: 'workspace' as const, workspaceId: owner } : undefined : owner - return useQuery({ - queryKey: searchSourceKeys.list(scope), - queryFn: async ({ signal }): Promise => + const workspaceId = scope?.kind === 'workspace' ? scope.workspaceId : undefined + const organizationId = scope?.kind === 'organization' ? scope.organizationId : undefined + const enabled = Boolean(scope) && (options?.enabled ?? true) + const filters = { + search: options?.search?.trim().toLowerCase() ?? '', + mine: options?.mine ?? false, + } + const summary = useInfiniteQuery({ + queryKey: searchSourceKeys.pages(scope, filters), + initialPageParam: null as string | null, + getNextPageParam: (page: SearchSourcePage) => page.nextCursor, + select: (data) => data.pages.flatMap((page) => page.sources), + queryFn: async ({ signal, pageParam }): Promise => ( await requestJson(listSearchSourcesContract, { - query: scope ? resourceScopeFields(scope) : {}, + query: { + ...(scope ? resourceScopeFields(scope) : {}), + ...filters, + ...(pageParam ? { cursor: pageParam } : {}), + }, signal, }) ).data, - enabled: Boolean(scope) && (options?.enabled ?? true), + enabled, staleTime: CONNECTOR_LIST_STALE_TIME, refetchInterval: (query) => - query.state.data?.some((source) => source.isSyncing) - ? CONNECTOR_SYNC_POLL_INTERVAL_MS + query.state.data?.pages.some((page) => page.sources.some((source) => source.isSyncing)) + ? SEARCH_SOURCE_SUMMARY_POLL_MS : false, }) + const activeIds = (summary.data ?? []) + .filter((source) => source.isSyncing) + .map((source) => source.connectorId) + .sort() + const progress = useQuery({ + queryKey: searchSourceKeys.progress(scope, activeIds), + queryFn: async ({ signal }) => { + if (!scope) throw new Error('A Search source scope is required') + const sources: SearchSourceProgress[] = [] + for (let offset = 0; offset < activeIds.length; offset += MAX_SEARCH_SOURCE_PROGRESS_ITEMS) { + const response = await requestJson(readSearchSourceProgressContract, { + body: { + ...resourceScopeFields(scope), + connectorIds: activeIds.slice(offset, offset + MAX_SEARCH_SOURCE_PROGRESS_ITEMS), + }, + signal, + }) + sources.push(...response.data) + } + return sources + }, + enabled: enabled && activeIds.length > 0, + staleTime: CONNECTOR_SYNC_POLL_INTERVAL_MS, + refetchInterval: (query) => + query.state.dataUpdateCount < 20 ? CONNECTOR_SYNC_POLL_INTERVAL_MS : 15_000, + }) + + /** Reconcile exact viewer counts when the cheaper probe observes a state transition. */ + useEffect(() => { + if (!enabled || !progress.data || progress.dataUpdatedAt <= summary.dataUpdatedAt) return + const states = new Map(progress.data.map((source) => [source.connectorId, source])) + const changed = summary.data?.some((source) => { + if (!source.isSyncing) return false + const state = states.get(source.connectorId) + return ( + !state || + state.isSyncing !== source.isSyncing || + state.hasSyncError !== source.hasSyncError || + state.hasIndexingError !== source.viewerFailedDocumentCount > 0 + ) + }) + if (changed) { + const owner = organizationId + ? { kind: 'organization' as const, organizationId } + : { kind: 'workspace' as const, workspaceId: workspaceId! } + queryClient.invalidateQueries( + { queryKey: searchSourceKeys.list(owner) }, + { cancelRefetch: false } + ) + } + }, [ + enabled, + progress.data, + progress.dataUpdatedAt, + summary.data, + summary.dataUpdatedAt, + queryClient, + workspaceId, + organizationId, + ]) + + return summary } export const memberConnectorKeys = { @@ -630,12 +752,20 @@ export function useTriggerSync() { queryClient.cancelQueries({ queryKey: memberConnectorKeys.lists() }), queryClient.cancelQueries({ queryKey: searchSourceKeys.lists() }), ]) - queryClient.setQueriesData( - { queryKey: searchSourceKeys.lists() }, - (sources) => - sources?.map((source) => - source.connectorId === connectorId ? { ...source, isSyncing: true } : source - ) + queryClient.setQueriesData>( + { queryKey: searchSourceKeys.lists(), predicate: (query) => query.queryKey[3] === 'pages' }, + (data) => + data + ? { + ...data, + pages: data.pages.map((page) => ({ + ...page, + sources: page.sources.map((source) => + source.connectorId === connectorId ? { ...source, isSyncing: true } : source + ), + })), + } + : data ) return optimisticallyQueueSync(queryClient, knowledgeBaseId, connectorId) }, @@ -676,14 +806,24 @@ export const connectorDocumentKeys = { [...connectorKeys.detail(knowledgeBaseId, connectorId), 'documents'] as const, lists: (knowledgeBaseId?: string, connectorId?: string) => [...connectorDocumentKeys.all(knowledgeBaseId, connectorId), 'list'] as const, - list: (knowledgeBaseId?: string, connectorId?: string, includeExcluded = false) => - [...connectorDocumentKeys.lists(knowledgeBaseId, connectorId), includeExcluded] as const, + list: ( + knowledgeBaseId?: string, + connectorId?: string, + includeExcluded = false, + failedOnly = false + ) => + [ + ...connectorDocumentKeys.lists(knowledgeBaseId, connectorId), + includeExcluded, + failedOnly, + ] as const, } async function fetchConnectorDocuments( knowledgeBaseId: string, connectorId: string, includeExcluded: boolean, + failedOnly: boolean, offset: number, signal?: AbortSignal ): Promise { @@ -691,6 +831,7 @@ async function fetchConnectorDocuments( params: { id: knowledgeBaseId, connectorId }, query: { includeExcluded, + failedOnly, limit: MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, offset, }, @@ -703,24 +844,27 @@ async function fetchConnectorDocuments( export function useConnectorDocuments( knowledgeBaseId?: string, connectorId?: string, - options?: { includeExcluded?: boolean } + options?: { includeExcluded?: boolean; failedOnly?: boolean } ) { const includeExcluded = options?.includeExcluded ?? false + const failedOnly = options?.failedOnly ?? false return useInfiniteQuery({ - queryKey: connectorDocumentKeys.list(knowledgeBaseId, connectorId, includeExcluded), + queryKey: connectorDocumentKeys.list(knowledgeBaseId, connectorId, includeExcluded, failedOnly), queryFn: ({ signal, pageParam }) => fetchConnectorDocuments( knowledgeBaseId as string, connectorId as string, includeExcluded, + failedOnly, pageParam, signal ), initialPageParam: 0, getNextPageParam: (lastPage, pages) => { const loadedCount = pages.reduce((total, page) => total + page.documents.length, 0) - const totalCount = lastPage.counts.active + (includeExcluded ? lastPage.counts.excluded : 0) - if (lastPage.documents.length === 0 || loadedCount >= totalCount) return undefined + const hasMore = + lastPage.hasMore ?? lastPage.documents.length === MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE + if (!hasMore || lastPage.documents.length === 0) return undefined return loadedCount }, enabled: Boolean(knowledgeBaseId && connectorId), diff --git a/apps/sim/hooks/queries/kb/knowledge.ts b/apps/sim/hooks/queries/kb/knowledge.ts index 750436ff322..b2d4ac8014b 100644 --- a/apps/sim/hooks/queries/kb/knowledge.ts +++ b/apps/sim/hooks/queries/kb/knowledge.ts @@ -62,6 +62,7 @@ import { resourceScopeKey, } from '@/lib/core/resource-scope' import type { DocumentSortField, SortOrder } from '@/lib/knowledge/documents/types' +import { connectorKeys, searchSourceKeys } from '@/hooks/queries/kb/connectors' import { folderKeys } from '@/hooks/queries/utils/folder-keys' import { KNOWLEDGE_BASE_LIST_STALE_TIME, @@ -556,6 +557,8 @@ export function useUpdateDocument() { queryClient.invalidateQueries({ queryKey: knowledgeKeys.documentLists(knowledgeBaseId), }) + queryClient.invalidateQueries({ queryKey: connectorKeys.all(knowledgeBaseId) }) + queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }) }, }) } diff --git a/apps/sim/hooks/queries/kb/search-source-progress.test.tsx b/apps/sim/hooks/queries/kb/search-source-progress.test.tsx new file mode 100644 index 00000000000..895826d3bbf --- /dev/null +++ b/apps/sim/hooks/queries/kb/search-source-progress.test.tsx @@ -0,0 +1,166 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ requestJson: vi.fn() })) +vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.requestJson })) + +import { searchSourceKeys, useSearchSources } from '@/hooks/queries/kb/connectors' + +let root: Root +let client: QueryClient +let syncing: boolean +let progressFails: boolean +let enabled: boolean + +function Probe() { + const result = useSearchSources('workspace', { enabled }) + return
    {result.data?.[0]?.viewerDocumentCount ?? 0}
    +} +async function advance(ms: number) { + await act(async () => { + await vi.advanceTimersByTimeAsync(ms) + }) +} +async function mount() { + root = createRoot(document.createElement('div')) + await act(async () => + root.render( + + + + ) + ) + await advance(1) +} +const calls = (suffix: string) => + mocks.requestJson.mock.calls.filter(([contract]) => contract.path.endsWith(suffix)) + +beforeEach(() => { + vi.useFakeTimers() + syncing = true + progressFails = false + enabled = true + client = new QueryClient({ + defaultOptions: { queries: { retry: false, gcTime: Number.POSITIVE_INFINITY } }, + }) + mocks.requestJson.mockReset().mockImplementation(async (contract) => { + if (contract.path.endsWith('/progress')) { + if (progressFails) throw new Error('Temporary progress error') + return { + data: [ + { + connectorId: 'source', + isSyncing: syncing, + hasSyncError: false, + hasIndexingError: false, + }, + ], + } + } + return { + data: { + sources: [ + { + connectorId: 'source', + isSyncing: syncing, + hasSyncError: false, + viewerFailedDocumentCount: 0, + viewerDocumentCount: syncing ? 0 : 1, + }, + ], + nextCursor: null, + }, + } + }) +}) +afterEach(() => { + if (root) act(() => root.unmount()) + client.clear() + vi.useRealTimers() +}) + +describe('source progress polling', () => { + it('checks progress without recounting every three seconds and slows long waits', async () => { + await mount() + for (let i = 0; i < 20; i++) await advance(3000) + expect(calls('/sources')).toHaveLength(3) + const progressCalls = calls('/progress').length + expect(progressCalls).toBeGreaterThanOrEqual(20) + await advance(3000) + expect(calls('/progress')).toHaveLength(progressCalls) + await advance(12_000) + expect(calls('/progress')).toHaveLength(progressCalls + 1) + expect(calls('/progress')[0][1]).toMatchObject({ + body: { workspaceId: 'workspace', connectorIds: ['source'] }, + signal: expect.any(AbortSignal), + }) + }) + it('refreshes exact counts at completion and stops both polls', async () => { + await mount() + syncing = false + await advance(3000) + await advance(1) + expect(calls('/sources')).toHaveLength(2) + expect( + client.getQueryData(searchSourceKeys.pages('workspace', { search: '', mine: false })) + ).toMatchObject({ + pages: [{ sources: [expect.objectContaining({ isSyncing: false, viewerDocumentCount: 1 })] }], + }) + const total = mocks.requestJson.mock.calls.length + await advance(60_000) + expect(mocks.requestJson).toHaveBeenCalledTimes(total) + }) + it('keeps periodic full reconciliation if the progress request fails', async () => { + progressFails = true + await mount() + syncing = false + await advance(30_000) + await advance(1) + expect(calls('/sources')).toHaveLength(2) + expect( + client.getQueryData(searchSourceKeys.pages('workspace', { search: '', mine: false })) + ).toMatchObject({ + pages: [{ sources: [expect.objectContaining({ isSyncing: false, viewerDocumentCount: 1 })] }], + }) + }) + it('lets a slow summary refresh finish while progress keeps polling', async () => { + const refresh = Promise.withResolvers() + const original = mocks.requestJson.getMockImplementation()! + const signals: AbortSignal[] = [] + mocks.requestJson.mockImplementation((contract, input) => { + if (contract.path.endsWith('/sources') && calls('/sources').length > 1) { + signals.push(input.signal) + return refresh.promise + } + return original(contract, input) + }) + await mount() + syncing = false + await advance(3000) + await advance(1) + await advance(3000) + await advance(3000) + expect(calls('/sources')).toHaveLength(2) + expect(signals).toHaveLength(1) + expect(signals[0].aborted).toBe(false) + await act(async () => refresh.resolve(await original({ path: '/sources' }, {}))) + await advance(1) + expect( + client.getQueryData(searchSourceKeys.pages('workspace', { search: '', mine: false })) + ).toMatchObject({ + pages: [{ sources: [expect.objectContaining({ isSyncing: false, viewerDocumentCount: 1 })] }], + }) + const total = mocks.requestJson.mock.calls.length + await advance(60_000) + expect(mocks.requestJson).toHaveBeenCalledTimes(total) + }) + it('does not poll on a disabled surface', async () => { + enabled = false + await mount() + await advance(60_000) + expect(mocks.requestJson).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/hooks/queries/search-integrations.ts b/apps/sim/hooks/queries/search-integrations.ts index 8f1740bff75..c1b7213617d 100644 --- a/apps/sim/hooks/queries/search-integrations.ts +++ b/apps/sim/hooks/queries/search-integrations.ts @@ -1,6 +1,6 @@ -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' +import { type InfiniteData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { requestJson } from '@/lib/api/client/request' -import type { SearchSourceSummary } from '@/lib/api/contracts/knowledge/connectors' +import type { SearchSourcePage } from '@/lib/api/contracts/knowledge/connectors' import { listSearchIntegrationsContract, type UpdateSearchIntegrationBody, @@ -30,8 +30,17 @@ export function useUpdateSearchIntegration() { (await requestJson(updateSearchIntegrationContract, { body })).data, onSuccess: async (_data, { organizationId }) => { const scope = { kind: 'organization', organizationId } as const - const sources = queryClient.getQueryData(searchSourceKeys.list(scope)) - const knowledgeBaseIds = new Set(sources?.map((source) => source.knowledgeBaseId)) + const pages = queryClient.getQueriesData>({ + queryKey: searchSourceKeys.list(scope), + predicate: (query) => query.queryKey[3] === 'pages', + }) + const knowledgeBaseIds = new Set( + pages.flatMap( + ([, data]) => + data?.pages.flatMap((page) => page.sources.map((source) => source.knowledgeBaseId)) ?? + [] + ) + ) await Promise.all([ queryClient.invalidateQueries({ queryKey: searchIntegrationKeys.list(organizationId) }), queryClient.invalidateQueries({ queryKey: searchSourceKeys.list(scope) }), diff --git a/apps/sim/lib/api/contracts/knowledge/connectors.ts b/apps/sim/lib/api/contracts/knowledge/connectors.ts index 94e25547784..89f9f7af06d 100644 --- a/apps/sim/lib/api/contracts/knowledge/connectors.ts +++ b/apps/sim/lib/api/contracts/knowledge/connectors.ts @@ -15,6 +15,9 @@ import { DEFAULT_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_MUTATION_ITEMS, MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, + MAX_SEARCH_SOURCE_PROGRESS_ITEMS, + MAX_SEARCH_SOURCE_PROVIDER_TYPES, + SEARCH_SOURCE_PAGE_SIZE, } from '@/lib/knowledge/constants' import { MEMBER_SYNC_STATUSES } from '@/lib/knowledge/types' @@ -61,6 +64,7 @@ export const deleteConnectorQuerySchema = z.object({ }) export const connectorDocumentsQuerySchema = z.object({ + failedOnly: booleanQueryFlagSchema.optional().default(false), includeExcluded: booleanQueryFlagSchema.optional(), limit: z.coerce .number() @@ -218,7 +222,12 @@ export type ConnectorDocumentData = z.output export const connectorDocumentsDataSchema = z.object({ documents: z.array(connectorDocumentDataSchema), - counts: z.object({ active: z.number(), excluded: z.number() }), + counts: z.object({ + active: z.number().int().nonnegative(), + excluded: z.number().int().nonnegative(), + failed: z.number().int().nonnegative().default(0), + }), + hasMore: z.boolean().optional(), }) export type ConnectorDocumentsData = z.output @@ -322,6 +331,7 @@ const searchSourceSummaryFields = { lastSyncAt: z.string().datetime().nullable(), hasSyncError: z.boolean(), viewerDocumentCount: z.number().int().nonnegative(), + viewerFailedDocumentCount: z.number().int().nonnegative().default(0), viewerEmailVerified: z.boolean(), } @@ -339,13 +349,74 @@ export const searchSourceSummarySchema = z.discriminatedUnion('connectionRequire ]) export type SearchSourceSummary = z.output +export const searchSourceCursorSchema = z.object({ + createdAt: z.string().datetime(), + id: knowledgeConnectorParamsSchema.shape.connectorId.max(255), + scope: z.string().min(1).max(64), +}) + +export const listSearchSourcesQuerySchema = resourceOwnerSchema.safeExtend({ + cursor: z.string().min(1).max(1024).optional(), + search: z.string().trim().max(200).optional(), + mine: booleanQueryFlagSchema.optional(), +}) +export type ListSearchSourcesQuery = z.input + +export const searchSourcePageSchema = z.object({ + sources: z.array(searchSourceSummarySchema).max(SEARCH_SOURCE_PAGE_SIZE), + nextCursor: z.string().max(1024).nullable(), +}) +export type SearchSourcePage = z.output + export const listSearchSourcesContract = defineRouteContract({ method: 'GET', path: '/api/knowledge/sim-search/sources', + query: listSearchSourcesQuerySchema, + response: { mode: 'json', schema: successResponseSchema(searchSourcePageSchema) }, +}) + +export const searchSourceOverviewSchema = z.object({ + providers: z + .array( + z.object({ + connectorType: z.string().min(1).max(100), + isSyncing: z.boolean(), + }) + ) + .max(MAX_SEARCH_SOURCE_PROVIDER_TYPES), + hasSearchableDocuments: z.boolean(), +}) +export type SearchSourceOverview = z.output + +export const readSearchSourceOverviewContract = defineRouteContract({ + method: 'GET', + path: '/api/knowledge/sim-search/sources/overview', query: resourceOwnerSchema, + response: { mode: 'json', schema: successResponseSchema(searchSourceOverviewSchema) }, +}) + +export const searchSourceProgressSchema = z.object({ + connectorId: knowledgeConnectorParamsSchema.shape.connectorId, + isSyncing: z.boolean(), + hasSyncError: z.boolean(), + hasIndexingError: z.boolean(), +}) +export type SearchSourceProgress = z.output + +export const readSearchSourceProgressContract = defineRouteContract({ + method: 'POST', + path: '/api/knowledge/sim-search/sources/progress', + body: resourceOwnerSchema.safeExtend({ + connectorIds: z + .array(knowledgeConnectorParamsSchema.shape.connectorId.max(255)) + .min(1) + .max(MAX_SEARCH_SOURCE_PROGRESS_ITEMS), + }), response: { mode: 'json', - schema: successResponseSchema(z.array(searchSourceSummarySchema)), + schema: successResponseSchema( + z.array(searchSourceProgressSchema).max(MAX_SEARCH_SOURCE_PROGRESS_ITEMS) + ), }, }) diff --git a/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts b/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts new file mode 100644 index 00000000000..7daf724f521 --- /dev/null +++ b/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts @@ -0,0 +1,486 @@ +import { db } from '@sim/db' +import { + document, + knowledgeBase, + knowledgeDocumentDispatch, + knowledgeDocumentDispatchOwner, + organization, + user, + workspace, +} from '@sim/db/schema' +import { generateId } from '@sim/utils/id' +import { and, eq, inArray, isNotNull, sql } from 'drizzle-orm' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const transport = vi.hoisted(() => ({ trigger: vi.fn(), retrieve: vi.fn() })) +vi.mock('@trigger.dev/sdk', () => ({ + tasks: { trigger: transport.trigger }, + runs: { retrieve: transport.retrieve }, +})) +vi.mock('@/lib/core/async-jobs/region', () => ({ resolveTriggerRegion: async () => 'us-east-1' })) + +import { + claimDocumentProcessingDispatches, + completeDocumentProcessingDispatch, + DOCUMENT_DISPATCH_MAX_OUTSTANDING, + DOCUMENT_DISPATCH_OWNER_OUTSTANDING, + dispatchQueuedDocumentProcessing, + documentDispatchIdempotencyKey, + documentDispatchOwnerKey, + enqueueDocumentProcessingContinuation, + enqueueDocumentProcessingDispatch, +} from '@/lib/knowledge/documents/processing-dispatch-queue' +import { + createCanonicalDocumentProcessingPayload, + createDocumentProcessingPayload, + type DocumentProcessingBillingContext, + type DocumentProcessingPayload, +} from '@/lib/knowledge/documents/processing-payload' + +describe('durable fair document admission', () => { + const fixtureUsers: string[] = [] + const fixtureOrganizations: string[] = [] + const fixtureWorkspaces: string[] = [] + const fixtureBases: string[] = [] + const fixtureOwners: string[] = [] + + beforeEach(() => { + vi.clearAllMocks() + transport.trigger.mockImplementation(async () => ({ id: `run_${generateId()}` })) + transport.retrieve.mockResolvedValue({ isCompleted: false }) + }) + + afterEach(async () => { + if (fixtureBases.length) { + await db + .delete(knowledgeDocumentDispatch) + .where(inArray(knowledgeDocumentDispatch.knowledgeBaseId, fixtureBases)) + await db.delete(knowledgeBase).where(inArray(knowledgeBase.id, fixtureBases)) + } + if (fixtureOwners.length) + await db + .delete(knowledgeDocumentDispatchOwner) + .where(inArray(knowledgeDocumentDispatchOwner.ownerKey, fixtureOwners)) + if (fixtureWorkspaces.length) + await db.delete(workspace).where(inArray(workspace.id, fixtureWorkspaces)) + if (fixtureOrganizations.length) + await db.delete(organization).where(inArray(organization.id, fixtureOrganizations)) + if (fixtureUsers.length) await db.delete(user).where(inArray(user.id, fixtureUsers)) + fixtureUsers.length = + fixtureOrganizations.length = + fixtureWorkspaces.length = + fixtureBases.length = + fixtureOwners.length = + 0 + }) + + async function createSource(kind: 'organization' | 'workspace' | 'personal' = 'organization') { + const actorUserId = generateId() + const organizationId = kind === 'organization' ? generateId() : null + const workspaceId = kind === 'workspace' ? generateId() : null + const knowledgeBaseId = generateId() + fixtureUsers.push(actorUserId) + fixtureBases.push(knowledgeBaseId) + await db.insert(user).values({ + id: actorUserId, + name: 'Dispatch fixture', + email: `${actorUserId}@fixture.test`, + emailVerified: true, + createdAt: new Date(), + updatedAt: new Date(), + }) + if (organizationId) { + fixtureOrganizations.push(organizationId) + await db + .insert(organization) + .values({ id: organizationId, name: 'Dispatch fixture', slug: organizationId }) + } + if (workspaceId) { + fixtureWorkspaces.push(workspaceId) + await db.insert(workspace).values({ + id: workspaceId, + name: 'Dispatch fixture', + ownerId: actorUserId, + billedAccountUserId: actorUserId, + }) + } + await db.insert(knowledgeBase).values({ + id: knowledgeBaseId, + userId: actorUserId, + organizationId, + workspaceId, + name: 'Dispatch fixture', + }) + const billingAttribution = { + actorUserId, + organizationId, + workspaceId, + billedAccountUserId: actorUserId, + billingEntity: organizationId + ? { type: 'organization' as const, id: organizationId } + : { type: 'user' as const, id: actorUserId }, + billingPeriod: { start: '2026-09-01T00:00:00.000Z', end: '2026-10-01T00:00:00.000Z' }, + payerSubscription: null, + } + const context: DocumentProcessingBillingContext = organizationId + ? { + billingScope: 'organization', + actorUserId, + organizationId, + workspaceId: null, + billingAttribution, + } + : workspaceId + ? { billingScope: 'workspace', actorUserId, workspaceId, billingAttribution } + : { billingScope: 'non-workspace', actorUserId, workspaceId: null } + const ownerKey = organizationId + ? `organization:${organizationId}` + : workspaceId + ? `workspace:${workspaceId}` + : `user:${actorUserId}` + fixtureOwners.push(ownerKey) + return { knowledgeBaseId, context, ownerKey } + } + + async function createDocuments(source: Awaited>, count: number) { + const payloads: DocumentProcessingPayload[] = [] + const rows: (typeof document.$inferInsert)[] = [] + for (let index = 0; index < count; index++) { + const documentId = generateId() + const requestId = generateId() + const processingQueuedAt = new Date() + const docData = { + filename: `Fixture ${index}.txt`, + fileUrl: '/api/files/serve/kb%2Ffixture', + fileSize: 12, + mimeType: 'text/plain', + } + rows.push({ + id: documentId, + knowledgeBaseId: source.knowledgeBaseId, + ...docData, + processingStatus: 'pending', + processingQueuedAt, + processingQueueToken: requestId, + }) + payloads.push( + createDocumentProcessingPayload( + { + knowledgeBaseId: source.knowledgeBaseId, + documentId, + requestId, + processingQueueToken: requestId, + processingQueuedAt: processingQueuedAt.toISOString(), + chargedAtDispatch: true, + docData, + processingOptions: {}, + }, + source.context + ) + ) + } + for (let offset = 0; offset < rows.length; offset += 500) { + await db.insert(document).values(rows.slice(offset, offset + 500)) + } + return payloads + } + + it('enforces owner and global outstanding budgets under concurrent claimers', async () => { + const sources = await Promise.all([createSource(), createSource(), createSource()]) + for (const source of sources) + await enqueueDocumentProcessingDispatch(await createDocuments(source, 30)) + await Promise.all(Array.from({ length: 6 }, () => claimDocumentProcessingDispatches())) + const active = await db + .select() + .from(knowledgeDocumentDispatch) + .where(isNotNull(knowledgeDocumentDispatch.dispatchedAt)) + expect(active).toHaveLength(DOCUMENT_DISPATCH_MAX_OUTSTANDING) + for (const source of sources) { + const count = active.filter((row) => row.ownerKey === source.ownerKey).length + expect(count).toBeGreaterThan(0) + expect(count).toBeLessThanOrEqual(DOCUMENT_DISPATCH_OWNER_OUTSTANDING) + } + }) + + it('lets one owner use available workers without queuing its entire corpus ahead of a newcomer', async () => { + const large = await createSource() + await enqueueDocumentProcessingDispatch(await createDocuments(large, 10_000)) + await claimDocumentProcessingDispatches() + const newcomer = await createSource() + const [newDocument] = await createDocuments(newcomer, 1) + await enqueueDocumentProcessingDispatch([newDocument]) + await claimDocumentProcessingDispatches() + const active = await db + .select() + .from(knowledgeDocumentDispatch) + .where(isNotNull(knowledgeDocumentDispatch.dispatchedAt)) + expect(active.filter((row) => row.ownerKey === large.ownerKey)).toHaveLength( + DOCUMENT_DISPATCH_OWNER_OUTSTANDING + ) + expect(active.some((row) => row.documentId === newDocument.documentId)).toBe(true) + }) + + it('keeps inline document bytes out of durable intents and Trigger requests', async () => { + const source = await createSource() + const [payload] = await createDocuments(source, 1) + const fileUrl = `data:text/plain;base64,${'a'.repeat(10 * 1024 * 1024 - 64)}` + payload.docData.fileUrl = fileUrl + await db.update(document).set({ fileUrl }).where(eq(document.id, payload.documentId)) + await enqueueDocumentProcessingDispatch([payload]) + const [claimed] = await claimDocumentProcessingDispatches() + expect(claimed.payload).toEqual(createCanonicalDocumentProcessingPayload(payload)) + expect(JSON.stringify(claimed).length).toBeLessThan(3000) + expect(await dispatchQueuedDocumentProcessing()).toEqual({ dispatched: 1 }) + const [, transmitted] = transport.trigger.mock.calls.find( + ([name]) => name === 'knowledge-process-document' + )! + expect(JSON.stringify(transmitted).length).toBeLessThan(2000) + expect(transmitted).not.toHaveProperty('docData') + const [persisted] = await db + .select({ fileUrlLength: sql`length(${document.fileUrl})::int` }) + .from(document) + .where(eq(document.id, payload.documentId)) + expect(persisted.fileUrlLength).toBe(fileUrl.length) + }) + + it('bounds stale pruning per owner and rotates stale-only owners ahead of the next pump', async () => { + const staleOwners = [] + for (let index = 0; index < DOCUMENT_DISPATCH_MAX_OUTSTANDING; index++) { + const source = await createSource() + staleOwners.push(source) + const payloads = await createDocuments(source, DOCUMENT_DISPATCH_OWNER_OUTSTANDING + 5) + await enqueueDocumentProcessingDispatch(payloads) + await db + .update(document) + .set({ deletedAt: new Date() }) + .where(eq(document.knowledgeBaseId, source.knowledgeBaseId)) + } + const newcomer = await createSource() + const [payload] = await createDocuments(newcomer, 1) + await enqueueDocumentProcessingDispatch([payload]) + expect(await claimDocumentProcessingDispatches()).toEqual([]) + const [{ remaining }] = await db + .select({ remaining: sql`count(*)::int` }) + .from(knowledgeDocumentDispatch) + .where( + inArray( + knowledgeDocumentDispatch.ownerKey, + staleOwners.map((owner) => owner.ownerKey) + ) + ) + expect(remaining).toBe(DOCUMENT_DISPATCH_MAX_OUTSTANDING * 5) + const rotated = await db + .select({ at: knowledgeDocumentDispatchOwner.lastDispatchedAt }) + .from(knowledgeDocumentDispatchOwner) + .where( + inArray( + knowledgeDocumentDispatchOwner.ownerKey, + staleOwners.map((owner) => owner.ownerKey) + ) + ) + expect(rotated.every((owner) => owner.at !== null)).toBe(true) + expect( + (await claimDocumentProcessingDispatches()).some( + (intent) => intent.documentId === payload.documentId + ) + ).toBe(true) + }) + + it('records terminal cancellation only for its current generation and preserves a newer continuation', async () => { + const source = await createSource() + const [cancelled, superseded] = await createDocuments(source, 2) + await enqueueDocumentProcessingDispatch([cancelled, superseded]) + const newerAt = new Date(Date.now() + 60_000) + await db + .update(document) + .set({ processingQueuedAt: newerAt }) + .where(eq(document.id, superseded.documentId)) + await completeDocumentProcessingDispatch(cancelled, { failed: true }) + await completeDocumentProcessingDispatch(superseded, { failed: true }) + const rows = await db + .select({ id: document.id, status: document.processingStatus }) + .from(document) + .where(inArray(document.id, [cancelled.documentId, superseded.documentId])) + expect(rows.find((row) => row.id === cancelled.documentId)?.status).toBe('failed') + expect(rows.find((row) => row.id === superseded.documentId)?.status).toBe('pending') + }) + + it.each(['workspace', 'personal'] as const)( + 'keeps canonical %s ownership and payload intact', + async (kind) => { + const source = await createSource(kind) + const [payload] = await createDocuments(source, 1) + expect(await enqueueDocumentProcessingDispatch([payload])).toEqual( + new Set([payload.documentId]) + ) + const [intent] = await db + .select() + .from(knowledgeDocumentDispatch) + .where(eq(knowledgeDocumentDispatch.documentId, payload.documentId)) + expect(intent.ownerKey).toBe(source.ownerKey) + expect(intent.payload).toEqual(createCanonicalDocumentProcessingPayload(payload)) + expect(documentDispatchOwnerKey(payload)).toBe(source.ownerKey) + } + ) + + it('rejects another canonical owner even when the supplied billing snapshot is internally consistent', async () => { + const first = await createSource() + const other = await createSource() + const [payload] = await createDocuments(first, 1) + const wrongOwner = createDocumentProcessingPayload(payload, other.context) + await expect(enqueueDocumentProcessingDispatch([wrongOwner])).rejects.toThrow( + 'owner does not match' + ) + expect(await db.select().from(knowledgeDocumentDispatch)).toEqual([]) + }) + + it('deduplicates a delayed continuation and releases only the prior generation', async () => { + const source = await createSource() + const [payload] = await createDocuments(source, 1) + await enqueueDocumentProcessingDispatch([payload]) + await claimDocumentProcessingDispatches() + await db + .update(document) + .set({ processingStatus: 'processing' }) + .where(eq(document.id, payload.documentId)) + const continuation = { ...payload, admissionRetryCount: 1 } + const firstDate = new Date(Date.now() + 60_000) + const stored = await enqueueDocumentProcessingContinuation(continuation, firstDate) + const duplicate = await enqueueDocumentProcessingContinuation( + continuation, + new Date(firstDate.getTime() + 2000) + ) + expect(duplicate).toEqual(stored) + await db + .update(document) + .set({ + processingStatus: 'pending', + processingQueuedAt: stored, + processingDeferredUntil: stored, + }) + .where(eq(document.id, payload.documentId)) + await completeDocumentProcessingDispatch(payload) + const rows = await db + .select() + .from(knowledgeDocumentDispatch) + .where(eq(knowledgeDocumentDispatch.documentId, payload.documentId)) + expect(rows).toHaveLength(1) + expect(rows[0].idempotencyKey).toBe(documentDispatchIdempotencyKey(continuation)) + expect(await claimDocumentProcessingDispatches()).toEqual([]) + await db + .update(knowledgeDocumentDispatch) + .set({ availableAt: new Date(Date.now() - 1000) }) + .where(eq(knowledgeDocumentDispatch.id, rows[0].id)) + expect(await claimDocumentProcessingDispatches()).toHaveLength(1) + }) + + it('does not admit deleted or superseded queued generations', async () => { + const source = await createSource() + const [superseded, deleted] = await createDocuments(source, 2) + await enqueueDocumentProcessingDispatch([superseded, deleted]) + await db + .update(document) + .set({ processingQueueToken: generateId() }) + .where(eq(document.id, superseded.documentId)) + await db + .update(document) + .set({ deletedAt: new Date() }) + .where(eq(document.id, deleted.documentId)) + expect(await claimDocumentProcessingDispatches()).toEqual([]) + expect(await enqueueDocumentProcessingDispatch([superseded])).toEqual(new Set()) + }) + + it('retains reservations when Trigger acceptance is unknown and retries the identical key', async () => { + const source = await createSource() + const [payload] = await createDocuments(source, 1) + await enqueueDocumentProcessingDispatch([payload]) + transport.trigger.mockRejectedValueOnce(new Error('fixture connection reset after acceptance')) + expect(await dispatchQueuedDocumentProcessing()).toEqual({ dispatched: 0 }) + const [reserved] = await db + .select() + .from(knowledgeDocumentDispatch) + .where(eq(knowledgeDocumentDispatch.documentId, payload.documentId)) + expect(reserved.dispatchedAt).not.toBeNull() + expect(reserved.triggerRunId).toBeNull() + expect(await dispatchQueuedDocumentProcessing()).toEqual({ dispatched: 1 }) + const calls = transport.trigger.mock.calls.filter( + ([name]) => name === 'knowledge-process-document' + ) + expect(calls).toHaveLength(2) + expect(calls[0][2].idempotencyKey).toBe(calls[1][2].idempotencyKey) + expect(calls.every(([, , options]) => !options.queue && !options.concurrencyKey)).toBe(true) + }) + + it.each(['live', 'unavailable'] as const)( + 'reconciles newer completed runs when the oldest ten remain %s', + async (oldestState) => { + const source = await createSource() + const payloads = await createDocuments(source, 12) + await enqueueDocumentProcessingDispatch(payloads) + await dispatchQueuedDocumentProcessing() + const oldIds = payloads.slice(0, 10).map((payload) => payload.documentId) + const oldStamp = new Date(Date.now() - 21 * 60_000) + await db + .update(knowledgeDocumentDispatch) + .set({ dispatchedAt: new Date(Date.now() - 20 * 60_000) }) + .where(eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId)) + await db + .update(knowledgeDocumentDispatch) + .set({ dispatchedAt: oldStamp }) + .where(inArray(knowledgeDocumentDispatch.documentId, oldIds)) + const oldest = await db + .select({ runId: knowledgeDocumentDispatch.triggerRunId }) + .from(knowledgeDocumentDispatch) + .where(inArray(knowledgeDocumentDispatch.documentId, oldIds)) + const oldRunIds = new Set(oldest.map((intent) => intent.runId)) + transport.retrieve.mockImplementation(async (runId: string) => { + if (oldRunIds.has(runId)) { + if (oldestState === 'unavailable') + throw new Error('Fixture status temporarily unavailable') + return { isCompleted: false } + } + return { isCompleted: true } + }) + await dispatchQueuedDocumentProcessing() + const retained = await db + .select({ + id: knowledgeDocumentDispatch.documentId, + at: knowledgeDocumentDispatch.dispatchedAt, + }) + .from(knowledgeDocumentDispatch) + .where(eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId)) + expect(retained).toHaveLength(10) + expect( + retained.every( + (intent) => oldIds.includes(intent.id) && intent.at?.getTime() === oldStamp.getTime() + ) + ).toBe(true) + expect(transport.retrieve).toHaveBeenCalledTimes(12) + } + ) + + it('repairs missed terminal hooks but preserves a live retry reservation', async () => { + const source = await createSource() + const payloads = await createDocuments(source, 2) + await enqueueDocumentProcessingDispatch(payloads) + await dispatchQueuedDocumentProcessing() + await db + .update(knowledgeDocumentDispatch) + .set({ dispatchedAt: new Date(Date.now() - 20 * 60_000) }) + .where(eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId)) + transport.retrieve + .mockResolvedValueOnce({ isCompleted: true }) + .mockResolvedValueOnce({ isCompleted: false }) + await dispatchQueuedDocumentProcessing() + const [{ count }] = await db + .select({ count: sql`count(*)::int` }) + .from(knowledgeDocumentDispatch) + .where( + and( + eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId), + isNotNull(knowledgeDocumentDispatch.dispatchedAt) + ) + ) + expect(count).toBe(1) + }) +}) diff --git a/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts b/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts new file mode 100644 index 00000000000..04be1114507 --- /dev/null +++ b/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts @@ -0,0 +1,230 @@ +import { db } from '@sim/db' +import { + document, + embedding, + knowledgeBase, + knowledgeConnector, + member, + organization, + organizationSearchIntegration, + user, + workspace, +} from '@sim/db/schema' +import { generateId } from '@sim/utils/id' +import { eq, inArray, sql } from 'drizzle-orm' +import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { + createKnowledgeAclFixtureIds, + seedKnowledgeAclFixture, +} from '@/lib/knowledge/__integration__/seed-source-access-fixture' +import { readSearchSourceOverview } from '@/lib/knowledge/application/search-source-overview' +import { readSearchSourceProgress } from '@/lib/knowledge/application/search-source-progress' +import { listSearchSources } from '@/lib/knowledge/application/search-sources' + +const ids = createKnowledgeAclFixtureIds() +const alice = { kind: 'session' as const, userId: ids.aliceId, sessionId: 'fixture-alice' } +const bob = { kind: 'session' as const, userId: ids.bobId, sessionId: 'fixture-bob' } +const sourceIds = Array.from({ length: 105 }, () => generateId()) + .sort() + .reverse() +const olderSourceId = generateId() +const documentId = generateId() +const embeddingId = generateId() +const input = { workspaceId: ids.workspaceId } + +beforeAll(async () => { + await seedKnowledgeAclFixture(ids) + await db + .update(knowledgeBase) + .set({ isSearchIndex: true }) + .where(eq(knowledgeBase.id, ids.knowledgeBaseId)) + await db + .update(knowledgeConnector) + .set({ archivedAt: new Date() }) + .where(eq(knowledgeConnector.id, ids.connectorId)) + await db.insert(knowledgeConnector).values( + sourceIds.map((id) => ({ + id, + knowledgeBaseId: ids.knowledgeBaseId, + connectorType: 'confluence', + sourceConfig: { domain: 'fixture.atlassian.net', spaceKey: 'ENG' }, + accessMode: 'admin', + status: 'active', + })) + ) + await db + .update(knowledgeConnector) + .set({ createdAt: sql`'2026-01-01 00:00:00.123456'::timestamp` }) + .where(inArray(knowledgeConnector.id, sourceIds)) + await db.insert(knowledgeConnector).values({ + id: olderSourceId, + knowledgeBaseId: ids.knowledgeBaseId, + connectorType: 'google_drive', + sourceConfig: { folderId: 'opaque-fixture-id' }, + accessMode: 'admin', + status: 'active', + createdAt: new Date('2025-12-31T00:00:00Z'), + }) + await db.insert(document).values({ + id: documentId, + connectorId: olderSourceId, + knowledgeBaseId: ids.knowledgeBaseId, + externalId: 'fixture', + filename: 'readable.txt', + fileUrl: 'https://fixture.test/readable', + fileSize: 12, + mimeType: 'text/plain', + processingStatus: 'completed', + acl: [`u:${ids.aliceId}@fixture.test`], + aclVerifiedAt: new Date(), + }) + await db.insert(embedding).values({ + id: embeddingId, + documentId, + knowledgeBaseId: ids.knowledgeBaseId, + chunkIndex: 0, + chunkHash: 'fixture-hash', + content: 'Fixture text', + contentLength: 12, + tokenCount: 3, + startOffset: 0, + endOffset: 12, + embeddingModel: 'text-embedding-3-small', + embedding: [1, ...Array(1535).fill(0)], + }) +}) + +afterAll(async () => { + await db.delete(workspace).where(eq(workspace.id, ids.workspaceId)) + await db.delete(organization).where(eq(organization.id, ids.organizationId)) + await db.delete(user).where(eq(user.id, ids.aliceId)) + await db.delete(user).where(eq(user.id, ids.bobId)) +}) + +describe('bounded source pagination and provider overview', () => { + it('walks tied microsecond timestamps without duplicating or skipping sources', async () => { + const found: string[] = [] + let cursor: string | undefined + for (let page = 0; page < 5; page++) { + const result = await listSearchSources.execute({ + principal: alice, + input: { ...input, cursor }, + }) + expect(result.sources.length).toBeLessThanOrEqual(25) + found.push(...result.sources.map((source) => source.connectorId)) + cursor = result.nextCursor ?? undefined + if (!cursor) break + } + expect(cursor).toBeUndefined() + expect(found).toEqual([...sourceIds, olderSourceId]) + expect(new Set(found).size).toBe(106) + }) + it('continues after a sparse filtered page to find sources beyond the candidate bound', async () => { + const first = await listSearchSources.execute({ + principal: alice, + input: { ...input, search: 'Google Drive' }, + }) + expect(first.sources).toEqual([]) + expect(first.nextCursor).not.toBeNull() + const second = await listSearchSources.execute({ + principal: alice, + input: { ...input, search: ' google drive ', cursor: first.nextCursor! }, + }) + expect(second.sources.map((source) => source.connectorId)).toEqual([olderSourceId]) + expect(second.nextCursor).toBeNull() + }) + it('includes providers beyond the loaded page and requires viewer-readable indexed content', async () => { + const first = await listSearchSources.execute({ principal: alice, input }) + expect(first.sources.every((source) => source.connectorType === 'confluence')).toBe(true) + const [aliceOverview, bobOverview] = await Promise.all( + [alice, bob].map((principal) => readSearchSourceOverview.execute({ principal, input })) + ) + expect(aliceOverview.providers).toEqual( + expect.arrayContaining([{ connectorType: 'google_drive', isSyncing: false }]) + ) + expect(aliceOverview.hasSearchableDocuments).toBe(true) + expect(bobOverview.hasSearchableDocuments).toBe(false) + }) + it('keeps paused but readable sources complete and ignores disabled chunks', async () => { + await db + .update(knowledgeConnector) + .set({ status: 'paused' }) + .where(eq(knowledgeConnector.id, olderSourceId)) + const paused = await readSearchSourceOverview.execute({ principal: alice, input }) + expect(paused.hasSearchableDocuments).toBe(true) + expect(paused.providers.every((provider) => !provider.isSyncing)).toBe(true) + await db.update(embedding).set({ enabled: false }).where(eq(embedding.id, embeddingId)) + expect( + (await readSearchSourceOverview.execute({ principal: alice, input })).hasSearchableDocuments + ).toBe(false) + }) + it('shows a newly created source on the first-page refresh so enrollment can observe completion', async () => { + const before = await listSearchSources.execute({ principal: alice, input }) + expect(before.sources[0].connectorId).toBe(sourceIds[0]) + const newSourceId = generateId() + await db.insert(knowledgeConnector).values({ + id: newSourceId, + knowledgeBaseId: ids.knowledgeBaseId, + connectorType: 'confluence', + sourceConfig: { domain: 'fixture.atlassian.net', spaceKey: 'NEW' }, + accessMode: 'admin', + status: 'pending', + }) + const refreshed = await listSearchSources.execute({ principal: alice, input }) + expect(refreshed.sources[0]).toMatchObject({ connectorId: newSourceId, isSyncing: true }) + expect(refreshed.sources.map((source) => source.connectorId)).toEqual([ + newSourceId, + ...sourceIds.slice(0, 24), + ]) + const next = await listSearchSources.execute({ + principal: alice, + input: { ...input, cursor: refreshed.nextCursor! }, + }) + expect(next.sources.map((source) => source.connectorId)).toEqual(sourceIds.slice(24, 49)) + }) + it('does not report deactivated pending sources as indexing in any read model', async () => { + await db.insert(member).values({ + id: generateId(), + organizationId: ids.organizationId, + userId: ids.aliceId, + role: 'admin', + createdAt: new Date(), + }) + await db + .update(knowledgeBase) + .set({ workspaceId: null, organizationId: ids.organizationId }) + .where(eq(knowledgeBase.id, ids.knowledgeBaseId)) + const approvalSourceId = generateId() + await db.insert(knowledgeConnector).values({ + id: approvalSourceId, + knowledgeBaseId: ids.knowledgeBaseId, + connectorType: 'google_drive', + sourceConfig: {}, + accessMode: 'admin', + status: 'pending', + }) + await db.insert(organizationSearchIntegration).values({ + organizationId: ids.organizationId, + connectorType: 'google_drive', + approved: false, + }) + const owner = { organizationId: ids.organizationId } + const [progress, overview, summary] = await Promise.all([ + readSearchSourceProgress.execute({ + principal: alice, + input: { ...owner, connectorIds: [approvalSourceId] }, + }), + readSearchSourceOverview.execute({ principal: alice, input: owner }), + listSearchSources.execute({ principal: alice, input: owner }), + ]) + expect(progress.sources[0].isSyncing).toBe(false) + expect( + overview.providers.find((provider) => provider.connectorType === 'google_drive')?.isSyncing + ).toBe(false) + expect(summary.sources[0]).toMatchObject({ + connectorId: approvalSourceId, + approved: false, + isSyncing: false, + }) + }) +}) diff --git a/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts b/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts new file mode 100644 index 00000000000..42d2b99b9bd --- /dev/null +++ b/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts @@ -0,0 +1,131 @@ +import { db } from '@sim/db' +import { + document, + knowledgeBase, + knowledgeConnector, + organization, + permissions, + user, + workspace, +} from '@sim/db/schema' +import { generateId } from '@sim/utils/id' +import { and, eq } from 'drizzle-orm' +import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { + createKnowledgeAclFixtureIds, + seedKnowledgeAclFixture, +} from '@/lib/knowledge/__integration__/seed-source-access-fixture' +import { listKnowledgeConnectorDocuments } from '@/lib/knowledge/application/connectors' +import { readSearchSourceProgress } from '@/lib/knowledge/application/search-source-progress' +import { listSearchSources } from '@/lib/knowledge/application/search-sources' + +const ids = createKnowledgeAclFixtureIds() +const alice = { kind: 'session' as const, userId: ids.aliceId, sessionId: 'fixture-alice' } +const bob = { kind: 'session' as const, userId: ids.bobId, sessionId: 'fixture-bob' } +const failedId = generateId() +const pendingId = generateId() +const input = { workspaceId: ids.workspaceId, connectorIds: [ids.connectorId] } + +beforeAll(async () => { + await seedKnowledgeAclFixture(ids) + await db + .update(knowledgeBase) + .set({ isSearchIndex: true }) + .where(eq(knowledgeBase.id, ids.knowledgeBaseId)) + await db + .update(knowledgeConnector) + .set({ status: 'active', syncLockToken: null }) + .where(eq(knowledgeConnector.id, ids.connectorId)) + await db.insert(document).values( + [ + { id: failedId, status: 'failed', owner: ids.aliceId }, + { id: pendingId, status: 'pending', owner: ids.bobId }, + ].map((row) => ({ + id: row.id, + knowledgeBaseId: ids.knowledgeBaseId, + connectorId: ids.connectorId, + externalId: row.id, + filename: `${row.status}.txt`, + fileUrl: `https://fixture.test/${row.id}`, + fileSize: 10, + mimeType: 'text/plain', + processingStatus: row.status, + acl: [`u:${row.owner}@fixture.test`], + aclVerifiedAt: new Date(), + })) + ) +}) +afterAll(async () => { + await db.delete(workspace).where(eq(workspace.id, ids.workspaceId)) + await db.delete(organization).where(eq(organization.id, ids.organizationId)) + await db.delete(user).where(eq(user.id, ids.aliceId)) + await db.delete(user).where(eq(user.id, ids.bobId)) +}) + +describe('viewer-isolated indexing progress and recovery lists', () => { + it('keeps failed and pending state scoped to the viewer, including admins', async () => { + expect((await readSearchSourceProgress.execute({ principal: alice, input })).sources).toEqual([ + { + connectorId: ids.connectorId, + isSyncing: false, + hasSyncError: false, + hasIndexingError: true, + }, + ]) + expect((await readSearchSourceProgress.execute({ principal: bob, input })).sources).toEqual([ + { + connectorId: ids.connectorId, + isSyncing: true, + hasSyncError: false, + hasIndexingError: false, + }, + ]) + const [aliceSources, bobSources] = await Promise.all( + [alice, bob].map((principal) => + listSearchSources.execute({ principal, input: { workspaceId: ids.workspaceId } }) + ) + ) + expect(aliceSources.sources[0].viewerFailedDocumentCount).toBe(1) + expect(bobSources.sources[0].viewerFailedDocumentCount).toBe(0) + }) + it('only lists accessible failures, with authoritative filtered pagination', async () => { + const read = (principal: typeof alice) => + listKnowledgeConnectorDocuments.execute({ + principal, + input: { + knowledgeBaseId: ids.knowledgeBaseId, + connectorId: ids.connectorId, + failedOnly: true, + limit: 1, + }, + }) + const result = await read(alice) + expect(result.documents.map((doc) => doc.id)).toEqual([failedId]) + expect(result.counts.failed).toBe(1) + expect(result.hasMore).toBe(false) + expect((await read(bob)).documents).toEqual([]) + }) + it('does not report excluded or deleted failures as actionable', async () => { + await db.update(document).set({ userExcluded: true }).where(eq(document.id, failedId)) + expect( + (await readSearchSourceProgress.execute({ principal: alice, input })).sources[0] + .hasIndexingError + ).toBe(false) + await db + .update(document) + .set({ userExcluded: false, deletedAt: new Date() }) + .where(eq(document.id, failedId)) + expect( + (await readSearchSourceProgress.execute({ principal: alice, input })).sources[0] + .hasIndexingError + ).toBe(false) + }) + it('rechecks membership before showing progress', async () => { + await db + .delete(permissions) + .where(and(eq(permissions.entityId, ids.workspaceId), eq(permissions.userId, ids.bobId))) + await expect(readSearchSourceProgress.execute({ principal: bob, input })).rejects.toThrow( + 'Insufficient workspace permissions' + ) + }) +}) diff --git a/apps/sim/lib/knowledge/__integration__/seed-source-access-fixture.ts b/apps/sim/lib/knowledge/__integration__/seed-source-access-fixture.ts index 5aa74e70b88..7970a713756 100644 --- a/apps/sim/lib/knowledge/__integration__/seed-source-access-fixture.ts +++ b/apps/sim/lib/knowledge/__integration__/seed-source-access-fixture.ts @@ -39,9 +39,9 @@ export async function seedKnowledgeAclFixture(ids = createKnowledgeAclFixtureIds const target = new URL(process.env.DATABASE_URL ?? '') if ( !['localhost', '127.0.0.1'].includes(target.hostname) || - !target.pathname.startsWith('/sim_acl_test') + (!target.pathname.startsWith('/sim_acl_test') && target.pathname !== '/sim_auth_scim') ) { - throw new Error('Knowledge fixture seeding requires a local sim_acl_test database') + throw new Error('Knowledge fixture seeding requires a local disposable test database') } const { aliceId, bobId, workspaceId, knowledgeBaseId, connectorId, lockId, groups, groupIds } = ids diff --git a/apps/sim/lib/knowledge/__integration__/setup.ts b/apps/sim/lib/knowledge/__integration__/setup.ts index 21887531d84..39ca5fdc521 100644 --- a/apps/sim/lib/knowledge/__integration__/setup.ts +++ b/apps/sim/lib/knowledge/__integration__/setup.ts @@ -13,9 +13,9 @@ if (!databaseUrl) const target = new URL(databaseUrl) if ( !['localhost', '127.0.0.1'].includes(target.hostname) || - !target.pathname.startsWith('/sim_acl_test') + (!target.pathname.startsWith('/sim_acl_test') && target.pathname !== '/sim_auth_scim') ) { - throw new Error('Knowledge integration tests require a local sim_acl_test database') + throw new Error('Knowledge integration tests require a local disposable test database') } /** Never inherit an application secret or transport endpoint from the developer's shell. */ diff --git a/apps/sim/lib/knowledge/application/connectors.test.ts b/apps/sim/lib/knowledge/application/connectors.test.ts index eb791429d83..ab3a75f7e4b 100644 --- a/apps/sim/lib/knowledge/application/connectors.test.ts +++ b/apps/sim/lib/knowledge/application/connectors.test.ts @@ -791,6 +791,7 @@ describe('knowledge connector application use cases', () => { mocks.resolveConnector.mockResolvedValueOnce(sameWorkspaceContext) queueTableRows(document, [{ value: 5 }]) queueTableRows(document, [{ value: 2 }]) + queueTableRows(document, [{ value: 1 }]) queueTableRows(document, [ { id: 'document-3', filename: 'c.txt', userExcluded: false }, { id: 'document-4', filename: 'd.txt', userExcluded: true }, @@ -813,7 +814,7 @@ describe('knowledge connector application use cases', () => { { id: 'document-3', filename: 'c.txt', userExcluded: false }, { id: 'document-4', filename: 'd.txt', userExcluded: true }, ], - counts: { active: 5, excluded: 2 }, + counts: { active: 5, excluded: 2, failed: 1 }, hasMore: false, offset: 2, limit: 2, diff --git a/apps/sim/lib/knowledge/application/connectors.ts b/apps/sim/lib/knowledge/application/connectors.ts index 1accca413cf..5b1861cbaa2 100644 --- a/apps/sim/lib/knowledge/application/connectors.ts +++ b/apps/sim/lib/knowledge/application/connectors.ts @@ -158,6 +158,7 @@ export interface SyncKnowledgeConnectorInput extends KnowledgeConnectorApplicati } export interface ListKnowledgeConnectorDocumentsInput extends ReadKnowledgeConnectorInput { + failedOnly?: boolean includeExcluded?: boolean limit?: number offset?: number @@ -1137,7 +1138,7 @@ export const listKnowledgeConnectorDocuments = defineAuthorizedKnowledgeUseCase( isNull(document.deletedAt), knowledgeAccessCondition(await context.access.get()), ] as const - const [[activeCount], excludedCountRows] = await Promise.all([ + const [[activeCount], excludedCountRows, [failedCount]] = await Promise.all([ db .select({ value: count() }) .from(document) @@ -1148,22 +1149,40 @@ export const listKnowledgeConnectorDocuments = defineAuthorizedKnowledgeUseCase( .from(document) .where(and(...baseConditions, eq(document.userExcluded, true))) : Promise.resolve([{ value: 0 }]), + db + .select({ value: count() }) + .from(document) + .where( + and( + ...baseConditions, + eq(document.userExcluded, false), + eq(document.processingStatus, 'failed') + ) + ), ]) const excludedCount = excludedCountRows[0] const rows = await db .select(connectorDocumentSelection) .from(document) .where( - and(...baseConditions, input.includeExcluded ? undefined : eq(document.userExcluded, false)) + and( + ...baseConditions, + input.includeExcluded && !input.failedOnly ? undefined : eq(document.userExcluded, false), + input.failedOnly ? eq(document.processingStatus, 'failed') : undefined + ) ) - .orderBy(asc(document.userExcluded), asc(document.filename)) + .orderBy(asc(document.userExcluded), asc(document.filename), asc(document.id)) .limit(limit + 1) .offset(offset) const hasMore = rows.length > limit const documents = rows.slice(0, limit) return { documents, - counts: { active: activeCount?.value ?? 0, excluded: excludedCount?.value ?? 0 }, + counts: { + active: activeCount?.value ?? 0, + excluded: excludedCount?.value ?? 0, + failed: failedCount?.value ?? 0, + }, hasMore, offset, limit, diff --git a/apps/sim/lib/knowledge/application/operations.ts b/apps/sim/lib/knowledge/application/operations.ts index 6887d5767dd..3a25611eb8a 100644 --- a/apps/sim/lib/knowledge/application/operations.ts +++ b/apps/sim/lib/knowledge/application/operations.ts @@ -627,6 +627,24 @@ export const knowledgeOperations = { principalKinds: ['session'], }) ), + readSearchSourceOverview: defineKnowledgeOperation( + defineWorkspaceOperation({ + id: 'knowledge.search.sources.overview', + minimumRole: 'read', + workspaceApiKey: 'deny', + capability: 'knowledge.use', + principalKinds: ['session'], + }) + ), + readSearchSourceProgress: defineKnowledgeOperation( + defineWorkspaceOperation({ + id: 'knowledge.search.sources.progress', + minimumRole: 'read', + workspaceApiKey: 'deny', + capability: 'knowledge.use', + principalKinds: ['session'], + }) + ), listSearchIntegrations: defineKnowledgeOperation( defineWorkspaceOperation({ id: 'knowledge.search.integrations.list', diff --git a/apps/sim/lib/knowledge/application/search-source-overview.ts b/apps/sim/lib/knowledge/application/search-source-overview.ts new file mode 100644 index 00000000000..fbf1b56f503 --- /dev/null +++ b/apps/sim/lib/knowledge/application/search-source-overview.ts @@ -0,0 +1,139 @@ +import { db } from '@sim/db' +import { document, embedding, knowledgeBase, knowledgeConnector } from '@sim/db/schema' +import { and, eq, exists, inArray, isNull, notInArray, or } from 'drizzle-orm' +import type { SearchSourceOverview } from '@/lib/api/contracts/knowledge/connectors' +import { type ResourceOwner, resourceScopeFromOwner } from '@/lib/core/resource-scope' +import { resourceScopeCondition } from '@/lib/core/resource-scope.server' +import { resolveKnowledgeAccessAvailability } from '@/lib/knowledge/access/availability' +import { knowledgeAccessCondition } from '@/lib/knowledge/access/predicate' +import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' +import { defineAuthorizedKnowledgeUseCase } from '@/lib/knowledge/application/authorized-knowledge-use-case' +import { resolveKnowledgeOwnerContext } from '@/lib/knowledge/application/contexts' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { MAX_SEARCH_SOURCE_PROVIDER_TYPES } from '@/lib/knowledge/constants' +import { searchIntegrationAccessCondition } from '@/lib/knowledge/search/integration-policy' +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' + +/** Provider-level existence probes keep setup cards independent of the loaded source pages. */ +export const readSearchSourceOverview = defineAuthorizedKnowledgeUseCase({ + operation: knowledgeOperations.readSearchSourceOverview, + resolveContext: ({ input }: { input: ResourceOwner }) => resolveKnowledgeOwnerContext(input), + async execute({ principal, context }): Promise { + const [availability, access] = await Promise.all([ + resolveKnowledgeAccessAvailability(context), + createKnowledgeAccessProvider(principal, context).get(), + ]) + const providerTypes = Object.keys(CONNECTOR_META_REGISTRY) + if (providerTypes.length > MAX_SEARCH_SOURCE_PROVIDER_TYPES) { + throw new Error('Search provider catalog exceeds the overview bound') + } + const configured = and( + resourceScopeCondition(knowledgeBase, resourceScopeFromOwner(context)), + eq(knowledgeBase.isSearchIndex, true), + isNull(knowledgeBase.deletedAt), + inArray(knowledgeConnector.connectorType, providerTypes), + inArray(knowledgeConnector.accessMode, ['admin', 'members']), + isNull(knowledgeConnector.archivedAt), + isNull(knowledgeConnector.deletedAt) + ) + const available = or( + availability.memberScoped ? eq(knowledgeConnector.accessMode, 'members') : undefined, + availability.sourceMirrored + ? and( + eq(knowledgeConnector.accessMode, 'admin'), + inArray( + knowledgeConnector.connectorType, + providerTypes.filter( + (type) => + availability.memberScoped || !CONNECTOR_META_REGISTRY[type].requiresMemberIdentity + ) + ) + ) + : undefined + ) + const syncingEnabled = and( + available, + searchIntegrationAccessCondition(), + notInArray(knowledgeConnector.status, ['paused', 'disabled']), + or( + eq(knowledgeConnector.accessMode, 'admin'), + notInArray(knowledgeConnector.memberSyncStatus, ['disabled']) + ) + ) + const readableDocument = and( + eq(document.connectorId, knowledgeConnector.id), + eq(document.knowledgeBaseId, knowledgeConnector.knowledgeBaseId), + eq(document.enabled, true), + eq(document.userExcluded, false), + isNull(document.archivedAt), + isNull(document.deletedAt), + knowledgeAccessCondition(access) + ) + const providersQuery = () => + db + .selectDistinct({ connectorType: knowledgeConnector.connectorType }) + .from(knowledgeConnector) + .innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId)) + const [providers, indexing, searchable] = await Promise.all([ + providersQuery().where(configured).limit(MAX_SEARCH_SOURCE_PROVIDER_TYPES), + availability.memberScoped || availability.sourceMirrored + ? providersQuery() + .where( + and( + configured, + syncingEnabled, + or( + inArray(knowledgeConnector.status, ['pending', 'syncing']), + and( + eq(knowledgeConnector.accessMode, 'members'), + inArray(knowledgeConnector.memberSyncStatus, ['pending', 'running']) + ), + exists( + db + .select({ id: document.id }) + .from(document) + .where( + and( + readableDocument, + inArray(document.processingStatus, ['pending', 'processing']) + ) + ) + ) + ) + ) + ) + .limit(MAX_SEARCH_SOURCE_PROVIDER_TYPES) + : [], + availability.memberScoped || availability.sourceMirrored + ? db + .select({ id: document.id }) + .from(document) + .innerJoin(knowledgeConnector, eq(knowledgeConnector.id, document.connectorId)) + .innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId)) + .where( + and( + configured, + available, + readableDocument, + eq(document.processingStatus, 'completed'), + exists( + db + .select({ id: embedding.id }) + .from(embedding) + .where(and(eq(embedding.documentId, document.id), eq(embedding.enabled, true))) + ) + ) + ) + .limit(1) + : [], + ]) + const indexingTypes = new Set(indexing.map((provider) => provider.connectorType)) + return { + providers: providers.map(({ connectorType }) => ({ + connectorType, + isSyncing: indexingTypes.has(connectorType), + })), + hasSearchableDocuments: searchable.length > 0, + } + }, +}) diff --git a/apps/sim/lib/knowledge/application/search-source-progress.ts b/apps/sim/lib/knowledge/application/search-source-progress.ts new file mode 100644 index 00000000000..1a3d5bd4e1d --- /dev/null +++ b/apps/sim/lib/knowledge/application/search-source-progress.ts @@ -0,0 +1,97 @@ +import { db } from '@sim/db' +import { document, knowledgeBase, knowledgeConnector } from '@sim/db/schema' +import { and, eq, exists, inArray, isNull, sql } from 'drizzle-orm' +import { OrchestrationError } from '@/lib/core/orchestration/types' +import { type ResourceOwner, resourceScopeFromOwner } from '@/lib/core/resource-scope' +import { resourceScopeCondition } from '@/lib/core/resource-scope.server' +import { knowledgeAccessCondition } from '@/lib/knowledge/access/predicate' +import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' +import { defineAuthorizedKnowledgeUseCase } from '@/lib/knowledge/application/authorized-knowledge-use-case' +import { resolveKnowledgeOwnerContext } from '@/lib/knowledge/application/contexts' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { MAX_SEARCH_SOURCE_PROGRESS_ITEMS } from '@/lib/knowledge/constants' +import { searchIntegrationAccessCondition } from '@/lib/knowledge/search/integration-policy' + +interface ReadSearchSourceProgressInput extends ResourceOwner { + connectorIds: string[] +} + +/** Progress probes stop at the first visible document, without recounting completed chunks. */ +export const readSearchSourceProgress = defineAuthorizedKnowledgeUseCase({ + operation: knowledgeOperations.readSearchSourceProgress, + resolveContext: ({ input }: { input: ReadSearchSourceProgressInput }) => + resolveKnowledgeOwnerContext(input), + async execute({ principal, input, context }) { + if ( + input.connectorIds.length === 0 || + input.connectorIds.length > MAX_SEARCH_SOURCE_PROGRESS_ITEMS + ) { + throw new OrchestrationError( + 'validation', + `Provide between 1 and ${MAX_SEARCH_SOURCE_PROGRESS_ITEMS} sources` + ) + } + const access = await createKnowledgeAccessProvider(principal, context).get() + const hasDocumentsInState = (statuses: string[]) => + sql`${exists( + db + .select({ id: document.id }) + .from(document) + .where( + and( + eq(document.knowledgeBaseId, knowledgeConnector.knowledgeBaseId), + eq(document.connectorId, knowledgeConnector.id), + inArray(document.processingStatus, statuses), + eq(document.enabled, true), + eq(document.userExcluded, false), + isNull(document.archivedAt), + isNull(document.deletedAt), + knowledgeAccessCondition(access) + ) + ) + )}` + const rows = await db + .select({ + connectorId: knowledgeConnector.id, + status: knowledgeConnector.status, + accessMode: knowledgeConnector.accessMode, + memberSyncStatus: knowledgeConnector.memberSyncStatus, + approved: sql`${searchIntegrationAccessCondition()}`, + isIndexing: hasDocumentsInState(['pending', 'processing']), + hasIndexingError: hasDocumentsInState(['failed']), + }) + .from(knowledgeConnector) + .innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId)) + .where( + and( + resourceScopeCondition(knowledgeBase, resourceScopeFromOwner(context)), + eq(knowledgeBase.isSearchIndex, true), + isNull(knowledgeBase.deletedAt), + inArray(knowledgeConnector.id, [...new Set(input.connectorIds)]), + inArray(knowledgeConnector.accessMode, ['admin', 'members']), + isNull(knowledgeConnector.archivedAt), + isNull(knowledgeConnector.deletedAt) + ) + ) + .limit(MAX_SEARCH_SOURCE_PROGRESS_ITEMS) + return { + sources: rows.map((row) => ({ + connectorId: row.connectorId, + isSyncing: + row.approved && + row.status !== 'paused' && + row.status !== 'disabled' && + !(row.accessMode === 'members' && row.memberSyncStatus === 'disabled') && + (row.status === 'pending' || + row.status === 'syncing' || + (row.accessMode === 'members' && + (row.memberSyncStatus === 'pending' || row.memberSyncStatus === 'running')) || + row.isIndexing), + hasSyncError: + row.status === 'error' || + (row.accessMode === 'members' && row.memberSyncStatus === 'error'), + hasIndexingError: row.hasIndexingError, + })), + } + }, +}) diff --git a/apps/sim/lib/knowledge/application/search-sources.test.ts b/apps/sim/lib/knowledge/application/search-sources.test.ts index c4d1480d919..5b94657ad66 100644 --- a/apps/sim/lib/knowledge/application/search-sources.test.ts +++ b/apps/sim/lib/knowledge/application/search-sources.test.ts @@ -5,6 +5,7 @@ import { knowledgeBase, knowledgeConnector, member, + organizationSearchIntegration, user, } from '@sim/db/schema' import { dbChainMockFns, queueTableRows, resetDbChainMock } from '@sim/testing' @@ -60,7 +61,12 @@ vi.mock('@/connectors/registry', () => { } }) -import { searchSourceSummarySchema } from '@/lib/api/contracts/knowledge/connectors' +import { + searchSourceCursorSchema, + searchSourceSummarySchema, +} from '@/lib/api/contracts/knowledge/connectors' +import { readSearchSourceOverview } from '@/lib/knowledge/application/search-source-overview' +import { readSearchSourceProgress } from '@/lib/knowledge/application/search-source-progress' import { listSearchSources } from '@/lib/knowledge/application/search-sources' const principal = { kind: 'session' as const, userId: 'reader', sessionId: 'session' } @@ -72,6 +78,7 @@ const LAST_SYNC = new Date('2026-09-05T12:00:00.000Z') function source(id: string, connectorType = 'google_drive', accessMode = 'admin') { return { id, + createdAt: '2026-09-05T12:00:00.123456Z', knowledgeBaseId: 'search-index', connectorType, sourceConfig: { @@ -122,7 +129,7 @@ describe('Search source summaries', () => { knowledgeBaseId: 'search-index', connectorId: 'drive', connectorType: 'google_drive', - sourceDescription: 'handbook', + sourceDescription: '1 folder selected', accessMode: 'admin', availability: 'available', enabled: true, @@ -130,6 +137,7 @@ describe('Search source summaries', () => { lastSyncAt: LAST_SYNC.toISOString(), hasSyncError: false, viewerDocumentCount: 4, + viewerFailedDocumentCount: 0, viewerEmailVerified: true, connectionRequired: false, viewerMembership: null, @@ -261,7 +269,10 @@ describe('Search source summaries', () => { it('restricts the source query to this workspace, the Search index, and live configured sources', async () => { seed([]) - await expect(listSearchSources.execute({ principal, input })).resolves.toEqual({ sources: [] }) + await expect(listSearchSources.execute({ principal, input })).resolves.toEqual({ + sources: [], + nextCursor: null, + }) expect(dbChainMockFns.where.mock.calls[0][0]).toEqual({ type: 'and', conditions: expect.arrayContaining([ @@ -379,6 +390,20 @@ describe('organization Search source summaries', () => { ) } ) + it('keeps deactivated pending sources idle in full summaries as well as progress probes', async () => { + mocks.context.mockResolvedValue({ organizationId: 'org-1' }) + queueTableRows(member, [{ role: 'admin' }]) + seed([{ ...source('drive'), status: 'pending' }]) + queueTableRows(organizationSearchIntegration, [ + { connectorType: 'google_drive', approved: false }, + ]) + const result = await listSearchSources.execute({ + principal, + input: { organizationId: 'org-1' }, + }) + expect(result.sources[0]).toMatchObject({ approved: false, isSyncing: false }) + }) + it('rejects a removed organization member without exposing configured sources', async () => { mocks.context.mockResolvedValue({ organizationId: 'org-1' }) queueTableRows(member, []) @@ -389,3 +414,243 @@ describe('organization Search source summaries', () => { expect(mocks.access).not.toHaveBeenCalled() }) }) + +describe('bounded Search progress', () => { + it('reports visible pending and failed work without counting documents or chunks', async () => { + queueTableRows(knowledgeConnector, [ + { + connectorId: 'drive', + approved: true, + status: 'active', + accessMode: 'admin', + memberSyncStatus: 'idle', + isIndexing: true, + hasIndexingError: true, + }, + ]) + const result = await readSearchSourceProgress.execute({ + principal, + input: { ...input, connectorIds: ['drive'] }, + }) + expect(result).toEqual({ + sources: [ + { connectorId: 'drive', isSyncing: true, hasSyncError: false, hasIndexingError: true }, + ], + }) + expect(mocks.predicate).toHaveBeenCalledWith(access) + expect(dbChainMockFns.limit).toHaveBeenCalledWith(100) + expect(dbChainMockFns.select.mock.calls.every(([projection]) => !('count' in projection))).toBe( + true + ) + expect(dbChainMockFns.where.mock.calls).toContainEqual([ + expect.objectContaining({ + type: 'and', + conditions: expect.arrayContaining([ + { type: 'eq', left: document.knowledgeBaseId, right: knowledgeConnector.knowledgeBaseId }, + { type: 'eq', left: document.connectorId, right: knowledgeConnector.id }, + { type: 'isNull', column: document.deletedAt }, + { type: 'isNull', column: document.archivedAt }, + { type: 'eq', left: document.userExcluded, right: false }, + { type: 'eq', left: document.enabled, right: true }, + ACL, + ]), + }), + ]) + }) + + it('keeps a paused source idle despite pending documents', async () => { + queueTableRows(knowledgeConnector, [ + { + connectorId: 'drive', + approved: true, + status: 'paused', + accessMode: 'admin', + memberSyncStatus: 'idle', + isIndexing: true, + hasIndexingError: false, + }, + ]) + const result = await readSearchSourceProgress.execute({ + principal, + input: { ...input, connectorIds: ['drive'] }, + }) + expect(result.sources[0].isSyncing).toBe(false) + }) + + it('does not read progress for a former member', async () => { + mocks.permission.mockResolvedValue(null) + await expect( + readSearchSourceProgress.execute({ principal, input: { ...input, connectorIds: ['drive'] } }) + ).rejects.toMatchObject({ code: 'forbidden' }) + expect(mocks.access).not.toHaveBeenCalled() + }) + + it('rejects an oversized progress request before document work', async () => { + await expect( + readSearchSourceProgress.execute({ + principal, + input: { ...input, connectorIds: Array(101).fill('drive') }, + }) + ).rejects.toMatchObject({ code: 'validation' }) + expect(mocks.access).not.toHaveBeenCalled() + }) + + it('does not report pending source work after organization approval is removed', async () => { + queueTableRows(knowledgeConnector, [ + { + connectorId: 'drive', + approved: false, + status: 'pending', + accessMode: 'admin', + memberSyncStatus: 'idle', + isIndexing: false, + hasIndexingError: false, + }, + ]) + const result = await readSearchSourceProgress.execute({ + principal, + input: { ...input, connectorIds: ['drive'] }, + }) + expect(result.sources[0].isSyncing).toBe(false) + }) + + it('counts visible indexing failures separately from provider sync errors', async () => { + seed([source('drive')]) + queueTableRows(document, [ + { connectorId: 'drive', count: 3, failedCount: 2, isIndexing: false }, + ]) + const { sources } = await listSearchSources.execute({ principal, input }) + expect(sources[0]).toMatchObject({ + hasSyncError: false, + viewerFailedDocumentCount: 2, + viewerDocumentCount: 3, + isSyncing: false, + }) + }) +}) + +describe('bounded Search source pagination', () => { + const rows = (count: number) => + Array.from({ length: count }, (_, index) => source(`source-${String(index).padStart(3, '0')}`)) + + it('counts only the returned page and preserves submillisecond cursor precision', async () => { + seed(rows(101)) + const result = await listSearchSources.execute({ principal, input }) + expect(result.sources).toHaveLength(25) + expect(dbChainMockFns.limit).toHaveBeenCalledWith(101) + expect(mocks.memberships.mock.calls[0][0].connectors).toHaveLength(100) + const cursor = searchSourceCursorSchema.parse( + JSON.parse(Buffer.from(result.nextCursor!, 'base64url').toString()) + ) + expect(cursor).toMatchObject({ id: 'source-024', createdAt: '2026-09-05T12:00:00.123456Z' }) + expect(dbChainMockFns.where.mock.calls).toContainEqual([ + expect.objectContaining({ + type: 'and', + conditions: expect.arrayContaining([ + { type: 'inArray', column: document.connectorId, values: rows(25).map((row) => row.id) }, + ]), + }), + ]) + }) + + it('advances over an empty filtered candidate page without claiming the list ended', async () => { + seed(rows(101)) + const result = await listSearchSources.execute({ + principal, + input: { ...input, search: 'missing' }, + }) + expect(result.sources).toEqual([]) + expect(result.nextCursor).not.toBeNull() + expect(JSON.parse(Buffer.from(result.nextCursor!, 'base64url').toString()).id).toBe( + 'source-099' + ) + expect( + dbChainMockFns.select.mock.calls.every(([projection]) => !('failedCount' in projection)) + ).toBe(true) + }) + + it('ends a sparse final page and applies the verified personal membership filter', async () => { + const candidates = rows(100) + seed(candidates) + mocks.memberships.mockResolvedValue( + new Map([ + ['source-097', 'connected'], + ['source-098', 'needs_reauth'], + ]) + ) + const result = await listSearchSources.execute({ principal, input: { ...input, mine: true } }) + expect(result.sources.map((row) => row.connectorId)).toEqual(['source-097']) + expect(result.nextCursor).toBeNull() + }) + + it.each(['filter', 'viewer', 'scope'] as const)( + 'rejects a cursor replayed under a different %s before reading sources', + async (change) => { + seed(rows(26)) + const first = await listSearchSources.execute({ principal, input }) + resetDbChainMock() + if (change === 'scope') + mocks.context.mockResolvedValue({ + workspaceId: 'other-workspace', + workspaceOrganizationId: null, + allowPersonalApiKeys: true, + }) + await expect( + listSearchSources.execute({ + principal: change === 'viewer' ? { ...principal, userId: 'other-reader' } : principal, + input: { + ...input, + cursor: first.nextCursor!, + ...(change === 'filter' ? { mine: true } : {}), + }, + }) + ).rejects.toMatchObject({ code: 'validation' }) + expect(dbChainMockFns.select).not.toHaveBeenCalled() + } + ) +}) + +describe('Search source overview', () => { + it('returns provider existence and readable search readiness without loading source configuration', async () => { + queueTableRows(knowledgeConnector, [ + { connectorType: 'google_drive' }, + { connectorType: 'github' }, + ]) + queueTableRows(knowledgeConnector, [{ connectorType: 'github' }]) + queueTableRows(document, [{ id: 'readable-document' }]) + const result = await readSearchSourceOverview.execute({ principal, input }) + expect(result).toEqual({ + providers: [ + { connectorType: 'google_drive', isSyncing: false }, + { connectorType: 'github', isSyncing: true }, + ], + hasSearchableDocuments: true, + }) + expect(mocks.predicate).toHaveBeenCalledWith(access) + expect(mocks.memberships).not.toHaveBeenCalled() + expect( + dbChainMockFns.select.mock.calls.every( + ([projection]) => !('sourceConfig' in projection) && !('count' in projection) + ) + ).toBe(true) + }) + + it('does not confuse configured sources with searchable documents or expose gated progress', async () => { + mocks.availability.mockResolvedValue({ memberScoped: false, sourceMirrored: false }) + queueTableRows(knowledgeConnector, [{ connectorType: 'google_drive' }]) + const result = await readSearchSourceOverview.execute({ principal, input }) + expect(result).toEqual({ + providers: [{ connectorType: 'google_drive', isSyncing: false }], + hasSearchableDocuments: false, + }) + }) + + it('rechecks current membership before reading the overview', async () => { + mocks.permission.mockResolvedValue(null) + await expect(readSearchSourceOverview.execute({ principal, input })).rejects.toMatchObject({ + code: 'forbidden', + }) + expect(mocks.access).not.toHaveBeenCalled() + expect(dbChainMockFns.select).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/knowledge/application/search-sources.ts b/apps/sim/lib/knowledge/application/search-sources.ts index 085c6f8cffc..32f9cb642ac 100644 --- a/apps/sim/lib/knowledge/application/search-sources.ts +++ b/apps/sim/lib/knowledge/application/search-sources.ts @@ -1,6 +1,12 @@ import { db } from '@sim/db' import { document, embedding, knowledgeBase, knowledgeConnector, user } from '@sim/db/schema' -import { and, asc, eq, exists, inArray, isNull, sql } from 'drizzle-orm' +import { and, desc, eq, exists, inArray, isNull, lt, or, sql } from 'drizzle-orm' +import { + listSearchSourcesContract, + searchSourceCursorSchema, +} from '@/lib/api/contracts/knowledge/connectors' +import { cursorRoute, cursorScopeKey } from '@/lib/api/cursor-binding' +import { OrchestrationError } from '@/lib/core/orchestration/types' import { type ResourceOwner, resourceScopeFromOwner } from '@/lib/core/resource-scope' import { resourceScopeCondition } from '@/lib/core/resource-scope.server' import { resolveKnowledgeAccessAvailability } from '@/lib/knowledge/access/availability' @@ -10,21 +16,54 @@ import { defineAuthorizedKnowledgeUseCase } from '@/lib/knowledge/application/au import { resolveKnowledgeOwnerContext } from '@/lib/knowledge/application/contexts' import { knowledgeOperations } from '@/lib/knowledge/application/operations' import { resolveViewerConnectorMemberships } from '@/lib/knowledge/connectors/member-provisioning' +import { + SEARCH_SOURCE_CANDIDATE_PAGE_SIZE, + SEARCH_SOURCE_PAGE_SIZE, +} from '@/lib/knowledge/constants' import { listOrganizationSearchApprovals } from '@/lib/knowledge/search/integration-policy' import { describeSearchSource } from '@/lib/sim-search/source-identity' import { getConnectorMeta } from '@/connectors/registry' -export interface ListSearchSourcesInput extends ResourceOwner {} +export interface ListSearchSourcesInput extends ResourceOwner { + cursor?: string + search?: string + mine?: boolean +} /** Viewer-safe setup and indexing state; source credentials and other members never leave this use case. */ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ operation: knowledgeOperations.listSearchSources, resolveContext: ({ input }: { input: ListSearchSourcesInput }) => resolveKnowledgeOwnerContext(input), - async execute({ principal, context }) { - const rows = await db + async execute({ principal, input, context }) { + const search = input.search?.trim().toLowerCase() ?? '' + const cursorScope = cursorScopeKey(cursorRoute(listSearchSourcesContract), { + workspaceId: context.workspaceId, + organizationId: context.organizationId, + userId: principal.userId, + search, + mine: input.mine === true, + order: 'newest', + }) + const cursor = (() => { + if (!input.cursor) return null + try { + const parsed = searchSourceCursorSchema.parse( + JSON.parse(Buffer.from(input.cursor, 'base64url').toString('utf8')) + ) + if (parsed.scope !== cursorScope) throw new Error('Cursor scope mismatch') + return parsed + } catch { + throw new OrchestrationError( + 'validation', + 'Restart source pagination after changing your filters.' + ) + } + })() + const candidates = await db .select({ id: knowledgeConnector.id, + createdAt: sql`to_char(${knowledgeConnector.createdAt}, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"')`, knowledgeBaseId: knowledgeConnector.knowledgeBaseId, connectorType: knowledgeConnector.connectorType, sourceConfig: knowledgeConnector.sourceConfig, @@ -45,11 +84,22 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ isNull(knowledgeBase.deletedAt), inArray(knowledgeConnector.accessMode, ['admin', 'members']), isNull(knowledgeConnector.archivedAt), - isNull(knowledgeConnector.deletedAt) + isNull(knowledgeConnector.deletedAt), + cursor + ? or( + sql`${knowledgeConnector.createdAt} < ${cursor.createdAt}::timestamp`, + and( + sql`${knowledgeConnector.createdAt} = ${cursor.createdAt}::timestamp`, + lt(knowledgeConnector.id, cursor.id) + ) + ) + : undefined ) ) - .orderBy(asc(knowledgeConnector.createdAt), asc(knowledgeConnector.id)) - if (rows.length === 0) return { sources: [] } + .orderBy(desc(knowledgeConnector.createdAt), desc(knowledgeConnector.id)) + .limit(SEARCH_SOURCE_CANDIDATE_PAGE_SIZE + 1) + if (candidates.length === 0) return { sources: [], nextCursor: null } + const scanned = candidates.slice(0, SEARCH_SOURCE_CANDIDATE_PAGE_SIZE) const [availability, memberships, viewers, access, approvals] = await Promise.all([ resolveKnowledgeAccessAvailability(context), @@ -57,7 +107,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ userId: principal.userId, workspaceId: context.workspaceId, organizationId: context.organizationId, - connectors: rows, + connectors: scanned, }), db .select({ emailVerified: user.emailVerified }) @@ -67,6 +117,29 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ createKnowledgeAccessProvider(principal, context).get(), context.organizationId ? listOrganizationSearchApprovals(context.organizationId) : null, ]) + /** Filtering uses the same safe display labels and verified membership as the source rows. */ + const matches = scanned.filter((row) => { + if (input.mine && memberships.get(row.id) !== 'connected') return false + const meta = getConnectorMeta(row.connectorType) + const label = meta + ? `${meta.name ?? row.connectorType} ${describeSearchSource(meta, row.sourceConfig)}` + : row.connectorType + return label.toLowerCase().includes(search) + }) + const rows = matches.slice(0, SEARCH_SOURCE_PAGE_SIZE) + const last = matches.length > SEARCH_SOURCE_PAGE_SIZE ? rows.at(-1) : scanned.at(-1) + const hasMore = matches.length > SEARCH_SOURCE_PAGE_SIZE || candidates.length > scanned.length + const nextCursor = + hasMore && last + ? Buffer.from( + JSON.stringify({ + createdAt: last.createdAt, + id: last.id, + scope: cursorScope, + }) + ).toString('base64url') + : null + if (rows.length === 0) return { sources: [], nextCursor } const documentStates = await db .select({ connectorId: document.connectorId, @@ -79,6 +152,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ .where(and(eq(embedding.documentId, document.id), eq(embedding.enabled, true))) )} )::int`, + failedCount: sql`count(*) FILTER (WHERE ${document.processingStatus} = 'failed')::int`, isIndexing: sql`bool_or(${document.processingStatus} IN ('pending', 'processing'))`, }) .from(document) @@ -99,6 +173,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ const states = new Map(documentStates.map((state) => [state.connectorId, state])) return { + nextCursor, sources: rows.flatMap((row) => { const meta = getConnectorMeta(row.connectorType) if (row.accessMode !== 'admin' && row.accessMode !== 'members') return [] @@ -126,6 +201,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ isSyncing: available && enabled && + approvals?.get(row.connectorType) !== false && (row.status === 'pending' || row.status === 'syncing' || (row.accessMode === 'members' && @@ -138,6 +214,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ row.status === 'error' || (row.accessMode === 'members' && row.memberSyncStatus === 'error'), viewerDocumentCount: available ? (state?.count ?? 0) : 0, + viewerFailedDocumentCount: available ? (state?.failedCount ?? 0) : 0, viewerEmailVerified: viewers[0]?.emailVerified === true, } as const return [ diff --git a/apps/sim/lib/knowledge/constants.ts b/apps/sim/lib/knowledge/constants.ts index 1703f00b74f..5402f81fb1d 100644 --- a/apps/sim/lib/knowledge/constants.ts +++ b/apps/sim/lib/knowledge/constants.ts @@ -20,6 +20,13 @@ export const MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_MUTATION_ITEMS = 100 export const DEFAULT_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE = 100 export const MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE = 200 +/** Maximum source IDs in one viewer-authorized progress request. */ +export const MAX_SEARCH_SOURCE_PROGRESS_ITEMS = 100 +/** Bound viewer-specific source resolution and document counts to a single page. */ +export const SEARCH_SOURCE_PAGE_SIZE = 25 +export const SEARCH_SOURCE_CANDIDATE_PAGE_SIZE = 100 +export const MAX_SEARCH_SOURCE_PROVIDER_TYPES = 100 + /** * Chunking a knowledge base gets when its creator names no configuration. * diff --git a/apps/sim/lib/sim-search/source-identity.test.ts b/apps/sim/lib/sim-search/source-identity.test.ts index 468095231e3..a7f439fb1be 100644 --- a/apps/sim/lib/sim-search/source-identity.test.ts +++ b/apps/sim/lib/sim-search/source-identity.test.ts @@ -1,8 +1,16 @@ /** @vitest-environment node */ import { describe, expect, it } from 'vitest' -import { describeSearchSource, searchSourceIdentity } from '@/lib/sim-search/source-identity' +import { + createSourceLabelMetadata, + describeSearchSource, + normalizeSourceSelectionLabels, + readSourceSelectionLabels, + SOURCE_LABELS_KEY, + searchSourceIdentity, +} from '@/lib/sim-search/source-identity' import { confluenceConnectorMeta } from '@/connectors/confluence/meta' import { gitlabConnectorMeta } from '@/connectors/gitlab/meta' +import { googleDriveConnectorMeta } from '@/connectors/google-drive/meta' describe('Search source identity', () => { it('normalizes multi-value settings and ignores runtime mappings and cleared caps', () => { @@ -60,4 +68,93 @@ describe('Search source identity', () => { describeSearchSource(confluenceConnectorMeta, { domain: 'x'.repeat(500) }).length ).toBeLessThanOrEqual(240) }) + + it('uses readable counts for opaque legacy IDs and leaves unconfigured defaults unchanged', () => { + expect(describeSearchSource(googleDriveConnectorMeta, { folderId: 'opaque-folder-id' })).toBe( + '1 folder selected' + ) + expect( + describeSearchSource(googleDriveConnectorMeta, { folderId: ['folder-a', 'folder-b'] }) + ).toBe('2 folders selected') + expect(describeSearchSource(googleDriveConnectorMeta, {})).toBe('') + expect(describeSearchSource(gitlabConnectorMeta, { project: '12345' })).toBe( + '1 project selected' + ) + }) + + it('uses selected folder names without changing deduplication identity', () => { + const config = { folderId: ['folder-b', 'folder-a'] } + const sourceLabels = createSourceLabelMetadata(googleDriveConnectorMeta, config, { + folderId: [ + { id: 'folder-a', label: 'Engineering' }, + { id: 'folder-b', label: 'Company docs' }, + ], + }) + const labeledConfig = { ...config, [SOURCE_LABELS_KEY]: sourceLabels } + expect(describeSearchSource(googleDriveConnectorMeta, labeledConfig)).toBe( + 'Engineering · Company docs' + ) + expect(searchSourceIdentity(googleDriveConnectorMeta, labeledConfig)).toBe( + searchSourceIdentity(googleDriveConnectorMeta, config) + ) + }) + + it('drops saved labels when selections or source settings change', () => { + const config = { folderId: ['folder-a'], fileType: 'documents' } + const labeledConfig = { + ...config, + [SOURCE_LABELS_KEY]: createSourceLabelMetadata(googleDriveConnectorMeta, config, { + folderId: [{ id: 'folder-a', label: 'Engineering' }], + }), + } + for (const changed of [{ folderId: ['folder-b'] }, { fileType: 'spreadsheets' }]) { + expect(describeSearchSource(googleDriveConnectorMeta, { ...labeledConfig, ...changed })).toBe( + '1 folder selected' + ) + } + }) + + it('rejects mismatched or partial label sets even when the config identity matches', () => { + const config = { folderId: ['folder-a', 'folder-b'] } + for (const options of [ + [{ id: 'folder-a', label: 'Engineering' }], + [{ id: 'other-folder', label: 'Unrelated docs' }], + ]) { + expect( + describeSearchSource(googleDriveConnectorMeta, { + ...config, + [SOURCE_LABELS_KEY]: { + identity: searchSourceIdentity(googleDriveConnectorMeta, config), + fields: { folderId: options }, + }, + }) + ).toBe('2 folders selected') + } + }) + + it('bounds metadata, rejects ID-only labels, and never reads secret config fields as labels', () => { + for (const options of [ + [{ id: 'folder-a', label: 'folder-a' }], + [{ id: 'folder-a', label: 'x'.repeat(161) }], + [{ id: 'folder-a', label: 'Unsafe\nlabel' }], + Array.from({ length: 51 }, (_, index) => ({ + id: `folder-${index}`, + label: `Folder ${index}`, + })), + ]) { + expect(normalizeSourceSelectionLabels({ folderId: options })).toEqual({}) + } + const config = { folderId: ['folder-a'], apiKey: 'secret' } + const metadata = createSourceLabelMetadata(googleDriveConnectorMeta, config, { + folderId: [{ id: 'folder-a', label: 'Engineering', secret: 'do not persist' }], + apiKey: [{ id: 'secret', label: 'do not display' }], + }) + expect(metadata?.fields).toEqual({ folderId: [{ id: 'folder-a', label: 'Engineering' }] }) + expect( + readSourceSelectionLabels(googleDriveConnectorMeta, { ...config, _sourceLabels: {} }) + ).toEqual({}) + expect( + describeSearchSource(googleDriveConnectorMeta, { ...config, _sourceLabels: metadata }) + ).toBe('Engineering') + }) }) diff --git a/apps/sim/lib/sim-search/source-identity.ts b/apps/sim/lib/sim-search/source-identity.ts index 6bb3c45f821..cfdd475f57b 100644 --- a/apps/sim/lib/sim-search/source-identity.ts +++ b/apps/sim/lib/sim-search/source-identity.ts @@ -40,12 +40,125 @@ const SOURCE_ADDRESS_FIELDS = new Set([ 'channelIds', 'teamId', 'databaseId', + 'rootPageId', + 'projectId', + 'label', 'repository', 'repo', 'ref', 'pathPrefix', ]) +export const SOURCE_LABELS_KEY = '_sourceLabels' + +export interface SourceSelectionLabel { + id: string + label: string +} + +export type SourceSelectionLabels = Record + +interface SourceLabelMetadata { + identity: string + fields: SourceSelectionLabels +} + +const OPAQUE_SOURCE_FIELDS = new Map([ + ['folderId', 'folder'], + ['channel', 'channel'], + ['channelIds', 'channel'], + ['teamId', 'team'], + ['databaseId', 'database'], + ['rootPageId', 'page'], + ['projectId', 'project'], + ['label', 'label'], +]) + +const NAMED_SOURCE_FIELDS = new Map([ + ['project', 'project'], + ['projectKey', 'project'], + ['spaceKey', 'space'], + ['repository', 'repository'], + ['repo', 'repository'], +]) + +/** Selection metadata contains display text only, never arbitrary source settings or credentials. */ +export function normalizeSourceSelectionLabels(raw: unknown): SourceSelectionLabels { + if (!isPlainRecord(raw)) return {} + const labels: SourceSelectionLabels = {} + for (const id of SOURCE_ADDRESS_FIELDS) { + const options = raw[id] + if (!Array.isArray(options) || options.length === 0 || options.length > 50) continue + if ( + options.some( + (option) => + !isPlainRecord(option) || + typeof option.id !== 'string' || + !option.id.trim() || + option.id.length > 1024 || + typeof option.label !== 'string' || + !option.label.trim() || + option.label.length > 160 || + /[\u0000-\u001f\u007f]/.test(option.label) || + option.label.trim() === option.id.trim() + ) + ) { + continue + } + labels[id] = options.map((option) => ({ id: option.id.trim(), label: option.label.trim() })) + } + return labels +} + +export function createSourceLabelMetadata( + meta: Pick, + sourceConfig: Record, + rawLabels: unknown +): SourceLabelMetadata | undefined { + const labels = normalizeSourceSelectionLabels(rawLabels) + const fields: SourceSelectionLabels = {} + for (const field of meta.configFields) { + const id = field.canonicalParamId ?? field.id + if (fields[id] || !labels[id]) continue + const selected = field.multi + ? parseMultiValue(sourceConfig[id]) + : typeof sourceConfig[id] === 'string' && sourceConfig[id].trim() + ? [sourceConfig[id].trim()] + : [] + const uniqueIds = new Set(selected) + const optionsById = new Map(labels[id].map((option) => [option.id, option])) + if ( + uniqueIds.size === 0 || + uniqueIds.size !== optionsById.size || + !selected.every((value) => optionsById.has(value)) + ) { + continue + } + fields[id] = [...uniqueIds].sort().map((value) => optionsById.get(value)!) + } + if (Object.keys(fields).length === 0) return undefined + const identity = searchSourceIdentity(meta, sourceConfig) + return identity.length <= 64_000 ? { identity, fields } : undefined +} + +/** Config identity and selected IDs must still match the source for saved labels to be usable. */ +export function readSourceSelectionLabels( + meta: Pick, + sourceConfig: unknown +): SourceSelectionLabels { + if (!isPlainRecord(sourceConfig)) return {} + const raw = sourceConfig[SOURCE_LABELS_KEY] + if ( + !isPlainRecord(raw) || + typeof raw.identity !== 'string' || + raw.identity.length > 64_000 || + raw.identity !== searchSourceIdentity(meta, sourceConfig) + ) { + return {} + } + return createSourceLabelMetadata(meta, sourceConfig, raw.fields)?.fields ?? {} +} + /** Only declared source addresses are shown; credential and arbitrary config values are never rendered. */ export function describeSearchSource( meta: Pick, @@ -54,11 +167,24 @@ export function describeSearchSource( if (!isPlainRecord(sourceConfig)) return '' const caps = new Set(meta.permissionScopedListing?.capFieldIds ?? []) const fields = new Set(meta.configFields.map((field) => field.canonicalParamId ?? field.id)) + const labels = readSourceSelectionLabels(meta, sourceConfig) return truncate( [...fields] .flatMap((id) => { if (!SOURCE_ADDRESS_FIELDS.has(id) || caps.has(id)) return [] const value = sourceConfig[id] + if (labels[id]) return labels[id].map((option) => option.label) + const values = parseMultiValue(value) + const hasOpaqueId = values.some((item) => + /^(?:\d+|[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12})$/i.test(item) + ) + const noun = + OPAQUE_SOURCE_FIELDS.get(id) ?? (hasOpaqueId ? NAMED_SOURCE_FIELDS.get(id) : undefined) + if (noun) { + const count = new Set(values).size + const plural = noun === 'repository' ? 'repositories' : `${noun}s` + return count > 0 ? [`${count} ${count === 1 ? noun : plural} selected`] : [] + } if (typeof value === 'string' && value.trim()) return [value.trim()] if (Array.isArray(value)) return value.filter((item): item is string => typeof item === 'string') diff --git a/apps/sim/stores/connector-setup/store.test.ts b/apps/sim/stores/connector-setup/store.test.ts index c08b1941ff0..bca13c32803 100644 --- a/apps/sim/stores/connector-setup/store.test.ts +++ b/apps/sim/stores/connector-setup/store.test.ts @@ -48,6 +48,17 @@ describe('connector setup drafts', () => { expect(store.getDraft('source-11')).toBeDefined() }) + it('preserves selected display names across an OAuth draft rehydration', async () => { + const saved: ConnectorSetupDraft = { + ...draft(), + sourceConfig: { channelSelector: ['channel-1'] }, + selectionLabels: { channel: [{ id: 'channel-1', label: 'Engineering' }] }, + } + useConnectorSetupStore.getState().saveDraft('user:org:index:slack', saved) + await useConnectorSetupStore.persist.rehydrate() + expect(useConnectorSetupStore.getState().getDraft('user:org:index:slack')).toEqual(saved) + }) + it('clears just the canceled setup and clears persisted drafts on reset', async () => { const store = useConnectorSetupStore.getState() store.saveDraft('one', draft()) diff --git a/apps/sim/stores/connector-setup/store.ts b/apps/sim/stores/connector-setup/store.ts index 23f30fe6995..c8c4456ee3a 100644 --- a/apps/sim/stores/connector-setup/store.ts +++ b/apps/sim/stores/connector-setup/store.ts @@ -3,11 +3,13 @@ import { create } from 'zustand' import { createJSONStorage, devtools, persist } from 'zustand/middleware' import type { ConnectorAccessMode } from '@/lib/knowledge/connectors/access-modes' +import type { SourceSelectionLabels } from '@/lib/sim-search/source-identity' import { registerUserDataReset } from '@/stores/user-data-reset-registry' export interface ConnectorSetupDraft { sourceConfig: Record canonicalModes: Record + selectionLabels?: SourceSelectionLabels accessMode: ConnectorAccessMode credentialId: string | null contentCredentialId: string | null From 4973736bd4aaa823a611dec05bc6309b2325364a Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 12:21:13 -0700 Subject: [PATCH 02/14] fix(search): prune idle dispatch owners safely --- .../document-dispatch.integration.ts | 52 +++++++++++++++++++ .../knowledge/application/operations.test.ts | 2 + 2 files changed, 54 insertions(+) diff --git a/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts b/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts index 7daf724f521..24abc1f43a2 100644 --- a/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts @@ -202,6 +202,58 @@ describe('durable fair document admission', () => { } }) + it('prunes idle owners in bounded batches while retaining delayed and outstanding work', async () => { + const idleOwners = Array.from({ length: 1001 }, () => `organization:${generateId()}`) + fixtureOwners.push(...idleOwners) + await db + .insert(knowledgeDocumentDispatchOwner) + .values(idleOwners.map((ownerKey) => ({ ownerKey }))) + const delayed = await createSource() + const active = await createSource() + const [delayedPayload] = await createDocuments(delayed, 1) + const [activePayload] = await createDocuments(active, 1) + await enqueueDocumentProcessingDispatch([delayedPayload, activePayload]) + await db + .update(knowledgeDocumentDispatch) + .set({ availableAt: new Date(Date.now() + 60_000) }) + .where(eq(knowledgeDocumentDispatch.documentId, delayedPayload.documentId)) + + await claimDocumentProcessingDispatches() + const retained = await db.select().from(knowledgeDocumentDispatchOwner) + expect(retained.filter((owner) => idleOwners.includes(owner.ownerKey))).toHaveLength(1) + expect(retained.map((owner) => owner.ownerKey)).toEqual( + expect.arrayContaining([delayed.ownerKey, active.ownerKey]) + ) + await claimDocumentProcessingDispatches() + expect(await db.select().from(knowledgeDocumentDispatchOwner)).toHaveLength(2) + + await completeDocumentProcessingDispatch(activePayload) + await claimDocumentProcessingDispatches() + expect( + (await db.select().from(knowledgeDocumentDispatchOwner)).map((owner) => owner.ownerKey) + ).toEqual([delayed.ownerKey]) + }) + + it('keeps every persisted intent discoverable when idle pruning races with enqueues', async () => { + const sources = await Promise.all(Array.from({ length: 12 }, () => createSource())) + await db + .insert(knowledgeDocumentDispatchOwner) + .values(sources.map(({ ownerKey }) => ({ ownerKey }))) + const payloads = await Promise.all(sources.map((source) => createDocuments(source, 1))) + const results = await Promise.allSettled([ + ...payloads.map((batch) => enqueueDocumentProcessingDispatch(batch)), + ...Array.from({ length: 6 }, () => claimDocumentProcessingDispatches()), + ]) + expect(results.every((result) => result.status === 'fulfilled')).toBe(true) + const owners = new Set( + (await db.select().from(knowledgeDocumentDispatchOwner)).map((owner) => owner.ownerKey) + ) + const intents = await db.select().from(knowledgeDocumentDispatch) + expect(intents).toHaveLength(sources.length) + expect(intents.every((intent) => owners.has(intent.ownerKey))).toBe(true) + expect(await claimDocumentProcessingDispatches()).toHaveLength(sources.length) + }) + it('lets one owner use available workers without queuing its entire corpus ahead of a newcomer', async () => { const large = await createSource() await enqueueDocumentProcessingDispatch(await createDocuments(large, 10_000)) diff --git a/apps/sim/lib/knowledge/application/operations.test.ts b/apps/sim/lib/knowledge/application/operations.test.ts index 11c189ff10b..da07ddee98b 100644 --- a/apps/sim/lib/knowledge/application/operations.test.ts +++ b/apps/sim/lib/knowledge/application/operations.test.ts @@ -58,6 +58,8 @@ describe('knowledge operation registry', () => { 'knowledge.connectors.update', 'knowledge.connectors.access.update', 'knowledge.search.sources.list', + 'knowledge.search.sources.overview', + 'knowledge.search.sources.progress', 'knowledge.search.integrations.list', 'knowledge.search.integrations.approve', 'knowledge.connectors.members.list', From 940a034ca933e6268ebd0529009f7b1f14741d2a Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 12:32:09 -0700 Subject: [PATCH 03/14] test(search): use static invitation mocks --- apps/sim/app/invite/[id]/invite.test.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/sim/app/invite/[id]/invite.test.tsx b/apps/sim/app/invite/[id]/invite.test.tsx index 0cac988bcd2..1a966c3f386 100644 --- a/apps/sim/app/invite/[id]/invite.test.tsx +++ b/apps/sim/app/invite/[id]/invite.test.tsx @@ -1,7 +1,7 @@ /** * @vitest-environment jsdom */ -import { act, type ReactNode } from 'react' +import { act, type ReactNode, useEffect, useState } from 'react' import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { ApiClientError } from '@/lib/api/client/errors' @@ -50,8 +50,7 @@ vi.mock('next/navigation', () => ({ useSearchParams: () => mockSearchParams.current, })) -vi.mock('@tanstack/react-query', async () => { - const React = await import('react') +vi.mock('@tanstack/react-query', () => { return { useQueryClient: () => ({ cancelQueries: mockCancelQueries, @@ -66,13 +65,13 @@ vi.mock('@tanstack/react-query', async () => { queryFn: (context: { signal?: AbortSignal }) => Promise enabled?: boolean }) => { - const [state, setState] = React.useState<{ + const [state, setState] = useState<{ data: unknown error: unknown isPending: boolean }>({ data: undefined, error: null, isPending: true }) const enabled = options.enabled !== false - React.useEffect(() => { + useEffect(() => { if (!enabled) return let cancelled = false options.queryFn({}).then( @@ -108,10 +107,11 @@ vi.mock('@/lib/auth/auth-client', () => ({ useSession: mockUseSession, })) -vi.mock('@/app/invite/components', async () => ({ - InvitationDisclosure: (await import('@/app/invite/components/invitation-disclosure')) - .InvitationDisclosure, - InviteLayout: ({ children }: { children: ReactNode }) => children, +vi.mock('@/app/invite/components/layout', () => ({ + default: ({ children }: { children: ReactNode }) => children, +})) + +vi.mock('@/app/invite/components/status-card', () => ({ InviteStatusCard: ({ actions = [], description, From dcff8ff4a22c7f7689c36f352894369a92e2cf48 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 13:51:46 -0700 Subject: [PATCH 04/14] improvement(search): use source settings pages and searchable lists --- apps/docs/content/docs/search/index.mdx | 2 +- .../[connectorId]/documents/route.ts | 2 + .../app/api/knowledge/migrated-routes.test.ts | 8 +- apps/sim/app/invite/components/index.ts | 6 +- .../invite/components/status-card.test.tsx | 10 +- ...rganization-integrations-settings.test.tsx | 13 +- .../organization-integrations-setup.tsx | 64 +- .../sources/[connectorId]/layout.tsx | 14 + .../sources/[connectorId]/loading.tsx | 4 + .../sources/[connectorId]/page.test.tsx | 77 ++ .../sources/[connectorId]/page.tsx | 42 + .../sources/[connectorId]/search-params.ts | 13 + .../[connectorId]/source-detail.test.tsx | 268 ++++++ .../sources/[connectorId]/source-detail.tsx | 369 ++++++++ .../connect-oauth-modal.test.tsx | 99 +- .../connect-oauth-modal.tsx | 10 +- .../connector-access-field.tsx | 13 +- .../connector-config-fields.tsx | 5 +- .../connector-documents.tsx | 206 +++++ .../connector-selector-field.test.tsx | 43 + .../connector-selector-field.tsx | 9 +- .../connectors-section/connector-actions.tsx | 192 ++++ .../connectors-section/connector-recovery.tsx | 158 ++++ .../connector-sync-history.tsx | 230 +++++ .../connector-sync-state.ts | 53 ++ .../connectors-section.test.tsx | 489 +++++++++- .../connectors-section/connectors-section.tsx | 853 +----------------- .../components/connectors-section/index.ts | 8 +- .../knowledge/[id]/components/consts.ts | 3 +- .../connector-documents-tab.test.tsx | 31 +- .../connector-documents-tab.tsx | 176 +--- .../connector-settings-fields.tsx | 392 ++++++++ .../edit-connector-modal.tsx | 825 +---------------- .../use-connector-settings-form.test.tsx | 219 +++++ .../use-connector-settings-form.ts | 475 ++++++++++ .../components/search-source-setup.test.tsx | 25 + .../search/components/search-source-setup.tsx | 25 +- .../credential-group-invite-modal.tsx | 1 - .../organization-account-invite-modal.tsx | 1 - .../organization-account-people.test.tsx | 117 ++- .../organization-account-people.tsx | 99 +- .../kb/connector-documents-progress.test.tsx | 278 ++++++ apps/sim/hooks/queries/kb/connectors.test.ts | 188 +++- apps/sim/hooks/queries/kb/connectors.ts | 147 ++- .../queries/organization-accounts.test.tsx | 103 +++ .../hooks/queries/organization-accounts.ts | 13 +- .../sim/hooks/use-oauth-return-hooks.test.tsx | 149 ++- apps/sim/hooks/use-oauth-return.test.ts | 30 + apps/sim/hooks/use-oauth-return.ts | 22 +- .../contracts/knowledge/connectors.test.ts | 34 + .../lib/api/contracts/knowledge/connectors.ts | 8 + .../contracts/organization-accounts.test.ts | 27 +- .../api/contracts/organization-accounts.ts | 1 + .../organization-account-management.test.ts | 131 +++ .../organization-account-management.ts | 4 +- .../lib/credential-groups/enrollments.test.ts | 31 +- apps/sim/lib/credential-groups/enrollments.ts | 7 + apps/sim/lib/credentials/client-state.ts | 1 + .../search-source-progress.integration.ts | 154 ++++ .../knowledge/application/connectors.test.ts | 20 + .../lib/knowledge/application/connectors.ts | 23 +- apps/sim/lib/knowledge/constants.ts | 1 + apps/sim/lib/navigation/paths.ts | 2 + 63 files changed, 5007 insertions(+), 2016 deletions(-) create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/layout.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/loading.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.test.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/search-params.ts create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-history.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state.ts create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts create mode 100644 apps/sim/hooks/queries/kb/connector-documents-progress.test.tsx create mode 100644 apps/sim/hooks/queries/organization-accounts.test.tsx create mode 100644 apps/sim/lib/credential-groups/application/organization-account-management.test.ts diff --git a/apps/docs/content/docs/search/index.mdx b/apps/docs/content/docs/search/index.mdx index 03a0cfd80ce..eea2b5d8994 100644 --- a/apps/docs/content/docs/search/index.mdx +++ b/apps/docs/content/docs/search/index.mdx @@ -115,7 +115,7 @@ Search runs background syncs on an hourly schedule. Large sources, provider limi A completed sync means the source was checked; some documents may still be indexing. The source row shows how many documents you can search and whether indexing failed for any documents you can access. -As an admin, open **Manage → Settings → Documents → Failed** to inspect those files. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; use the **Excluded** tab and **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. +As an admin, open **Manage → Documents** and select **Failed** from the status dropdown to inspect those files. Use the search field to find a document by name. **Settings** contains the source configuration and **Sync history** shows recent runs. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; select **Excluded** and then **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. Temporary indexing-capacity waits retry automatically in the background. If automatic retries are exhausted, the document appears as failed so an admin can retry it. Other searchable documents remain available while this work finishes. diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts index e0e41284ab0..6d2c2c4928f 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.ts @@ -24,6 +24,8 @@ export const GET = defineInternalJsonRoute({ mapInput: ({ params, query }) => ({ knowledgeBaseId: params.id, connectorId: params.connectorId, + filter: query.filter, + search: query.search, includeExcluded: query.includeExcluded, failedOnly: query.failedOnly, limit: query.limit, diff --git a/apps/sim/app/api/knowledge/migrated-routes.test.ts b/apps/sim/app/api/knowledge/migrated-routes.test.ts index f2b17f97357..908db3d5fad 100644 --- a/apps/sim/app/api/knowledge/migrated-routes.test.ts +++ b/apps/sim/app/api/knowledge/migrated-routes.test.ts @@ -332,14 +332,18 @@ describe('migrated internal Knowledge routes', () => { const filteredListResponse = await listConnectorDocuments( new NextRequest( - 'http://localhost/api/knowledge/knowledge-1/connectors/connector-1/documents?includeExcluded=false' + 'http://localhost/api/knowledge/knowledge-1/connectors/connector-1/documents?includeExcluded=false&filter=excluded&search=%20Roadmap%20' ), { params: Promise.resolve({ id: 'knowledge-1', connectorId: 'connector-1' }) } ) expect(filteredListResponse.status).toBe(200) expect(mocks.listConnectorDocuments).toHaveBeenLastCalledWith( expect.objectContaining({ - input: expect.objectContaining({ includeExcluded: false }), + input: expect.objectContaining({ + includeExcluded: false, + filter: 'excluded', + search: 'Roadmap', + }), }) ) diff --git a/apps/sim/app/invite/components/index.ts b/apps/sim/app/invite/components/index.ts index 33d1fa04182..9098fcdfab2 100644 --- a/apps/sim/app/invite/components/index.ts +++ b/apps/sim/app/invite/components/index.ts @@ -1,3 +1,3 @@ -export { InvitationDisclosure } from './invitation-disclosure' -export { default as InviteLayout } from './layout' -export { InviteStatusCard } from './status-card' +export { InvitationDisclosure } from '@/app/invite/components/invitation-disclosure' +export { default as InviteLayout } from '@/app/invite/components/layout' +export { InviteStatusCard } from '@/app/invite/components/status-card' diff --git a/apps/sim/app/invite/components/status-card.test.tsx b/apps/sim/app/invite/components/status-card.test.tsx index 357d773c086..a3d5bc09cde 100644 --- a/apps/sim/app/invite/components/status-card.test.tsx +++ b/apps/sim/app/invite/components/status-card.test.tsx @@ -1,11 +1,15 @@ /** @vitest-environment jsdom */ -import { act } from 'react' +import { act, type ButtonHTMLAttributes } from 'react' import { createRoot } from 'react-dom/client' import { expect, it, vi } from 'vitest' vi.mock('next/navigation', () => ({ useRouter: () => ({ push: vi.fn() }) })) -vi.mock('@/app/(auth)/components', async () => ({ - AuthSubmitButton: (await import('@/app/(auth)/components/auth-submit-button')).AuthSubmitButton, +vi.mock('@/app/(auth)/components', () => ({ + AuthSubmitButton: ({ children, onClick, disabled }: ButtonHTMLAttributes) => ( + + ), })) import { InviteStatusCard } from '@/app/invite/components/status-card' diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx index 6e08b448195..d6b5d316464 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx @@ -27,6 +27,7 @@ vi.mock('@/hooks/queries/organization-accounts', () => ({ useRevokeOrganizationAccountEnrollment: () => ({}), })) +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' import { OrganizationIntegrationsSettings } from '@/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings' describe('organization integration invitations', () => { @@ -67,7 +68,11 @@ describe('organization integration invitations', () => { await act(async () => root.render( - + + + + + ) ) @@ -90,8 +95,8 @@ describe('organization integration invitations', () => { await click('People') expect(container.textContent).not.toContain('Provider setup') expect(mocks.accounts).toHaveBeenLastCalledWith('org-a') - expect(mocks.people).toHaveBeenLastCalledWith('org-a') - expect(container.querySelector('[aria-label="Search people"]')).not.toBeNull() + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '') + expect(container.querySelector('input[placeholder="Search people..."]')).not.toBeNull() expect(mocks.invite).not.toHaveBeenCalled() await click('Request connections') @@ -114,7 +119,7 @@ describe('organization integration invitations', () => { await render('?tab=people') expect(container.textContent).toContain('Request connections') expect(container.textContent).not.toContain('Provider setup') - expect(mocks.people).toHaveBeenLastCalledWith('org-a') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '') }) it('sends an org without a credential group back to provider setup before invitations', async () => { diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx index c1a132931ee..6c07137bd77 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx @@ -2,19 +2,20 @@ import { useMemo, useState } from 'react' import { Chip, ChipConfirmModal, ChipModalError, Switch } from '@sim/emcn' +import { useRouter } from 'next/navigation' import { useQueryState } from 'nuqs' +import { SettingsPanel } from '@/components/settings/settings-panel' import type { ResourceScope } from '@/lib/core/resource-scope' +import { organizationRoutes } from '@/lib/navigation/paths' import { getConnectorAccessAvailability, SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' import { OrganizationSlackAccountSetup } from '@/app/o/[organizationId]/settings/components/integrations/slack-account-setup' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' import { SearchSourceRow } from '@/app/workspace/[workspaceId]/search/components/search-source-row' import { SearchSourceSetup } from '@/app/workspace/[workspaceId]/search/components/search-source-setup' -import { - managedSourceParam, - searchSetupParam, -} from '@/app/workspace/[workspaceId]/search/search-params' +import { searchSetupParam } from '@/app/workspace/[workspaceId]/search/search-params' import { SettingsEmptyState, SettingsQueryErrorState, @@ -23,11 +24,13 @@ import { RESOURCE_LIST_STACK, SettingsResourceRow, } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { useSettingsSearch } from '@/app/workspace/[workspaceId]/settings/components/use-settings-search' import { searchSourceKeys, useSearchSources } from '@/hooks/queries/kb/connectors' import { useSearchIntegrations, useUpdateSearchIntegration, } from '@/hooks/queries/search-integrations' +import { useDebounce } from '@/hooks/use-debounce' import { useMemberEnrollment } from '@/hooks/use-member-enrollment' import { usePermissionConfig } from '@/hooks/use-permission-config' @@ -46,7 +49,9 @@ interface PendingApproval { export function OrganizationIntegrationsSetup() { const { organization, viewer, searchAccess } = useOrganizationContext() const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } - const sources = useSearchSources(scope) + const [search, setSearch] = useSettingsSearch() + const sourceSearch = useDebounce(search.trim(), SEARCH_DEBOUNCE_MS) + const sources = useSearchSources(scope, { search: sourceSearch }) const integrations = useSearchIntegrations(organization.id) const updateApproval = useUpdateSearchIntegration() const { @@ -61,10 +66,7 @@ export function OrganizationIntegrationsSetup() { searchSetupParam.key, searchSetupParam.parser.withOptions({ history: 'replace' }) ) - const [, setManagedSource] = useQueryState( - managedSourceParam.key, - managedSourceParam.parser.withOptions({ history: 'replace' }) - ) + const router = useRouter() const membershipQueryKeys = useMemo( () => [searchSourceKeys.list({ kind: 'organization', organizationId: organization.id })], [organization.id] @@ -91,6 +93,13 @@ export function OrganizationIntegrationsSetup() { ? integrations : null + const visibleProviders = SEARCH_SOURCE_TYPES.filter( + ([type, meta]) => + !sourceSearch || + meta.name.toLowerCase().includes(sourceSearch.toLowerCase()) || + sources.data?.some((source) => source.connectorType === type) + ) + const confirmApproval = () => { if (!pendingApproval) return updateApproval.mutate( @@ -114,7 +123,13 @@ export function OrganizationIntegrationsSetup() { } return ( - <> +
    {failedQuery ? ( ) : ( - SEARCH_SOURCE_TYPES.map(([type, meta]) => { + visibleProviders.map(([type, meta]) => { const configured = sources.data?.filter((source) => source.connectorType === type) ?? [] const { admin: central, members } = getConnectorAccessAvailability( meta, @@ -155,13 +170,7 @@ export function OrganizationIntegrationsSetup() { icon={} title={meta.name} description={ - loading - ? 'Loading approval…' - : approved - ? available - ? 'Approved for Sim Search' - : 'Approved · Connection setup is unavailable' - : 'Not approved for Sim Search' + !loading && !available ? 'Connection setup is unavailable' : undefined } trailing={
    @@ -201,14 +210,27 @@ export function OrganizationIntegrationsSetup() { waiting={enrollment.isAwaiting(source.connectorId)} isPending={enrollment.isPending} onConnect={() => enrollment.connect(source.knowledgeBaseId, source.connectorId)} - onManage={() => void setManagedSource(source.connectorId, { history: 'push' })} + onManage={() => + router.push( + organizationRoutes(organization.id).searchSource(source.connectorId) + ) + } /> ))}
    ) }) )} - {!failedQuery && !integrationAvailabilityError && } + {!failedQuery && !integrationAvailabilityError && ( + <> + {!sources.isPending && !sources.hasNextPage && visibleProviders.length === 0 && ( + + No providers or sources match your search + + )} + + + )} {enrollment.error && (

    {enrollment.error}

    )} @@ -254,6 +276,6 @@ export function OrganizationIntegrationsSetup() { > {updateApproval.error && {updateApproval.error.message}} - + ) } diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/layout.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/layout.tsx new file mode 100644 index 00000000000..d41d1a8b1e3 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/layout.tsx @@ -0,0 +1,14 @@ +import type { ReactNode } from 'react' +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' + +interface OrganizationSourceLayoutProps { + children: ReactNode +} + +export default function OrganizationSourceLayout({ children }: OrganizationSourceLayoutProps) { + return ( + + {children} + + ) +} diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/loading.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/loading.tsx new file mode 100644 index 00000000000..8515a36bff5 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/loading.tsx @@ -0,0 +1,4 @@ +/** Keeps the source layout's heading visible while authorization and content load. */ +export default function OrganizationSourceLoading() { + return null +} diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.test.tsx new file mode 100644 index 00000000000..f2ec15fcb12 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.test.tsx @@ -0,0 +1,77 @@ +/** @vitest-environment node */ +import { Suspense } from 'react' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ + session: vi.fn(), + authorize: vi.fn(), + redirect: vi.fn(), + notFound: vi.fn(), +})) +vi.mock('@/lib/auth', () => ({ getSession: mocks.session })) +vi.mock('@/lib/settings/application/organization-section-access', () => ({ + authorizeOrganizationSettingsSection: mocks.authorize, +})) +vi.mock('next/navigation', () => ({ redirect: mocks.redirect, notFound: mocks.notFound })) +vi.mock('@/components/settings/settings-header', () => ({ + SettingsHeaderProvider: 'header-provider', + SettingsHeaderShell: 'header-shell', +})) +vi.mock( + '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail', + () => ({ OrganizationSourceDetail: 'source-detail' }) +) + +import OrganizationSourceLayout from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/layout' +import OrganizationSourceLoading from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/loading' +import OrganizationSourcePage from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page' + +const props = { params: Promise.resolve({ organizationId: 'org-one', connectorId: 'source-one' }) } + +describe('organization source page authorization', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.session.mockResolvedValue({ user: { id: 'admin-one' } }) + mocks.authorize.mockResolvedValue(true) + mocks.redirect.mockImplementation(() => { + throw new Error('redirect') + }) + mocks.notFound.mockImplementation(() => { + throw new Error('not found') + }) + }) + it('gates the source page with the existing target-organization integration policy', async () => { + const page = await OrganizationSourcePage(props) + expect(page.type).toBe(Suspense) + expect(page.props.fallback.type).toBe(OrganizationSourceLoading) + expect(mocks.authorize).toHaveBeenCalledWith({ + organizationId: 'org-one', + userId: 'admin-one', + section: 'integrations', + }) + }) + it('renders the persistent heading without waiting for page authorization', () => { + const layout = OrganizationSourceLayout({ children: }) + expect(layout.type).toBe('header-provider') + expect(layout.props.children).toMatchObject({ + type: 'header-shell', + props: { meta: { title: 'Search source' } }, + }) + expect(mocks.session).not.toHaveBeenCalled() + expect(mocks.authorize).not.toHaveBeenCalled() + }) + it('does not render when the admin or feature gate denies access', async () => { + mocks.authorize.mockResolvedValue(false) + await expect(OrganizationSourcePage(props)).rejects.toThrow('not found') + }) + it('returns signed-out users to the requested source after login', async () => { + mocks.session.mockResolvedValue(null) + await expect(OrganizationSourcePage(props)).rejects.toThrow('redirect') + const url = new URL(mocks.redirect.mock.calls[0][0], 'https://example.com') + expect(url.pathname).toBe('/login') + expect(url.searchParams.get('callbackUrl')).toBe( + '/o/org-one/settings/integrations/sources/source-one' + ) + expect(mocks.authorize).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.tsx new file mode 100644 index 00000000000..9b83e824d99 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/page.tsx @@ -0,0 +1,42 @@ +import { Suspense } from 'react' +import type { Metadata } from 'next' +import { notFound, redirect } from 'next/navigation' +import { getSession } from '@/lib/auth' +import { organizationRoutes } from '@/lib/navigation/paths' +import { authorizeOrganizationSettingsSection } from '@/lib/settings/application/organization-section-access' +import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect' +import OrganizationSourceLoading from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/loading' +import { OrganizationSourceDetail } from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail' + +export const metadata: Metadata = { title: 'Search source' } + +interface OrganizationSourcePageProps { + params: Promise<{ organizationId: string; connectorId: string }> +} + +export default async function OrganizationSourcePage({ params }: OrganizationSourcePageProps) { + const { organizationId, connectorId } = await params + const session = await getSession() + if (!session?.user) { + redirect( + buildAuthCrossLink('/login', { + callbackUrl: organizationRoutes(organizationId).searchSource(connectorId), + isInviteFlow: false, + }) + ) + } + if ( + !(await authorizeOrganizationSettingsSection({ + organizationId, + userId: session.user.id, + section: 'integrations', + })) + ) + notFound() + + return ( + }> + + + ) +} diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/search-params.ts b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/search-params.ts new file mode 100644 index 00000000000..b4e2134e517 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/search-params.ts @@ -0,0 +1,13 @@ +import { parseAsStringLiteral } from 'nuqs/server' + +export const sourceViewParam = { + key: 'view', + parser: parseAsStringLiteral(['documents', 'settings', 'history']).withDefault('documents'), +} as const + +export const sourceDocumentFilterParam = { + key: 'document-filter', + parser: parseAsStringLiteral(['active', 'excluded', 'failed']).withDefault('active'), +} as const + +export type SourceView = NonNullable> diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx new file mode 100644 index 00000000000..ba683d53bb9 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx @@ -0,0 +1,268 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { NuqsTestingAdapter } from 'nuqs/adapters/testing' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { ApiClientError } from '@/lib/api/client/errors' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' + +const mocks = vi.hoisted(() => ({ + admin: true, + index: vi.fn(), + detail: vi.fn(), + push: vi.fn(), + documents: vi.fn(), + actions: vi.fn(), + history: vi.fn(), + form: vi.fn(), + dirty: false, + save: vi.fn(), +})) +vi.mock('next/navigation', () => ({ + useRouter: () => ({ push: mocks.push }), + usePathname: () => '/o/org-one/settings/integrations/sources/source-one', +})) +vi.mock('@/app/o/[organizationId]/providers/organization-provider', () => ({ + useOrganizationContext: () => ({ + organization: { id: 'org-one' }, + viewer: { isAdmin: mocks.admin }, + }), +})) +vi.mock('@/hooks/use-oauth-return', () => ({ useOAuthReturnForKBConnectors: vi.fn() })) +vi.mock('@/hooks/queries/kb/connectors', () => ({ + useSearchIndex: mocks.index, + useConnectorDetail: mocks.detail, + isConnectorSyncingOrPending: () => false, +})) +vi.mock('@/connectors/registry', () => ({ + CONNECTOR_META_REGISTRY: { + google_drive: { + name: 'Google Drive', + configFields: [], + searchDocsUrl: 'https://example.com/guide', + }, + }, +})) +vi.mock( + '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents', + () => ({ + ConnectorDocuments: (props: unknown) => { + mocks.documents(props) + return

    Source documents

    + }, + }) +) +vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section', () => ({ + ConnectorActions: (props: unknown) => { + mocks.actions(props) + return + }, + ConnectorRecovery: () => null, + ConnectorSyncHistory: () => { + mocks.history() + return

    Source sync history

    + }, +})) +vi.mock( + '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form', + () => ({ useConnectorSettingsForm: mocks.form }) +) +vi.mock( + '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields', + () => ({ ConnectorSettingsFields: () =>

    Source configuration

    }) +) + +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' +import { OrganizationSourceDetail } from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail' + +const connector: ConnectorData = { + id: 'source-one', + knowledgeBaseId: 'index-one', + connectorType: 'google_drive', + credentialId: null, + sourceConfig: {}, + syncMode: null, + syncIntervalMinutes: 5, + status: 'active', + lastSyncAt: null, + lastSyncError: null, + lastSyncDocCount: null, + 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-01-01T00:00:00.000Z', + updatedAt: '2026-01-01T00:00:00.000Z', +} + +describe('organization source detail navigation', () => { + let root: Root + let container: HTMLDivElement + beforeEach(() => { + vi.clearAllMocks() + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + mocks.admin = true + mocks.dirty = false + mocks.index.mockReturnValue({ data: { knowledgeBaseId: 'index-one' }, isPending: false }) + mocks.detail.mockReturnValue({ data: connector }) + mocks.form.mockImplementation(() => ({ + dirty: mocks.dirty, + saving: false, + canSave: mocks.dirty, + save: mocks.save, + fieldsProps: {}, + displayName: 'Google Drive', + })) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + }) + afterEach(async () => { + await act(async () => root.unmount()) + container.remove() + vi.unstubAllGlobals() + }) + async function render(searchParams = '') { + await act(async () => + root.render( + + + + + + + + ) + ) + } + async function click(text: string) { + const button = Array.from(document.querySelectorAll('button')).find( + (item) => item.textContent?.trim() === text + ) + expect(button, `Missing ${text}`).toBeTruthy() + await act(async () => button!.click()) + } + it('opens documents by default and uses the exact canonical search index', async () => { + await render() + expect(mocks.detail).toHaveBeenLastCalledWith('index-one', 'source-one') + expect(mocks.documents).toHaveBeenCalledWith( + expect.objectContaining({ + knowledgeBaseId: 'index-one', + connectorId: 'source-one', + filter: 'active', + }) + ) + expect(document.querySelector('[role="dialog"]')).toBeNull() + await click('Sync history') + expect(mocks.history).toHaveBeenCalled() + await click('Integrations') + expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') + }) + it('restores document search and status from the shared URL', async () => { + await render('?search=notes&document-filter=excluded') + expect(mocks.documents).toHaveBeenLastCalledWith( + expect.objectContaining({ search: 'notes', filter: 'excluded' }) + ) + expect( + container.querySelector('input[placeholder="Search documents..."]')?.value + ).toBe('notes') + }) + + it.each([ + { ...connector, id: 'another-source' }, + { ...connector, knowledgeBaseId: 'another-index' }, + ])('never exposes actions for a stale detail placeholder', async (data) => { + mocks.detail.mockReturnValue({ data }) + await render() + expect(mocks.actions).not.toHaveBeenCalled() + expect(mocks.documents).not.toHaveBeenCalled() + expect(container.textContent).toContain('Loading source') + }) + it('does not load protected source data for non-admins', async () => { + mocks.admin = false + await render() + expect(mocks.index).toHaveBeenLastCalledWith( + { kind: 'organization', organizationId: 'org-one' }, + { enabled: false } + ) + expect(mocks.detail).toHaveBeenLastCalledWith(undefined, 'source-one') + expect(mocks.actions).not.toHaveBeenCalled() + }) + it('shows a missing source when there is no search index', async () => { + mocks.index.mockReturnValue({ data: { knowledgeBaseId: null }, isPending: false }) + mocks.detail.mockReturnValue({}) + await render() + expect(container.textContent).toContain('This source is no longer available') + expect(mocks.actions).not.toHaveBeenCalled() + }) + it('requires discard confirmation before leaving dirty settings', async () => { + mocks.dirty = true + await render('?view=settings') + await click('Documents') + expect(document.querySelector('[role="dialog"]')?.textContent).toContain('Unsaved Changes') + expect(mocks.documents).not.toHaveBeenCalled() + await click('Keep editing') + await click('Integrations') + expect(mocks.push).not.toHaveBeenCalled() + await click('Discard Changes') + expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') + }) + it.each(['index', 'detail'] as const)( + 'preserves a dirty draft when a background %s refresh fails', + async (query) => { + await render('?view=settings') + mocks.dirty = true + const data = + query === 'index' + ? { knowledgeBaseId: 'index-one' } + : { ...connector, sourceConfig: { folderId: 'new-server-value' } } + mocks[query].mockReturnValue({ + data, + isError: true, + error: new Error('Temporary refresh failure'), + refetch: vi.fn(), + }) + await render('?view=settings') + expect(container.textContent).toContain('Temporary refresh failure') + expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector })) + await click('Documents') + expect(document.querySelector('[role="dialog"]')?.textContent).toContain('Unsaved Changes') + } + ) + + it('hides cached source data after access is revoked, even if the index also failed', async () => { + await render('?view=settings') + mocks.index.mockReturnValue({ + data: { knowledgeBaseId: 'index-one' }, + isError: true, + error: new Error('Temporary failure'), + refetch: vi.fn(), + }) + mocks.detail.mockReturnValue({ + data: connector, + isError: true, + error: new ApiClientError({ status: 403, message: 'Access denied', body: null }), + refetch: vi.fn(), + }) + await render('?view=settings') + expect(container.textContent).toContain('Access denied') + expect(container.textContent).not.toContain('Source configuration') + }) + + it('preserves the editable baseline across background connector updates', async () => { + await render('?view=settings') + mocks.detail.mockReturnValue({ + data: { ...connector, status: 'syncing', sourceConfig: { folderId: 'changed-remotely' } }, + }) + await render('?view=settings') + expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector })) + }) +}) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx new file mode 100644 index 00000000000..c8824b4a48d --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx @@ -0,0 +1,369 @@ +'use client' + +import { type ReactNode, useState } from 'react' +import { ChipModalTabs } from '@sim/emcn' +import { ArrowLeft } from '@sim/emcn/icons' +import { useRouter } from 'next/navigation' +import { useQueryState } from 'nuqs' +import { saveDiscardActions } from '@/components/settings/save-discard-actions' +import { SettingsPanel } from '@/components/settings/settings-panel' +import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard' +import { isApiClientError } from '@/lib/api/client/errors' +import type { ConnectorData, ConnectorDetailData } from '@/lib/api/contracts/knowledge/connectors' +import type { ResourceScope } from '@/lib/core/resource-scope' +import { organizationRoutes } from '@/lib/navigation/paths' +import { describeSearchSource } from '@/lib/sim-search/source-identity' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' +import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' +import { + type SourceView, + sourceDocumentFilterParam, + sourceViewParam, +} from '@/app/o/[organizationId]/settings/integrations/sources/[connectorId]/search-params' +import { UnsavedChangesModal } from '@/app/workspace/[workspaceId]/components/credential-detail/components/unsaved-changes-modal' +import { ConnectorDocuments } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents' +import { + ConnectorActions, + ConnectorRecovery, + ConnectorSyncHistory, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section' +import { getConnectorSyncState } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state' +import { ConnectorSettingsFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields' +import { useConnectorSettingsForm } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { useSettingsSearch } from '@/app/workspace/[workspaceId]/settings/components/use-settings-search' +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' +import { + isConnectorSyncingOrPending, + useConnectorDetail, + useSearchIndex, +} from '@/hooks/queries/kb/connectors' +import { useDebounce } from '@/hooks/use-debounce' +import { useOAuthReturnForKBConnectors } from '@/hooks/use-oauth-return' + +const SOURCE_VIEWS = [ + { value: 'documents', label: 'Documents' }, + { value: 'settings', label: 'Settings' }, + { value: 'history', label: 'Sync history' }, +] as const + +interface OrganizationSourceDetailProps { + connectorId: string +} + +export function OrganizationSourceDetail({ connectorId }: OrganizationSourceDetailProps) { + const { organization, viewer } = useOrganizationContext() + const router = useRouter() + const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } + const backHref = organizationRoutes(organization.id).settingsSection('integrations') + const index = useSearchIndex(scope, { enabled: viewer.isAdmin }) + const knowledgeBaseId = viewer.isAdmin ? (index.data?.knowledgeBaseId ?? undefined) : undefined + const detail = useConnectorDetail(knowledgeBaseId, connectorId) + const back = { text: 'Integrations', icon: ArrowLeft, onSelect: () => router.push(backHref) } + + if (!viewer.isAdmin) + return ( + + + Only organization admins can manage sources. + + + ) + const accessFailure = [index, detail].find( + (query) => + query.isError && isApiClientError(query.error) && [401, 403, 404].includes(query.error.status) + ) + const failedQuery = accessFailure ?? (index.isError ? index : detail.isError ? detail : null) + const hasCanonicalDetail = Boolean( + detail.data && + !detail.isPlaceholderData && + detail.data.id === connectorId && + detail.data.knowledgeBaseId === knowledgeBaseId + ) + if (failedQuery && (!hasCanonicalDetail || accessFailure)) + return ( + + {isApiClientError(failedQuery.error) && failedQuery.error.status === 404 ? ( + + This source is no longer available. + + ) : ( + void failedQuery.refetch()} + fallback='Could not load source' + variant='inline' + /> + )} + + ) + if (!index.isPending && !knowledgeBaseId) + return ( + + + This source is no longer available. + + + ) + if ( + !detail.data || + detail.isPlaceholderData || + detail.data.id !== connectorId || + detail.data.knowledgeBaseId !== knowledgeBaseId + ) + return ( + + Loading source… + + ) + return ( + void failedQuery.refetch()} + fallback='Could not refresh source' + variant='inline' + /> + ) : undefined + } + /> + ) +} + +interface SourceDetailContentProps { + connector: ConnectorDetailData + scope: ResourceScope + backHref: string + queryError?: ReactNode +} + +function SourceDetailContent({ connector, scope, backHref, queryError }: SourceDetailContentProps) { + useOAuthReturnForKBConnectors( + connector.knowledgeBaseId, + undefined, + connector.connectorType, + scope, + connector.id + ) + const router = useRouter() + const [view, setView] = useQueryState( + sourceViewParam.key, + sourceViewParam.parser.withOptions({ history: 'replace' }) + ) + const [filter, setFilter] = useQueryState( + sourceDocumentFilterParam.key, + sourceDocumentFilterParam.parser + ) + const [search, setSearch] = useSettingsSearch() + const documentSearch = useDebounce(search.trim(), SEARCH_DEBOUNCE_MS) + const meta = CONNECTOR_META_REGISTRY[connector.connectorType] + const title = meta + ? describeSearchSource(meta, connector.sourceConfig) || meta.name + : 'Search source' + const { effectiveStatus } = getConnectorSyncState(connector) + const status = + effectiveStatus === 'paused' + ? 'Sync paused' + : effectiveStatus === 'disabled' + ? 'Sync disabled' + : effectiveStatus === 'error' + ? 'Sync needs attention' + : undefined + const description = + [title === meta?.name ? undefined : meta?.name, status].filter(Boolean).join(' · ') || undefined + const onBack = () => router.push(backHref) + const onViewChange = (value: string) => { + const next = sourceViewParam.parser.parse(value) + if (next) void setView(next) + } + if (view === 'settings') + return ( + + ) + return ( + + {queryError} + + + {view === 'documents' ? ( + void setFilter(next)} + progressScope={scope} + syncing={isConnectorSyncingOrPending(connector)} + /> + ) : ( + + )} + + ) +} + +interface SourceNavigationProps { + connector: ConnectorData + view: SourceView + onViewChange: (view: string) => void + onRemoved: () => void + disabled?: boolean +} + +function SourceNavigation({ + connector, + view, + onViewChange, + onRemoved, + disabled = false, +}: SourceNavigationProps) { + return ( +
    + + +
    + ) +} + +interface SourceSettingsEditorProps { + connector: ConnectorData + scope: ResourceScope + title: string + description?: string + queryError?: ReactNode + onBack: () => void + onViewChange: (view: string) => void +} + +function SourceSettingsEditor(props: SourceSettingsEditorProps) { + const [draft, setDraft] = useState({ connector: props.connector, revision: 0 }) + const reset = (connector: ConnectorData) => + setDraft((previous) => ({ connector, revision: previous.revision + 1 })) + return ( + reset(props.connector)} + /> + ) +} + +interface SourceSettingsFormProps extends SourceSettingsEditorProps { + baseline: ConnectorData + onSaved: (connector: ConnectorData) => void + onDiscard: () => void +} + +function SourceSettingsForm({ + connector, + baseline, + scope, + title, + description, + queryError, + onBack, + onViewChange, + onSaved, + onDiscard, +}: SourceSettingsFormProps) { + const form = useConnectorSettingsForm({ + connector: baseline, + scope, + knowledgeBaseId: connector.knowledgeBaseId, + isSearchIndex: true, + onSaved, + }) + const guard = useSettingsUnsavedGuard({ isDirty: form.dirty, navigationBlocked: form.saving }) + return ( + guard.guardBack(onBack) }} + title={title} + description={description} + docsLink={form.docsUrl} + actions={saveDiscardActions({ + dirty: form.dirty, + saving: form.saving, + saveDisabled: !form.canSave, + onSave: form.save, + onDiscard, + })} + > + {queryError} + { + if (next !== 'settings') guard.guardBack(() => onViewChange(next)) + }} + onRemoved={onBack} + disabled={form.dirty || form.saving} + /> +
    + +
    + +
    + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx index a85f0021b9a..4cbb2e49ab0 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx @@ -156,7 +156,10 @@ vi.mock('@/hooks/queries/oauth/microsoft-dataverse-connections', () => ({ }), })) -import { ConnectOAuthModal } from '@/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal' +import { + ConnectOAuthModal, + type ConnectOAuthModalProps, +} from '@/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal' let container: HTMLDivElement let root: Root @@ -164,14 +167,11 @@ let root: Root function renderReauthorizeModal({ reconnectTarget, onConnect, -}: { - reconnectTarget?: { - workspaceId: string - credentialId: string - displayName: string - } - onConnect?: () => Promise | void -} = {}) { + returnContext, +}: Pick< + Extract, + 'reconnectTarget' | 'onConnect' | 'returnContext' +> = {}) { act(() => { root.render( ) }) @@ -331,6 +332,86 @@ describe('ConnectOAuthModal reauthorization', () => { expect(mocks.clearOAuthReturnContext).not.toHaveBeenCalled() }) + it('preserves the existing source target when creating its reconnect draft', async () => { + renderReauthorizeModal({ + reconnectTarget: { + organizationId: 'org-1', + credentialId: 'credential-slack', + displayName: 'Team Slack', + }, + returnContext: { + origin: 'kb-connectors', + knowledgeBaseId: 'kb-search', + connectorType: 'slack', + connectorId: 'connector-slack', + }, + }) + + await clickConnect() + + expect(mocks.writeOAuthReturnContext).toHaveBeenCalledExactlyOnceWith( + expect.objectContaining({ + origin: 'kb-connectors', + organizationId: 'org-1', + knowledgeBaseId: 'kb-search', + connectorType: 'slack', + connectorId: 'connector-slack', + reconnect: true, + }) + ) + expect(mocks.createDraft.mock.invocationCallOrder[0]).toBeLessThan( + mocks.writeOAuthReturnContext.mock.invocationCallOrder[0] + ) + }) + + it.each([undefined, 'connector-slack'])( + 'carries source identity through connection without reopening setup for connectorId=%s', + async (connectorId) => { + window.history.replaceState( + {}, + '', + connectorId + ? '/o/org-1/settings/integrations/sources/connector-slack?view=settings' + : '/o/org-1/settings/integrations' + ) + act(() => { + root.render( + + ) + }) + + await clickConnect() + + expect(mocks.writeOAuthReturnContext).toHaveBeenCalledExactlyOnceWith( + expect.objectContaining({ + origin: 'kb-connectors', + organizationId: 'org-1', + knowledgeBaseId: 'kb-search', + connectorType: 'slack', + connectorId, + }) + ) + expect(mocks.connectOAuthService).toHaveBeenCalledWith({ + providerId: 'slack', + callbackURL: connectorId + ? window.location.href + : `${window.location.href}?addConnector=slack`, + draftId: 'draft-exact', + }) + } + ) + it('clears reconnect context when the provider handoff cannot start', async () => { mocks.connectOAuthService.mockRejectedValue(new Error('Provider launch failed')) renderReauthorizeModal({ diff --git a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx index b2be2c61f0c..6e97ed4bf44 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx @@ -133,6 +133,7 @@ type ConnectOAuthModalConnectProps = ConnectOAuthModalBaseProps & { origin: 'kb-connectors' knowledgeBaseId: string connectorType?: string + connectorId?: string } | { origin: 'integrations' } ) @@ -153,6 +154,10 @@ interface ConnectOAuthModalReauthorizeProps extends ConnectOAuthModalBaseProps { credentialId: string displayName: string } + returnContext?: Pick< + Extract, + 'origin' | 'knowledgeBaseId' | 'connectorType' | 'connectorId' + > onConnect?: () => Promise | void } @@ -384,12 +389,13 @@ export function ConnectOAuthModal(props: ConnectOAuthModalProps) { let returnContext: OAuthReturnContext if (props.origin === 'kb-connectors') { - connectorType = props.connectorType + connectorType = props.connectorId ? undefined : props.connectorType returnContext = { ...baseContext, origin: 'kb-connectors', knowledgeBaseId: props.knowledgeBaseId, connectorType: props.connectorType, + connectorId: props.connectorId, } } else if (props.origin === 'workflow') { returnContext = { @@ -424,7 +430,7 @@ export function ConnectOAuthModal(props: ConnectOAuthModalProps) { (credential) => credential.type === 'oauth' && credential.providerId === providerId ) writeOAuthReturnContext({ - origin: 'integrations', + ...(props.returnContext ?? { origin: 'integrations' as const }), displayName: props.reconnectTarget.displayName, providerId, preCount: providerCredentials.length, diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx index 2050a7b5144..2525dd6fed0 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx @@ -236,15 +236,8 @@ export function SlackMemberSetup({ ? slackSearchSetupHref(scope, searchSetupSource ?? 'search') : `/workspace/${scope.workspaceId}/settings/credential-groups` return ( -
    -

    - Set up your Slack app to continue. -

    -
    - - Set up Slack - -
    -
    + + Set up Slack + ) } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx index 693d235af7a..868dac4d1ba 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields.tsx @@ -5,7 +5,7 @@ import { ArrowLeftRight, CircleInfo } from '@sim/emcn/icons' import type { ConnectorAccessMode } from '@/lib/api/contracts/knowledge/connectors' import type { ResourceScope } from '@/lib/core/resource-scope' import type { SelectorKey } from '@/lib/selectors/manifest' -import type { SourceSelectionLabel } from '@/lib/sim-search/source-identity' +import type { SourceSelectionLabel, SourceSelectionLabels } from '@/lib/sim-search/source-identity' import { isConnectorFieldRequired } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access' import { ConnectorSelectorField } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field' import type { @@ -21,6 +21,7 @@ export interface ConnectorConfigFieldsProps { connectorConfig: ConnectorMeta /** Current values keyed by field ID. */ sourceConfig: ConfigFieldMap + selectionLabels?: SourceSelectionLabels /** OAuth credential backing selector fields, when available. */ credentialId: string | null /** Canonical-pair groups keyed by `canonicalParamId`. */ @@ -52,6 +53,7 @@ export function ConnectorConfigFields({ accessMode = 'workspace', connectorConfig, sourceConfig, + selectionLabels, credentialId, canonicalGroups, canonicalModes, @@ -137,6 +139,7 @@ export function ConnectorConfigFields({ onChange={(value, selectedOptions) => onFieldChange(field.id, value, selectedOptions) } + selectedLabels={selectionLabels?.[field.canonicalParamId ?? field.id]} credentialId={credentialId} sourceConfig={sourceConfig} configFields={connectorConfig.configFields} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx new file mode 100644 index 00000000000..05e093d8f3f --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx @@ -0,0 +1,206 @@ +'use client' + +import { Chip, ChipDropdown, ChipLink, Skeleton } from '@sim/emcn' +import { RefreshCw, SquareArrowUpRight } from '@sim/emcn/icons' +import type { ConnectorDocumentFilter } from '@/lib/api/contracts/knowledge/connectors' +import type { ResourceScope } from '@/lib/core/resource-scope' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { + RESOURCE_LIST_STACK, + SettingsResourceRow, +} from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { + useConnectorDocuments, + useExcludeConnectorDocument, + useRestoreConnectorDocument, +} from '@/hooks/queries/kb/connectors' +import { useUpdateDocument } from '@/hooks/queries/kb/knowledge' + +interface ConnectorDocumentsProps { + knowledgeBaseId: string + connectorId: string + search?: string + progressScope?: ResourceScope + syncing?: boolean + filter: ConnectorDocumentFilter + onFilterChange: (filter: ConnectorDocumentFilter) => void +} + +export function ConnectorDocuments({ + knowledgeBaseId, + connectorId, + filter, + search, + progressScope, + syncing, + onFilterChange, +}: ConnectorDocumentsProps) { + const query = useConnectorDocuments(knowledgeBaseId, connectorId, { + filter, + search, + progressScope, + syncing, + }) + const { data, hasNextPage, isFetchingNextPage, fetchNextPage } = query + const isLoading = query.isLoading || query.isPlaceholderData + const excludeMutation = useExcludeConnectorDocument() + const restoreMutation = useRestoreConnectorDocument() + const retryMutation = useUpdateDocument() + const mutationError = excludeMutation.error ?? restoreMutation.error ?? retryMutation.error + const isRecoveryPending = + excludeMutation.isPending || restoreMutation.isPending || retryMutation.isPending + const documents = (data?.pages.flatMap((page) => page.documents) ?? []).filter((document) => + filter === 'excluded' + ? document.userExcluded + : !document.userExcluded && (filter !== 'failed' || document.processingStatus === 'failed') + ) + const counts = data?.pages[0]?.counts ?? { active: 0, excluded: 0, failed: 0 } + const visibleDocumentCount = counts[filter] + const hasMoreVisibleDocuments = Boolean(hasNextPage && documents.length < visibleDocumentCount) + + function resetRecoveryErrors() { + excludeMutation.reset() + restoreMutation.reset() + retryMutation.reset() + } + + if (query.isError && !query.isFetchNextPageError) { + return ( + query.refetch()} + fallback='Could not load documents' + /> + ) + } + + return ( + <> +
    +
    + { + if (value === 'active' || value === 'excluded' || value === 'failed') + onFilterChange(value) + }} + matchTriggerWidth={false} + options={[ + { value: 'active', label: isLoading ? 'Included' : `Included (${counts.active})` }, + { + value: 'excluded', + label: isLoading ? 'Excluded' : `Excluded (${counts.excluded})`, + }, + { value: 'failed', label: isLoading ? 'Failed' : `Failed (${counts.failed})` }, + ]} + /> +
    +
    + {isLoading ? ( + <> + + + + ) : visibleDocumentCount === 0 ? ( + + {search?.trim() + ? 'No documents match your search' + : filter === 'excluded' + ? 'No excluded documents' + : filter === 'failed' + ? 'No failed documents' + : 'No documents yet'} + + ) : ( + documents.map((doc) => ( + + {doc.sourceUrl && ( + + )} + {doc.processingStatus === 'failed' && !doc.userExcluded && ( + { + resetRecoveryErrors() + retryMutation.mutate({ + knowledgeBaseId, + documentId: doc.id, + updates: { retryProcessing: true }, + }) + }} + > + Retry indexing + + )} + { + resetRecoveryErrors() + doc.userExcluded + ? restoreMutation.mutate({ + knowledgeBaseId, + connectorId, + documentIds: [doc.id], + }) + : excludeMutation.mutate({ + knowledgeBaseId, + connectorId, + documentIds: [doc.id], + }) + }} + > + {doc.userExcluded ? 'Restore' : 'Exclude'} + +
    + } + /> + )) + )} + {query.isFetchNextPageError ? ( + void fetchNextPage()} + variant='inline' + /> + ) : !isLoading && hasMoreVisibleDocuments ? ( + fetchNextPage()}> + {isFetchingNextPage ? 'Loading…' : 'Load more documents'} + + ) : null} +
    +
    + {mutationError && ( + + {mutationError.message} + + )} + + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx index 3078031d695..015cce5a2f9 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.test.tsx @@ -29,6 +29,8 @@ vi.mock('@/hooks/queries/selectors', () => ({ import { ConnectorSelectorField } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field' interface ComboboxCallbacks { + options: { value: string; label: string; hidden?: boolean }[] + disabled: boolean onChange?: (value: string) => void onMultiSelectChange?: (value: string[]) => void } @@ -84,3 +86,44 @@ it.each([true, false])( } } ) + +it('uses saved labels only for selected values and prefers live provider names', async () => { + const field: ConnectorConfigField & { selectorKey: 'google.drive' } = { + id: 'folder', + title: 'Folders', + type: 'selector', + selectorKey: 'google.drive', + multi: true, + } + const root = createRoot(document.createElement('div')) + try { + await act(async () => + root.render( + + ) + ) + const props = mocks.combobox.mock.lastCall![0] + expect(props.disabled).toBe(true) + expect(props.options).toEqual([ + { value: 'folder-a', label: 'Engineering' }, + { value: 'folder-saved', label: 'Project notes', hidden: true }, + { value: 'folder-b', label: 'Company docs' }, + ]) + } finally { + await act(async () => root.unmount()) + vi.clearAllMocks() + } +}) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx index 536f8fe8e06..2ad9103c45e 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx @@ -31,6 +31,7 @@ interface ConnectorSelectorFieldProps { sourceConfig: ConfigFieldMap configFields: ConnectorConfigField[] canonicalModes: Record + selectedLabels?: SourceSelectionLabel[] disabled?: boolean } @@ -43,6 +44,7 @@ export function ConnectorSelectorField({ sourceConfig, configFields, canonicalModes, + selectedLabels, disabled, }: ConnectorSelectorFieldProps) { const params = useParams<{ workspaceId?: string; organizationId?: string }>() @@ -152,8 +154,13 @@ export function ConnectorSelectorField({ seen.add(option.id) extras.push({ label: option.label, value: option.id }) } + for (const option of selectedLabels ?? []) { + if (seen.has(option.id) || !selectedIds.includes(option.id)) continue + seen.add(option.id) + extras.push({ label: option.label, value: option.id, hidden: true }) + } return extras.length > 0 ? [...extras, ...base] : base - }, [options, selectedOptions, searchedOption]) + }, [options, selectedOptions, searchedOption, selectedLabels, selectedIds]) const handleChange = (nextValue: ConfigFieldValue) => { const ids = new Set(Array.isArray(nextValue) ? nextValue : nextValue ? [nextValue] : []) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx new file mode 100644 index 00000000000..9a131250771 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx @@ -0,0 +1,192 @@ +'use client' + +import { useId, useState } from 'react' +import { + Checkbox, + Chip, + ChipConfirmModal, + ChipModalError, + ChipModalField, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, + Tooltip, +} from '@sim/emcn' +import { MoreHorizontal } from '@sim/emcn/icons' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' +import { getConnectorSyncState } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state' +import { SettingsEmptyState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { + useDeleteConnector, + useTriggerSync, + useUpdateConnector, +} from '@/hooks/queries/kb/connectors' + +interface ConnectorActionsProps { + connector: ConnectorData + knowledgeBaseId: string + canEdit: boolean + disabled?: boolean + onEdit?: () => void + onRemoved?: () => void +} + +export function ConnectorActions({ + connector, + knowledgeBaseId, + canEdit, + disabled = false, + onEdit, + onRemoved, +}: ConnectorActionsProps) { + const sync = useTriggerSync() + const update = useUpdateConnector() + const remove = useDeleteConnector() + const deleteDocumentsId = useId() + const [confirmRemove, setConfirmRemove] = useState(false) + const [deleteDocuments, setDeleteDocuments] = useState(false) + const state = getConnectorSyncState(connector) + const isPending = sync.isPending || update.isPending || remove.isPending + const actionsDisabled = disabled || isPending + const error = sync.error ?? update.error + + function resetErrors() { + sync.reset() + update.reset() + remove.reset() + } + + function triggerSync(rehydrate = false) { + if (actionsDisabled || state.syncDisabled) return + resetErrors() + sync.mutate({ knowledgeBaseId, connectorId: connector.id, rehydrate }) + } + + function setRemoveOpen(open: boolean) { + if (remove.isPending) return + setConfirmRemove(open) + if (!open) setDeleteDocuments(false) + } + + if (!canEdit) return null + + return ( +
    +
    + + + + triggerSync()}> + {state.syncLabel} + + + + {state.syncTooltip && {state.syncTooltip}} + + + + + + + {state.canFullResync && ( + triggerSync(true)} + > + Full resync + + )} + {onEdit && ( + + Settings + + )} + { + if (actionsDisabled) return + resetErrors() + update.mutate({ + knowledgeBaseId, + connectorId: connector.id, + updates: { status: state.canResume ? 'active' : 'paused' }, + }) + }} + > + {state.canResume ? 'Resume' : 'Pause'} + + + { + resetErrors() + setRemoveOpen(true) + }} + > + Remove + + + +
    + {error && ( + + {error.message} + + )} + { + if (actionsDisabled) return + remove.mutate( + { + knowledgeBaseId, + connectorId: connector.id, + deleteDocuments: state.syncsPerMember || deleteDocuments, + }, + { + onSuccess: () => { + setConfirmRemove(false) + setDeleteDocuments(false) + onRemoved?.() + }, + } + ) + }, + }} + > + {!state.syncsPerMember && ( + +
    + setDeleteDocuments(checked === true)} + /> + +
    +
    + )} + {remove.error?.message} +
    +
    + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx new file mode 100644 index 00000000000..947d7e37708 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx @@ -0,0 +1,158 @@ +'use client' + +import { useEffect, useState } from 'react' +import { Chip } from '@sim/emcn' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' +import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' +import { getCanonicalScopesForProvider, getProviderIdFromServiceId } from '@/lib/oauth' +import { getMissingRequiredScopes } from '@/lib/oauth/utils' +import { ConnectOAuthModal } from '@/app/workspace/[workspaceId]/components/connect-oauth-modal' +import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' +import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' +import { useCredentialRefreshTriggers } from '@/hooks/use-credential-refresh-triggers' + +interface ConnectorRecoveryProps { + connector: ConnectorData + scope: ResourceScope + knowledgeBaseId: string + isSearchIndex?: boolean + canEdit: boolean + disabled?: boolean +} + +export function ConnectorRecovery({ + connector, + scope, + knowledgeBaseId, + isSearchIndex = false, + canEdit, + disabled = false, +}: ConnectorRecoveryProps) { + const [showOAuthModal, setShowOAuthModal] = useState(false) + const connectorDef = CONNECTOR_META_REGISTRY[connector.connectorType] + const serviceId = connectorDef?.auth.mode === 'oauth' ? connectorDef.auth.provider : undefined + const providerId = serviceId ? getProviderIdFromServiceId(serviceId) : undefined + const requiredScopes = + connectorDef?.auth.mode === 'oauth' ? (connectorDef.auth.requiredScopes ?? []) : [] + const { + data: credentials, + isFetching: credentialsLoading, + refetch: refetchCredentials, + } = useOAuthCredentials(providerId, resourceScopeFields(scope)) + const selectedCredential = credentials?.find((item) => item.id === connector.credentialId) + const missingScopes = selectedCredential + ? getMissingRequiredScopes(selectedCredential, requiredScopes) + : [] + + useCredentialRefreshTriggers( + refetchCredentials, + selectedCredential?.provider ?? providerId ?? '', + scope + ) + + useEffect(() => { + if (showOAuthModal && connector.credentialId && !selectedCredential && !credentialsLoading) { + setShowOAuthModal(false) + } + }, [showOAuthModal, connector.credentialId, selectedCredential, credentialsLoading]) + + function openReconnect() { + if (!canEdit || disabled) return + if (connector.credentialId && !selectedCredential) return + setShowOAuthModal(true) + } + + function onOAuthOpenChange(open: boolean) { + if (!open) { + setShowOAuthModal(false) + } + } + + const docsUrl = isSearchIndex ? connectorDef?.searchDocsUrl : undefined + + return ( + <> + {connector.accessMode === 'members' && connector.memberSyncStatus === 'disabled' && ( + + )} + {connector.status === 'disabled' ? ( + + Reconnect + + ) : undefined + } + /> + ) : missingScopes.length > 0 ? ( + + Update access + + ) : undefined + } + /> + ) : null} + {showOAuthModal && canEdit && serviceId && providerId && !connector.credentialId && ( + + )} + {showOAuthModal && canEdit && serviceId && providerId && selectedCredential && ( + + )} + + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-history.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-history.tsx new file mode 100644 index 00000000000..ba4ddf531a4 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-history.tsx @@ -0,0 +1,230 @@ +'use client' + +import { CircleCheck, CircleX, Loader, TriangleAlert, Users } from '@sim/emcn/icons' +import { format } from 'date-fns' +import type { + ConnectorData, + ConnectorDetailData, + ConnectorMemberSummary, + MemberSyncLogData, + SyncLogData, +} from '@/lib/api/contracts/knowledge/connectors' +import { + CONNECTOR_SYNC_STALE_LOCK_TTL_MS, + MEMBER_SYNC_STALE_LOCK_TTL_MS, +} from '@/lib/knowledge/connectors/sync-limits' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { + RESOURCE_LIST_STACK, + SettingsResourceRow, +} from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { useConnectorDetail } from '@/hooks/queries/kb/connectors' + +interface ConnectorSyncHistoryProps { + connector: ConnectorData + knowledgeBaseId: string + detail?: ConnectorDetailData +} + +export function ConnectorSyncHistory({ + connector, + knowledgeBaseId, + detail, +}: ConnectorSyncHistoryProps) { + const query = useConnectorDetail( + detail ? undefined : knowledgeBaseId, + detail ? undefined : connector.id + ) + const isLoading = !detail && (query.isLoading || query.isPlaceholderData) + const data = detail ?? query.data + if (!detail && query.isError) { + return ( + void query.refetch()} + variant='inline' + /> + ) + } + return connector.accessMode === 'members' ? ( + + ) : ( + + ) +} + +type SyncLogState = 'running' | 'interrupted' | 'failed' | 'completed' | 'partial' + +const SYNC_LOG_LABELS: Record = { + running: 'In progress…', + interrupted: 'Interrupted', + failed: 'Failed', + completed: 'Completed', + partial: 'Partial', +} + +/** Reclaimed stale locks leave started log rows behind; both views use the engine's own TTL. */ +function getSyncLogState( + log: Pick, + staleLockTtl: number, + now: number +): SyncLogState { + switch (log.status) { + case 'completed': + case 'partial': + case 'failed': + return log.status + case 'started': + return now - new Date(log.startedAt).getTime() > staleLockTtl ? 'interrupted' : 'running' + } +} + +interface SyncHistoryRowProps { + startedAt: string + state: SyncLogState + description?: string +} + +function SyncHistoryRow({ startedAt, state, description }: SyncHistoryRowProps) { + const icon = + state === 'running' ? ( + + ) : state === 'interrupted' || state === 'partial' ? ( + + ) : state === 'failed' ? ( + + ) : ( + + ) + return ( + + ) +} + +interface SyncHistoryProps { + logs: SyncLogData[] + isLoading: boolean +} + +export function SyncHistory({ logs, isLoading }: SyncHistoryProps) { + if (isLoading) + return Loading sync history… + if (logs.length === 0) + return No sync history yet. + + const now = Date.now() + return ( +
    + {logs.map((log) => { + const state = getSyncLogState(log, CONNECTOR_SYNC_STALE_LOCK_TTL_MS, now) + const changes = [ + log.docsAdded > 0 && `${log.docsAdded} added`, + log.docsUpdated > 0 && `${log.docsUpdated} updated`, + log.docsDeleted > 0 && `${log.docsDeleted} deleted`, + log.docsFailed > 0 && `${log.docsFailed} failed`, + log.docsSkipped > 0 && `${log.docsSkipped} skipped`, + ] + .filter(Boolean) + .join(' · ') + return ( + + ) + })} +
    + ) +} + +interface MemberSyncHistoryProps { + logs: MemberSyncLogData[] + members: ConnectorMemberSummary | undefined + isLoading: boolean +} + +/** Several partial member runs can form one drain; they are not failed syncs. */ +function MemberSyncHistory({ logs, members, isLoading }: MemberSyncHistoryProps) { + if (isLoading) + return Loading member sync history… + + const now = Date.now() + return ( +
    + {members && ( + } + iconVariant='plain' + title={`${members.active} connected`} + description={ + [ + members.suspended > 0 && `${members.suspended} need reconnecting`, + members.stale > 0 && `${members.stale} not synced recently`, + ] + .filter(Boolean) + .join(' · ') || undefined + } + /> + )} + {logs.length === 0 ? ( + No member sync history yet. + ) : ( + logs.map((log) => { + const state = getSyncLogState(log, MEMBER_SYNC_STALE_LOCK_TTL_MS, now) + const processed = log.membersCompleted + log.membersIncomplete + log.membersFailed + const changes = [ + log.docsAdded > 0 && `${log.docsAdded} added`, + log.docsUpdated > 0 && `${log.docsUpdated} updated`, + log.docsTombstoned + log.docsPurged > 0 && + `${log.docsTombstoned + log.docsPurged} deleted`, + ] + .filter(Boolean) + .join(' · ') + const description = [ + `${processed} ${processed === 1 ? 'member' : 'members'}`, + log.membersFailed > 0 && `${log.membersFailed} failed`, + changes || 'No changes', + ] + .filter(Boolean) + .join(' · ') + return ( + + ) + }) + )} +
    + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state.ts new file mode 100644 index 00000000000..e048fe75b63 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state.ts @@ -0,0 +1,53 @@ +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' +import { isConnectorSyncingOrPending } from '@/hooks/queries/kb/connectors' + +const MEMBER_STATUS = { + idle: 'active', + pending: 'pending', + running: 'syncing', + error: 'error', + disabled: 'disabled', +} as const + +/** Member sync runs independently; an explicit pause or disable still takes precedence. */ +export function getConnectorSyncState(connector: ConnectorData) { + const syncsPerMember = connector.accessMode === 'members' + const syncInFlight = isConnectorSyncingOrPending(connector) + const canResume = connector.status === 'paused' || connector.status === 'disabled' + const memberSyncDisabled = syncsPerMember && connector.memberSyncStatus === 'disabled' + const canFullResync = + Boolean(CONNECTOR_META_REGISTRY[connector.connectorType]?.rehydrateOnFullSync) && + !syncsPerMember + + return { + syncsPerMember, + syncInFlight, + canResume, + canFullResync, + syncDisabled: syncInFlight || canResume || memberSyncDisabled, + effectiveStatus: + syncsPerMember && connector.status === 'active' + ? MEMBER_STATUS[connector.memberSyncStatus] + : connector.status, + syncLabel: + canResume || memberSyncDisabled + ? 'Sync now' + : connector.status === 'pending' || + (syncsPerMember && connector.memberSyncStatus === 'pending') + ? 'Sync queued' + : syncInFlight + ? 'Syncing…' + : 'Sync now', + syncTooltip: canResume + ? 'Resume to sync' + : memberSyncDisabled + ? 'Member sync is disabled' + : undefined, + lastSyncAt: syncsPerMember ? connector.lastMemberSyncAt : connector.lastSyncAt, + nextSyncAt: syncsPerMember ? connector.nextMemberSyncAt : connector.nextSyncAt, + lastSyncError: syncsPerMember + ? (connector.lastMemberSyncError ?? connector.lastSyncError) + : connector.lastSyncError, + } +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx index 3d30827eadc..44ed254a86c 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx @@ -6,7 +6,10 @@ import { act } from 'react' import { createRoot, type Root } from 'react-dom/client' import { afterEach, describe, expect, it, vi } from 'vitest' import type { SyncLogData } from '@/lib/api/contracts/knowledge/connectors' -import { CONNECTOR_SYNC_STALE_LOCK_TTL_MS } from '@/lib/knowledge/connectors/sync-limits' +import { + CONNECTOR_SYNC_STALE_LOCK_TTL_MS, + MEMBER_SYNC_STALE_LOCK_TTL_MS, +} from '@/lib/knowledge/connectors/sync-limits' const { consumeOAuthReturnContextMock, @@ -14,6 +17,8 @@ const { credentialRefreshTriggersMock, icon, oauthCredentialsState, + lifecycle, + missingScopesMock, } = vi.hoisted(() => ({ consumeOAuthReturnContextMock: vi.fn(), connectOAuthModalMock: vi.fn(), @@ -25,6 +30,18 @@ const { current: [] as Array<{ id: string; name: string; provider: string }>, isFetching: false, }, + lifecycle: { + sync: { mutate: vi.fn(), reset: vi.fn(), error: null as Error | null, isPending: false }, + update: { mutate: vi.fn(), reset: vi.fn(), error: null as Error | null, isPending: false }, + remove: { mutate: vi.fn(), reset: vi.fn(), error: null as Error | null, isPending: false }, + detail: { + current: undefined as unknown, + isError: false, + isPlaceholderData: false, + refetch: vi.fn(), + }, + }, + missingScopesMock: vi.fn(() => [] as string[]), })) vi.mock('@sim/emcn/icons', () => ({ @@ -40,6 +57,9 @@ vi.mock('@sim/emcn/icons', () => ({ Settings: icon('settings'), Trash: icon('trash'), TriangleAlert: icon('triangle-alert'), + Users: icon('users'), + MoreHorizontal: icon('more-horizontal'), + ArrowRight: icon('arrow-right'), })) vi.mock('@sim/emcn', () => ({ @@ -59,12 +79,73 @@ vi.mock('@sim/emcn', () => ({ {children} ), - Checkbox: () => , - ChipConfirmModal: () => null, + Checkbox: ({ + id, + checked, + disabled, + onCheckedChange, + }: { + id: string + checked: boolean + disabled?: boolean + onCheckedChange: (checked: boolean) => void + }) => ( + onCheckedChange(event.target.checked)} + /> + ), + ChipConfirmModal: ({ + open, + title, + children, + confirm, + onOpenChange, + }: { + open: boolean + title: string + children: ReactNode + confirm: { label: string; onClick: () => void; pending?: boolean; disabled?: boolean } + onOpenChange: (open: boolean) => void + }) => + open ? ( +
    + {children} + + +
    + ) : null, + ChipModalField: ({ children }: { children: ReactNode }) =>
    {children}
    , + ChipModalError: ({ children }: { children: ReactNode }) => + children ?
    {children}
    : null, cn: (...classes: unknown[]) => classes.filter(Boolean).join(' '), DropdownMenu: ({ children }: { children?: ReactNode }) =>
    {children}
    , DropdownMenuContent: ({ children }: { children?: ReactNode }) =>
    {children}
    , - DropdownMenuItem: ({ children }: { children?: ReactNode }) =>
    {children}
    , + DropdownMenuItem: ({ + children, + disabled, + onSelect, + }: { + children?: ReactNode + disabled?: boolean + onSelect: () => void + }) => ( + + ), + DropdownMenuSeparator: () =>
    , DropdownMenuTrigger: ({ children }: { children?: ReactNode }) =>
    {children}
    , OverflowText: ({ label, children }: { label: string; children?: ReactNode }) => ( {children ?? label} @@ -84,7 +165,7 @@ vi.mock('@/lib/oauth', () => ({ getCanonicalScopesForProvider: vi.fn(() => []), getProviderIdFromServiceId: vi.fn(() => 'slack'), })) -vi.mock('@/lib/oauth/utils', () => ({ getMissingRequiredScopes: vi.fn(() => []) })) +vi.mock('@/lib/oauth/utils', () => ({ getMissingRequiredScopes: missingScopesMock })) vi.mock('@/app/workspace/[workspaceId]/components/connect-oauth-modal', () => ({ ConnectOAuthModal: (props: unknown) => { connectOAuthModalMock(props) @@ -104,6 +185,7 @@ vi.mock('@/connectors/registry', () => ({ name: 'Slack', configFields: [], auth: { mode: 'oauth', provider: 'slack', requiredScopes: ['channels:read'] }, + rehydrateOnFullSync: true, }, confluence: { id: 'confluence', @@ -115,13 +197,22 @@ vi.mock('@/connectors/registry', () => ({ })) vi.mock('@/hooks/queries/kb/connectors', () => ({ isConnectorSyncingOrPending: vi.fn( - (connector: { status: string }) => - connector.status === 'pending' || connector.status === 'syncing' + (connector: { status: string; memberSyncStatus?: string }) => + connector.status === 'pending' || + connector.status === 'syncing' || + connector.memberSyncStatus === 'pending' || + connector.memberSyncStatus === 'running' ), - useConnectorDetail: vi.fn(() => ({ data: undefined, isLoading: false })), - useDeleteConnector: vi.fn(() => ({ mutate: vi.fn(), isPending: false })), - useTriggerSync: vi.fn(() => ({ mutate: vi.fn() })), - useUpdateConnector: vi.fn(() => ({ mutate: vi.fn() })), + useConnectorDetail: vi.fn(() => ({ + data: lifecycle.detail.current, + isLoading: false, + isError: lifecycle.detail.isError, + isPlaceholderData: lifecycle.detail.isPlaceholderData, + refetch: lifecycle.detail.refetch, + })), + useDeleteConnector: () => lifecycle.remove, + useTriggerSync: () => lifecycle.sync, + useUpdateConnector: () => lifecycle.update, })) vi.mock('@/hooks/queries/oauth/oauth-credentials', () => ({ useOAuthCredentials: vi.fn(() => ({ @@ -135,10 +226,13 @@ vi.mock('@/hooks/use-credential-refresh-triggers', () => ({ })) import { + ConnectorActions, + ConnectorRecovery, + ConnectorSyncHistory, ConnectorsSection, SyncHistory, -} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section' -import type { ConnectorData } from '@/hooks/queries/kb/connectors' +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section' +import { type ConnectorData, useConnectorDetail } from '@/hooks/queries/kb/connectors' let root: Root | null = null @@ -183,6 +277,16 @@ function makeConnector(overrides: Partial = {}): ConnectorData { lastSyncDocCount: null, nextSyncAt: null, consecutiveFailures: 3, + accessMode: 'admin', + memberSyncStatus: 'idle', + viewerMembership: null, + credentialGroupId: null, + credentialGroupOptionId: null, + lastMemberSyncAt: null, + nextMemberSyncAt: null, + lastMemberSyncError: null, + memberSyncConsecutiveFailures: 0, + accessRewritePending: false, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), ...overrides, @@ -214,12 +318,37 @@ function icons(container: HTMLElement) { ) } +function renderComponent(component: ReactNode) { + const container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + act(() => root?.render(component)) + return container +} + +function findButton(container: ParentNode, label: string) { + const button = Array.from(container.querySelectorAll('button')).find( + (item) => item.textContent === label || item.getAttribute('aria-label') === label + ) + if (!button) throw new Error(`Missing ${label} button`) + return button +} + afterEach(() => { act(() => root?.unmount()) root = null document.body.innerHTML = '' oauthCredentialsState.current = [] oauthCredentialsState.isFetching = false + for (const mutation of [lifecycle.sync, lifecycle.update, lifecycle.remove]) { + mutation.isPending = false + mutation.error = null + mutation.mutate.mockReset() + } + lifecycle.detail.current = undefined + lifecycle.detail.isError = false + lifecycle.detail.isPlaceholderData = false + missingScopesMock.mockReturnValue([]) vi.clearAllMocks() }) @@ -362,9 +491,329 @@ describe('Connector credential reauthorization', () => { ) ) - expect(consumeOAuthReturnContextMock).toHaveBeenCalledOnce() + expect(consumeOAuthReturnContextMock).not.toHaveBeenCalled() expect(connectOAuthModalMock).not.toHaveBeenCalled() }) + + it('preserves pending OAuth return context when the recovery modal closes', () => { + oauthCredentialsState.current = [ + { id: 'credential-1', name: 'Workspace Slack', provider: 'slack-custom' }, + ] + const container = renderSection(makeConnector()) + act(() => findButton(container, 'Reconnect').click()) + act(() => connectOAuthModalMock.mock.calls.at(-1)?.[0].onOpenChange(false)) + expect(consumeOAuthReturnContextMock).not.toHaveBeenCalled() + }) + + it('returns an organization reconnect to its source detail page', () => { + oauthCredentialsState.current = [ + { id: 'credential-1', name: 'Workspace Slack', provider: 'slack-custom' }, + ] + const container = renderComponent( + + ) + act(() => findButton(container, 'Reconnect').click()) + expect(connectOAuthModalMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + reconnectTarget: { + organizationId: 'organization-1', + credentialId: 'credential-1', + displayName: 'Workspace Slack', + }, + returnContext: { + origin: 'kb-connectors', + knowledgeBaseId: 'knowledge-1', + connectorId: 'connector-1', + connectorType: 'slack', + }, + }) + ) + }) + + it('reuses the source return context when connecting a missing account', () => { + const container = renderComponent( + + ) + act(() => findButton(container, 'Reconnect').click()) + expect(connectOAuthModalMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + mode: 'connect', + connectorType: 'slack', + organizationId: 'organization-1', + knowledgeBaseId: 'knowledge-1', + connectorId: 'connector-1', + }) + ) + }) + + it('cannot reconnect away from unsaved source settings', () => { + oauthCredentialsState.current = [ + { id: 'credential-1', name: 'Workspace Slack', provider: 'slack-custom' }, + ] + const container = renderComponent( + + ) + expect(findButton(container, 'Reconnect').disabled).toBe(true) + act(() => findButton(container, 'Reconnect').click()) + expect(connectOAuthModalMock).not.toHaveBeenCalled() + }) + + it('reauthorizes missing scopes on an otherwise active source', () => { + oauthCredentialsState.current = [ + { id: 'credential-1', name: 'Workspace Slack', provider: 'slack-custom' }, + ] + missingScopesMock.mockReturnValue(['channels:read']) + const container = renderSection(makeConnector({ status: 'active' })) + act(() => findButton(container, 'Update access').click()) + expect(connectOAuthModalMock).toHaveBeenLastCalledWith( + expect.objectContaining({ mode: 'reauthorize', newScopes: ['channels:read'] }) + ) + }) +}) + +describe('shared connector lifecycle actions', () => { + it('distinguishes an incremental sync from a supported full resync', () => { + const container = renderComponent( + + ) + act(() => findButton(container, 'Sync now').click()) + expect(lifecycle.sync.mutate).toHaveBeenLastCalledWith({ + knowledgeBaseId: 'knowledge-1', + connectorId: 'connector-1', + rehydrate: false, + }) + act(() => findButton(container, 'Full resync').click()) + expect(lifecycle.sync.mutate).toHaveBeenLastCalledWith({ + knowledgeBaseId: 'knowledge-1', + connectorId: 'connector-1', + rehydrate: true, + }) + }) + + it.each(['pending', 'running', 'disabled'] as const)( + 'does not offer content resync or dispatch work while the member engine is %s', + (memberSyncStatus) => { + const container = renderComponent( + + ) + expect(container.textContent).not.toContain('Full resync') + const syncButton = container.querySelector('button')! + expect(syncButton.disabled).toBe(true) + act(() => syncButton.click()) + expect(lifecycle.sync.mutate).not.toHaveBeenCalled() + } + ) + + it('resumes a paused source and prevents reversing its optimistic update before settling', () => { + const connector = makeConnector({ status: 'paused' }) + const container = renderComponent( + + ) + expect(findButton(container, 'Sync now').disabled).toBe(true) + act(() => findButton(container, 'Resume').click()) + expect(lifecycle.update.mutate).toHaveBeenCalledWith({ + knowledgeBaseId: 'knowledge-1', + connectorId: 'connector-1', + updates: { status: 'active' }, + }) + lifecycle.update.isPending = true + act(() => + root?.render( + + ) + ) + expect(findButton(container, 'Pause').disabled).toBe(true) + act(() => findButton(container, 'Pause').click()) + expect(lifecycle.update.mutate).toHaveBeenCalledOnce() + }) + + it.each([true, false])('removes member documents automatically: %s', (members) => { + const onRemoved = vi.fn() + const container = renderComponent( + + ) + act(() => findButton(container, 'Remove').click()) + const dialog = container.querySelector('[role="dialog"]')! + expect(Boolean(dialog.querySelector('input'))).toBe(!members) + act(() => findButton(dialog, 'Remove').click()) + expect(lifecycle.remove.mutate).toHaveBeenCalledWith( + { knowledgeBaseId: 'knowledge-1', connectorId: 'connector-1', deleteDocuments: members }, + expect.any(Object) + ) + act(() => lifecycle.remove.mutate.mock.calls[0][1].onSuccess()) + expect(onRemoved).toHaveBeenCalledOnce() + expect(container.querySelector('[role="dialog"]')).toBeNull() + }) + + it('can explicitly delete content-mode documents and retains a failed removal for retry', () => { + const connector = makeConnector({ status: 'active' }) + const container = renderComponent( + + ) + act(() => findButton(container, 'Remove').click()) + const dialog = container.querySelector('[role="dialog"]')! + act(() => dialog.querySelector('input')!.click()) + act(() => findButton(dialog, 'Remove').click()) + expect(lifecycle.remove.mutate.mock.calls[0][0].deleteDocuments).toBe(true) + lifecycle.remove.error = new Error('Removal failed') + act(() => + root?.render() + ) + expect(container.querySelector('[role="dialog"]')?.textContent).toContain('Removal failed') + }) + + it('keeps lifecycle actions unavailable while the source settings are being edited', () => { + const container = renderComponent( + + ) + expect(findButton(container, 'Sync now').disabled).toBe(true) + expect(findButton(container, 'Source actions').disabled).toBe(true) + expect(findButton(container, 'Pause').disabled).toBe(true) + expect(findButton(container, 'Remove').disabled).toBe(true) + }) + + it('does not expose mutation controls to a viewer', () => { + const container = renderComponent( + + ) + expect(container.querySelector('button')).toBeNull() + }) +}) + +describe('shared connector sync history', () => { + it('reuses the detail page query instead of starting another polling observer', () => { + const connector = makeConnector() + const detail = { + ...connector, + syncLogs: [makeLog({ status: 'completed', docsAdded: 3 })], + memberSyncLogs: [], + members: { active: 0, suspended: 0, stale: 0 }, + } + const container = renderComponent( + + ) + expect(useConnectorDetail).toHaveBeenLastCalledWith(undefined, undefined) + expect(container.textContent).toContain('3 added') + }) + + it('does not display the previous source history while a new source loads', () => { + lifecycle.detail.isPlaceholderData = true + lifecycle.detail.current = { syncLogs: [makeLog({ status: 'completed', docsAdded: 999 })] } + const container = renderComponent( + + ) + expect(container.textContent).toContain('Loading sync history…') + expect(container.textContent).not.toContain('999') + }) + + it.each(['partial', 'failed', 'started'] as const)( + 'preserves member history counts, failures and interrupted runs: %s', + (status) => { + lifecycle.detail.current = { + memberSyncLogs: [ + { + id: 'member-log-1', + status, + startedAt: new Date(Date.now() - MEMBER_SYNC_STALE_LOCK_TTL_MS - 60_000).toISOString(), + membersCompleted: 1, + membersIncomplete: 1, + membersFailed: 1, + docsAdded: 2, + docsUpdated: 0, + docsTombstoned: 1, + docsPurged: 2, + errorMessage: 'The member account needs reconnecting', + }, + ], + } + const container = renderComponent( + + ) + if (status === 'partial') { + expect(container.textContent).toContain('Partial') + expect(container.textContent).toContain('3 members · 1 failed · 2 added · 3 deleted') + } else if (status === 'failed') { + expect(container.textContent).toContain('The member account needs reconnecting') + } else { + expect(container.textContent).toContain('Interrupted') + expect(container.textContent).not.toContain('In progress…') + } + } + ) + + it('loads the member engine history rather than the content history', () => { + lifecycle.detail.current = { + syncLogs: [makeLog({ status: 'completed', docsAdded: 999 })], + memberSyncLogs: [], + members: { active: 2, suspended: 1, stale: 0 }, + } + const container = renderComponent( + + ) + expect(container.textContent).toContain('2 connected') + expect(container.textContent).toContain('1 need reconnecting') + expect(container.textContent).toContain('No member sync history yet.') + expect(container.textContent).not.toContain('999') + }) + + it('offers retry on a failed history load instead of claiming the history is empty', () => { + lifecycle.detail.isError = true + const container = renderComponent( + + ) + expect(container.textContent).toContain('Could not load sync history') + expect(container.textContent).not.toContain('No sync history yet.') + act(() => findButton(container, 'Try again').click()) + expect(lifecycle.detail.refetch).toHaveBeenCalledOnce() + }) }) describe('SyncHistory', () => { @@ -381,7 +830,7 @@ describe('SyncHistory', () => { const container = render(makeLog({ status: 'partial', docsAdded: 3 })) expect(icons(container)).toEqual(['icon-triangle-alert']) expect(container.textContent).toContain('Partial') - expect(container.textContent).toContain('+3') + expect(container.textContent).toContain('3 added') expect(container.textContent).not.toContain('In progress…') }) @@ -389,7 +838,7 @@ describe('SyncHistory', () => { const container = render(makeLog({ status: 'completed', docsAdded: 3 })) expect(icons(container)).toEqual(['icon-circle-check']) - expect(container.textContent).toContain('+3') + expect(container.textContent).toContain('3 added') expect(container.textContent).not.toContain('In progress…') }) @@ -404,11 +853,11 @@ describe('SyncHistory', () => { const container = render(makeLog({ status: 'completed', docsSkipped: 4 })) expect(icons(container)).toEqual(['icon-circle-check']) - expect(container.textContent).toContain('⊘4') + expect(container.textContent).toContain('4 skipped') expect(container.textContent).not.toContain('No changes') }) - it('renders mixed sync counts as separate ordered markers', () => { + it('renders mixed sync counts with readable labels', () => { const container = render( makeLog({ status: 'completed', @@ -420,7 +869,9 @@ describe('SyncHistory', () => { }) ) - expect(container.textContent).toContain('+2 ~3 -4 !5 ⊘6') + expect(container.textContent).toContain( + '2 added · 3 updated · 4 deleted · 5 failed · 6 skipped' + ) expect(container.textContent).not.toContain('No changes') }) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx index 7b6bf01fd67..59906b1f71a 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx @@ -1,71 +1,19 @@ 'use client' -import { useEffect, useId, useMemo, useState } from 'react' -import { - Badge, - Checkbox, - Chip, - ChipConfirmModal, - cn, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - OverflowText, - Tooltip, -} from '@sim/emcn' -import { - ChevronDown, - ChevronUp, - CircleAlert, - CircleCheck, - CircleX, - Loader, - Pause, - Play, - RefreshCw, - Settings, - Trash, - TriangleAlert, - Users, -} from '@sim/emcn/icons' -import { createLogger } from '@sim/logger' +import { useState } from 'react' +import { Badge, Chip, cn, OverflowText, Tooltip } from '@sim/emcn' +import { ChevronDown, ChevronUp, CircleAlert, Loader, Users } from '@sim/emcn/icons' import { format, formatDistanceToNow, isPast } from 'date-fns' -import { - type ResourceScope, - resourceScopeFields, - resourceScopeFromOwner, -} from '@/lib/core/resource-scope' -import { consumeOAuthReturnContext, writeOAuthReturnContext } from '@/lib/credentials/client-state' -import { - CONNECTOR_SYNC_STALE_LOCK_TTL_MS, - MEMBER_SYNC_STALE_LOCK_TTL_MS, -} from '@/lib/knowledge/connectors/sync-limits' -import type { MemberSyncStatus } from '@/lib/knowledge/types' -import { getCanonicalScopesForProvider, getProviderIdFromServiceId } from '@/lib/oauth' -import { getMissingRequiredScopes } from '@/lib/oauth/utils' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' +import { type ResourceScope, resourceScopeFromOwner } from '@/lib/core/resource-scope' import { describeSearchSource } from '@/lib/sim-search/source-identity' -import { ConnectOAuthModal } from '@/app/workspace/[workspaceId]/components/connect-oauth-modal' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' +import { ConnectorActions } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions' +import { ConnectorRecovery } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery' +import { ConnectorSyncHistory } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-history' +import { getConnectorSyncState } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state' import { EditConnectorModal } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal' import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' -import type { - ConnectorData, - ConnectorMemberSummary, - MemberSyncLogData, - SyncLogData, -} from '@/hooks/queries/kb/connectors' -import { - isConnectorSyncingOrPending, - useConnectorDetail, - useDeleteConnector, - useTriggerSync, - useUpdateConnector, -} from '@/hooks/queries/kb/connectors' -import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' -import { useCredentialRefreshTriggers } from '@/hooks/use-credential-refresh-triggers' - -const logger = createLogger('ConnectorsSection') interface ConnectorsSectionProps { scope?: ResourceScope @@ -78,8 +26,6 @@ interface ConnectorsSectionProps { className?: string } -const EMPTY_REQUIRED_SCOPES: string[] = [] - const STATUS_CONFIG = { active: { label: 'Active', variant: 'green' as const }, pending: { label: 'Queued', variant: 'blue' as const }, @@ -89,27 +35,6 @@ const STATUS_CONFIG = { disabled: { label: 'Disabled', variant: 'orange' as const }, } as const -/** Covers exactly the statuses {@link isConnectorSyncingOrPending} matches. */ -const SYNC_IN_FLIGHT_TOOLTIP = { - pending: 'Sync queued', - syncing: 'Sync in progress', -} as const - -/** The member engine's own in-flight states, shown when the connector syncs per member. */ -const MEMBER_SYNC_IN_FLIGHT_TOOLTIP: Partial> = { - pending: 'Member sync queued', - running: 'Syncing members', -} - -/** How each member-engine status reads on the card's badge. */ -const MEMBER_SYNC_STATUS_AS_CONNECTOR_STATUS = { - idle: 'active', - pending: 'pending', - running: 'syncing', - error: 'error', - disabled: 'disabled', -} as const satisfies Record - export function ConnectorsSection({ workspaceId, scope: explicitScope, @@ -121,94 +46,11 @@ export function ConnectorsSection({ className, }: ConnectorsSectionProps) { const scope = explicitScope ?? resourceScopeFromOwner({ workspaceId }) - const { mutate: triggerSync } = useTriggerSync() - const { - mutate: updateConnector, - isPending: isUpdatingConnector, - variables: updatingVariables, - } = useUpdateConnector() - const { mutate: deleteConnector, isPending: isDeleting } = useDeleteConnector() - const deleteDocumentsId = useId() - const [deleteTarget, setDeleteTarget] = useState(null) - const [deleteDocuments, setDeleteDocuments] = useState(false) - - const closeDeleteModal = () => { - setDeleteTarget(null) - setDeleteDocuments(false) - } const [editingConnector, setEditingConnector] = useState(null) - const [error, setError] = useState(null) - - /** - * In-flight state is written optimistically into the connector list, so the - * row's own `status` is the only thing the UI reads — local id sets would not - * survive the modal holding them unmounting. - */ - const handleSync = (connectorId: string, rehydrate = false) => { - triggerSync( - { knowledgeBaseId, connectorId, rehydrate }, - { - onSuccess: () => setError(null), - onError: (err) => { - logger.error('Sync trigger failed', { error: err.message }) - setError(err.message) - }, - } - ) - } - - const handleTogglePause = (connector: ConnectorData) => { - updateConnector( - { - knowledgeBaseId, - connectorId: connector.id, - updates: { - status: - connector.status === 'paused' || connector.status === 'disabled' ? 'active' : 'paused', - }, - }, - { - onSuccess: () => setError(null), - onError: (err) => { - logger.error('Toggle pause failed', { error: err.message }) - setError(err.message) - }, - } - ) - } - - const deletingMembersConnector = - connectors.find((connector) => connector.id === deleteTarget)?.accessMode === 'members' - - const handleDeleteConnector = () => { - if (!deleteTarget) return - deleteConnector( - { - knowledgeBaseId, - connectorId: deleteTarget, - /** Documents synced per member have no meaning without their members. */ - deleteDocuments: deleteDocuments || deletingMembersConnector, - }, - { - onSuccess: () => { - setError(null) - closeDeleteModal() - }, - onError: (err) => { - logger.error('Delete connector failed', { error: err.message }) - setError(err.message) - closeDeleteModal() - }, - } - ) - } - if (connectors.length === 0 && !canEdit && !isLoading) return null return (
    - {error &&

    {error}

    } - {isLoading ? (
    ) : connectors.length === 0 ? ( @@ -225,69 +67,21 @@ export function ConnectorsSection({ knowledgeBaseId={knowledgeBaseId} canEdit={canEdit} isSearchIndex={isSearchIndex} - /** - * The optimistic status flip relabels this control Pause -> Resume - * immediately, so without a guard a second click would send - * `active` before the first pause settles and resume a connector - * the user meant to pause. Read from the mutation rather than a - * local id set: React Query already knows which row is in flight. - */ - isUpdating={isUpdatingConnector && updatingVariables?.connectorId === connector.id} - onSync={(rehydrate) => handleSync(connector.id, rehydrate)} - onTogglePause={() => handleTogglePause(connector)} onEdit={() => setEditingConnector(connector)} - onDelete={() => setDeleteTarget(connector.id)} /> ))}
    )} - {editingConnector && ( !val && setEditingConnector(null)} + open + onOpenChange={(open) => !open && setEditingConnector(null)} knowledgeBaseId={knowledgeBaseId} isSearchIndex={isSearchIndex} connector={editingConnector} /> )} - - { - if (!open) closeDeleteModal() - }} - srTitle='Remove Connector' - title='Remove Connector' - text={ - deletingMembersConnector - ? 'This will disconnect the source, stop future syncs, and delete the documents it synced per member.' - : 'This will disconnect the source and stop future syncs. Documents already synced will remain in the knowledge base unless you choose to delete them.' - } - confirm={{ - label: 'Remove', - onClick: handleDeleteConnector, - pending: isDeleting, - pendingLabel: 'Removing...', - }} - > - {!deletingMembersConnector && ( -
    - setDeleteDocuments(checked === true)} - /> - -
    - )} -
    ) } @@ -298,11 +92,7 @@ interface ConnectorCardProps { knowledgeBaseId: string canEdit: boolean isSearchIndex: boolean - isUpdating: boolean - onSync: (rehydrate?: boolean) => void onEdit: () => void - onTogglePause: () => void - onDelete: () => void } function ConnectorCard({ @@ -311,110 +101,19 @@ function ConnectorCard({ knowledgeBaseId, canEdit, isSearchIndex, - isUpdating, - onSync, onEdit, - onTogglePause, - onDelete, }: ConnectorCardProps) { const [expanded, setExpanded] = useState(false) - const [showOAuthModal, setShowOAuthModal] = useState(false) - const connectorDef = CONNECTOR_META_REGISTRY[connector.connectorType] - const docsUrl = isSearchIndex ? connectorDef?.searchDocsUrl : undefined const sourceDescription = connectorDef ? describeSearchSource(connectorDef, connector.sourceConfig) : '' const Icon = connectorDef?.icon - /** - * A members-mode connector's content status stays `active` while the member - * engine does the work, so its badge reads the member engine's status. A - * paused or disabled content status still wins: the user set it. - */ - const effectiveStatus = - connector.accessMode === 'members' && connector.status === 'active' - ? MEMBER_SYNC_STATUS_AS_CONNECTOR_STATUS[connector.memberSyncStatus] - : connector.status + const { syncsPerMember, syncInFlight, effectiveStatus, lastSyncAt, nextSyncAt, lastSyncError } = + getConnectorSyncState(connector) const statusConfig = STATUS_CONFIG[effectiveStatus as keyof typeof STATUS_CONFIG] || STATUS_CONFIG.active - const serviceId = connectorDef?.auth.mode === 'oauth' ? connectorDef.auth.provider : undefined - const providerId = serviceId ? getProviderIdFromServiceId(serviceId) : undefined - const requiredScopes = - connectorDef?.auth.mode === 'oauth' - ? (connectorDef.auth.requiredScopes ?? EMPTY_REQUIRED_SCOPES) - : EMPTY_REQUIRED_SCOPES - - const { - data: credentials, - isFetching: credentialsLoading, - refetch: refetchCredentials, - } = useOAuthCredentials(providerId, { - ...resourceScopeFields(scope), - }) - - const selectedCredential = useMemo(() => { - if (!credentials || !connector.credentialId) return undefined - return credentials.find((credential) => credential.id === connector.credentialId) - }, [credentials, connector.credentialId]) - - useCredentialRefreshTriggers( - refetchCredentials, - selectedCredential?.provider ?? providerId ?? '', - scope - ) - - const missingScopes = useMemo( - () => (selectedCredential ? getMissingRequiredScopes(selectedCredential, requiredScopes) : []), - [selectedCredential, requiredScopes] - ) - - useEffect(() => { - if (showOAuthModal && connector.credentialId && !selectedCredential && !credentialsLoading) { - consumeOAuthReturnContext() - setShowOAuthModal(false) - } - }, [showOAuthModal, connector.credentialId, selectedCredential, credentialsLoading]) - - const { data: detail, isLoading: detailLoading } = useConnectorDetail( - expanded ? knowledgeBaseId : undefined, - expanded ? connector.id : undefined - ) - const syncLogs = detail?.syncLogs ?? [] - const memberSyncLogs = detail?.memberSyncLogs ?? [] - const members = detail?.members - - const syncsPerMember = connector.accessMode === 'members' - /** A per-member connector re-hydrates through its members; the content resync has no meaning there. */ - const canFullResync = Boolean(connectorDef?.rehydrateOnFullSync) && !syncsPerMember - const syncInFlight = isConnectorSyncingOrPending(connector) - const isPaused = connector.status === 'paused' - const memberSyncDisabled = syncsPerMember && connector.memberSyncStatus === 'disabled' - /** - * A queued sync is what stops a second one being dispatched — the server - * rejects it as a conflict anyway, so the button reflects that rather than - * running a client-side cooldown timer alongside it. - */ - const syncDisabled = - syncInFlight || connector.status === 'disabled' || isPaused || memberSyncDisabled - const syncTooltip = - SYNC_IN_FLIGHT_TOOLTIP[connector.status as keyof typeof SYNC_IN_FLIGHT_TOOLTIP] ?? - (syncsPerMember ? MEMBER_SYNC_IN_FLIGHT_TOOLTIP[connector.memberSyncStatus] : undefined) ?? - (isPaused - ? 'Resume to sync' - : memberSyncDisabled - ? 'Member sync is disabled' - : canFullResync - ? 'Sync' - : syncsPerMember - ? 'Sync members now' - : 'Sync now') - const lastSyncAt = syncsPerMember ? connector.lastMemberSyncAt : connector.lastSyncAt - const nextSyncAt = syncsPerMember ? connector.nextMemberSyncAt : connector.nextSyncAt - const lastSyncError = syncsPerMember - ? (connector.lastMemberSyncError ?? connector.lastSyncError) - : connector.lastSyncError - return (
    - {canEdit && ( - <> - {canFullResync ? ( - - - - {/* span keeps the tooltip hoverable while the trigger button is disabled */} - - - - - - - {syncTooltip} - - - onSync(false)}>Sync now - onSync(true)}>Full resync - - - ) : ( - - - {/* span keeps the tooltip hoverable while the button is disabled */} - - onSync(false)} - leftIcon={RefreshCw} - /> - - - {syncTooltip} - - )} - - - - - - Settings - - - - - - - - {connector.status === 'paused' || connector.status === 'disabled' - ? 'Resume' - : 'Pause'} - - - - - - - - Delete - - - )} - +
    - - {syncsPerMember && connector.memberSyncStatus === 'disabled' && ( -
    -
    -
    - - Per-member sync is disabled -
    -

    - {connector.lastMemberSyncError ?? 'The connector can no longer sync per member.'}{' '} - Members keep no access until it is fixed; switch the connector's access to re-enable - it. -

    -
    -
    - )} - - {connector.status === 'disabled' && ( -
    -
    -
    - - Connector disabled after repeated sync failures -
    -

    - Syncing has been paused due to {connector.consecutiveFailures} consecutive failures. - {serviceId - ? ' Reconnect your account to resume syncing.' - : ' Use the resume button to re-enable syncing.'} -

    - {canEdit && serviceId && providerId && ( - { - if (connector.credentialId) { - if (!selectedCredential) return - writeOAuthReturnContext({ - origin: 'kb-connectors', - knowledgeBaseId, - displayName: connectorDef?.name ?? connector.connectorType, - providerId: selectedCredential.provider, - preCount: credentials?.length ?? 0, - ...resourceScopeFields(scope), - reconnect: true, - requestedAt: Date.now(), - }) - } - setShowOAuthModal(true) - }} - fullWidth - > - Reconnect - - )} -
    -
    - )} - - {missingScopes.length > 0 && connector.status !== 'disabled' && ( -
    -
    -
    - - Additional permissions required -
    - {canEdit && ( - { - if (connector.credentialId) { - if (!selectedCredential) return - writeOAuthReturnContext({ - origin: 'kb-connectors', - knowledgeBaseId, - displayName: connectorDef?.name ?? connector.connectorType, - providerId: selectedCredential.provider, - preCount: credentials?.length ?? 0, - ...resourceScopeFields(scope), - reconnect: true, - requestedAt: Date.now(), - }) - } - setShowOAuthModal(true) - }} - fullWidth - > - Update access - - )} -
    -
    - )} - + {expanded && (
    - {syncsPerMember ? ( - - ) : ( - - )} -
    - )} - - {showOAuthModal && serviceId && providerId && !connector.credentialId && ( - { - if (!open) { - consumeOAuthReturnContext() - setShowOAuthModal(false) - } - }} - serviceId={serviceId} - providerId={providerId} - docsUrl={docsUrl} - requiredScopes={getCanonicalScopesForProvider(providerId)} - {...resourceScopeFields(scope)} - knowledgeBaseId={knowledgeBaseId} - /> - )} - - {showOAuthModal && - serviceId && - providerId && - connector.credentialId && - selectedCredential && ( - { - if (!open) { - consumeOAuthReturnContext() - setShowOAuthModal(false) - } - }} - toolName={connectorDef?.name ?? connector.connectorType} - requiredScopes={getCanonicalScopesForProvider(providerId)} - newScopes={missingScopes} - serviceId={serviceId} - providerId={selectedCredential.provider} - docsUrl={docsUrl} - reconnectTarget={{ - ...resourceScopeFields(scope), - credentialId: selectedCredential.id, - displayName: selectedCredential.name, - }} - /> - )} -
    - ) -} - -/** - * How a sync-log row should read to a user. - * - * `interrupted` has no status of its own: the scheduler reclaims a stale - * `syncing` lock by flipping the *connector* to `error`, and never rewrites the - * log row, so a run killed mid-flight (deploy, OOM) stays `started` forever. - * Past the stale-lock TTL that row is a crashed run, not a live one. - * - * Treating the TTL as a hard ceiling is a deliberate policy choice, not an - * assumption that no run can outlive it. The in-process fallback sync runs - * unawaited in the web process with no duration limit, so it genuinely can — - * but nothing writes to the row between lock acquisition and completion, so a - * live run past the TTL and a dead one are byte-identical to this component. - * Rendering it as still running is the failure this state exists to fix; the - * same TTL already governs the reclaim that takes its lock away. - */ -type SyncLogState = 'running' | 'interrupted' | 'failed' | 'completed' | 'partial' - -function getSyncLogState(log: SyncLogData, now: number): SyncLogState { - switch (log.status) { - case 'completed': - return 'completed' - case 'partial': - return 'partial' - case 'failed': - return 'failed' - case 'started': { - const ageMs = now - new Date(log.startedAt).getTime() - return ageMs > CONNECTOR_SYNC_STALE_LOCK_TTL_MS ? 'interrupted' : 'running' - } - default: { - const exhaustive: never = log.status - return exhaustive - } - } -} - -interface SyncHistoryProps { - logs: SyncLogData[] - isLoading: boolean -} - -export function SyncHistory({ logs, isLoading }: SyncHistoryProps) { - if (isLoading) { - return ( -
    - - Loading sync history… -
    - ) - } - - if (logs.length === 0) { - return ( -

    - No sync history yet. -

    - ) - } - - const now = Date.now() - - return ( -
    - {logs.map((log) => { - const state = getSyncLogState(log, now) - const totalChanges = - log.docsAdded + - log.docsUpdated + - log.docsDeleted + - log.docsSkipped + - (log.docsFailed ?? 0) - - return ( -
    -
    - {state === 'running' ? ( - - ) : state === 'interrupted' || state === 'partial' ? ( - - ) : state === 'failed' ? ( - - ) : ( - - )} -
    - -
    -
    - - {format(new Date(log.startedAt), 'MMM d, h:mm a')} - - {(state === 'completed' || state === 'partial') && ( - - {totalChanges > 0 ? ( - <> - {log.docsAdded > 0 && ( - +{log.docsAdded} - )} - {log.docsUpdated > 0 && ( - <> - {log.docsAdded > 0 && ' '} - ~{log.docsUpdated} - - )} - {log.docsDeleted > 0 && ( - <> - {(log.docsAdded > 0 || log.docsUpdated > 0) && ' '} - -{log.docsDeleted} - - )} - {log.docsFailed > 0 && ( - <> - {(log.docsAdded > 0 || log.docsUpdated > 0 || log.docsDeleted > 0) && - ' '} - !{log.docsFailed} - - )} - {log.docsSkipped > 0 && ( - <> - {(log.docsAdded > 0 || - log.docsUpdated > 0 || - log.docsDeleted > 0 || - log.docsFailed > 0) && - ' '} - ⊘{log.docsSkipped} - - )} - - ) : ( - 'No changes' - )} - - )} - {state === 'partial' && Partial} - {state === 'running' && ( - In progress… - )} - {state === 'interrupted' && ( - Interrupted - )} -
    - - {state === 'failed' && log.errorMessage && ( - {log.errorMessage} - )} -
    -
    - ) - })} -
    - ) -} - -function getMemberSyncLogState(log: MemberSyncLogData, now: number): SyncLogState { - switch (log.status) { - case 'completed': - return 'completed' - case 'partial': - return 'partial' - case 'failed': - return 'failed' - case 'started': { - const ageMs = now - new Date(log.startedAt).getTime() - return ageMs > MEMBER_SYNC_STALE_LOCK_TTL_MS ? 'interrupted' : 'running' - } - default: { - const exhaustive: never = log.status - return exhaustive - } - } -} - -interface MemberSyncHistoryProps { - logs: MemberSyncLogData[] - members: ConnectorMemberSummary | undefined - isLoading: boolean -} - -/** - * The per-member run history: who was crawled, what changed, and how the - * membership stands. A run that ended with members still due re-dispatches - * itself, so several short rows in a row are one drain, not a fault. - */ -function MemberSyncHistory({ logs, members, isLoading }: MemberSyncHistoryProps) { - if (isLoading) { - return ( -
    - - Loading member sync history… -
    - ) - } - - const now = Date.now() - - return ( -
    - {members && ( -
    - - - {members.active} connected - {members.suspended > 0 && ` · ${members.suspended} need reconnecting`} - {members.stale > 0 && ` · ${members.stale} not synced recently`} - -
    - )} - {logs.length === 0 ? ( -

    - No member sync history yet. -

    - ) : ( -
    - {logs.map((log) => { - const state = getMemberSyncLogState(log, now) - const changes = log.docsAdded + log.docsUpdated + log.docsTombstoned + log.docsPurged - return ( -
    -
    - {state === 'running' ? ( - - ) : state === 'interrupted' || state === 'partial' ? ( - - ) : state === 'failed' ? ( - - ) : ( - - )} -
    -
    -
    - {format(new Date(log.startedAt), 'MMM d, h:mm a')} - {(state === 'completed' || state === 'partial') && ( - - {log.membersCompleted + log.membersIncomplete + log.membersFailed} member - {log.membersCompleted + log.membersIncomplete + log.membersFailed === 1 - ? '' - : 's'} - {log.membersFailed > 0 && ( - - {' '} - · {log.membersFailed} failed - - )} - {changes > 0 ? ( - <> - {log.docsAdded > 0 && ( - +{log.docsAdded} - )} - {log.docsUpdated > 0 && ( - ~{log.docsUpdated} - )} - {log.docsTombstoned + log.docsPurged > 0 && ( - - {' '} - -{log.docsTombstoned + log.docsPurged} - - )} - - ) : ( - ' · no changes' - )} - - )} - {state === 'partial' && Partial} - {state === 'running' && In progress…} - {state === 'interrupted' && ( - Interrupted - )} -
    - {state === 'failed' && log.errorMessage && ( - {log.errorMessage} - )} -
    -
    - ) - })} +
    )}
    diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/index.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/index.ts index d59cadaa3ef..cce010190e4 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/index.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/index.ts @@ -1 +1,7 @@ -export { ConnectorsSection } from './connectors-section' +export { ConnectorActions } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions' +export { ConnectorRecovery } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery' +export { + ConnectorSyncHistory, + SyncHistory, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-history' +export { ConnectorsSection } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/consts.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/consts.ts index 82c71b5a462..9107047a394 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/consts.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/consts.ts @@ -2,8 +2,7 @@ import type { ConnectorAccessMode } from '@/lib/api/contracts/knowledge/connecto import { effectiveConnectorSyncIntervalMinutes } from '@/lib/knowledge/connectors/access-modes' /** Under the account picker of a per-member connector, whose account only browses. */ -export const BROWSE_WITH_HINT = - 'Only used to choose what to sync below. It does not change who indexes documents or who can read them.' +export const BROWSE_WITH_HINT = 'Used only to choose what to sync.' /** Explain when permission refresh requires a more frequent pass than content indexing. */ export function connectorSyncFrequencyHint( diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.test.tsx index 56b1d8a8af1..03e15c133ab 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.test.tsx @@ -107,10 +107,18 @@ describe('connector document recovery', () => { }) it('requests failed documents from the server and hides healthy placeholder rows', () => { render() - act(() => button('Failed (1)').click()) + act(() => + document + .querySelector('[aria-label="Document status"]') + ?.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, button: 0 })) + ) + const failed = [...document.querySelectorAll('[role="menuitem"]')].find((item) => + item.textContent?.includes('Failed (1)') + ) as HTMLElement + act(() => failed.click()) expect(mocks.query).toHaveBeenLastCalledWith('kb', 'connector', { - includeExcluded: true, - failedOnly: true, + filter: 'failed', + search: undefined, }) expect(document.body.textContent).toContain('Handbook.txt') expect(document.body.textContent).not.toContain('Guide.txt') @@ -145,6 +153,23 @@ describe('connector document recovery', () => { act(() => button('Load more documents').click()) expect(mocks.fetchNextPage).toHaveBeenCalledOnce() }) + it('keeps loaded documents visible when loading the next page fails', () => { + render() + const query = mocks.query.mock.results.at(-1)?.value + mocks.query.mockReturnValue({ + ...query, + isError: true, + isFetchNextPageError: true, + error: new Error('Next page failed'), + }) + rerender() + expect(document.body.textContent).toContain('Guide.txt') + expect(document.body.textContent).toContain('Next page failed') + act(() => button('Try again').click()) + expect(mocks.fetchNextPage).toHaveBeenCalledOnce() + expect(mocks.refetch).not.toHaveBeenCalled() + }) + it('renders an actionable loading failure rather than claiming no documents exist', () => { mocks.query.mockReturnValue({ isError: true, diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx index 4f58a54b2b9..da2b7a5188d 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab.tsx @@ -1,27 +1,9 @@ 'use client' import { useState } from 'react' -import { - ButtonGroup, - ButtonGroupItem, - Chip, - ChipLink, - ChipModalError, - ChipModalField, - Skeleton, -} from '@sim/emcn' -import { RefreshCw, SquareArrowUpRight } from '@sim/emcn/icons' -import { - SettingsEmptyState, - SettingsQueryErrorState, -} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' -import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' -import { - useConnectorDocuments, - useExcludeConnectorDocument, - useRestoreConnectorDocument, -} from '@/hooks/queries/kb/connectors' -import { useUpdateDocument } from '@/hooks/queries/kb/knowledge' +import { ChipModalField } from '@sim/emcn' +import type { ConnectorDocumentFilter } from '@/lib/api/contracts/knowledge/connectors' +import { ConnectorDocuments } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents' interface ConnectorDocumentsTabProps { knowledgeBaseId: string @@ -32,149 +14,15 @@ export function ConnectorDocumentsTab({ knowledgeBaseId, connectorId, }: ConnectorDocumentsTabProps) { - const [filter, setFilter] = useState<'active' | 'excluded' | 'failed'>('active') - const query = useConnectorDocuments(knowledgeBaseId, connectorId, { - includeExcluded: true, - failedOnly: filter === 'failed', - }) - const { data, isLoading, hasNextPage, isFetchingNextPage, fetchNextPage } = query - const excludeMutation = useExcludeConnectorDocument() - const restoreMutation = useRestoreConnectorDocument() - const retryMutation = useUpdateDocument() - const mutationError = excludeMutation.error ?? restoreMutation.error ?? retryMutation.error - const isRecoveryPending = - excludeMutation.isPending || restoreMutation.isPending || retryMutation.isPending - const documents = (data?.pages.flatMap((page) => page.documents) ?? []).filter((document) => - filter === 'excluded' - ? document.userExcluded - : !document.userExcluded && (filter !== 'failed' || document.processingStatus === 'failed') - ) - const counts = data?.pages[0]?.counts ?? { active: 0, excluded: 0, failed: 0 } - const visibleDocumentCount = counts[filter] - const hasMoreVisibleDocuments = Boolean(hasNextPage && documents.length < visibleDocumentCount) - - function resetRecoveryErrors() { - excludeMutation.reset() - restoreMutation.reset() - retryMutation.reset() - } - - if (isLoading) { - return ( - - - - - - ) - } - if (query.isError) { - return ( - query.refetch()} - fallback='Could not load documents' - /> - ) - } - + const [filter, setFilter] = useState('active') return ( - <> - - { - if (value === 'active' || value === 'excluded' || value === 'failed') setFilter(value) - }} - > - Active ({counts.active}) - Excluded ({counts.excluded}) - Failed ({counts.failed}) - -
    - {visibleDocumentCount === 0 ? ( - - {filter === 'excluded' - ? 'No excluded documents' - : filter === 'failed' - ? 'No failed documents' - : 'No documents yet'} - - ) : ( - documents.map((doc) => ( - - {doc.sourceUrl && ( - - )} - {doc.processingStatus === 'failed' && !doc.userExcluded && ( - { - resetRecoveryErrors() - retryMutation.mutate({ - knowledgeBaseId, - documentId: doc.id, - updates: { retryProcessing: true }, - }) - }} - > - Retry indexing - - )} - { - resetRecoveryErrors() - doc.userExcluded - ? restoreMutation.mutate({ - knowledgeBaseId, - connectorId, - documentIds: [doc.id], - }) - : excludeMutation.mutate({ - knowledgeBaseId, - connectorId, - documentIds: [doc.id], - }) - }} - > - {doc.userExcluded ? 'Restore' : 'Exclude'} - -
    - } - /> - )) - )} - {hasMoreVisibleDocuments && ( - fetchNextPage()}> - {isFetchingNextPage ? 'Loading…' : 'Load more documents'} - - )} - -
    - {mutationError?.message} - + + + ) } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx new file mode 100644 index 00000000000..2b8843ce17d --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx @@ -0,0 +1,392 @@ +'use client' + +import { useMemo, useState } from 'react' +import { + ButtonGroup, + ButtonGroupItem, + Chip, + ChipCombobox, + ChipModalError, + ChipModalField, + type ComboboxOption, +} from '@sim/emcn' +import { Plus } from '@sim/emcn/icons' +import type { ConnectorAccessMode } from '@/lib/api/contracts/knowledge/connectors' +import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' +import { + getProviderIdFromServiceId, + getServiceAccountProviderForProviderId, + type OAuthProvider, +} from '@/lib/oauth' +import type { SourceSelectionLabel, SourceSelectionLabels } from '@/lib/sim-search/source-identity' +import { + ConnectServiceAccountModal, + useServiceAccountConnectTarget, +} from '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal' +import { + ConnectorAccessField, + type ConnectorAccessSelection, + ConnectorContentCredentialField, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field' +import { ConnectorConfigFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields' +import { + BROWSE_WITH_HINT, + connectorSyncFrequencyHint, + SYNC_INTERVALS, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/consts' +import { MaxBadge } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/max-badge' +import type { + ConfigFieldMap, + ConfigFieldValue, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields' +import { SettingsQueryErrorState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { isConnectorCredentialTypeAllowed } from '@/connectors/auth' +import type { ConnectorConfigField, ConnectorMeta } from '@/connectors/types' +import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' +import { useCredentialRefreshTriggers } from '@/hooks/use-credential-refresh-triggers' + +const SWITCH_NOTICE: Record = { + workspace: 'Every workspace member can read every synced document once the next sync completes.', + members: + 'Teammates are invited to connect their accounts. Documents become available after their next sync. Item limits are removed.', + admin: + 'Documents become available after the next sync updates their source permissions. Item limits are removed.', +} + +export interface ConnectorSettingsFieldsProps { + availability: { + error: Error | null + isFetching: boolean + refetch: () => unknown + } + isSearchIndex: boolean + connectorConfig: ConnectorMeta | null + selectionLabels: SourceSelectionLabels + sourceConfig: ConfigFieldMap + credentialId: string | null + canonicalGroups: Map + canonicalModes: Record + onToggleCanonicalMode: (canonicalId: string) => void + onFieldChange: ( + fieldId: string, + value: ConfigFieldValue, + selectedOptions?: SourceSelectionLabel[] + ) => void + isFieldVisible: (field: ConnectorConfigField) => boolean + syncInterval: number + setSyncInterval: (v: number) => void + hasMaxAccess: boolean + isSaving: boolean + error: string | null + access: ConnectorAccessSelection + onAccessChange: (access: ConnectorAccessSelection) => void + canAdmin: boolean + showAccessField: boolean + allowMembers: boolean + allowAdmin: boolean + allowWorkspace: boolean + canReenableMemberSync: boolean + accessDirty: boolean + accessModeChanged: boolean + accessComplete: boolean + accessSetupHint?: string + isSwitchingAccess: boolean + onApplyAccess: () => void + onResetAccess: () => void + scope: ResourceScope + needsWorkspaceCredential: boolean + workspaceCredentialId: string | null + contentCredentialId: string | null + onContentCredentialChange: (credentialId: string | null) => void + onWorkspaceCredentialChange: (credentialId: string) => void +} + +export function ConnectorSettingsFields({ + availability, + isSearchIndex, + connectorConfig, + sourceConfig, + selectionLabels, + credentialId, + canonicalGroups, + canonicalModes, + onToggleCanonicalMode, + onFieldChange, + isFieldVisible, + syncInterval, + setSyncInterval, + hasMaxAccess, + isSaving, + error, + access, + onAccessChange, + canAdmin, + showAccessField, + allowMembers, + allowAdmin, + allowWorkspace, + canReenableMemberSync, + accessDirty, + accessModeChanged, + accessComplete, + accessSetupHint, + isSwitchingAccess, + onApplyAccess, + onResetAccess, + scope, + needsWorkspaceCredential, + workspaceCredentialId, + contentCredentialId, + onContentCredentialChange, + onWorkspaceCredentialChange, +}: ConnectorSettingsFieldsProps) { + const providerId = + connectorConfig?.auth.mode === 'oauth' + ? (getProviderIdFromServiceId(connectorConfig.auth.provider) as OAuthProvider) + : null + const syncsPerMember = access.accessMode === 'members' + const requiresServiceAccount = Boolean( + connectorConfig && + !isConnectorCredentialTypeAllowed(connectorConfig.auth, access.accessMode, 'oauth') + ) + const serviceAccountProviderId = providerId + ? getServiceAccountProviderForProviderId(providerId) + : undefined + const serviceAccountTarget = useServiceAccountConnectTarget({ + serviceAccountProviderId: + requiresServiceAccount && + (serviceAccountProviderId === 'google-service-account' || + serviceAccountProviderId === 'atlassian-service-account') + ? serviceAccountProviderId + : undefined, + serviceName: connectorConfig?.name, + serviceIcon: connectorConfig?.icon, + }) + const [showServiceAccountModal, setShowServiceAccountModal] = useState(false) + const isContentCredentialChange = accessDirty && !accessModeChanged + const { + data: rawCredentials = [], + isLoading: credentialsLoading, + refetch: refetchCredentials, + } = useOAuthCredentials(providerId ?? undefined, { + enabled: (needsWorkspaceCredential || syncsPerMember) && Boolean(providerId), + ...resourceScopeFields(scope), + }) + useCredentialRefreshTriggers(refetchCredentials, providerId ?? '', scope) + const [browseCredentialId, setBrowseCredentialId] = useState(null) + const selectorCredentialId = syncsPerMember ? browseCredentialId : credentialId + const credentialOptions = useMemo( + () => + rawCredentials + .filter( + (credential) => + !connectorConfig || + isConnectorCredentialTypeAllowed( + connectorConfig.auth, + access.accessMode, + credential.type + ) + ) + .map((credential) => ({ + label: credential.name || credential.provider, + value: credential.id, + })), + [rawCredentials, connectorConfig, access.accessMode] + ) + + return ( + <> + {availability.error && ( + + void availability.refetch()} + variant='inline' + /> + + )} + {syncsPerMember && connectorConfig?.supportsSeparateContentCredential && ( + + )} + {connectorConfig && showAccessField && ( + +
    + + {isSwitchingAccess ? 'Re-enabling…' : 'Re-enable per-member sync'} + +
    +

    + Members and their documents are kept; the next sync restores their access. +

    + + ) : accessDirty ? ( +
    +
    + + {isSwitchingAccess + ? 'Switching…' + : isContentCredentialChange + ? 'Change indexing account' + : 'Apply connection method'} + + + {accessSetupHint ? 'Edit settings' : 'Cancel'} + +
    +

    + {accessSetupHint ?? + (isContentCredentialChange + ? syncsPerMember + ? 'The next sync uses this indexing account. Members keep their connected accounts and source permissions.' + : 'The next sync uses this account and refreshes source permissions.' + : SWITCH_NOTICE[access.accessMode])} +

    +
    + ) : undefined + } + /> + )} + + {connectorConfig && needsWorkspaceCredential && canAdmin && ( + + setShowServiceAccountModal(true), + }, + ] + : []), + ]} + value={workspaceCredentialId ?? credentialId ?? undefined} + onChange={onWorkspaceCredentialChange} + placeholder='Select the account to sync as' + isLoading={credentialsLoading} + disabled={isSaving} + /> + + )} + + {showServiceAccountModal && serviceAccountTarget && canAdmin && ( + + )} + + {connectorConfig && + syncsPerMember && + connectorConfig.configFields.some( + (field) => field.type === 'selector' && isFieldVisible(field) + ) && ( + + + + )} + + {connectorConfig && ( + + )} + + {!isSearchIndex && ( + + setSyncInterval(Number(val))} + > + {SYNC_INTERVALS.map((interval) => ( + + {interval.label} + {interval.requiresMax && !hasMaxAccess && } + + ))} + + + )} + + {error} + + ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx index 4f8b2491e91..1ca946f2895 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/edit-connector-modal.tsx @@ -1,168 +1,19 @@ 'use client' -import { useMemo, useState } from 'react' +import { useState } from 'react' import { - ButtonGroup, - ButtonGroupItem, - Chip, - ChipCombobox, ChipModal, ChipModalBody, - ChipModalError, - ChipModalField, ChipModalFooter, ChipModalHeader, ChipModalTabs, - type ComboboxOption, } from '@sim/emcn' -import { Plus } from '@sim/emcn/icons' -import { createLogger } from '@sim/logger' -import type { ConnectorAccessMode } from '@/lib/api/contracts/knowledge/connectors' -import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' -import { isContentEngineAccessMode } from '@/lib/knowledge/connectors/access-modes' -import { - getProviderIdFromServiceId, - getServiceAccountProviderForProviderId, - type OAuthProvider, -} from '@/lib/oauth' -import { getConnectorAccessAvailability } from '@/lib/sim-search/connectors' -import { - readSourceSelectionLabels, - SOURCE_LABELS_KEY, - type SourceSelectionLabel, -} from '@/lib/sim-search/source-identity' -import { - ConnectServiceAccountModal, - useServiceAccountConnectTarget, -} from '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal' -import { - derivedAclCapFieldIds, - isConnectorFieldRequired, -} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access' -import { - ConnectorAccessField, - type ConnectorAccessSelection, - ConnectorContentCredentialField, -} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field' -import { ConnectorConfigFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields' -import { - BROWSE_WITH_HINT, - connectorSyncFrequencyHint, - SYNC_INTERVALS, -} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/consts' +import type { ResourceScope } from '@/lib/core/resource-scope' import { ConnectorDocumentsTab } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab' -import { MaxBadge } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/max-badge' -import type { - ConfigFieldMap, - ConfigFieldValue, -} from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields' -import { useConnectorConfigFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields' -import { useConnectorScope } from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-scope' -import { SettingsQueryErrorState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { ConnectorSettingsFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields' +import { useConnectorSettingsForm } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form' import { withBrandIcon } from '@/blocks/brand-icon' -import { isConnectorCredentialTypeAllowed } from '@/connectors/auth' -import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' -import type { ConnectorConfigField, ConnectorMeta } from '@/connectors/types' import type { ConnectorData } from '@/hooks/queries/kb/connectors' -import { useUpdateConnector, useUpdateConnectorAccess } from '@/hooks/queries/kb/connectors' -import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' -import { usePermissionConfig } from '@/hooks/use-permission-config' - -const logger = createLogger('EditConnectorModal') - -const SWITCH_NOTICE: Record = { - workspace: 'Every workspace member can read every synced document once the next sync completes.', - members: - 'Teammates are invited to connect their accounts. Documents become available after their next sync. Item limits are removed.', - admin: - 'Documents become available after the next sync updates their source permissions. Item limits are removed.', -} - -/** Keys injected by the sync engine or modal state — not user-editable */ -const INTERNAL_CONFIG_KEYS = new Set([ - 'tagSlotMapping', - 'disabledTagIds', - '_canonicalModes', - SOURCE_LABELS_KEY, -]) - -const CANONICAL_MODES_KEY = '_canonicalModes' - -/** The access a connector row currently has, as the Access field edits it. */ -function currentAccess(connector: ConnectorData): ConnectorAccessSelection { - if (connector.accessMode === 'members') return { accessMode: 'members' } - if (connector.accessMode === 'admin') return { accessMode: 'admin' } - return { accessMode: 'workspace' } -} - -function readPersistedCanonicalModes( - sourceConfig: Record -): Record { - const raw = sourceConfig[CANONICAL_MODES_KEY] - if (!raw || typeof raw !== 'object') return {} - const result: Record = {} - for (const [key, value] of Object.entries(raw as Record)) { - if (value === 'basic' || value === 'advanced') result[key] = value - } - return result -} - -/** - * Equality for sourceConfig values, including serialized source-label metadata. - * - * Empty string, empty array, and nullish are treated as equivalent to absence. - * When either side is an array (multi-value field), both sides are normalized - * to string[] via CSV-split-and-trim so a persisted legacy scalar `"ENG"` - * compares equal to an in-memory `["ENG"]` and a persisted CSV `"ENG,PROJ"` - * compares equal to `["ENG","PROJ"]`. Without this, opening edit on a - * pre-multi-select connector would falsely show unsaved changes. - */ -function valuesEqual(a: unknown, b: unknown): boolean { - const isEmpty = (v: unknown): boolean => { - if (v == null) return true - if (Array.isArray(v)) return v.length === 0 - if (typeof v === 'string') return v.trim() === '' - return false - } - if (isEmpty(a) && isEmpty(b)) return true - - const toArray = (v: unknown): string[] | null => { - if (Array.isArray(v)) return v.filter((x): x is string => typeof x === 'string') - if (typeof v === 'string') { - return v.split(',').flatMap((s) => { - const t = s.trim() - return t ? [t] : [] - }) - } - return null - } - - if (Array.isArray(a) || Array.isArray(b)) { - const arrA = toArray(a) ?? [] - const arrB = toArray(b) ?? [] - if (arrA.length !== arrB.length) return false - /** - * Order-insensitive: the multi-select UI does not guarantee insertion order - * matches the server-returned order, so `["PROD","ENG"]` and `["ENG","PROD"]` - * should be treated as equal to avoid a false unsaved-changes state. - */ - const setA = new Set(arrA) - return arrB.every((v) => setA.has(v)) - } - if (typeof a === 'object' || typeof b === 'object') return JSON.stringify(a) === JSON.stringify(b) - return a === b -} - -function didCanonicalModesChange( - current: Record, - persisted: Record -): boolean { - const keys = new Set([...Object.keys(persisted), ...Object.keys(current)]) - for (const key of keys) { - if ((current[key] ?? 'basic') !== (persisted[key] ?? 'basic')) return true - } - return false -} interface EditConnectorModalProps { scope?: ResourceScope @@ -179,296 +30,32 @@ export function EditConnectorModal({ knowledgeBaseId, isSearchIndex = false, connector, - scope: explicitScope, + scope, }: EditConnectorModalProps) { - const connectorConfig = CONNECTOR_META_REGISTRY[connector.connectorType] ?? null - const [activeTab, setActiveTab] = useState('settings') - const [syncInterval, setSyncInterval] = useState(connector.syncIntervalMinutes) - const [access, setAccess] = useState(() => currentAccess(connector)) - const [workspaceCredentialId, setWorkspaceCredentialId] = useState(null) - const [contentCredentialId, setContentCredentialId] = useState( - connector.accessMode === 'members' ? connector.credentialId : null - ) - const [error, setError] = useState(null) - - /** - * Seeds from the stored canonical config. For canonical-pair fields (selector + - * manual input), both field IDs get the same value so toggling preserves it. - * Captured once on mount; editing state is owned by the hook afterward. - */ - const [initialSourceConfig] = useState(() => { - const config: ConfigFieldMap = {} - if (!connectorConfig) { - for (const [key, value] of Object.entries(connector.sourceConfig)) { - if (INTERNAL_CONFIG_KEYS.has(key)) continue - if (Array.isArray(value)) { - config[key] = value.filter((v): v is string => typeof v === 'string') - } else { - config[key] = String(value ?? '') - } - } - return config - } - for (const field of connectorConfig.configFields) { - const canonicalId = field.canonicalParamId ?? field.id - if (INTERNAL_CONFIG_KEYS.has(canonicalId)) continue - const rawValue = connector.sourceConfig[canonicalId] - if (rawValue === undefined) continue - if (field.multi) { - if (Array.isArray(rawValue)) { - config[field.id] = rawValue.filter((v): v is string => typeof v === 'string') - } else if (typeof rawValue === 'string') { - config[field.id] = rawValue.split(',').flatMap((s) => { - const t = s.trim() - return t ? [t] : [] - }) - } else { - config[field.id] = [] - } - } else { - config[field.id] = String(rawValue ?? '') - } - } - return config + const form = useConnectorSettingsForm({ + scope, + knowledgeBaseId, + isSearchIndex, + connector, + onSaved: () => onOpenChange(false), }) - const [initialCanonicalModes] = useState>(() => - readPersistedCanonicalModes(connector.sourceConfig) - ) - const [initialSelectionLabels] = useState(() => - connectorConfig ? readSourceSelectionLabels(connectorConfig, connector.sourceConfig) : {} - ) - - const { - sourceConfig, - canonicalModes, - canonicalGroups, - isFieldVisible, - isFieldPopulated, - handleFieldChange, - toggleCanonicalMode, - resolveSourceConfig, - } = useConnectorConfigFields({ - connectorConfig, - accessMode: access.accessMode, - initialSourceConfig, - initialCanonicalModes, - initialSelectionLabels, - }) - - const { scope, canAdmin, memberAccessAvailable, mirroredAccessAvailable, hasMaxAccess } = - useConnectorScope(explicitScope) - const { mutate: updateConnector, isPending: isSavingSettings } = useUpdateConnector() - const { mutate: updateAccess, isPending: isSwitchingAccess } = useUpdateConnectorAccess() - const isSaving = isSavingSettings || isSwitchingAccess - const { - integrationAvailability, - oauthServiceAvailability, - isIntegrationAvailabilityReady, - isIntegrationAvailabilityFetching, - integrationAvailabilityError, - refetchIntegrationAvailability, - } = usePermissionConfig() - const { admin: allowAdmin, members: allowMembers } = connectorConfig - ? getConnectorAccessAvailability(connectorConfig, integrationAvailability, { - memberAccessAvailable, - mirroredAccessAvailable, - oauthServiceAvailability, - isIntegrationAvailabilityReady, - }) - : { admin: false, members: false } - const persistedAccess = currentAccess(connector) - const docsUrl = isSearchIndex ? connectorConfig?.searchDocsUrl : undefined - const searchSourceSupported = !isSearchIndex || connectorConfig?.search === true - const searchAccessAllowed = !isSearchIndex || access.accessMode !== 'workspace' - const searchSettingsAllowed = - searchSourceSupported && (!isSearchIndex || persistedAccess.accessMode !== 'workspace') - const searchSetupError = !searchSourceSupported - ? 'This source is not supported in Search. Use a separate knowledge base.' - : !searchAccessAllowed - ? 'Choose Member accounts or Admin or service account for Search.' - : null - /** Keep existing permission-scoped settings visible after their feature is disabled. */ - const showAccessField = - memberAccessAvailable || mirroredAccessAvailable || persistedAccess.accessMode !== 'workspace' - - const accessModeChanged = persistedAccess.accessMode !== access.accessMode - const accessDirty = - accessModeChanged || - (isContentEngineAccessMode(access.accessMode) && - workspaceCredentialId !== null && - workspaceCredentialId !== connector.credentialId) || - (access.accessMode === 'members' && - contentCredentialId !== (connector.accessMode === 'members' ? connector.credentialId : null)) - /** Exposes credential selection for mode changes and administrator credential recovery. */ - const needsWorkspaceCredential = - connectorConfig?.auth.mode === 'oauth' && - isContentEngineAccessMode(access.accessMode) && - (persistedAccess.accessMode === 'members' || - !isConnectorCredentialTypeAllowed(connectorConfig.auth, access.accessMode, 'oauth')) - const missingAdminField = - accessDirty && access.accessMode === 'admin' - ? connectorConfig?.configFields.find((field) => { - const value = connector.sourceConfig[field.id] - return ( - !field.required && - isConnectorFieldRequired(field, connectorConfig, 'admin') && - (typeof value !== 'string' || !value.trim()) - ) - }) - : undefined - const accessSetupHint = missingAdminField - ? `Set ${missingAdminField.title} and save your settings before changing the connection method.` - : undefined - const accessComplete = - searchSourceSupported && - searchAccessAllowed && - !missingAdminField && - (access.accessMode === 'workspace' || - (access.accessMode === 'members' ? allowMembers : allowAdmin)) && - (!accessDirty || !needsWorkspaceCredential || Boolean(workspaceCredentialId)) - /** A disabled member sync is re-enabled by applying the current binding again. */ - const canReenableMemberSync = - !accessDirty && connector.accessMode === 'members' && connector.memberSyncStatus === 'disabled' - const hiddenCapFieldIds = derivedAclCapFieldIds(connectorConfig, access.accessMode) - const settingsComplete = connectorConfig?.configFields.every( - (field) => - !isConnectorFieldRequired(field, connectorConfig, persistedAccess.accessMode) || - !isFieldVisible(field) || - hiddenCapFieldIds.has(field.id) || - isFieldPopulated(field) - ) - - const persistedCanonicalModes = useMemo( - () => readPersistedCanonicalModes(connector.sourceConfig), - [connector.sourceConfig] - ) - - const hasChanges = useMemo(() => { - if (syncInterval !== connector.syncIntervalMinutes) return true - if (didCanonicalModesChange(canonicalModes, persistedCanonicalModes)) return true - const resolved = resolveSourceConfig() - for (const [key, value] of Object.entries(resolved)) { - if (!valuesEqual(connector.sourceConfig[key], value)) return true - } - return false - }, [ - resolveSourceConfig, - syncInterval, - connector.syncIntervalMinutes, - connector.sourceConfig, - canonicalModes, - persistedCanonicalModes, - ]) - - const handleSave = () => { - if (!searchSettingsAllowed || !settingsComplete || accessDirty) return - setError(null) - - const updates: { sourceConfig?: Record; syncIntervalMinutes?: number } = {} - - if (syncInterval !== connector.syncIntervalMinutes) { - updates.syncIntervalMinutes = syncInterval - } - - const resolved = resolveSourceConfig() - const changedEntries: Record = {} - for (const [key, value] of Object.entries(resolved)) { - if (!valuesEqual(connector.sourceConfig[key], value)) changedEntries[key] = value - } - - const modesChanged = didCanonicalModesChange(canonicalModes, persistedCanonicalModes) - - if (Object.keys(changedEntries).length > 0 || modesChanged) { - const next: Record = { ...connector.sourceConfig, ...changedEntries } - if (Object.keys(canonicalModes).length > 0) { - next[CANONICAL_MODES_KEY] = canonicalModes - } else { - delete next[CANONICAL_MODES_KEY] - } - if (next[SOURCE_LABELS_KEY] === null) delete next[SOURCE_LABELS_KEY] - updates.sourceConfig = next - } - - if (Object.keys(updates).length === 0) { - onOpenChange(false) - return - } - - updateConnector( - { knowledgeBaseId, connectorId: connector.id, updates }, - { - onSuccess: () => onOpenChange(false), - onError: (err) => { - logger.error('Failed to update connector', { error: err.message }) - setError(err.message) - }, - } - ) - } - - /** - * The mode switch is its own admin operation: it rewrites document access - * and queues a run of the other engine, so it is applied on its own rather - * than folded into a settings save that would race the run it starts. - */ - const handleApplyAccess = () => { - if (!accessComplete) return - setError(null) - updateAccess( - { - knowledgeBaseId, - connectorId: connector.id, - access: - access.accessMode === 'members' - ? { - accessMode: 'members', - credentialId: contentCredentialId, - } - : { - accessMode: access.accessMode, - credentialId: workspaceCredentialId ?? connector.credentialId ?? undefined, - }, - }, - { - /** The connector prop is a snapshot; closing hands the refreshed row to the next open. */ - onSuccess: () => onOpenChange(false), - onError: (err) => { - logger.error('Failed to switch connector access', { error: err.message }) - setError(err.message) - }, - } - ) - } - - const displayName = connectorConfig?.name ?? connector.connectorType - const Icon = connectorConfig?.icon - return ( - onOpenChange(false)}> - Edit {displayName} + onOpenChange(false)} + > + Edit {form.displayName} - - {integrationAvailabilityError && ( - - void refetchIntegrationAvailability()} - variant='inline' - /> - - )} - {activeTab === 'settings' ? ( - isFieldVisible(field) && !hiddenCapFieldIds.has(field.id)} - syncInterval={syncInterval} - setSyncInterval={setSyncInterval} - hasMaxAccess={hasMaxAccess} - isSaving={isSaving} - error={error ?? searchSetupError} - access={access} - onAccessChange={setAccess} - canAdmin={canAdmin} - showAccessField={showAccessField} - allowMembers={allowMembers} - allowAdmin={allowAdmin} - allowWorkspace={!isSearchIndex} - canReenableMemberSync={canReenableMemberSync} - accessDirty={accessDirty} - accessModeChanged={accessModeChanged} - accessComplete={accessComplete} - accessSetupHint={accessSetupHint} - isSwitchingAccess={isSwitchingAccess} - onApplyAccess={handleApplyAccess} - onResetAccess={() => { - setAccess(currentAccess(connector)) - setWorkspaceCredentialId(null) - setContentCredentialId( - connector.accessMode === 'members' ? connector.credentialId : null - ) - }} - contentCredentialId={contentCredentialId} - onContentCredentialChange={setContentCredentialId} - scope={scope} - needsWorkspaceCredential={needsWorkspaceCredential} - workspaceCredentialId={workspaceCredentialId} - onWorkspaceCredentialChange={setWorkspaceCredentialId} - /> + ) : ( )} - {activeTab === 'settings' && ( onOpenChange(false)} secondaryActions={ - docsUrl + form.docsUrl ? [ { label: 'Setup guide', - onClick: () => window.open(docsUrl, '_blank', 'noopener,noreferrer'), + onClick: () => window.open(form.docsUrl, '_blank', 'noopener,noreferrer'), }, ] : undefined } primaryAction={{ - label: isSaving ? 'Saving…' : 'Save', - onClick: handleSave, - /** An open access change is applied by its own control, never folded into Save. */ - disabled: - !hasChanges || accessDirty || isSaving || !searchSettingsAllowed || !settingsComplete, + label: form.saving ? 'Saving…' : 'Save', + onClick: form.save, + disabled: !form.canSave, }} /> )} ) } - -interface SettingsTabProps { - isSearchIndex: boolean - connectorConfig: ConnectorMeta | null - /** The mode the connector is saved in, which the draft `access` may differ from. */ - sourceConfig: ConfigFieldMap - credentialId: string | null - canonicalGroups: Map - canonicalModes: Record - onToggleCanonicalMode: (canonicalId: string) => void - onFieldChange: ( - fieldId: string, - value: ConfigFieldValue, - selectedOptions?: SourceSelectionLabel[] - ) => void - isFieldVisible: (field: ConnectorConfigField) => boolean - syncInterval: number - setSyncInterval: (v: number) => void - hasMaxAccess: boolean - isSaving: boolean - error: string | null - access: ConnectorAccessSelection - onAccessChange: (access: ConnectorAccessSelection) => void - canAdmin: boolean - showAccessField: boolean - allowMembers: boolean - allowAdmin: boolean - allowWorkspace: boolean - canReenableMemberSync: boolean - accessDirty: boolean - accessModeChanged: boolean - accessComplete: boolean - accessSetupHint?: string - isSwitchingAccess: boolean - onApplyAccess: () => void - onResetAccess: () => void - scope: ResourceScope - needsWorkspaceCredential: boolean - workspaceCredentialId: string | null - contentCredentialId: string | null - onContentCredentialChange: (credentialId: string | null) => void - onWorkspaceCredentialChange: (credentialId: string) => void -} - -function SettingsTab({ - isSearchIndex, - connectorConfig, - sourceConfig, - credentialId, - canonicalGroups, - canonicalModes, - onToggleCanonicalMode, - onFieldChange, - isFieldVisible, - syncInterval, - setSyncInterval, - hasMaxAccess, - isSaving, - error, - access, - onAccessChange, - canAdmin, - showAccessField, - allowMembers, - allowAdmin, - allowWorkspace, - canReenableMemberSync, - accessDirty, - accessModeChanged, - accessComplete, - accessSetupHint, - isSwitchingAccess, - onApplyAccess, - onResetAccess, - scope, - needsWorkspaceCredential, - workspaceCredentialId, - contentCredentialId, - onContentCredentialChange, - onWorkspaceCredentialChange, -}: SettingsTabProps) { - const providerId = - connectorConfig?.auth.mode === 'oauth' - ? (getProviderIdFromServiceId(connectorConfig.auth.provider) as OAuthProvider) - : null - const syncsPerMember = access.accessMode === 'members' - const requiresServiceAccount = Boolean( - connectorConfig && - !isConnectorCredentialTypeAllowed(connectorConfig.auth, access.accessMode, 'oauth') - ) - const serviceAccountProviderId = providerId - ? getServiceAccountProviderForProviderId(providerId) - : undefined - const serviceAccountTarget = useServiceAccountConnectTarget({ - serviceAccountProviderId: - requiresServiceAccount && - (serviceAccountProviderId === 'google-service-account' || - serviceAccountProviderId === 'atlassian-service-account') - ? serviceAccountProviderId - : undefined, - serviceName: connectorConfig?.name, - serviceIcon: connectorConfig?.icon, - }) - const [showServiceAccountModal, setShowServiceAccountModal] = useState(false) - const isContentCredentialChange = accessDirty && !accessModeChanged - const { data: rawCredentials = [], isLoading: credentialsLoading } = useOAuthCredentials( - providerId ?? undefined, - { - enabled: (needsWorkspaceCredential || syncsPerMember) && Boolean(providerId), - ...resourceScopeFields(scope), - } - ) - const [browseCredentialId, setBrowseCredentialId] = useState(null) - /** A per-member connector has no credential of its own; the admin's account browses the source. */ - const selectorCredentialId = syncsPerMember ? browseCredentialId : credentialId - const credentialOptions = useMemo( - () => - rawCredentials - .filter( - (credential) => - !connectorConfig || - isConnectorCredentialTypeAllowed( - connectorConfig.auth, - access.accessMode, - credential.type - ) - ) - .map((credential) => ({ - label: credential.name || credential.provider, - value: credential.id, - })), - [rawCredentials, connectorConfig, access.accessMode] - ) - - return ( - <> - {syncsPerMember && connectorConfig?.supportsSeparateContentCredential && ( - - )} - {connectorConfig && showAccessField && ( - -
    - - {isSwitchingAccess ? 'Re-enabling…' : 'Re-enable per-member sync'} - -
    -

    - Members and their documents are kept; the next sync restores their access. -

    - - ) : accessDirty ? ( -
    -
    - - {isSwitchingAccess - ? 'Switching…' - : isContentCredentialChange - ? 'Change indexing account' - : 'Apply connection method'} - - - {accessSetupHint ? 'Edit settings' : 'Cancel'} - -
    -

    - {accessSetupHint ?? - (isContentCredentialChange - ? syncsPerMember - ? 'The next sync uses this indexing account. Members keep their connected accounts and source permissions.' - : 'The next sync uses this account and refreshes source permissions.' - : SWITCH_NOTICE[access.accessMode])} -

    -
    - ) : undefined - } - /> - )} - - {connectorConfig && needsWorkspaceCredential && canAdmin && ( - - setShowServiceAccountModal(true), - }, - ] - : []), - ]} - value={workspaceCredentialId ?? credentialId ?? undefined} - onChange={onWorkspaceCredentialChange} - placeholder='Select the account to sync as' - isLoading={credentialsLoading} - disabled={isSaving} - /> - - )} - - {showServiceAccountModal && serviceAccountTarget && canAdmin && ( - - )} - - {connectorConfig && - syncsPerMember && - connectorConfig.configFields.some( - (field) => field.type === 'selector' && isFieldVisible(field) - ) && ( - - - - )} - - {connectorConfig && ( - - )} - - {!isSearchIndex && ( - - setSyncInterval(Number(val))} - > - {SYNC_INTERVALS.map((interval) => ( - - {interval.label} - {interval.requiresMax && !hasMaxAccess && } - - ))} - - - )} - - {error} - - ) -} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx new file mode 100644 index 00000000000..0cb6f1adb68 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx @@ -0,0 +1,219 @@ +/** + * @vitest-environment jsdom + */ +import { act } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' + +const mocks = vi.hoisted(() => ({ + update: vi.fn(), + applyAccess: vi.fn(), + settingsPending: false, + accessPending: false, +})) + +vi.mock('@/hooks/queries/kb/connectors', () => ({ + useUpdateConnector: () => ({ mutate: mocks.update, isPending: mocks.settingsPending }), + useUpdateConnectorAccess: () => ({ mutate: mocks.applyAccess, isPending: mocks.accessPending }), +})) +vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-scope', () => ({ + useConnectorScope: () => ({ + scope: { kind: 'organization', organizationId: 'org-1' }, + canAdmin: true, + memberAccessAvailable: true, + mirroredAccessAvailable: true, + hasMaxAccess: true, + }), +})) +vi.mock('@/hooks/use-permission-config', () => ({ + usePermissionConfig: () => ({ + integrationAvailability: new Map([ + ['slack', { oauthAvailable: true, state: 'ready' }], + ['slack_v2', { oauthAvailable: true, state: 'ready' }], + ]), + oauthServiceAvailability: new Map(), + isIntegrationAvailabilityReady: true, + isIntegrationAvailabilityFetching: false, + integrationAvailabilityError: null, + refetchIntegrationAvailability: vi.fn(), + }), +})) + +import { useConnectorSettingsForm } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form' + +function connector(overrides: Partial = {}): ConnectorData { + return { + id: 'connector-1', + knowledgeBaseId: 'kb-search', + connectorType: 'slack', + credentialId: null, + sourceConfig: {}, + syncMode: 'full', + syncIntervalMinutes: 1440, + status: 'active', + lastSyncAt: null, + lastSyncError: null, + lastSyncDocCount: null, + nextSyncAt: null, + consecutiveFailures: 0, + accessMode: 'members', + viewerMembership: null, + credentialGroupId: 'group-1', + credentialGroupOptionId: 'option-1', + memberSyncStatus: 'idle', + lastMemberSyncAt: null, + nextMemberSyncAt: null, + lastMemberSyncError: null, + memberSyncConsecutiveFailures: 0, + accessRewritePending: false, + createdAt: '2026-09-04T00:00:00Z', + updatedAt: '2026-09-04T00:00:00Z', + ...overrides, + } +} + +describe('shared connector settings form', () => { + let container: HTMLDivElement + let root: Root + let form: ReturnType + let onSaved: ReturnType + let baseline: ConnectorData + + function Probe({ row }: { row: ConnectorData }) { + form = useConnectorSettingsForm({ + scope: { kind: 'organization', organizationId: 'org-1' }, + knowledgeBaseId: 'kb-search', + isSearchIndex: true, + connector: row, + onSaved, + }) + return null + } + + function render(row = baseline, key = 'baseline') { + act(() => root.render()) + } + + beforeEach(() => { + vi.clearAllMocks() + mocks.settingsPending = false + mocks.accessPending = false + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + onSaved = vi.fn() + baseline = connector() + render() + }) + + afterEach(() => { + act(() => root.unmount()) + container.remove() + }) + + it('treats persisted JSONB label key order as an unchanged draft', () => { + render( + connector({ + connectorType: 'google_drive', + accessMode: 'admin', + sourceConfig: { + folderId: 'folder-1', + _sourceLabels: { + fields: { folderId: [{ label: 'Project notes', id: 'folder-1' }] }, + identity: JSON.stringify([['folderId', ['folder-1']]]), + }, + }, + }), + 'jsonb' + ) + expect(form.dirty).toBe(false) + expect(form.canSave).toBe(false) + act(() => form.fieldsProps.onFieldChange('folderId', ['folder-2'])) + expect(form.dirty).toBe(true) + }) + + it('guards access drafts separately from a settings save', () => { + expect(form.dirty).toBe(false) + expect(form.canSave).toBe(false) + act(() => form.fieldsProps.onContentCredentialChange('indexing-account')) + expect(form.dirty).toBe(true) + expect(form.canSave).toBe(false) + act(() => form.fieldsProps.onFieldChange('excludeChannels', 'legal')) + act(() => form.save()) + expect(mocks.update).not.toHaveBeenCalled() + expect(mocks.applyAccess).not.toHaveBeenCalled() + + act(() => form.fieldsProps.onResetAccess()) + expect(form.dirty).toBe(true) + expect(form.canSave).toBe(true) + act(() => form.fieldsProps.onFieldChange('excludeChannels', '')) + expect(form.dirty).toBe(false) + }) + + it('returns the canonical saved row for an explicit editor reset', () => { + act(() => form.fieldsProps.onFieldChange('excludeChannels', 'legal')) + act(() => form.save()) + expect(mocks.update).toHaveBeenCalledWith( + { + knowledgeBaseId: 'kb-search', + connectorId: baseline.id, + updates: { + sourceConfig: { excludeChannels: 'legal', _canonicalModes: { channel: 'basic' } }, + }, + }, + expect.any(Object) + ) + expect(mocks.applyAccess).not.toHaveBeenCalled() + const saved = connector({ + sourceConfig: { excludeChannels: 'legal', _canonicalModes: { channel: 'basic' } }, + }) + act(() => mocks.update.mock.calls[0][1].onSuccess(saved)) + expect(onSaved).toHaveBeenCalledExactlyOnceWith(saved) + + render(saved, 'saved') + expect(form.fieldsProps.sourceConfig.excludeChannels).toBe('legal') + expect(form.dirty).toBe(false) + expect(form.canSave).toBe(false) + }) + + it('applies indexing account changes through the separate access operation', () => { + act(() => form.fieldsProps.onContentCredentialChange('indexing-account')) + act(() => form.fieldsProps.onApplyAccess()) + expect(mocks.applyAccess).toHaveBeenCalledWith( + { + knowledgeBaseId: 'kb-search', + connectorId: baseline.id, + access: { accessMode: 'members', credentialId: 'indexing-account' }, + }, + expect.any(Object) + ) + expect(mocks.update).not.toHaveBeenCalled() + const saved = connector({ credentialId: 'indexing-account' }) + act(() => mocks.applyAccess.mock.calls[0][1].onSuccess(saved)) + expect(onSaved).toHaveBeenCalledExactlyOnceWith(saved) + }) + + it('keeps a failed settings draft editable without signaling a save', () => { + act(() => form.fieldsProps.onFieldChange('excludeChannels', 'legal')) + act(() => form.save()) + act(() => mocks.update.mock.calls[0][1].onError(new Error('Source update failed'))) + expect(form.fieldsProps.error).toBe('Source update failed') + expect(form.dirty).toBe(true) + expect(form.canSave).toBe(true) + expect(onSaved).not.toHaveBeenCalled() + }) + + it.each(['settingsPending', 'accessPending'] as const)( + 'blocks page saving while %s is pending', + (pending) => { + act(() => form.fieldsProps.onFieldChange('excludeChannels', 'legal')) + mocks[pending] = true + render() + expect(form.saving).toBe(true) + expect(form.canSave).toBe(false) + expect(form.dirty).toBe(true) + } + ) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts new file mode 100644 index 00000000000..49c825a42a5 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts @@ -0,0 +1,475 @@ +'use client' + +import { useCallback, useMemo, useState } from 'react' +import { createLogger } from '@sim/logger' +import { isEqual } from 'es-toolkit' +import type { ResourceScope } from '@/lib/core/resource-scope' +import { isContentEngineAccessMode } from '@/lib/knowledge/connectors/access-modes' +import { getConnectorAccessAvailability } from '@/lib/sim-search/connectors' +import { readSourceSelectionLabels, SOURCE_LABELS_KEY } from '@/lib/sim-search/source-identity' +import { + derivedAclCapFieldIds, + isConnectorFieldRequired, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access' +import type { ConnectorAccessSelection } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field' +import type { ConnectorSettingsFieldsProps } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields' +import { + type ConfigFieldMap, + useConnectorConfigFields, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields' +import { useConnectorScope } from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-scope' +import { isConnectorCredentialTypeAllowed } from '@/connectors/auth' +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' +import { + type ConnectorData, + useUpdateConnector, + useUpdateConnectorAccess, +} from '@/hooks/queries/kb/connectors' +import { usePermissionConfig } from '@/hooks/use-permission-config' + +const logger = createLogger('ConnectorSettingsForm') + +/** Keys injected by the sync engine or modal state — not user-editable */ +const INTERNAL_CONFIG_KEYS = new Set([ + 'tagSlotMapping', + 'disabledTagIds', + '_canonicalModes', + SOURCE_LABELS_KEY, +]) + +const CANONICAL_MODES_KEY = '_canonicalModes' + +function currentAccess(connector: ConnectorData): ConnectorAccessSelection { + if (connector.accessMode === 'members') return { accessMode: 'members' } + if (connector.accessMode === 'admin') return { accessMode: 'admin' } + return { accessMode: 'workspace' } +} + +function readPersistedCanonicalModes( + sourceConfig: Record +): Record { + const raw = sourceConfig[CANONICAL_MODES_KEY] + if (!raw || typeof raw !== 'object') return {} + const result: Record = {} + for (const [key, value] of Object.entries(raw as Record)) { + if (value === 'basic' || value === 'advanced') result[key] = value + } + return result +} + +/** + * Equality for sourceConfig values, including serialized source-label metadata. + * + * Empty string, empty array, and nullish are treated as equivalent to absence. + * When either side is an array (multi-value field), both sides are normalized + * to string[] via CSV-split-and-trim so a persisted legacy scalar `"ENG"` + * compares equal to an in-memory `["ENG"]` and a persisted CSV `"ENG,PROJ"` + * compares equal to `["ENG","PROJ"]`. Without this, opening edit on a + * pre-multi-select connector would falsely show unsaved changes. + */ +function valuesEqual(a: unknown, b: unknown): boolean { + const isEmpty = (v: unknown): boolean => { + if (v == null) return true + if (Array.isArray(v)) return v.length === 0 + if (typeof v === 'string') return v.trim() === '' + return false + } + if (isEmpty(a) && isEmpty(b)) return true + + const toArray = (v: unknown): string[] | null => { + if (Array.isArray(v)) return v.filter((x): x is string => typeof x === 'string') + if (typeof v === 'string') { + return v.split(',').flatMap((s) => { + const t = s.trim() + return t ? [t] : [] + }) + } + return null + } + + if (Array.isArray(a) || Array.isArray(b)) { + const arrA = toArray(a) ?? [] + const arrB = toArray(b) ?? [] + if (arrA.length !== arrB.length) return false + /** + * Order-insensitive: the multi-select UI does not guarantee insertion order + * matches the server-returned order, so `["PROD","ENG"]` and `["ENG","PROD"]` + * should be treated as equal to avoid a false unsaved-changes state. + */ + const setA = new Set(arrA) + return arrB.every((v) => setA.has(v)) + } + if (typeof a === 'object' || typeof b === 'object') return isEqual(a, b) + return a === b +} + +function didCanonicalModesChange( + current: Record, + persisted: Record +): boolean { + const keys = new Set([...Object.keys(persisted), ...Object.keys(current)]) + for (const key of keys) { + if ((current[key] ?? 'basic') !== (persisted[key] ?? 'basic')) return true + } + return false +} + +interface UseConnectorSettingsFormOptions { + scope?: ResourceScope + knowledgeBaseId: string + isSearchIndex?: boolean + connector: ConnectorData + onSaved: (connector: ConnectorData) => void +} + +/** Editable connector settings shared by the source page and knowledge-base modal. */ +export function useConnectorSettingsForm({ + scope: explicitScope, + knowledgeBaseId, + isSearchIndex = false, + connector, + onSaved, +}: UseConnectorSettingsFormOptions) { + const connectorConfig = CONNECTOR_META_REGISTRY[connector.connectorType] ?? null + + const [syncInterval, setSyncInterval] = useState(connector.syncIntervalMinutes) + const [access, setAccess] = useState(() => currentAccess(connector)) + const [workspaceCredentialId, setWorkspaceCredentialId] = useState(null) + const [contentCredentialId, setContentCredentialId] = useState( + connector.accessMode === 'members' ? connector.credentialId : null + ) + const [error, setError] = useState(null) + + /** + * Seeds from the stored canonical config. For canonical-pair fields (selector + + * manual input), both field IDs get the same value so toggling preserves it. + * Captured once on mount; editing state is owned by the hook afterward. + */ + const [initialSourceConfig] = useState(() => { + const config: ConfigFieldMap = {} + if (!connectorConfig) { + for (const [key, value] of Object.entries(connector.sourceConfig)) { + if (INTERNAL_CONFIG_KEYS.has(key)) continue + if (Array.isArray(value)) { + config[key] = value.filter((v): v is string => typeof v === 'string') + } else { + config[key] = String(value ?? '') + } + } + return config + } + for (const field of connectorConfig.configFields) { + const canonicalId = field.canonicalParamId ?? field.id + if (INTERNAL_CONFIG_KEYS.has(canonicalId)) continue + const rawValue = connector.sourceConfig[canonicalId] + if (rawValue === undefined) continue + if (field.multi) { + if (Array.isArray(rawValue)) { + config[field.id] = rawValue.filter((v): v is string => typeof v === 'string') + } else if (typeof rawValue === 'string') { + config[field.id] = rawValue.split(',').flatMap((s) => { + const t = s.trim() + return t ? [t] : [] + }) + } else { + config[field.id] = [] + } + } else { + config[field.id] = String(rawValue ?? '') + } + } + return config + }) + + const [initialCanonicalModes] = useState>(() => + readPersistedCanonicalModes(connector.sourceConfig) + ) + const [initialSelectionLabels] = useState(() => + connectorConfig ? readSourceSelectionLabels(connectorConfig, connector.sourceConfig) : {} + ) + + const { + sourceConfig, + selectionLabels, + canonicalModes, + canonicalGroups, + isFieldVisible, + isFieldPopulated, + handleFieldChange, + toggleCanonicalMode, + resolveSourceConfig, + } = useConnectorConfigFields({ + connectorConfig, + accessMode: access.accessMode, + initialSourceConfig, + initialCanonicalModes, + initialSelectionLabels, + }) + + const { scope, canAdmin, memberAccessAvailable, mirroredAccessAvailable, hasMaxAccess } = + useConnectorScope(explicitScope) + const { mutate: updateConnector, isPending: isSavingSettings } = useUpdateConnector() + const { mutate: updateAccess, isPending: isSwitchingAccess } = useUpdateConnectorAccess() + const isSaving = isSavingSettings || isSwitchingAccess + const { + integrationAvailability, + oauthServiceAvailability, + isIntegrationAvailabilityReady, + isIntegrationAvailabilityFetching, + integrationAvailabilityError, + refetchIntegrationAvailability, + } = usePermissionConfig() + const { admin: allowAdmin, members: allowMembers } = connectorConfig + ? getConnectorAccessAvailability(connectorConfig, integrationAvailability, { + memberAccessAvailable, + mirroredAccessAvailable, + oauthServiceAvailability, + isIntegrationAvailabilityReady, + }) + : { admin: false, members: false } + const persistedAccess = currentAccess(connector) + const docsUrl = isSearchIndex ? connectorConfig?.searchDocsUrl : undefined + const searchSourceSupported = !isSearchIndex || connectorConfig?.search === true + const searchAccessAllowed = !isSearchIndex || access.accessMode !== 'workspace' + const searchSettingsAllowed = + searchSourceSupported && (!isSearchIndex || persistedAccess.accessMode !== 'workspace') + const searchSetupError = !searchSourceSupported + ? 'This source is not supported in Search. Use a separate knowledge base.' + : !searchAccessAllowed + ? 'Choose Member accounts or Admin or service account for Search.' + : null + /** Keep existing permission-scoped settings visible after their feature is disabled. */ + const showAccessField = + memberAccessAvailable || mirroredAccessAvailable || persistedAccess.accessMode !== 'workspace' + + const accessModeChanged = persistedAccess.accessMode !== access.accessMode + const accessDirty = + accessModeChanged || + (isContentEngineAccessMode(access.accessMode) && + workspaceCredentialId !== null && + workspaceCredentialId !== connector.credentialId) || + (access.accessMode === 'members' && + contentCredentialId !== (connector.accessMode === 'members' ? connector.credentialId : null)) + /** Exposes credential selection for mode changes and administrator credential recovery. */ + const needsWorkspaceCredential = + connectorConfig?.auth.mode === 'oauth' && + isContentEngineAccessMode(access.accessMode) && + (persistedAccess.accessMode === 'members' || + !isConnectorCredentialTypeAllowed(connectorConfig.auth, access.accessMode, 'oauth')) + const missingAdminField = + accessDirty && access.accessMode === 'admin' + ? connectorConfig?.configFields.find((field) => { + const value = connector.sourceConfig[field.id] + return ( + !field.required && + isConnectorFieldRequired(field, connectorConfig, 'admin') && + (typeof value !== 'string' || !value.trim()) + ) + }) + : undefined + const accessSetupHint = missingAdminField + ? `Set ${missingAdminField.title} and save your settings before changing the connection method.` + : undefined + const accessComplete = + searchSourceSupported && + searchAccessAllowed && + !missingAdminField && + (access.accessMode === 'workspace' || + (access.accessMode === 'members' ? allowMembers : allowAdmin)) && + (!accessDirty || !needsWorkspaceCredential || Boolean(workspaceCredentialId)) + /** A disabled member sync is re-enabled by applying the current binding again. */ + const canReenableMemberSync = + !accessDirty && connector.accessMode === 'members' && connector.memberSyncStatus === 'disabled' + const hiddenCapFieldIds = derivedAclCapFieldIds(connectorConfig, access.accessMode) + const settingsComplete = connectorConfig?.configFields.every( + (field) => + !isConnectorFieldRequired(field, connectorConfig, persistedAccess.accessMode) || + !isFieldVisible(field) || + hiddenCapFieldIds.has(field.id) || + isFieldPopulated(field) + ) + + const persistedCanonicalModes = useMemo( + () => readPersistedCanonicalModes(connector.sourceConfig), + [connector.sourceConfig] + ) + + const hasChanges = useMemo(() => { + if (syncInterval !== connector.syncIntervalMinutes) return true + if (didCanonicalModesChange(canonicalModes, persistedCanonicalModes)) return true + const resolved = resolveSourceConfig() + for (const [key, value] of Object.entries(resolved)) { + if (!valuesEqual(connector.sourceConfig[key], value)) return true + } + return false + }, [ + resolveSourceConfig, + syncInterval, + connector.syncIntervalMinutes, + connector.sourceConfig, + canonicalModes, + persistedCanonicalModes, + ]) + + const handleSave = useCallback(() => { + if (!searchSettingsAllowed || !settingsComplete || accessDirty) return + setError(null) + + const updates: { sourceConfig?: Record; syncIntervalMinutes?: number } = {} + + if (syncInterval !== connector.syncIntervalMinutes) { + updates.syncIntervalMinutes = syncInterval + } + + const resolved = resolveSourceConfig() + const changedEntries: Record = {} + for (const [key, value] of Object.entries(resolved)) { + if (!valuesEqual(connector.sourceConfig[key], value)) changedEntries[key] = value + } + + const modesChanged = didCanonicalModesChange(canonicalModes, persistedCanonicalModes) + + if (Object.keys(changedEntries).length > 0 || modesChanged) { + const next: Record = { ...connector.sourceConfig, ...changedEntries } + if (Object.keys(canonicalModes).length > 0) { + next[CANONICAL_MODES_KEY] = canonicalModes + } else { + delete next[CANONICAL_MODES_KEY] + } + if (next[SOURCE_LABELS_KEY] === null) delete next[SOURCE_LABELS_KEY] + updates.sourceConfig = next + } + + if (Object.keys(updates).length === 0) { + onSaved(connector) + return + } + + updateConnector( + { knowledgeBaseId, connectorId: connector.id, updates }, + { + onSuccess: onSaved, + onError: (err) => { + logger.error('Failed to update connector', { error: err.message }) + setError(err.message) + }, + } + ) + }, [ + searchSettingsAllowed, + settingsComplete, + accessDirty, + syncInterval, + connector, + resolveSourceConfig, + canonicalModes, + persistedCanonicalModes, + onSaved, + updateConnector, + knowledgeBaseId, + ]) + + /** + * The mode switch is its own admin operation: it rewrites document access + * and queues a run of the other engine, so it is applied on its own rather + * than folded into a settings save that would race the run it starts. + */ + const handleApplyAccess = useCallback(() => { + if (!accessComplete) return + setError(null) + updateAccess( + { + knowledgeBaseId, + connectorId: connector.id, + access: + access.accessMode === 'members' + ? { + accessMode: 'members', + credentialId: contentCredentialId, + } + : { + accessMode: access.accessMode, + credentialId: workspaceCredentialId ?? connector.credentialId ?? undefined, + }, + }, + { + onSuccess: onSaved, + onError: (err) => { + logger.error('Failed to switch connector access', { error: err.message }) + setError(err.message) + }, + } + ) + }, [ + accessComplete, + updateAccess, + knowledgeBaseId, + connector, + access.accessMode, + contentCredentialId, + workspaceCredentialId, + onSaved, + ]) + + const handleResetAccess = useCallback(() => { + setAccess(currentAccess(connector)) + setWorkspaceCredentialId(null) + setContentCredentialId(connector.accessMode === 'members' ? connector.credentialId : null) + }, [connector]) + + const fieldsProps: ConnectorSettingsFieldsProps = { + availability: { + error: integrationAvailabilityError, + isFetching: isIntegrationAvailabilityFetching, + refetch: refetchIntegrationAvailability, + }, + isSearchIndex, + connectorConfig, + sourceConfig, + selectionLabels, + credentialId: connector.credentialId, + canonicalGroups, + canonicalModes, + onToggleCanonicalMode: toggleCanonicalMode, + onFieldChange: handleFieldChange, + isFieldVisible: (field) => isFieldVisible(field) && !hiddenCapFieldIds.has(field.id), + syncInterval, + setSyncInterval, + hasMaxAccess, + isSaving, + error: error ?? searchSetupError, + access, + onAccessChange: setAccess, + canAdmin, + showAccessField, + allowMembers, + allowAdmin, + allowWorkspace: !isSearchIndex, + canReenableMemberSync, + accessDirty, + accessModeChanged, + accessComplete, + accessSetupHint, + isSwitchingAccess, + onApplyAccess: handleApplyAccess, + onResetAccess: handleResetAccess, + contentCredentialId, + onContentCredentialChange: setContentCredentialId, + scope, + needsWorkspaceCredential, + workspaceCredentialId, + onWorkspaceCredentialChange: setWorkspaceCredentialId, + } + + return { + displayName: connectorConfig?.name ?? connector.connectorType, + icon: connectorConfig?.icon, + docsUrl, + dirty: hasChanges || accessDirty, + saving: isSaving, + canSave: + hasChanges && !accessDirty && !isSaving && searchSettingsAllowed && Boolean(settingsComplete), + save: handleSave, + fieldsProps, + } +} diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx index 06fd580eb6e..8692dabc612 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx @@ -8,6 +8,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ canAdmin: true, + replace: vi.fn(), availabilityReady: true, availabilityLoading: false, availabilityError: null as Error | null, @@ -101,6 +102,7 @@ vi.mock('@/app/workspace/[workspaceId]/search/components/search-source-status', }, })) vi.mock('next/navigation', () => ({ + useRouter: () => ({ replace: mocks.replace }), useParams: () => ({ workspaceId: 'workspace-1' }), usePathname: () => '/workspace/workspace-1/search', })) @@ -353,6 +355,29 @@ function setup() { } describe('Search source setup with real connector dialogs', () => { + it.each([ + ['source-one', '/o/org-1/settings/integrations/sources/source-one'], + ['confluence', '/o/org-1/settings/integrations'], + ['', '/o/org-1/settings/integrations'], + ])( + 'redirects legacy organization management for %s without loading the connector list', + async (source, destination) => { + await render( + , + `?manage-source=${source}` + ) + if (source === 'source-one') expect(mocks.replace).toHaveBeenCalledWith(destination) + else expect(mocks.replace).not.toHaveBeenCalled() + expect(mocks.connectorsQuery).toHaveBeenLastCalledWith(undefined) + expect(document.querySelector('[role="dialog"]')).toBeNull() + } + ) + it.each([false, true])( 'does not fetch admin data while closed for canAdmin=%s', async (canAdmin) => { diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx index d8f4d4926f3..592446038be 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState } from 'react' +import { useEffect, useState } from 'react' import { Chip, ChipInput, @@ -12,6 +12,7 @@ import { } from '@sim/emcn' import { Search } from '@sim/emcn/icons' import dynamic from 'next/dynamic' +import { useRouter } from 'next/navigation' import { useQueryState } from 'nuqs' import { useSession } from '@/lib/auth/auth-client' import { @@ -20,6 +21,7 @@ import { resourceScopeFromOwner, resourceScopeKey, } from '@/lib/core/resource-scope' +import { organizationRoutes } from '@/lib/navigation/paths' import { getConnectorAccessAvailability, SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' import { @@ -95,13 +97,28 @@ export function SearchSourceSetup({ managedSourceParam.parser.withOptions({ history: 'replace' }) ) const [search, setSearch] = useState('') + const router = useRouter() const prepare = usePrepareSearchSource() + const redirectManagement = + scope.kind === 'organization' && canAdmin && managedSource !== null && selectedType === null + const organizationId = scope.kind === 'organization' ? scope.organizationId : undefined + useEffect(() => { + if (!redirectManagement || !organizationId || managedSource === null) return + const routes = organizationRoutes(organizationId) + if (!managedSource || CONNECTOR_META_REGISTRY[managedSource]) { + void setManagedSource(null, { history: 'replace', scroll: false }) + } else { + router.replace(routes.searchSource(managedSource)) + } + }, [redirectManagement, organizationId, managedSource, router, setManagedSource]) const open = selectedType !== null || managedSource !== null - const index = useSearchIndex(scope, { enabled: canAdmin && open }) + const index = useSearchIndex(scope, { enabled: canAdmin && open && !redirectManagement }) const knowledgeBaseId = index.data?.knowledgeBaseId ?? undefined - const connectors = useConnectorList(canAdmin && managedSource ? knowledgeBaseId : undefined) + const connectors = useConnectorList( + canAdmin && managedSource && !redirectManagement ? knowledgeBaseId : undefined + ) - if (!canAdmin || !open) return null + if (!canAdmin || !open || redirectManagement) return null const close = () => { if (prepare.isPending) return diff --git a/apps/sim/ee/credential-groups/components/credential-group-invite-modal.tsx b/apps/sim/ee/credential-groups/components/credential-group-invite-modal.tsx index 180f29f5b73..071ca703dbe 100644 --- a/apps/sim/ee/credential-groups/components/credential-group-invite-modal.tsx +++ b/apps/sim/ee/credential-groups/components/credential-group-invite-modal.tsx @@ -101,7 +101,6 @@ export function CredentialGroupInviteModal({ onChange={handleEmailsChange} validate={validateEmail} placeholder='Enter emails' - hint='Each person receives a link to connect their accounts. They can connect and leave without joining Sim. To give someone access to Search in Sim, invite them from Teammates.' disabled={invite.isPending} /> diff --git a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx index ce0c2e9eb6c..e14e264b5f6 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx @@ -96,7 +96,6 @@ export function OrganizationAccountInviteModal({ onChange={handleEmailsChange} validate={validateEmail} placeholder='Enter emails' - hint='Each person receives a link to connect their accounts. They sign in to Sim with the verified invitation email and do not need organization membership.' disabled={invite.isPending} /> diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx index 7febf7f91f0..4ee82c98544 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx @@ -5,29 +5,14 @@ import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ + people: vi.fn(), resend: vi.fn(), revoke: vi.fn(), disconnect: vi.fn(), reset: vi.fn(), })) vi.mock('@/hooks/queries/organization-accounts', () => ({ - useOrganizationAccountPeople: () => ({ - data: { - pages: [ - { - enrollments: [ - { - id: 'enrollment-1', - email: 'person@example.com', - status: 'active', - connections: [{ provider: 'gmail', status: 'active', count: 2 }], - mcpConnections: [], - }, - ], - }, - ], - }, - }), + useOrganizationAccountPeople: mocks.people, usePersonalOrganizationAccounts: () => ({ data: { pages: [ @@ -58,6 +43,7 @@ vi.mock('@/ee/credential-groups/components/organization-account-invite-modal', ( OrganizationAccountInviteModal: () => null, })) +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' import { OrganizationAccountPeople } from '@/ee/credential-groups/components/organization-account-people' import { PersonalOrganizationAccounts } from '@/ee/credential-groups/components/personal-organization-accounts' @@ -66,6 +52,23 @@ let container: HTMLDivElement beforeEach(() => { vi.clearAllMocks() vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + mocks.people.mockReturnValue({ + data: { + pages: [ + { + enrollments: [ + { + id: 'enrollment-1', + email: 'person@example.com', + status: 'active', + connections: [{ provider: 'gmail', status: 'active', count: 2 }], + mcpConnections: [], + }, + ], + }, + ], + }, + }) container = document.createElement('div') document.body.appendChild(container) root = createRoot(container) @@ -106,7 +109,11 @@ it('keeps the compact People rows and resends from the actions menu', async () = await act(async () => root.render( - + + + + + ) ) @@ -142,7 +149,13 @@ describe.each(cases)( ({ label, component, mutation, target, input }) => { it('requires confirmation, allows cancellation, and never submits from an unfocused Enter', async () => { await act(async () => - root.render({component}) + root.render( + + + {component} + + + ) ) await openConfirmation(label) let dialog = document.querySelector('[role="dialog"]') @@ -166,3 +179,69 @@ describe.each(cases)( }) } ) + +it('restores the existing People URL search and requests server-filtered results', async () => { + mocks.people.mockReturnValue({ data: { pages: [{ enrollments: [] }] }, hasNextPage: false }) + await act(async () => + root.render( + + + + + + + + ) + ) + expect(mocks.people).toHaveBeenLastCalledWith('organization-1', 'late-page') + expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('late-page') + expect(container.textContent).toContain('No people match your search') + expect(container.textContent).not.toContain('loaded people') +}) + +it('keeps header search available after a people request fails', async () => { + mocks.people.mockReturnValue({ error: new Error('People unavailable'), refetch: vi.fn() }) + await act(async () => + root.render( + + + + + + + + ) + ) + expect(container.querySelector('input[placeholder="Search people..."]')).not.toBeDisabled() + expect(container.textContent).toContain('People unavailable') +}) + +it('retains loaded people and retries only the failed next page', async () => { + const fetchNextPage = vi.fn() + const refetch = vi.fn() + mocks.people.mockReturnValue({ + ...mocks.people(), + error: new Error('Next page unavailable'), + isFetchNextPageError: true, + hasNextPage: true, + fetchNextPage, + refetch, + }) + await act(async () => + root.render( + + + + + + + + ) + ) + expect(container.textContent).toContain('person@example.com') + expect(container.textContent).toContain('Next page unavailable') + expect(container.textContent).not.toContain('Load more') + await act(async () => button(container, 'Try again').click()) + expect(fetchNextPage).toHaveBeenCalledOnce() + expect(refetch).not.toHaveBeenCalled() +}) diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.tsx index f5272a91737..cb595dde0f8 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.tsx @@ -1,9 +1,10 @@ 'use client' import { useState } from 'react' -import { Chip, ChipConfirmModal, ChipInput, ChipModalError, toast } from '@sim/emcn' -import { Plus, Search } from '@sim/emcn/icons' +import { Chip, ChipConfirmModal, ChipModalError, toast } from '@sim/emcn' +import { Plus } from '@sim/emcn/icons' import { useQueryState } from 'nuqs' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { credentialGroupPeopleSearchParam, credentialGroupPeopleSearchUrlKeys, @@ -27,13 +28,13 @@ import { useResendOrganizationAccountInvitation, useRevokeOrganizationAccountEnrollment, } from '@/hooks/queries/organization-accounts' +import { useDebounce } from '@/hooks/use-debounce' import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter' interface OrganizationAccountPeopleProps { organizationId: string } export function OrganizationAccountPeople({ organizationId }: OrganizationAccountPeopleProps) { - const people = useOrganizationAccountPeople(organizationId) const resend = useResendOrganizationAccountInvitation() const revoke = useRevokeOrganizationAccountEnrollment() const [peopleSearch, setPeopleSearchParam] = useQueryState(credentialGroupPeopleSearchParam.key, { @@ -41,80 +42,61 @@ export function OrganizationAccountPeople({ organizationId }: OrganizationAccoun ...credentialGroupPeopleSearchUrlKeys, }) const setPeopleSearch = useDebouncedSearchSetter(setPeopleSearchParam) + const search = useDebounce(peopleSearch.trim(), SEARCH_DEBOUNCE_MS) + const people = useOrganizationAccountPeople(organizationId, search) const [inviteOpen, setInviteOpen] = useState(false) const [revokingPerson, setRevokingPerson] = useState<{ id: string; email: string } | null>(null) const error = resend.error ?? revoke.error const pending = resend.isPending || revoke.isPending const enrollments = people.data?.pages.flatMap((page) => page.enrollments) ?? [] - const filter = peopleSearch.trim().toLowerCase() - const visibleEnrollments = filter - ? enrollments.filter((person) => person.email.toLowerCase().includes(filter)) - : enrollments - const loadedTotal = `${enrollments.length}${people.hasNextPage ? '+' : ''}` - const searchLabel = people.hasNextPage ? 'Search loaded people' : 'Search people' - const peopleLabel = filter - ? `People (${visibleEnrollments.length} of ${loadedTotal})` - : `People (${loadedTotal})` - if (people.error) - return ( - void people.refetch()} - /> - ) + const peopleLabel = `People (${enrollments.length}${people.hasNextPage ? '+' : ''})` return ( - - setPeopleSearch(event.target.value)} - disabled={people.isPending} - autoComplete='off' - className='w-full' - /> + setInviteOpen(true), + }, + ]} + > + {people.error && !people.isFetchNextPageError && ( + void people.refetch()} + variant='inline' + /> + )} {error && (

    {error.message}

    )} - {!people.isPending && ( + {!people.isPending && (!people.error || people.isFetchNextPageError) && ( - {people.hasNextPage && ( - void people.fetchNextPage()} - > - {people.isFetchingNextPage ? 'Loading...' : 'Load more'} - - )} + people.hasNextPage && !people.isFetchNextPageError ? ( } - disabled={pending} - onClick={() => setInviteOpen(true)} + disabled={people.isFetchingNextPage} + onClick={() => void people.fetchNextPage()} > - Request connections + {people.isFetchingNextPage ? 'Loading...' : 'Load more'} - + ) : undefined } > - {visibleEnrollments.length === 0 ? ( + {enrollments.length === 0 ? ( - {filter - ? people.hasNextPage - ? 'No loaded people match your search. Load more to search additional people.' - : 'No people match your search' - : 'No people invited yet'} + {search ? 'No people match your search' : 'No people invited yet'} ) : (
    - {visibleEnrollments.map((person) => ( + {enrollments.map((person) => ( } @@ -157,6 +139,15 @@ export function OrganizationAccountPeople({ organizationId }: OrganizationAccoun )} )} + {people.isFetchNextPageError && ( + void people.fetchNextPage()} + variant='inline' + /> + )} {inviteOpen && ( ({ request: vi.fn() })) +vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.request })) + +import { + type ConnectorDocumentsData, + listKnowledgeConnectorDocumentsContract, + readSearchSourceProgressContract, +} from '@/lib/api/contracts/knowledge/connectors' +import type { ResourceScope } from '@/lib/core/resource-scope' +import { + CONNECTOR_SYNC_POLL_INTERVAL_MS, + connectorKeys, + useConnectorDocuments, +} from '@/hooks/queries/kb/connectors' + +const SCOPE: ResourceScope = { kind: 'organization', organizationId: 'org-1' } +const KB_ID = 'kb-1' +const CONNECTOR_ID = 'connector-1' + +interface ProbeProps { + progressScope?: ResourceScope + syncing?: boolean +} + +interface RequestInput { + query?: { offset?: number } + signal?: AbortSignal +} + +describe('connector document progress reconciliation', () => { + let root: Root + let container: HTMLDivElement + let client: QueryClient + let result: ReturnType + let serverSyncing: boolean + let processingStatus: string + + function Probe({ progressScope, syncing }: ProbeProps) { + result = useConnectorDocuments(KB_ID, CONNECTOR_ID, { + filter: 'active', + progressScope, + syncing, + }) + return {result.data?.pages.length} + } + + function documentPage(offset = 0): ConnectorDocumentsData { + return { + documents: [ + { + id: `document-${offset}`, + filename: `Document ${offset}`, + externalId: null, + sourceUrl: null, + enabled: true, + deletedAt: null, + userExcluded: false, + uploadedAt: '2026-09-08T00:00:00.000Z', + processingStatus, + }, + ], + counts: { active: 2, excluded: 0, failed: 0 }, + hasMore: offset === 0, + } + } + + function requestsFor(contract: unknown) { + return mocks.request.mock.calls.filter(([calledContract]) => calledContract === contract) + } + + async function advance(milliseconds: number) { + await act(async () => { + await vi.advanceTimersByTimeAsync(milliseconds) + }) + await act(async () => { + await vi.advanceTimersByTimeAsync(1) + }) + } + + async function render(props: ProbeProps = {}) { + await act(async () => + root.render( + + + + ) + ) + await advance(1) + } + + beforeEach(() => { + vi.useFakeTimers() + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + mocks.request.mockReset() + serverSyncing = false + processingStatus = 'pending' + mocks.request.mockImplementation(async (contract: unknown, input: RequestInput) => { + if (contract === listKnowledgeConnectorDocumentsContract) { + return { data: documentPage(input.query?.offset) } + } + if (contract === readSearchSourceProgressContract) { + return { + data: [ + { + connectorId: CONNECTOR_ID, + isSyncing: serverSyncing, + hasSyncError: false, + hasIndexingError: false, + }, + ], + } + } + throw new Error('Unexpected request') + }) + client = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + }) + + afterEach(async () => { + await act(async () => root.unmount()) + client.clear() + container.remove() + vi.useRealTimers() + vi.unstubAllGlobals() + }) + + it('does not probe or poll ordinary knowledge-base document lists', async () => { + await render({ syncing: true }) + await advance(60_000) + + expect(requestsFor(readSearchSourceProgressContract)).toHaveLength(0) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(1) + }) + + it('probes only the current source with cancellation and stops an abandoned request', async () => { + let progressSignal: AbortSignal | undefined + mocks.request.mockImplementation((contract: unknown, input: RequestInput) => { + if (contract === listKnowledgeConnectorDocumentsContract) { + return Promise.resolve({ data: documentPage() }) + } + progressSignal = input.signal + return new Promise((_resolve, reject) => { + input.signal?.addEventListener('abort', () => reject(new Error('Request aborted')), { + once: true, + }) + }) + }) + await render({ progressScope: SCOPE }) + + expect(mocks.request).toHaveBeenCalledWith(readSearchSourceProgressContract, { + body: { organizationId: SCOPE.organizationId, connectorIds: [CONNECTOR_ID] }, + signal: expect.any(AbortSignal), + }) + expect(progressSignal?.aborted).toBe(false) + await render() + expect(progressSignal?.aborted).toBe(true) + }) + + it('waits through post-sync indexing and refreshes loaded pages once when all work finishes', async () => { + serverSyncing = true + await render({ progressScope: SCOPE, syncing: true }) + await act(async () => { + await result.fetchNextPage() + }) + await advance(1) + expect(result.data?.pages).toHaveLength(2) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(2) + + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + await render({ progressScope: SCOPE, syncing: false }) + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + expect(requestsFor(readSearchSourceProgressContract).length).toBeGreaterThan(2) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(2) + + processingStatus = 'completed' + serverSyncing = false + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + await advance(1) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(4) + expect(result.data?.pages.flatMap((page) => page.documents)).toEqual([ + expect.objectContaining({ id: 'document-0', processingStatus: 'completed' }), + expect.objectContaining({ id: 'document-1', processingStatus: 'completed' }), + ]) + + const completedProbeCount = requestsFor(readSearchSourceProgressContract).length + await advance(30_000) + expect(requestsFor(readSearchSourceProgressContract)).toHaveLength(completedProbeCount) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(4) + }) + + it('restarts an idle probe when a new sync is queued without polling document pages', async () => { + await render({ progressScope: SCOPE, syncing: false }) + const idleProbeCount = requestsFor(readSearchSourceProgressContract).length + const idleDocumentCount = requestsFor(listKnowledgeConnectorDocumentsContract).length + await advance(30_000) + expect(requestsFor(readSearchSourceProgressContract)).toHaveLength(idleProbeCount) + + serverSyncing = true + await render({ progressScope: SCOPE, syncing: true }) + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + expect(requestsFor(readSearchSourceProgressContract).length).toBeGreaterThan(idleProbeCount) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(idleDocumentCount) + }) + + it('cancels a stale in-flight document snapshot when indexing completes', async () => { + serverSyncing = true + await render({ progressScope: SCOPE }) + const request = mocks.request.getMockImplementation()! + let staleRequestSignal: AbortSignal | undefined + mocks.request.mockImplementation((contract: unknown, input: RequestInput) => { + if (contract === listKnowledgeConnectorDocumentsContract && !staleRequestSignal) { + staleRequestSignal = input.signal + return new Promise((_resolve, reject) => { + input.signal?.addEventListener('abort', () => reject(new Error('Request aborted')), { + once: true, + }) + }) + } + return request(contract, input) + }) + await act(async () => { + void result.refetch() + }) + expect(staleRequestSignal?.aborted).toBe(false) + + processingStatus = 'completed' + serverSyncing = false + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + await advance(1) + + expect(staleRequestSignal?.aborted).toBe(true) + expect(result.data?.pages[0].documents[0].processingStatus).toBe('completed') + const completedDocumentCount = requestsFor(listKnowledgeConnectorDocumentsContract).length + await advance(30_000) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength( + completedDocumentCount + ) + }) + + it('restarts after a document retry invalidates the existing connector cache prefix', async () => { + await render({ progressScope: SCOPE, syncing: false }) + const idleProbeCount = requestsFor(readSearchSourceProgressContract).length + serverSyncing = true + await act(async () => { + await client.invalidateQueries({ queryKey: connectorKeys.all(KB_ID) }) + }) + await advance(1) + expect(requestsFor(readSearchSourceProgressContract).length).toBeGreaterThan(idleProbeCount) + + const retryProbeCount = requestsFor(readSearchSourceProgressContract).length + const retryDocumentCount = requestsFor(listKnowledgeConnectorDocumentsContract).length + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + expect(requestsFor(readSearchSourceProgressContract).length).toBeGreaterThan(retryProbeCount) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(retryDocumentCount) + }) + + it('reduces probe frequency for long indexing runs without refetching document pages', async () => { + serverSyncing = true + await render({ progressScope: SCOPE, syncing: false }) + for (let index = 0; index < 20; index++) { + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + } + const probeCount = requestsFor(readSearchSourceProgressContract).length + await advance(CONNECTOR_SYNC_POLL_INTERVAL_MS) + expect(requestsFor(readSearchSourceProgressContract)).toHaveLength(probeCount) + await advance(15_000) + expect(requestsFor(readSearchSourceProgressContract).length).toBeGreaterThan(probeCount) + expect(requestsFor(listKnowledgeConnectorDocumentsContract)).toHaveLength(1) + }) +}) diff --git a/apps/sim/hooks/queries/kb/connectors.test.ts b/apps/sim/hooks/queries/kb/connectors.test.ts index 0a9a8c9bb70..f732b184a12 100644 --- a/apps/sim/hooks/queries/kb/connectors.test.ts +++ b/apps/sim/hooks/queries/kb/connectors.test.ts @@ -2,12 +2,12 @@ * @vitest-environment node */ -import { beforeEach, describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ requestJson: vi.fn(), - useInfiniteQuery: vi.fn(), - useQuery: vi.fn(), + useInfiniteQuery: vi.fn().mockReturnValue({ data: undefined, dataUpdatedAt: 0 }), + useQuery: vi.fn().mockReturnValue({ data: undefined, dataUpdatedAt: 0 }), useMutation: vi.fn(), cancelQueries: vi.fn(), getQueryData: vi.fn(), @@ -41,7 +41,10 @@ import { listKnowledgeConnectorDocumentsContract, listSearchSourcesContract, } from '@/lib/api/contracts/knowledge' -import { readSearchIndexContract } from '@/lib/api/contracts/knowledge/connectors' +import { + type ConnectorDetailData, + readSearchIndexContract, +} from '@/lib/api/contracts/knowledge/connectors' import { MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE } from '@/lib/knowledge/constants' import { CONNECTOR_SYNC_POLL_INTERVAL_MS, @@ -55,6 +58,7 @@ import { useSearchIndex, useSearchSources, useTriggerSync, + useUpdateConnector, type WorkspaceMemberConnector, } from '@/hooks/queries/kb/connectors' @@ -207,6 +211,7 @@ describe('useTriggerSync optimistic state', () => { function capturedMutationOptions() { return mocks.useMutation.mock.calls.at(-1)?.[0] as { onMutate: (vars: { knowledgeBaseId: string; connectorId: string }) => Promise + onSuccess: (data: undefined, vars: { knowledgeBaseId: string; connectorId: string }) => void onError: ( error: unknown, vars: { knowledgeBaseId: string; connectorId: string }, @@ -227,6 +232,18 @@ describe('useTriggerSync optimistic state', () => { expect(lastListStatusUpdater()(existing)?.[0].status).toBe('pending') }) + it('refreshes only the triggered source progress after success', () => { + useTriggerSync() + capturedMutationOptions().onSuccess(undefined, { + knowledgeBaseId: KB_ID, + connectorId: 'connector-1', + }) + + expect(mocks.invalidateQueries.mock.calls).toEqual([ + [{ queryKey: connectorKeys.progresses(KB_ID, 'connector-1') }], + ]) + }) + it('restores the previous status when the request fails', async () => { const existing = [makeConnector({ status: 'active' })] mocks.getQueryData.mockReturnValue(existing) @@ -366,12 +383,137 @@ describe('useTriggerSync optimistic state', () => { }) }) +describe('direct source detail mutation state', () => { + const variables = { knowledgeBaseId: KB_ID, connectorId: 'connector-1' } + const detailKey = JSON.stringify(connectorKeys.detail(KB_ID, variables.connectorId)) + const listKey = JSON.stringify(connectorKeys.lists(KB_ID)) + + beforeEach(() => { + vi.clearAllMocks() + mocks.getQueryData.mockReset() + }) + + afterEach(() => { + mocks.getQueryData.mockReset() + }) + + function seedDetail(overrides: Partial = {}, list?: ConnectorData[]) { + const detail: ConnectorDetailData = { + ...makeConnector({ memberSyncStatus: 'idle', ...overrides }), + syncLogs: [], + memberSyncLogs: [], + members: { active: 2, suspended: 0, stale: 0 }, + } + mocks.getQueryData.mockImplementation((key) => { + if (JSON.stringify(key) === detailKey) return detail + if (JSON.stringify(key) === listKey) return list + return undefined + }) + return detail + } + + function capturedMutation() { + return mocks.useMutation.mock.calls.at(-1)?.[0] as { + onMutate: ( + input: typeof variables & { updates?: { status: 'active' | 'paused' } } + ) => Promise + onError: (error: Error, input: typeof variables, previous: unknown) => void + } + } + + function detailUpdater() { + return mocks.setQueryData.mock.calls + .filter(([key]) => JSON.stringify(key) === detailKey) + .at(-1)?.[1] as (detail: ConnectorDetailData | undefined) => ConnectorDetailData | undefined + } + + it.each(['admin', 'members'] as const)( + 'queues and rolls back %s sync with only the exact detail cached', + async (accessMode) => { + const detail = seedDetail({ accessMode }) + useTriggerSync() + const mutation = capturedMutation() + const previous = await mutation.onMutate(variables) + const queued = detailUpdater()(detail) + + expect(previous).toEqual( + accessMode === 'members' ? { memberSyncStatus: 'idle' } : { status: 'active' } + ) + expect(queued).toEqual({ + ...detail, + ...(accessMode === 'members' ? { memberSyncStatus: 'pending' } : { status: 'pending' }), + }) + expect(lastListStatusUpdater()(undefined)).toBeUndefined() + useConnectorDetail(KB_ID, variables.connectorId) + expect( + capturedQueryOptions().refetchInterval({ state: { data: queued } }) + ).toBe(CONNECTOR_SYNC_POLL_INTERVAL_MS) + + mocks.setQueryData.mockClear() + mutation.onError(new Error('Sync refused'), variables, previous) + expect(detailUpdater()(queued)).toEqual(detail) + if (accessMode === 'members') { + expect(mocks.invalidateQueries).toHaveBeenCalledWith({ + queryKey: memberConnectorKeys.lists(), + }) + } + } + ) + + it.each([ + { before: 'active', requested: 'paused' }, + { before: 'paused', requested: 'active' }, + ] as const)('rolls back a rejected $requested change without a list cache', async (status) => { + const detail = seedDetail({ status: status.before }) + useUpdateConnector() + const mutation = capturedMutation() + const previous = await mutation.onMutate({ + ...variables, + updates: { status: status.requested }, + }) + const optimistic = detailUpdater()(detail) + expect(optimistic?.status).toBe(status.requested) + expect(previous).toBe(status.before) + + mocks.setQueryData.mockClear() + mutation.onError(new Error('Status change refused'), variables, previous) + expect(detailUpdater()(optimistic)).toEqual(detail) + expect(lastListStatusUpdater()(undefined)).toBeUndefined() + }) + + it.each([{ id: 'other-connector' }, { knowledgeBaseId: 'other-kb' }])( + 'does not use a mismatched detail to choose the sync engine: %j', + async (identity) => { + seedDetail({ accessMode: 'members', ...identity }) + useTriggerSync() + expect(await capturedMutation().onMutate(variables)).toBeUndefined() + expect(mocks.setQueryData).not.toHaveBeenCalled() + expect(mocks.setQueriesData).not.toHaveBeenCalledWith( + { queryKey: memberConnectorKeys.lists() }, + expect.any(Function) + ) + } + ) + + it.each([{ id: 'other-connector' }, { knowledgeBaseId: 'other-kb' }])( + 'preserves mismatched detail data when queuing a matching list row: %j', + async (identity) => { + const detail = seedDetail(identity, [makeConnector({ accessMode: 'admin' })]) + useTriggerSync() + await capturedMutation().onMutate(variables) + expect(detailUpdater()(detail)).toBe(detail) + expect(lastListStatusUpdater()([makeConnector()])?.[0].status).toBe('pending') + } + ) +}) + interface ConnectorDocumentsPage { documents: Array<{ id: string }> counts: { active: number; excluded: number } } interface ConnectorDocumentsQueryOptions { + queryKey: readonly unknown[] initialPageParam: number queryFn: (context: { signal: AbortSignal; pageParam: number }) => Promise getNextPageParam: ( @@ -409,6 +551,8 @@ describe('useConnectorDocuments', () => { query: { includeExcluded: true, failedOnly: false, + filter: undefined, + search: undefined, limit: MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, offset: 200, }, @@ -419,6 +563,38 @@ describe('useConnectorDocuments', () => { expect(options.getNextPageParam(finalPage, [firstPage, finalPage])).toBeUndefined() }) + it('searches every requested page with the chosen filter and a distinct cache key', async () => { + useConnectorDocuments('knowledge-1', 'connector-1', { + filter: 'excluded', + search: ' Roadmap ', + includeExcluded: true, + failedOnly: true, + }) + const options = mocks.useInfiniteQuery.mock.calls[0]?.[0] as ConnectorDocumentsQueryOptions + const signal = new AbortController().signal + mocks.requestJson.mockResolvedValue({ data: { documents: [] } }) + await options.queryFn({ signal, pageParam: 200 }) + expect(mocks.requestJson).toHaveBeenLastCalledWith(listKnowledgeConnectorDocumentsContract, { + params: { id: 'knowledge-1', connectorId: 'connector-1' }, + query: { + filter: 'excluded', + search: 'Roadmap', + includeExcluded: undefined, + failedOnly: undefined, + limit: MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, + offset: 200, + }, + signal, + }) + + useConnectorDocuments('knowledge-1', 'connector-1', { filter: 'active', search: 'Roadmap' }) + expect(mocks.useInfiniteQuery.mock.calls.at(-1)?.[0].queryKey).not.toEqual(options.queryKey) + useConnectorDocuments('knowledge-1', 'connector-1', { filter: 'excluded', search: 'Roadmap' }) + expect(mocks.useInfiniteQuery.mock.calls.at(-1)?.[0].queryKey).toEqual(options.queryKey) + useConnectorDocuments('knowledge-1', 'connector-1', { filter: 'excluded', search: 'Budget' }) + expect(mocks.useInfiniteQuery.mock.calls.at(-1)?.[0].queryKey).not.toEqual(options.queryKey) + }) + it('does not page toward excluded documents when they were not requested', () => { const activePage = { documents: [{ id: 'document-1' }, { id: 'document-2' }], @@ -448,10 +624,6 @@ describe('connector document rolling compatibility', () => { }) describe('useSearchSources', () => { - beforeEach(() => { - mocks.useQuery.mockReturnValue({ data: undefined, dataUpdatedAt: 0 }) - mocks.useInfiniteQuery.mockReturnValue({ data: undefined, dataUpdatedAt: 0 }) - }) it('isolates organization sources and resolves their index without listing workspace knowledge bases', async () => { const scope = { kind: 'organization' as const, organizationId: 'scope-1' } const signal = new AbortController().signal diff --git a/apps/sim/hooks/queries/kb/connectors.ts b/apps/sim/hooks/queries/kb/connectors.ts index 149149a2771..012053d3312 100644 --- a/apps/sim/hooks/queries/kb/connectors.ts +++ b/apps/sim/hooks/queries/kb/connectors.ts @@ -38,6 +38,7 @@ import { } from '@/lib/api/contracts/knowledge' import { type ConnectorAccessMode, + type ConnectorDocumentsQuery, type PrepareSearchSourceBody, prepareSearchSourceContract, readSearchIndexContract, @@ -88,6 +89,13 @@ export const connectorKeys = { details: (knowledgeBaseId?: string) => [...connectorKeys.all(knowledgeBaseId), 'detail'] as const, detail: (knowledgeBaseId?: string, connectorId?: string) => [...connectorKeys.details(knowledgeBaseId), connectorId ?? ''] as const, + progress: (knowledgeBaseId?: string, connectorId?: string, scope?: ResourceScope) => + [ + ...connectorKeys.progresses(knowledgeBaseId, connectorId), + scope ? resourceScopeKey(scope) : '', + ] as const, + progresses: (knowledgeBaseId?: string, connectorId?: string) => + [...connectorKeys.detail(knowledgeBaseId, connectorId), 'progress'] as const, } async function fetchConnectors( @@ -182,6 +190,25 @@ export function useConnectorDetail(knowledgeBaseId?: string, connectorId?: strin */ type ConnectorStatusPatch = Pick | Pick +function getCachedConnector( + queryClient: QueryClient, + knowledgeBaseId: string, + connectorId: string +): ConnectorData | undefined { + const listed = queryClient + .getQueryData(connectorKeys.lists(knowledgeBaseId)) + ?.find( + (connector) => connector.id === connectorId && connector.knowledgeBaseId === knowledgeBaseId + ) + if (listed) return listed + const detail = queryClient.getQueryData( + connectorKeys.detail(knowledgeBaseId, connectorId) + ) + return detail?.id === connectorId && detail.knowledgeBaseId === knowledgeBaseId + ? detail + : undefined +} + function setCachedConnectorStatus( queryClient: QueryClient, knowledgeBaseId: string, @@ -190,12 +217,17 @@ function setCachedConnectorStatus( ) { queryClient.setQueryData(connectorKeys.lists(knowledgeBaseId), (connectors) => connectors?.map((connector) => - connector.id === connectorId ? { ...connector, ...patch } : connector + connector.id === connectorId && connector.knowledgeBaseId === knowledgeBaseId + ? { ...connector, ...patch } + : connector ) ) queryClient.setQueryData( connectorKeys.detail(knowledgeBaseId, connectorId), - (detail) => (detail ? { ...detail, ...patch } : detail) + (detail) => + detail?.id === connectorId && detail.knowledgeBaseId === knowledgeBaseId + ? { ...detail, ...patch } + : detail ) } @@ -219,9 +251,7 @@ function optimisticallySetConnectorStatus( connectorId: string, status: ConnectorData['status'] ) { - const previousStatus = queryClient - .getQueryData(connectorKeys.lists(knowledgeBaseId)) - ?.find((connector) => connector.id === connectorId)?.status + const previousStatus = getCachedConnector(queryClient, knowledgeBaseId, connectorId)?.status setCachedConnectorStatus(queryClient, knowledgeBaseId, connectorId, { status }) @@ -241,9 +271,7 @@ function optimisticallyQueueSync( knowledgeBaseId: string, connectorId: string ): ConnectorStatusPatch | undefined { - const cached = queryClient - .getQueryData(connectorKeys.lists(knowledgeBaseId)) - ?.find((connector) => connector.id === connectorId) + const cached = getCachedConnector(queryClient, knowledgeBaseId, connectorId) if (!cached) return undefined if (cached.accessMode === 'members') { setCachedConnectorStatus(queryClient, knowledgeBaseId, connectorId, { @@ -790,48 +818,38 @@ export function useTriggerSync() { queryClient.invalidateQueries({ queryKey: connectorKeys.all(knowledgeBaseId) }) } }, - /** - * Deliberately no invalidation on success. The route answers without - * awaiting the dispatch that writes `pending`, so an immediate refetch can - * still read `active`, discard the optimistic write, and stop the poll - * before it ever started — leaving the UI claiming idle for a sync that is - * running. The optimistic `pending` starts the poll instead, and the poll - * reconciles against whatever the server actually settles on. - */ + onSuccess: (_data, { knowledgeBaseId, connectorId }) => { + queryClient.invalidateQueries({ + queryKey: connectorKeys.progresses(knowledgeBaseId, connectorId), + }) + }, }) } +type ConnectorDocumentListOptions = Partial< + Pick +> + export const connectorDocumentKeys = { all: (knowledgeBaseId?: string, connectorId?: string) => [...connectorKeys.detail(knowledgeBaseId, connectorId), 'documents'] as const, lists: (knowledgeBaseId?: string, connectorId?: string) => [...connectorDocumentKeys.all(knowledgeBaseId, connectorId), 'list'] as const, - list: ( - knowledgeBaseId?: string, - connectorId?: string, - includeExcluded = false, - failedOnly = false - ) => - [ - ...connectorDocumentKeys.lists(knowledgeBaseId, connectorId), - includeExcluded, - failedOnly, - ] as const, + list: (knowledgeBaseId?: string, connectorId?: string, options?: ConnectorDocumentListOptions) => + [...connectorDocumentKeys.lists(knowledgeBaseId, connectorId), options] as const, } async function fetchConnectorDocuments( knowledgeBaseId: string, connectorId: string, - includeExcluded: boolean, - failedOnly: boolean, + options: ConnectorDocumentListOptions, offset: number, signal?: AbortSignal ): Promise { const result = await requestJson(listKnowledgeConnectorDocumentsContract, { params: { id: knowledgeBaseId, connectorId }, query: { - includeExcluded, - failedOnly, + ...options, limit: MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, offset, }, @@ -844,18 +862,22 @@ async function fetchConnectorDocuments( export function useConnectorDocuments( knowledgeBaseId?: string, connectorId?: string, - options?: { includeExcluded?: boolean; failedOnly?: boolean } + options?: ConnectorDocumentListOptions & { progressScope?: ResourceScope; syncing?: boolean } ) { - const includeExcluded = options?.includeExcluded ?? false - const failedOnly = options?.failedOnly ?? false - return useInfiniteQuery({ - queryKey: connectorDocumentKeys.list(knowledgeBaseId, connectorId, includeExcluded, failedOnly), + const queryClient = useQueryClient() + const query = { + includeExcluded: options?.filter ? undefined : (options?.includeExcluded ?? false), + failedOnly: options?.filter ? undefined : (options?.failedOnly ?? false), + filter: options?.filter, + search: options?.search?.trim() || undefined, + } + const documents = useInfiniteQuery({ + queryKey: connectorDocumentKeys.list(knowledgeBaseId, connectorId, query), queryFn: ({ signal, pageParam }) => fetchConnectorDocuments( knowledgeBaseId as string, connectorId as string, - includeExcluded, - failedOnly, + query, pageParam, signal ), @@ -871,6 +893,55 @@ export function useConnectorDocuments( staleTime: CONNECTOR_DOCUMENT_LIST_STALE_TIME, placeholderData: keepPreviousData, }) + const scope = options?.progressScope + const hasProgressScope = Boolean(scope) + const syncing = options?.syncing ?? false + const progress = useQuery({ + queryKey: connectorKeys.progress(knowledgeBaseId, connectorId, scope), + queryFn: async ({ signal }) => { + if (!scope || !connectorId) + throw new Error('A Search source scope and connector are required') + return ( + await requestJson(readSearchSourceProgressContract, { + body: { ...resourceScopeFields(scope), connectorIds: [connectorId] }, + signal, + }) + ).data + }, + enabled: Boolean(scope && knowledgeBaseId && connectorId), + staleTime: CONNECTOR_SYNC_POLL_INTERVAL_MS, + refetchInterval: (query) => + syncing || query.state.data?.some((source) => source.isSyncing) + ? query.state.dataUpdateCount < 20 + ? CONNECTOR_SYNC_POLL_INTERVAL_MS + : 15_000 + : false, + }) + + /** Refresh document pages once indexing settles, rather than polling every loaded page. */ + useEffect(() => { + if ( + !hasProgressScope || + syncing || + !progress.data || + progress.data.some((source) => source.isSyncing) || + progress.dataUpdatedAt <= documents.dataUpdatedAt + ) + return + void queryClient.invalidateQueries({ + queryKey: connectorDocumentKeys.lists(knowledgeBaseId, connectorId), + }) + }, [ + hasProgressScope, + syncing, + progress.data, + progress.dataUpdatedAt, + documents.dataUpdatedAt, + queryClient, + knowledgeBaseId, + connectorId, + ]) + return documents } interface ConnectorDocumentMutationParams { diff --git a/apps/sim/hooks/queries/organization-accounts.test.tsx b/apps/sim/hooks/queries/organization-accounts.test.tsx new file mode 100644 index 00000000000..9b3bda17025 --- /dev/null +++ b/apps/sim/hooks/queries/organization-accounts.test.tsx @@ -0,0 +1,103 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { sleep } from '@sim/utils/helpers' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ request: vi.fn() })) +vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.request })) + +import { listOrganizationAccountPeopleContract } from '@/lib/api/contracts/organization-accounts' +import { useOrganizationAccountPeople } from '@/hooks/queries/organization-accounts' + +describe('organization people search pagination', () => { + let root: Root + let container: HTMLDivElement + let client: QueryClient + let result: ReturnType + + function Probe({ search, organizationId }: { search: string; organizationId: string }) { + result = useOrganizationAccountPeople(organizationId, search) + return {result.data?.pages.length} + } + + async function flushQueries() { + await act(async () => { + for (let index = 0; index < 5; index++) await sleep(1) + }) + } + + async function render(search: string, organizationId = 'org-1') { + await act(async () => + root.render( + + + + ) + ) + await flushQueries() + } + + beforeEach(() => { + vi.clearAllMocks() + mocks.request.mockReset() + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + client = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + }) + + afterEach(async () => { + await act(async () => root.unmount()) + client.clear() + container.remove() + vi.unstubAllGlobals() + }) + + it('sends search on every bounded page and starts a new first page when it changes', async () => { + mocks.request + .mockResolvedValueOnce({ enrollments: [], nextCursor: 'alpha-page-2' }) + .mockResolvedValueOnce({ enrollments: [], nextCursor: null }) + .mockResolvedValueOnce({ enrollments: [], nextCursor: null }) + await render(' alpha ') + expect(mocks.request).toHaveBeenNthCalledWith(1, listOrganizationAccountPeopleContract, { + params: { id: 'org-1' }, + query: { limit: 50, cursor: undefined, search: 'alpha' }, + signal: expect.any(AbortSignal), + }) + await act(async () => { + await result.fetchNextPage() + }) + await flushQueries() + expect(result.data?.pages).toHaveLength(2) + expect(mocks.request).toHaveBeenNthCalledWith(2, listOrganizationAccountPeopleContract, { + params: { id: 'org-1' }, + query: { limit: 50, cursor: 'alpha-page-2', search: 'alpha' }, + signal: expect.any(AbortSignal), + }) + await render('beta') + expect(mocks.request).toHaveBeenNthCalledWith(3, listOrganizationAccountPeopleContract, { + params: { id: 'org-1' }, + query: { limit: 50, cursor: undefined, search: 'beta' }, + signal: expect.any(AbortSignal), + }) + expect(result.data?.pages).toHaveLength(1) + }) + + it('keeps search pages scoped to the organization and omits whitespace-only search', async () => { + mocks.request + .mockResolvedValueOnce({ enrollments: [], nextCursor: 'org-1-next' }) + .mockResolvedValueOnce({ enrollments: [], nextCursor: null }) + await render(' ') + await render('', 'org-2') + expect(mocks.request).toHaveBeenLastCalledWith(listOrganizationAccountPeopleContract, { + params: { id: 'org-2' }, + query: { limit: 50, cursor: undefined, search: undefined }, + signal: expect.any(AbortSignal), + }) + expect(result.hasNextPage).toBe(false) + expect(result.data?.pages).toHaveLength(1) + }) +}) diff --git a/apps/sim/hooks/queries/organization-accounts.ts b/apps/sim/hooks/queries/organization-accounts.ts index 6ef7a263930..9fa0ffc8e67 100644 --- a/apps/sim/hooks/queries/organization-accounts.ts +++ b/apps/sim/hooks/queries/organization-accounts.ts @@ -18,6 +18,7 @@ import { inviteOrganizationAccountPeopleContract, listOrganizationAccountPeopleContract, listPersonalOrganizationAccountsContract, + type OrganizationAccountPeopleQuery, type RemoveOrganizationAccountMcpProviderParams, reconnectPersonalOrganizationAccountContract, removeOrganizationAccountMcpProviderContract, @@ -40,6 +41,8 @@ export const organizationAccountsKeys = { [...organizationAccountsKeys.workspaces(), workspaceId ?? ''] as const, access: (id?: string) => [...organizationAccountsKeys.detail(id), 'access'] as const, people: (id?: string) => [...organizationAccountsKeys.detail(id), 'people'] as const, + peopleList: (id: string, search?: string) => + [...organizationAccountsKeys.people(id), { search: search ?? '' }] as const, databricks: (id?: string) => [...organizationAccountsKeys.detail(id), 'databricks'] as const, details: () => [...organizationAccountsKeys.all, 'detail'] as const, detail: (organizationId?: string) => @@ -188,15 +191,19 @@ export function useUpdateOrganizationAccountWorkspaceAccess() { ]), }) } -export function useOrganizationAccountPeople(organizationId: string) { +export function useOrganizationAccountPeople( + organizationId: string, + search?: OrganizationAccountPeopleQuery['search'] +) { + const normalizedSearch = search?.trim() || undefined return useInfiniteQuery({ - queryKey: organizationAccountsKeys.people(organizationId), + queryKey: organizationAccountsKeys.peopleList(organizationId, normalizedSearch), staleTime: ORGANIZATION_ACCOUNTS_STALE_TIME, initialPageParam: undefined as string | undefined, queryFn: ({ signal, pageParam }) => requestJson(listOrganizationAccountPeopleContract, { params: { id: organizationId }, - query: { limit: 50, cursor: pageParam }, + query: { limit: 50, cursor: pageParam, search: normalizedSearch }, signal, }), getNextPageParam: (page) => page.nextCursor ?? undefined, diff --git a/apps/sim/hooks/use-oauth-return-hooks.test.tsx b/apps/sim/hooks/use-oauth-return-hooks.test.tsx index 60d33775065..49dbe1e2579 100644 --- a/apps/sim/hooks/use-oauth-return-hooks.test.tsx +++ b/apps/sim/hooks/use-oauth-return-hooks.test.tsx @@ -14,12 +14,14 @@ const mocks = vi.hoisted(() => ({ requireWorkspaceCredentialListResponse: vi.fn(), success: vi.fn(), error: vi.fn(), + replace: vi.fn(), + params: { workspaceId: 'workspace-1' } as { workspaceId?: string; organizationId?: string }, })) vi.mock('@sim/emcn', () => ({ toast: { success: mocks.success, error: mocks.error } })) vi.mock('next/navigation', () => ({ - useParams: () => ({ workspaceId: 'workspace-1' }), - useRouter: vi.fn(), + useParams: () => mocks.params, + useRouter: () => ({ replace: mocks.replace }), })) vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.requestJson })) vi.mock('@/lib/desktop', () => ({ @@ -38,9 +40,12 @@ import { readOAuthReturnContext, writeOAuthReturnContext, } from '@/lib/credentials/client-state' +import { oauthCredentialKeys, useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' +import { useCredentialRefreshTriggers } from '@/hooks/use-credential-refresh-triggers' import { useDesktopOAuthConnectListener, useOAuthReturnForKBConnectors, + useOAuthReturnRouter, } from '@/hooks/use-oauth-return' const UPDATED_EVENT = 'oauth-credentials-updated' @@ -58,7 +63,7 @@ const NEW_CREDENTIAL = { accountId: 'account-new', } -function context(): OAuthReturnContext { +function context(): Extract { return { origin: 'kb-connectors', workspaceId: 'workspace-1', @@ -88,6 +93,19 @@ function Probe({ return null } +function RouterProbe() { + useOAuthReturnRouter() + return null +} + +function SourceSettingsProbe({ connectorId }: { connectorId: string }) { + const scope = { kind: 'organization' as const, organizationId: 'org-1' } + const credentials = useOAuthCredentials('google-drive', { organizationId: scope.organizationId }) + useCredentialRefreshTriggers(credentials.refetch, 'google-drive', scope) + useOAuthReturnForKBConnectors('kb-search', undefined, 'google_drive', scope, connectorId) + return {credentials.data?.map((credential) => credential.name).join(', ')} +} + let root: Root let container: HTMLDivElement let queryClient: QueryClient @@ -106,6 +124,7 @@ async function render(props: ProbeProps) { beforeEach(() => { vi.clearAllMocks() mocks.desktop = false + mocks.params = { workspaceId: 'workspace-1' } completeDesktop = undefined mocks.onOAuthConnectComplete.mockImplementation( (callback: (result: DesktopOAuthConnectResult) => void) => { @@ -136,6 +155,130 @@ afterEach(async () => { sessionStorage.clear() }) +describe('organization source OAuth return routing', () => { + async function renderRouter() { + await act(async () => { + root.render( + + + + ) + }) + } + + it.each([false, true])( + 'returns to source settings after OAuth with canceled=%s', + async (canceled) => { + mocks.params = { organizationId: 'org-1' } + const pending: OAuthReturnContext = { + ...context(), + workspaceId: undefined, + organizationId: 'org-1', + connectorId: 'connector-1', + } + writeOAuthReturnContext(pending) + window.history.replaceState( + null, + '', + `/o/org-1/settings/integrations${canceled ? '?error=access_denied' : ''}` + ) + + await renderRouter() + + expect(mocks.replace).toHaveBeenCalledExactlyOnceWith( + '/o/org-1/settings/integrations/sources/connector-1?view=settings' + ) + expect(readOAuthReturnContext()).toEqual(canceled ? null : pending) + expect(mocks.requestJson).not.toHaveBeenCalled() + } + ) + + it('keeps new-source OAuth returns on the existing setup form', async () => { + mocks.params = { organizationId: 'org-1' } + writeOAuthReturnContext({ + ...context(), + workspaceId: undefined, + organizationId: 'org-1', + }) + + await renderRouter() + + expect(mocks.replace).toHaveBeenCalledExactlyOnceWith( + '/o/org-1/settings/integrations?addConnector=google_drive' + ) + }) + + it('does not route a pending source return through a different organization', async () => { + mocks.params = { organizationId: 'org-other' } + const pending: OAuthReturnContext = { + ...context(), + workspaceId: undefined, + organizationId: 'org-1', + connectorId: 'connector-1', + } + writeOAuthReturnContext(pending) + + await renderRouter() + + expect(mocks.replace).not.toHaveBeenCalled() + expect(readOAuthReturnContext()).toEqual(pending) + }) +}) + +describe('existing source settings OAuth return', () => { + async function renderSettings(connectorId: string) { + await act(async () => { + root.render( + + + + ) + }) + } + + beforeEach(() => { + queryClient.setQueryData(oauthCredentialKeys.list('google-drive', '', '', 'org-1'), [ + { id: 'credential-existing', name: 'Cached account' }, + ]) + mocks.requestJson.mockResolvedValue({ + credentials: [{ id: 'credential-existing', name: 'Updated account' }], + }) + }) + + it('consumes a matching source return and refreshes fresh cached account options', async () => { + writeOAuthReturnContext({ + ...context(), + workspaceId: undefined, + organizationId: 'org-1', + connectorId: 'connector-1', + reconnect: true, + }) + + await renderSettings('connector-1') + + expect(readOAuthReturnContext()).toBeNull() + expect(mocks.requestJson).toHaveBeenCalledOnce() + await vi.waitFor(() => expect(container.textContent).toBe('Updated account')) + }) + + it('preserves an OAuth return for another source of the same provider', async () => { + const pending: OAuthReturnContext = { + ...context(), + workspaceId: undefined, + organizationId: 'org-1', + connectorId: 'connector-1', + reconnect: true, + } + writeOAuthReturnContext(pending) + + await renderSettings('connector-other') + + expect(readOAuthReturnContext()).toEqual(pending) + expect(mocks.requestJson).not.toHaveBeenCalled() + expect(container.textContent).toBe('Cached account') + }) +}) + describe('KB OAuth return account selection', () => { it('verifies a web return and selects the connected account once', async () => { writeOAuthReturnContext(context()) diff --git a/apps/sim/hooks/use-oauth-return.test.ts b/apps/sim/hooks/use-oauth-return.test.ts index eb768bf5890..7fa611f2b01 100644 --- a/apps/sim/hooks/use-oauth-return.test.ts +++ b/apps/sim/hooks/use-oauth-return.test.ts @@ -185,4 +185,34 @@ describe('buildKnowledgeBaseOAuthReturnUrl', () => { '/workspace/workspace-1/knowledge/kb-1?addConnector=google_drive' ) }) + + it('returns to an existing organization source without opening another source form', () => { + expect( + buildKnowledgeBaseOAuthReturnUrl( + { kind: 'organization', organizationId: 'org-1' }, + 'kb-1', + 'google_drive', + 'connector-1' + ) + ).toBe('/o/org-1/settings/integrations/sources/connector-1?view=settings') + }) + + it('keeps connector identifiers within the source route path segment', () => { + expect( + buildKnowledgeBaseOAuthReturnUrl( + { kind: 'organization', organizationId: 'org-1' }, + 'kb-1', + undefined, + 'connector/other?view=documents' + ) + ).toBe( + '/o/org-1/settings/integrations/sources/connector%2Fother%3Fview%3Ddocuments?view=settings' + ) + }) + + it('preserves workspace knowledge-base returns when an existing connector is supplied', () => { + expect(buildKnowledgeBaseOAuthReturnUrl('workspace-1', 'kb-1', undefined, 'connector-1')).toBe( + '/workspace/workspace-1/knowledge/kb-1' + ) + }) }) diff --git a/apps/sim/hooks/use-oauth-return.ts b/apps/sim/hooks/use-oauth-return.ts index 43d5b1c947a..de28bb691d1 100644 --- a/apps/sim/hooks/use-oauth-return.ts +++ b/apps/sim/hooks/use-oauth-return.ts @@ -25,6 +25,7 @@ import { setOAuthChatAttemptStatus, } from '@/lib/credentials/oauth-chat-attempt' import { getDesktopBridge } from '@/lib/desktop' +import { organizationRoutes } from '@/lib/navigation/paths' import { stripMicrosoftDataverseEnvironmentFromOAuthCallback } from '@/lib/oauth/microsoft-dataverse' import { organizationSearchSetupPath } from '@/lib/sim-search/setup-navigation' import { oauthConnectionsKeys } from '@/hooks/queries/oauth/oauth-connections' @@ -149,6 +150,7 @@ interface OAuthCredentialUpdate { credentialId?: string knowledgeBaseId?: string connectorType?: string + connectorId?: string requestedAt?: number } @@ -172,6 +174,7 @@ function dispatchCredentialUpdate( detail.credentialId = result.credentialId detail.knowledgeBaseId = ctx.knowledgeBaseId detail.connectorType = ctx.connectorType + detail.connectorId = ctx.connectorId detail.requestedAt = ctx.requestedAt } window.dispatchEvent( @@ -313,7 +316,8 @@ export function useOAuthReturnRouter() { buildKnowledgeBaseOAuthReturnUrl( resourceScopeFromOwner(ctx), ctx.knowledgeBaseId, - ctx.connectorType + ctx.connectorType, + ctx.connectorId ) ) } @@ -346,7 +350,8 @@ export function useOAuthReturnRouter() { buildKnowledgeBaseOAuthReturnUrl( resourceScopeFromOwner(ctx), ctx.knowledgeBaseId, - ctx.connectorType + ctx.connectorType, + ctx.connectorId ) ) return @@ -357,10 +362,14 @@ export function useOAuthReturnRouter() { export function buildKnowledgeBaseOAuthReturnUrl( owner: string | ResourceScope, knowledgeBaseId: string, - connectorType?: string + connectorType?: string, + connectorId?: string ): string { const scope = typeof owner === 'string' ? { kind: 'workspace' as const, workspaceId: owner } : owner + if (scope.kind === 'organization' && connectorId) { + return `${organizationRoutes(scope.organizationId).searchSource(connectorId)}?view=settings` + } const kbUrl = scope.kind === 'organization' ? organizationSearchSetupPath(scope.organizationId) @@ -404,7 +413,8 @@ export function useOAuthReturnForKBConnectors( knowledgeBaseId: string | undefined, onConnected?: (credentialId: string) => void, connectorType?: string, - explicitScope?: ResourceScope + explicitScope?: ResourceScope, + connectorId?: string ) { const params = useParams() const workspaceId = explicitScope @@ -426,6 +436,7 @@ export function useOAuthReturnForKBConnectors( !detail?.credentialId || detail.knowledgeBaseId !== knowledgeBaseId || detail.connectorType !== connectorType || + (connectorId && detail.connectorId !== connectorId) || detail.workspaceId !== workspaceId || detail.organizationId !== organizationId || detail.requestedAt === undefined || @@ -445,6 +456,7 @@ export function useOAuthReturnForKBConnectors( ctx.knowledgeBaseId === knowledgeBaseId && ctx.workspaceId === workspaceId && ctx.organizationId === organizationId && + (!connectorId || ctx.connectorId === connectorId) && (!connectorType || ctx.connectorType === connectorType) ) { consumeOAuthReturnContext() @@ -466,7 +478,7 @@ export function useOAuthReturnForKBConnectors( return () => { window.removeEventListener(OAUTH_CREDENTIAL_UPDATED_EVENT, handleCredentialUpdate) } - }, [knowledgeBaseId, onConnected, connectorType, workspaceId, organizationId]) + }, [knowledgeBaseId, onConnected, connectorType, workspaceId, organizationId, connectorId]) } /** diff --git a/apps/sim/lib/api/contracts/knowledge/connectors.test.ts b/apps/sim/lib/api/contracts/knowledge/connectors.test.ts index 3d34c4d37ea..ed6870a25e9 100644 --- a/apps/sim/lib/api/contracts/knowledge/connectors.test.ts +++ b/apps/sim/lib/api/contracts/knowledge/connectors.test.ts @@ -3,15 +3,49 @@ */ import { describe, expect, it } from 'vitest' import { + connectorDocumentsQuerySchema, createConnectorBodySchema, updateConnectorAccessBodySchema, } from '@/lib/api/contracts/knowledge/connectors' +import { MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH } from '@/lib/knowledge/constants' const base = { connectorType: 'google_drive', sourceConfig: { folderId: ['f-1'] }, } +describe('connector document list contracts', () => { + it('accepts each document set and trims filename search without interpreting wildcards', () => { + for (const filter of ['active', 'excluded', 'failed']) { + expect( + connectorDocumentsQuerySchema.parse({ filter, search: ' 50%_report ' }) + ).toMatchObject({ + filter, + search: '50%_report', + }) + } + }) + + it('preserves legacy flags when no document filter is supplied', () => { + expect( + connectorDocumentsQuerySchema.parse({ includeExcluded: 'true', failedOnly: 'false' }) + ).toMatchObject({ + includeExcluded: true, + failedOnly: false, + offset: 0, + }) + }) + + it('rejects unknown filters and oversized searches before execution', () => { + expect(connectorDocumentsQuerySchema.safeParse({ filter: 'all' }).success).toBe(false) + expect( + connectorDocumentsQuerySchema.safeParse({ + search: 'a'.repeat(MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH + 1), + }).success + ).toBe(false) + }) +}) + describe('connector access binding contracts', () => { it('defaults a create to workspace mode with a credential', () => { const parsed = createConnectorBodySchema.parse({ ...base, credentialId: 'cred-1' }) diff --git a/apps/sim/lib/api/contracts/knowledge/connectors.ts b/apps/sim/lib/api/contracts/knowledge/connectors.ts index 89f9f7af06d..c84fcfcdb32 100644 --- a/apps/sim/lib/api/contracts/knowledge/connectors.ts +++ b/apps/sim/lib/api/contracts/knowledge/connectors.ts @@ -15,6 +15,7 @@ import { DEFAULT_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_MUTATION_ITEMS, MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, + MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH, MAX_SEARCH_SOURCE_PROGRESS_ITEMS, MAX_SEARCH_SOURCE_PROVIDER_TYPES, SEARCH_SOURCE_PAGE_SIZE, @@ -63,7 +64,13 @@ export const deleteConnectorQuerySchema = z.object({ deleteDocuments: booleanQueryFlagSchema.optional().default(false), }) +export const connectorDocumentFilterSchema = z.enum(['active', 'excluded', 'failed']) +export type ConnectorDocumentFilter = z.output + export const connectorDocumentsQuerySchema = z.object({ + /** When present, selects the document set instead of the legacy inclusion flags. */ + filter: connectorDocumentFilterSchema.optional(), + search: z.string().trim().max(MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH).optional(), failedOnly: booleanQueryFlagSchema.optional().default(false), includeExcluded: booleanQueryFlagSchema.optional(), limit: z.coerce @@ -75,6 +82,7 @@ export const connectorDocumentsQuerySchema = z.object({ .default(DEFAULT_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE), offset: z.coerce.number().int().min(0).optional().default(0), }) +export type ConnectorDocumentsQuery = z.output export const connectorDocumentsPatchBodySchema = z.object({ operation: z.enum(['restore', 'exclude']), diff --git a/apps/sim/lib/api/contracts/organization-accounts.test.ts b/apps/sim/lib/api/contracts/organization-accounts.test.ts index 0a964866eb1..6e9a19cfb03 100644 --- a/apps/sim/lib/api/contracts/organization-accounts.test.ts +++ b/apps/sim/lib/api/contracts/organization-accounts.test.ts @@ -1,6 +1,9 @@ /** @vitest-environment node */ import { describe, expect, it } from 'vitest' -import { addOrganizationAccountMcpProviderContract } from '@/lib/api/contracts/organization-accounts' +import { + addOrganizationAccountMcpProviderContract, + listOrganizationAccountPeopleContract, +} from '@/lib/api/contracts/organization-accounts' describe('organization MCP provider creation contract', () => { const schema = addOrganizationAccountMcpProviderContract.body @@ -37,3 +40,25 @@ describe('organization MCP provider creation contract', () => { expect(schema.safeParse({ ...databricks, workspaceId: 'workspace-1' }).success).toBe(false) }) }) + +describe('organization account people search contract', () => { + const schema = listOrganizationAccountPeopleContract.query! + + it('adds trimmed substring search while preserving exact email and cursor inputs', () => { + expect( + schema.parse({ search: ' Example ', email: ' alex@example.com ', cursor: 'cursor-1' }) + ).toEqual({ + limit: 50, + search: 'Example', + email: 'alex@example.com', + cursor: 'cursor-1', + }) + expect(schema.parse({})).toEqual({ limit: 50 }) + }) + + it('bounds search text and every response page', () => { + expect(schema.safeParse({ search: 'x'.repeat(321) }).success).toBe(false) + expect(schema.safeParse({ limit: 101 }).success).toBe(false) + expect(schema.safeParse({ search: 'x'.repeat(320), limit: 100 }).success).toBe(true) + }) +}) diff --git a/apps/sim/lib/api/contracts/organization-accounts.ts b/apps/sim/lib/api/contracts/organization-accounts.ts index 5b03d3ca021..1b71874796e 100644 --- a/apps/sim/lib/api/contracts/organization-accounts.ts +++ b/apps/sim/lib/api/contracts/organization-accounts.ts @@ -149,6 +149,7 @@ export const listOrganizationAccountPeopleContract = defineRouteContract({ limit: z.coerce.number().int().min(1).max(100).default(50), cursor: z.string().min(1).max(512).optional(), email: z.string().trim().max(320).optional(), + search: z.string().trim().max(320).optional(), }), response: { mode: 'json', diff --git a/apps/sim/lib/credential-groups/application/organization-account-management.test.ts b/apps/sim/lib/credential-groups/application/organization-account-management.test.ts new file mode 100644 index 00000000000..7dc71157b76 --- /dev/null +++ b/apps/sim/lib/credential-groups/application/organization-account-management.test.ts @@ -0,0 +1,131 @@ +/** @vitest-environment node */ +import type { SessionPrincipal } from '@sim/auth/principal' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ + authorize: vi.fn(), + available: vi.fn(), + group: vi.fn(), + setup: vi.fn(), + list: vi.fn(), +})) +vi.mock('@/lib/core/application/organization-authorization', () => ({ + authorizeOrganizationOperation: mocks.authorize, +})) +vi.mock('@/lib/credential-groups/credentials', () => ({ + loadScopedAccountsCredentialListContext: mocks.group, +})) +vi.mock('@/lib/credential-groups/scoped-availability', () => ({ + isScopedCredentialGroupsAvailable: mocks.available, +})) +vi.mock('@/lib/credential-groups/organization-setup', () => ({ + requireOrganizationAccountsSetup: mocks.setup, +})) +vi.mock('@/lib/credential-groups/provider-availability', () => ({ + listConfiguredCredentialGroupProviders: vi.fn(), +})) +vi.mock('@/lib/credential-groups/self-enrollment', () => ({ + createViewerCredentialGroupEnrollment: vi.fn(), +})) +vi.mock('@/lib/knowledge/access/availability', () => ({ + isKnowledgeMemberAccessAvailable: vi.fn(), +})) +vi.mock('@/lib/credential-groups/service', () => ({ + ensureWorkspaceAccountsGroup: vi.fn(), + getOrganizationAccountsGroup: vi.fn(), + updateCredentialGroup: vi.fn(), +})) +vi.mock('@/lib/credential-groups/enrollments', () => ({ + CredentialGroupEnrollmentError: class extends Error {}, + listCredentialGroupEnrollments: mocks.list, + inviteCredentialGroupEnrollments: vi.fn(), + loadCredentialGroupInviterIdentity: vi.fn(), + resendCredentialGroupEnrollment: vi.fn(), + revokeCredentialGroupEnrollment: vi.fn(), +})) +vi.mock('@/lib/credential-groups/managed-mcp-service', () => ({ + ManagedMcpConnectorError: class extends Error {}, + createManagedMcpConnector: vi.fn(), + deleteManagedMcpConnector: vi.fn(), +})) +vi.mock('@/lib/credential-groups/mcp-oauth-state', () => ({ + clearCredentialGroupMcpOAuthAttempts: vi.fn(), +})) +vi.mock('@/lib/mcp/connection-pool', () => ({ evictMcpServerConnections: vi.fn() })) + +import { OrchestrationError } from '@/lib/core/orchestration/types' +import { + listOrganizationAccountPeople, + organizationAccountManagementOperations, +} from '@/lib/credential-groups/application/organization-account-management' + +const principal: SessionPrincipal = { kind: 'session', userId: 'admin-1', sessionId: 'session-1' } +const input = { organizationId: 'org-1', limit: 50, cursor: 'cursor-1', search: 'example' } + +describe('organization account people search application', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.authorize.mockResolvedValue({ organizationId: 'org-1', userId: 'admin-1', role: 'admin' }) + mocks.available.mockResolvedValue(true) + mocks.group.mockResolvedValue({ credentialGroupId: 'group-1' }) + mocks.setup.mockResolvedValue(undefined) + mocks.list.mockResolvedValue({ enrollments: [], nextCursor: null }) + }) + + it('keeps the existing session-only admin operation and forwards search after authorization', async () => { + const result = await listOrganizationAccountPeople.execute({ principal, input }) + expect(organizationAccountManagementOperations.people).toMatchObject({ + minimumRole: 'admin', + principalKinds: ['session'], + capability: 'integrations.manage', + }) + expect(mocks.authorize).toHaveBeenCalledExactlyOnceWith( + principal, + organizationAccountManagementOperations.people, + input + ) + expect(mocks.list).toHaveBeenCalledExactlyOnceWith( + { kind: 'organization', organizationId: 'org-1' }, + 'group-1', + 50, + 'cursor-1', + { email: undefined, search: 'example' } + ) + expect(result).toEqual({ enrollments: [], nextCursor: null }) + }) + + it('preserves exact email filtering when search is omitted', async () => { + await listOrganizationAccountPeople.execute({ + principal, + input: { organizationId: 'org-1', limit: 20, email: 'person@example.com' }, + }) + expect(mocks.list).toHaveBeenCalledExactlyOnceWith( + { kind: 'organization', organizationId: 'org-1' }, + 'group-1', + 20, + undefined, + { email: 'person@example.com', search: undefined } + ) + }) + + it('does not query people or source accounts after current authorization is refused', async () => { + mocks.authorize.mockRejectedValue(new OrchestrationError('forbidden', 'Admin access required')) + await expect(listOrganizationAccountPeople.execute({ principal, input })).rejects.toMatchObject( + { + code: 'forbidden', + } + ) + expect(mocks.group).not.toHaveBeenCalled() + expect(mocks.list).not.toHaveBeenCalled() + }) + + it('keeps feature availability and account-pool setup gates ahead of search', async () => { + mocks.setup.mockRejectedValue(new OrchestrationError('conflict', 'Account setup required')) + await expect(listOrganizationAccountPeople.execute({ principal, input })).rejects.toMatchObject( + { + code: 'conflict', + } + ) + expect(mocks.list).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/credential-groups/application/organization-account-management.ts b/apps/sim/lib/credential-groups/application/organization-account-management.ts index 905feb0831b..9cf30250d89 100644 --- a/apps/sim/lib/credential-groups/application/organization-account-management.ts +++ b/apps/sim/lib/credential-groups/application/organization-account-management.ts @@ -104,7 +104,7 @@ export const listOrganizationAccountPeople = defineOrganizationAccountsUseCase({ input, context, }: OrganizationExecution< - OrganizationInput & { limit: number; cursor?: string; email?: string } + OrganizationInput & { limit: number; cursor?: string; email?: string; search?: string } >) { const { scope, group } = await requireGroup(context.organizationId) return listCredentialGroupEnrollments( @@ -112,7 +112,7 @@ export const listOrganizationAccountPeople = defineOrganizationAccountsUseCase({ group.credentialGroupId, input.limit, input.cursor, - { email: input.email } + { email: input.email, search: input.search } ) }, }) diff --git a/apps/sim/lib/credential-groups/enrollments.test.ts b/apps/sim/lib/credential-groups/enrollments.test.ts index e0380fadb13..fcb80c12d81 100644 --- a/apps/sim/lib/credential-groups/enrollments.test.ts +++ b/apps/sim/lib/credential-groups/enrollments.test.ts @@ -2,7 +2,7 @@ * @vitest-environment node */ import { dbChainMockFns, queueTableRows, resetDbChainMock, schemaMock } from '@sim/testing' -import { eq, inArray, isNull } from 'drizzle-orm' +import { eq, ilike, inArray, isNull } from 'drizzle-orm' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { adapter } = vi.hoisted(() => ({ @@ -292,6 +292,35 @@ describe('listCredentialGroupEnrollments', () => { ]) }) + it('filters email in SQL before the bounded page and preserves exact-email compatibility', async () => { + dbChainMockFns.limit.mockResolvedValueOnce([{ options: [] }]).mockResolvedValueOnce([]) + const result = await listCredentialGroupEnrollments( + { kind: 'organization', organizationId: 'org-1' }, + 'group-1', + 50, + undefined, + { search: ' A_%\\b ', email: 'exact@example.com' } + ) + expect(ilike).toHaveBeenCalledWith(schemaMock.credentialGroupEnrollment.email, '%A\\_\\%\\\\b%') + expect(eq).toHaveBeenCalledWith(schemaMock.credentialGroupEnrollment.email, 'exact@example.com') + expect(eq).toHaveBeenCalledWith(schemaMock.credentialGroup.organizationId, 'org-1') + expect(eq).toHaveBeenCalledWith(schemaMock.credentialGroup.id, 'group-1') + expect(dbChainMockFns.limit).toHaveBeenNthCalledWith(2, 51) + expect(result).toEqual({ enrollments: [], nextCursor: null }) + }) + + it('ignores blank search and rejects oversized direct search before database loading', async () => { + await expect( + listCredentialGroupEnrollments('workspace-1', 'group-1', 50, undefined, { + search: 'x'.repeat(321), + }) + ).rejects.toMatchObject({ status: 400 }) + expect(dbChainMockFns.select).not.toHaveBeenCalled() + dbChainMockFns.limit.mockResolvedValueOnce([{ options: [] }]).mockResolvedValueOnce([]) + await listCredentialGroupEnrollments('workspace-1', 'group-1', 50, undefined, { search: ' ' }) + expect(ilike).not.toHaveBeenCalled() + }) + it('rejects a malformed enrollment cursor', async () => { dbChainMockFns.limit.mockResolvedValueOnce([{ options: [] }]) diff --git a/apps/sim/lib/credential-groups/enrollments.ts b/apps/sim/lib/credential-groups/enrollments.ts index fe6a93eefdf..fca86c98464 100644 --- a/apps/sim/lib/credential-groups/enrollments.ts +++ b/apps/sim/lib/credential-groups/enrollments.ts @@ -16,6 +16,7 @@ import { normalizeEmail, truncate } from '@sim/utils/string' import { and, asc, count, desc, eq, inArray, isNull, lt, or, type SQL, sql } from 'drizzle-orm' import { renderCredentialGroupInvitationEmail } from '@/components/emails/credential-groups/render' import { getCredentialGroupInvitationSubject } from '@/components/emails/subjects' +import { searchFilter } from '@/lib/api/list-query' import { type ResourceScope, resourceScopeFields, @@ -58,6 +59,7 @@ export type CredentialGroupEnrollmentStatus = EnrollmentRow['status'] export interface ListCredentialGroupEnrollmentFilters { email?: string + search?: string statuses?: CredentialGroupEnrollmentStatus[] } @@ -681,6 +683,10 @@ export async function listCredentialGroupEnrollments( `Credential group enrollment limit must be between 1 and ${MAX_ENROLLMENT_PAGE_SIZE}` ) } + const search = filters.search?.trim() || undefined + if (search && search.length > 320) { + throw new CredentialGroupEnrollmentError('People search must be at most 320 characters', 400) + } const [group] = await db .select({ options: credentialGroup.options }) .from(credentialGroup) @@ -715,6 +721,7 @@ export async function listCredentialGroupEnrollments( eq(credentialGroup.id, groupId), resourceScopeCondition(credentialGroup, scope), filters.email ? eq(credentialGroupEnrollment.email, filters.email) : undefined, + searchFilter(credentialGroupEnrollment.email, search), filters.statuses?.length ? inArray(credentialGroupEnrollment.status, filters.statuses) : undefined, diff --git a/apps/sim/lib/credentials/client-state.ts b/apps/sim/lib/credentials/client-state.ts index 8221391c8a6..4e18b74cc01 100644 --- a/apps/sim/lib/credentials/client-state.ts +++ b/apps/sim/lib/credentials/client-state.ts @@ -78,6 +78,7 @@ interface OAuthReturnKBConnectors extends OAuthReturnBase { origin: 'kb-connectors' knowledgeBaseId: string connectorType?: string + connectorId?: string } export type OAuthReturnContext = diff --git a/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts b/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts index 42d2b99b9bd..c14ee7c7a17 100644 --- a/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts @@ -11,6 +11,7 @@ import { import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import type { ConnectorDocumentFilter } from '@/lib/api/contracts/knowledge/connectors' import { createKnowledgeAclFixtureIds, seedKnowledgeAclFixture, @@ -129,3 +130,156 @@ describe('viewer-isolated indexing progress and recovery lists', () => { ) }) }) + +describe('connector document filename search and document sets', () => { + const fixture = createKnowledgeAclFixtureIds() + const viewer = { kind: 'session' as const, userId: fixture.aliceId, sessionId: 'fixture-search' } + const otherViewer = { ...viewer, userId: fixture.bobId } + const planIds = [generateId(), generateId()].sort() + const excludedId = generateId() + const failureId = generateId() + const privateId = generateId() + const literalId = generateId() + const quoteId = generateId() + const scope = { knowledgeBaseId: fixture.knowledgeBaseId, connectorId: fixture.connectorId } + + beforeAll(async () => { + await seedKnowledgeAclFixture(fixture) + const rows: Array & { id: string; filename: string }> = [ + ...Array.from({ length: 221 }, (_, index) => ({ + id: generateId(), + filename: `aaa-${String(index).padStart(3, '0')}.md`, + })), + ...planIds.map((id) => ({ id, filename: 'zNeedle plan.md' })), + { id: failureId, filename: 'zNeedle failure.md', processingStatus: 'failed' }, + { + id: excludedId, + filename: 'zNeedle excluded.md', + processingStatus: 'failed', + userExcluded: true, + }, + { + id: privateId, + filename: 'zNeedle private.md', + processingStatus: 'failed', + acl: [`u:${fixture.bobId}@fixture.test`], + }, + { id: generateId(), filename: 'zNeedle deleted.md', deletedAt: new Date() }, + { id: generateId(), filename: 'zNeedle archived.md', archivedAt: new Date() }, + { id: literalId, filename: 'Literal 50%_\\Team.md' }, + { id: generateId(), filename: 'Literal 500ABC Team.md' }, + { id: quoteId, filename: "O'Brien.md" }, + ] + await db.insert(document).values( + rows.map((row) => ({ + knowledgeBaseId: fixture.knowledgeBaseId, + connectorId: fixture.connectorId, + externalId: row.id, + fileUrl: `https://fixture.test/${row.id}`, + fileSize: 10, + mimeType: 'text/plain', + processingStatus: 'completed', + acl: [`u:${fixture.aliceId}@fixture.test`], + aclVerifiedAt: new Date(), + ...row, + })) + ) + }) + + afterAll(async () => { + await db.delete(workspace).where(eq(workspace.id, fixture.workspaceId)) + await db.delete(organization).where(eq(organization.id, fixture.organizationId)) + await db.delete(user).where(eq(user.id, fixture.aliceId)) + await db.delete(user).where(eq(user.id, fixture.bobId)) + }) + + it('finds documents beyond the first page and returns all searched counts for every set', async () => { + const firstPage = await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, filter: 'active', limit: 200 }, + }) + expect(firstPage.documents).toHaveLength(200) + expect(firstPage.hasMore).toBe(true) + expect(firstPage.documents.every((row) => row.filename.startsWith('aaa-'))).toBe(true) + + const expectedIds: Record = { + active: [failureId, ...planIds], + excluded: [excludedId], + failed: [failureId], + } + for (const filter of ['active', 'excluded', 'failed'] as const) { + const result = await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, filter, search: ' nEeDle ' }, + }) + expect(result.documents.map((row) => row.id)).toEqual(expectedIds[filter]) + expect(result.counts).toEqual({ active: 3, excluded: 1, failed: 1 }) + expect(result.hasMore).toBe(false) + } + }) + + it('paginates within matching filenames with a stable ID tie-breaker', async () => { + const results = [] + for (const offset of [0, 1]) { + results.push( + await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, filter: 'active', search: 'needle plan', limit: 1, offset }, + }) + ) + } + expect(results.flatMap((result) => result.documents.map((row) => row.id))).toEqual(planIds) + expect(results.map((result) => result.hasMore)).toEqual([true, false]) + expect(results.map((result) => result.counts.active)).toEqual([2, 2]) + }) + + it('treats SQL pattern characters and quotes literally', async () => { + for (const [search, id] of [ + ['50%_\\', literalId], + ["O'Brien", quoteId], + ] as const) { + const result = await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, filter: 'active', search }, + }) + expect(result.documents.map((row) => row.id)).toEqual([id]) + expect(result.counts).toEqual({ active: 1, excluded: 0, failed: 0 }) + } + }) + + it('keeps legacy flags and limits both results and counts to current document access', async () => { + const mixed = await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, search: 'needle', includeExcluded: true }, + }) + expect(mixed.documents.map((row) => row.id)).toEqual([failureId, ...planIds, excludedId]) + const failures = await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, search: 'needle', includeExcluded: true, failedOnly: true }, + }) + expect(failures.documents.map((row) => row.id)).toEqual([failureId]) + const override = await listKnowledgeConnectorDocuments.execute({ + principal: viewer, + input: { ...scope, search: 'needle', filter: 'excluded', failedOnly: true }, + }) + expect(override.documents.map((row) => row.id)).toEqual([excludedId]) + const privateResult = await listKnowledgeConnectorDocuments.execute({ + principal: otherViewer, + input: { ...scope, filter: 'active', search: 'needle' }, + }) + expect(privateResult.documents.map((row) => row.id)).toEqual([privateId]) + expect(privateResult.counts).toEqual({ active: 1, excluded: 0, failed: 1 }) + + await db + .delete(permissions) + .where( + and(eq(permissions.entityId, fixture.workspaceId), eq(permissions.userId, fixture.bobId)) + ) + await expect( + listKnowledgeConnectorDocuments.execute({ + principal: otherViewer, + input: { ...scope, filter: 'active', search: 'needle' }, + }) + ).rejects.toThrow('Insufficient workspace permissions') + }) +}) diff --git a/apps/sim/lib/knowledge/application/connectors.test.ts b/apps/sim/lib/knowledge/application/connectors.test.ts index ab3a75f7e4b..652c8b40e18 100644 --- a/apps/sim/lib/knowledge/application/connectors.test.ts +++ b/apps/sim/lib/knowledge/application/connectors.test.ts @@ -137,6 +137,7 @@ import { updateKnowledgeConnectorDocuments, validateConnectorSourceConfig, } from '@/lib/knowledge/application/connectors' +import { MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH } from '@/lib/knowledge/constants' import { capabilityRefusal } from '@/lib/permission-groups/capability-assertions' import { DEFAULT_PERMISSION_GROUP_CONFIG } from '@/lib/permission-groups/fields' import { googleDriveConnectorMeta } from '@/connectors/google-drive/meta' @@ -850,6 +851,25 @@ describe('knowledge connector application use cases', () => { expect(mocks.recordAudit).not.toHaveBeenCalled() }) + it('bounds connector filename searches for direct application callers', async () => { + mocks.resolveConnector.mockResolvedValueOnce({ + ...connectorContext, + workspaceId: 'workspace-a', + knowledgeBaseId: 'knowledge-a', + }) + await expect( + listKnowledgeConnectorDocuments.execute({ + principal: delegatedPrincipal, + input: { + knowledgeBaseId: 'knowledge-a', + connectorId: 'connector-b', + search: 'x'.repeat(MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH + 1), + }, + }) + ).rejects.toMatchObject({ code: 'validation' }) + expect(dbChainMockFns.select).not.toHaveBeenCalled() + }) + it('deduplicates connector document IDs before mutation and audit', async () => { const sameWorkspaceContext = { ...connectorContext, diff --git a/apps/sim/lib/knowledge/application/connectors.ts b/apps/sim/lib/knowledge/application/connectors.ts index 5b1861cbaa2..853f08ca224 100644 --- a/apps/sim/lib/knowledge/application/connectors.ts +++ b/apps/sim/lib/knowledge/application/connectors.ts @@ -13,6 +13,7 @@ import { } from '@sim/db/schema' import { truncate } from '@sim/utils/string' import { and, asc, count, desc, eq, inArray, isNull, lt, or, sql } from 'drizzle-orm' +import type { ConnectorDocumentFilter } from '@/lib/api/contracts/knowledge/connectors' import type { BillingAttributionSnapshot } from '@/lib/billing/core/billing-attribution' import { requireCurrentHumanRole } from '@/lib/core/application' import { requireOrganizationMembership } from '@/lib/core/application/organization-authorization' @@ -68,6 +69,7 @@ import { DEFAULT_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_MUTATION_ITEMS, MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE, + MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH, } from '@/lib/knowledge/constants' import { type ResolvedMembersBinding, @@ -87,6 +89,7 @@ import type { KnowledgeOrchestrationResult, } from '@/lib/knowledge/orchestration/shared' import { requireOrganizationSearchApproval } from '@/lib/knowledge/search/integration-policy' +import { escapeLikePattern } from '@/lib/knowledge/tags/utils' import { isMemberSyncStatus } from '@/lib/knowledge/types' import { credentialProviderMatchesService, type ServiceProviderIdentity } from '@/lib/oauth' import { CAPABILITY_RULES, refuseCapability } from '@/lib/permission-groups/capabilities' @@ -158,6 +161,8 @@ export interface SyncKnowledgeConnectorInput extends KnowledgeConnectorApplicati } export interface ListKnowledgeConnectorDocumentsInput extends ReadKnowledgeConnectorInput { + filter?: ConnectorDocumentFilter + search?: string failedOnly?: boolean includeExcluded?: boolean limit?: number @@ -1132,18 +1137,30 @@ export const listKnowledgeConnectorDocuments = defineAuthorizedKnowledgeUseCase( 'Connector document offset must be a non-negative integer' ) } + const search = input.search?.trim() + if (search && search.length > MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH) { + throw new OrchestrationError( + 'validation', + `Connector document search must be at most ${MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH} characters` + ) + } + const filter = + input.filter ?? (input.failedOnly ? 'failed' : input.includeExcluded ? undefined : 'active') const baseConditions = [ eq(document.connectorId, context.connectorId), isNull(document.archivedAt), isNull(document.deletedAt), knowledgeAccessCondition(await context.access.get()), + search + ? sql`${document.filename} ILIKE ${`%${escapeLikePattern(search)}%`} ESCAPE '\\'` + : undefined, ] as const const [[activeCount], excludedCountRows, [failedCount]] = await Promise.all([ db .select({ value: count() }) .from(document) .where(and(...baseConditions, eq(document.userExcluded, false))), - input.includeExcluded + input.filter || input.includeExcluded ? db .select({ value: count() }) .from(document) @@ -1167,8 +1184,8 @@ export const listKnowledgeConnectorDocuments = defineAuthorizedKnowledgeUseCase( .where( and( ...baseConditions, - input.includeExcluded && !input.failedOnly ? undefined : eq(document.userExcluded, false), - input.failedOnly ? eq(document.processingStatus, 'failed') : undefined + filter ? eq(document.userExcluded, filter === 'excluded') : undefined, + filter === 'failed' ? eq(document.processingStatus, 'failed') : undefined ) ) .orderBy(asc(document.userExcluded), asc(document.filename), asc(document.id)) diff --git a/apps/sim/lib/knowledge/constants.ts b/apps/sim/lib/knowledge/constants.ts index 5402f81fb1d..b65aa6bd77f 100644 --- a/apps/sim/lib/knowledge/constants.ts +++ b/apps/sim/lib/knowledge/constants.ts @@ -19,6 +19,7 @@ export const MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_MUTATION_ITEMS = 100 /** Default and maximum bounded connector-document list page sizes. */ export const DEFAULT_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE = 100 export const MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_PAGE_SIZE = 200 +export const MAX_KNOWLEDGE_CONNECTOR_DOCUMENT_SEARCH_LENGTH = 200 /** Maximum source IDs in one viewer-authorized progress request. */ export const MAX_SEARCH_SOURCE_PROGRESS_ITEMS = 100 diff --git a/apps/sim/lib/navigation/paths.ts b/apps/sim/lib/navigation/paths.ts index b11070e5e5d..75fe8260894 100644 --- a/apps/sim/lib/navigation/paths.ts +++ b/apps/sim/lib/navigation/paths.ts @@ -38,6 +38,8 @@ export function organizationRoutes(organizationId: string) { integrations: `${root}/integrations`, skills: `${root}/skills`, settings: `${root}/settings`, + searchSource: (connectorId: string) => + `${root}/settings/integrations/sources/${encodeURIComponent(connectorId)}`, settingsSection: (section: string) => `${root}/settings/${section}`, chat: (chatId: string) => `${root}/chat/${chatId}`, } as const From c6788c9dac4bbfd17865eaafb82dbdbaeeb69445 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 14:12:15 -0700 Subject: [PATCH 05/14] improvement(search): align source actions and load people concurrently --- ...rganization-integrations-settings.test.tsx | 54 +++- .../organization-integrations-settings.tsx | 48 ++-- .../[connectorId]/source-detail.test.tsx | 57 +++- .../sources/[connectorId]/source-detail.tsx | 89 +++--- .../connector-documents.tsx | 39 ++- .../connectors-section/connector-actions.tsx | 181 ++++-------- .../use-connector-actions.ts | 143 ++++++++++ .../organization-account-people.test.tsx | 25 +- .../organization-account-people.tsx | 258 +++++++++--------- .../queries/organization-accounts.test.tsx | 71 ++++- .../hooks/queries/organization-accounts.ts | 20 +- 11 files changed, 633 insertions(+), 352 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions.ts diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx index d6b5d316464..c4a3e799713 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx @@ -78,12 +78,16 @@ describe('organization integration invitations', () => { ) } - async function click(label: string) { + function findButton(label: string) { const button = Array.from(document.querySelectorAll('button')).find( (element) => element.textContent === label ) if (!button) throw new Error(`Missing ${label} button`) - await act(async () => button.click()) + return button + } + + async function click(label: string) { + await act(async () => findButton(label).click()) } it('keeps provider setup as the default and sends manual invitations from People to this org', async () => { @@ -95,7 +99,7 @@ describe('organization integration invitations', () => { await click('People') expect(container.textContent).not.toContain('Provider setup') expect(mocks.accounts).toHaveBeenLastCalledWith('org-a') - expect(mocks.people).toHaveBeenLastCalledWith('org-a', '') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: true }) expect(container.querySelector('input[placeholder="Search people..."]')).not.toBeNull() expect(mocks.invite).not.toHaveBeenCalled() @@ -119,15 +123,50 @@ describe('organization integration invitations', () => { await render('?tab=people') expect(container.textContent).toContain('Request connections') expect(container.textContent).not.toContain('Provider setup') - expect(mocks.people).toHaveBeenLastCalledWith('org-a', '') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: true }) + }) + + it('loads people alongside setup but waits for the pool before allowing invitations', async () => { + mocks.accounts.mockReturnValue({ data: undefined, error: null, isPending: true }) + await render('?tab=people') + expect(mocks.accounts).toHaveBeenLastCalledWith('org-a') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: true }) + expect(container.textContent).toContain('Loading connected accounts') + expect(container.textContent).not.toContain('No people invited yet') + expect(findButton('Request connections')).toBeDisabled() + await click('Request connections') + expect(document.querySelector('[role="dialog"]')).toBeNull() + + mocks.accounts.mockReturnValue({ data: { credentialGroup: { id: 'group-a' } }, error: null }) + await render('?tab=people') + expect(container.textContent).not.toContain('Loading connected accounts') + expect(findButton('Request connections')).not.toBeDisabled() + await click('Request connections') + expect(document.querySelector('[role="dialog"]')).not.toBeNull() + expect(mocks.invite).not.toHaveBeenCalled() + }) + + it('stops the people query when setup resolves without a pool and preserves the setup action', async () => { + mocks.accounts.mockReturnValue({ data: undefined, error: null, isPending: true }) + mocks.people.mockReturnValue({ error: new Error('Organization accounts not configured') }) + await render('?tab=people') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: true }) + expect(container.textContent).not.toContain('Organization accounts not configured') + + mocks.accounts.mockReturnValue({ data: { credentialGroup: null }, error: null }) + await render('?tab=people') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) + expect(container.textContent).toContain('before inviting people') + expect(container.textContent).not.toContain('Organization accounts not configured') + expect(findButton('Request connections')).toBeDisabled() }) it('sends an org without a credential group back to provider setup before invitations', async () => { mocks.accounts.mockReturnValue({ data: { credentialGroup: null }, error: null }) await render('?tab=people') expect(container.textContent).toContain('before inviting people') - expect(mocks.people).not.toHaveBeenCalled() - expect(container.textContent).not.toContain('Request connections') + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) + expect(findButton('Request connections')).toBeDisabled() await click('Set up providers') expect(container.textContent).toContain('Provider setup') expect(mocks.invite).not.toHaveBeenCalled() @@ -141,7 +180,8 @@ describe('organization integration invitations', () => { await render('?tab=people') expect(container.textContent).toContain('Account access denied') expect(container.textContent).not.toContain('Set up providers') - expect(mocks.people).not.toHaveBeenCalled() + expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) + expect(findButton('Request connections')).toBeDisabled() await click('Try again') expect(mocks.refetch).toHaveBeenCalledOnce() }) diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx index ea16315bafe..6fb43d013cd 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx @@ -37,27 +37,33 @@ export function OrganizationIntegrationsSettings() { />
    {tab === 'providers' && } - {tab === 'people' && - (accounts.error ? ( - void accounts.refetch()} - variant='inline' - /> - ) : !accounts.data ? ( - Loading connected accounts… - ) : !accounts.data.credentialGroup ? ( -
    - - Set up a provider for personal account connections before inviting people. - - void setTab('providers')}>Set up providers -
    - ) : ( - - ))} + {tab === 'people' && ( + void accounts.refetch()} + variant='inline' + /> + ) : !accounts.data ? ( + Loading connected accounts… + ) : !accounts.data.credentialGroup ? ( +
    + + Set up a provider for personal account connections before inviting people. + + void setTab('providers')}>Set up providers +
    + ) : undefined + } + /> + )} ) } diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx index ba683d53bb9..f2167a85983 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx @@ -5,6 +5,7 @@ import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { ApiClientError } from '@/lib/api/client/errors' import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' +import type { ConnectorActionsOptions } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions' const mocks = vi.hoisted(() => ({ admin: true, @@ -53,16 +54,24 @@ vi.mock( }) ) vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section', () => ({ - ConnectorActions: (props: unknown) => { - mocks.actions(props) - return - }, ConnectorRecovery: () => null, ConnectorSyncHistory: () => { mocks.history() return

    Source sync history

    }, })) +vi.mock( + '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions', + () => ({ + useConnectorActions: mocks.actions, + }) +) +vi.mock( + '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions', + () => ({ + ConnectorActionFeedback: () => null, + }) +) vi.mock( '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form', () => ({ useConnectorSettingsForm: mocks.form }) @@ -113,6 +122,19 @@ describe('organization source detail navigation', () => { mocks.dirty = false mocks.index.mockReturnValue({ data: { knowledgeBaseId: 'index-one' }, isPending: false }) mocks.detail.mockReturnValue({ data: connector }) + mocks.actions.mockImplementation((options: ConnectorActionsOptions) => ({ + actions: [ + { + id: 'sync', + text: 'Sync now', + variant: options.primarySync ? 'primary' : undefined, + disabled: options.disabled, + onSelect: vi.fn(), + }, + { id: 'pause', text: 'Pause', disabled: options.disabled, onSelect: vi.fn() }, + { id: 'delete', text: 'Remove', disabled: options.disabled, onSelect: vi.fn() }, + ], + })) mocks.form.mockImplementation(() => ({ dirty: mocks.dirty, saving: false, @@ -171,9 +193,9 @@ describe('organization source detail navigation', () => { expect(mocks.documents).toHaveBeenLastCalledWith( expect.objectContaining({ search: 'notes', filter: 'excluded' }) ) - expect( - container.querySelector('input[placeholder="Search documents..."]')?.value - ).toBe('notes') + expect(mocks.documents).toHaveBeenLastCalledWith( + expect.objectContaining({ searchControl: { value: 'notes', onChange: expect.any(Function) } }) + ) }) it.each([ @@ -206,6 +228,15 @@ describe('organization source detail navigation', () => { it('requires discard confirmation before leaving dirty settings', async () => { mocks.dirty = true await render('?view=settings') + expect(mocks.actions).toHaveBeenLastCalledWith( + expect.objectContaining({ disabled: true, primarySync: false }) + ) + for (const label of ['Sync now', 'Pause', 'Remove']) { + const action = Array.from(container.querySelectorAll('button')).find( + (item) => item.textContent === label + ) + expect(action).toBeDisabled() + } await click('Documents') expect(document.querySelector('[role="dialog"]')?.textContent).toContain('Unsaved Changes') expect(mocks.documents).not.toHaveBeenCalled() @@ -215,6 +246,18 @@ describe('organization source detail navigation', () => { await click('Discard Changes') expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') }) + + it('places source actions in the resource header before the view tabs', async () => { + await render() + const sync = Array.from(container.querySelectorAll('button')).find( + (item) => item.textContent === 'Sync now' + ) + const tabs = container.querySelector('[aria-label="Source views"]') + expect(sync).toBeTruthy() + expect(tabs).toBeTruthy() + expect(sync!.compareDocumentPosition(tabs!)).toBe(Node.DOCUMENT_POSITION_FOLLOWING) + expect(mocks.actions).toHaveBeenLastCalledWith(expect.objectContaining({ primarySync: true })) + }) it.each(['index', 'detail'] as const)( 'preserves a dirty draft when a background %s refresh fails', async (query) => { diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx index c8824b4a48d..f1b7e8e02dd 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx @@ -6,6 +6,7 @@ import { ArrowLeft } from '@sim/emcn/icons' import { useRouter } from 'next/navigation' import { useQueryState } from 'nuqs' import { saveDiscardActions } from '@/components/settings/save-discard-actions' +import type { SettingsAction, SettingsBackAction } from '@/components/settings/settings-header' import { SettingsPanel } from '@/components/settings/settings-panel' import { useSettingsUnsavedGuard } from '@/components/settings/use-settings-unsaved-guard' import { isApiClientError } from '@/lib/api/client/errors' @@ -23,11 +24,12 @@ import { import { UnsavedChangesModal } from '@/app/workspace/[workspaceId]/components/credential-detail/components/unsaved-changes-modal' import { ConnectorDocuments } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents' import { - ConnectorActions, ConnectorRecovery, ConnectorSyncHistory, } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section' +import { ConnectorActionFeedback } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions' import { getConnectorSyncState } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state' +import { useConnectorActions } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions' import { ConnectorSettingsFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields' import { useConnectorSettingsForm } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form' import { @@ -201,24 +203,16 @@ function SourceDetailContent({ connector, scope, backHref, queryError }: SourceD /> ) return ( - {queryError} - + void setFilter(next)} progressScope={scope} @@ -243,44 +238,64 @@ function SourceDetailContent({ connector, scope, backHref, queryError }: SourceD detail={connector} /> )} - + ) } interface SourceNavigationProps { - connector: ConnectorData view: SourceView onViewChange: (view: string) => void - onRemoved: () => void - disabled?: boolean } -function SourceNavigation({ - connector, - view, - onViewChange, - onRemoved, - disabled = false, -}: SourceNavigationProps) { +function SourceNavigation({ view, onViewChange }: SourceNavigationProps) { return ( -
    +
    -
    ) } +interface SourcePanelProps { + connector: ConnectorData + back: SettingsBackAction + title: string + description?: string + docsLink?: string + actions?: SettingsAction[] + lifecycleDisabled?: boolean + onRemoved: () => void + children: ReactNode +} + +function SourcePanel({ + connector, + actions, + lifecycleDisabled, + onRemoved, + children, + ...panel +}: SourcePanelProps) { + const lifecycle = useConnectorActions({ + connector, + knowledgeBaseId: connector.knowledgeBaseId, + canEdit: true, + disabled: lifecycleDisabled, + primarySync: !actions, + onRemoved, + }) + return ( + + + {children} + + ) +} + interface SourceSettingsEditorProps { connector: ConnectorData scope: ResourceScope @@ -333,11 +348,14 @@ function SourceSettingsForm({ }) const guard = useSettingsUnsavedGuard({ isDirty: form.dirty, navigationBlocked: form.saving }) return ( - guard.guardBack(onBack) }} title={title} description={description} docsLink={form.docsUrl} + lifecycleDisabled={form.dirty || form.saving} + onRemoved={onBack} actions={saveDiscardActions({ dirty: form.dirty, saving: form.saving, @@ -348,13 +366,10 @@ function SourceSettingsForm({ > {queryError} { if (next !== 'settings') guard.guardBack(() => onViewChange(next)) }} - onRemoved={onBack} - disabled={form.dirty || form.saving} />
    @@ -364,6 +379,6 @@ function SourceSettingsForm({ onOpenChange={guard.setShowUnsavedModal} onDiscard={guard.confirmDiscard} /> - + ) } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx index 05e093d8f3f..8c698f67158 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents.tsx @@ -1,7 +1,7 @@ 'use client' -import { Chip, ChipDropdown, ChipLink, Skeleton } from '@sim/emcn' -import { RefreshCw, SquareArrowUpRight } from '@sim/emcn/icons' +import { Chip, ChipDropdown, ChipInput, ChipLink, Skeleton } from '@sim/emcn' +import { RefreshCw, Search, SquareArrowUpRight } from '@sim/emcn/icons' import type { ConnectorDocumentFilter } from '@/lib/api/contracts/knowledge/connectors' import type { ResourceScope } from '@/lib/core/resource-scope' import { @@ -23,6 +23,7 @@ interface ConnectorDocumentsProps { knowledgeBaseId: string connectorId: string search?: string + searchControl?: { value: string; onChange: (value: string) => void } progressScope?: ResourceScope syncing?: boolean filter: ConnectorDocumentFilter @@ -34,6 +35,7 @@ export function ConnectorDocuments({ connectorId, filter, search, + searchControl, progressScope, syncing, onFilterChange, @@ -67,21 +69,20 @@ export function ConnectorDocuments({ retryMutation.reset() } - if (query.isError && !query.isFetchNextPageError) { - return ( - query.refetch()} - fallback='Could not load documents' - /> - ) - } - return ( <>
    -
    +
    + {searchControl && ( + searchControl.onChange(event.target.value)} + autoComplete='off' + className='min-w-0 flex-1' + /> + )}
    - {isLoading ? ( + {query.isError && !query.isFetchNextPageError ? ( + query.refetch()} + fallback='Could not load documents' + variant='inline' + /> + ) : isLoading ? ( <> diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx index 9a131250771..cc2e15757d1 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-actions.tsx @@ -1,6 +1,6 @@ 'use client' -import { useId, useState } from 'react' +import { useId } from 'react' import { Checkbox, Chip, @@ -10,183 +10,98 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, - DropdownMenuSeparator, DropdownMenuTrigger, - Tooltip, } from '@sim/emcn' import { MoreHorizontal } from '@sim/emcn/icons' -import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' -import { getConnectorSyncState } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state' -import { SettingsEmptyState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { SettingsActionChip } from '@/components/settings/settings-header' import { - useDeleteConnector, - useTriggerSync, - useUpdateConnector, -} from '@/hooks/queries/kb/connectors' - -interface ConnectorActionsProps { - connector: ConnectorData - knowledgeBaseId: string - canEdit: boolean - disabled?: boolean - onEdit?: () => void - onRemoved?: () => void -} - -export function ConnectorActions({ - connector, - knowledgeBaseId, - canEdit, - disabled = false, - onEdit, - onRemoved, -}: ConnectorActionsProps) { - const sync = useTriggerSync() - const update = useUpdateConnector() - const remove = useDeleteConnector() - const deleteDocumentsId = useId() - const [confirmRemove, setConfirmRemove] = useState(false) - const [deleteDocuments, setDeleteDocuments] = useState(false) - const state = getConnectorSyncState(connector) - const isPending = sync.isPending || update.isPending || remove.isPending - const actionsDisabled = disabled || isPending - const error = sync.error ?? update.error - - function resetErrors() { - sync.reset() - update.reset() - remove.reset() - } - - function triggerSync(rehydrate = false) { - if (actionsDisabled || state.syncDisabled) return - resetErrors() - sync.mutate({ knowledgeBaseId, connectorId: connector.id, rehydrate }) - } - - function setRemoveOpen(open: boolean) { - if (remove.isPending) return - setConfirmRemove(open) - if (!open) setDeleteDocuments(false) - } - - if (!canEdit) return null + type ConnectorActionState, + type ConnectorActionsOptions, + useConnectorActions, +} from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions' +import { SettingsEmptyState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +export function ConnectorActions(props: ConnectorActionsOptions) { + const state = useConnectorActions(props) + if (!state.canEdit) return null + const [sync, ...menuActions] = state.actions return (
    - - - - triggerSync()}> - {state.syncLabel} - - - - {state.syncTooltip && {state.syncTooltip}} - + {sync && } - {state.canFullResync && ( + {menuActions.map((action) => ( triggerSync(true)} + key={action.id} + disabled={action.disabled} + onSelect={action.onSelect} > - Full resync + {action.text} - )} - {onEdit && ( - - Settings - - )} - { - if (actionsDisabled) return - resetErrors() - update.mutate({ - knowledgeBaseId, - connectorId: connector.id, - updates: { status: state.canResume ? 'active' : 'paused' }, - }) - }} - > - {state.canResume ? 'Resume' : 'Pause'} - - - { - resetErrors() - setRemoveOpen(true) - }} - > - Remove - + ))}
    - {error && ( + +
    + ) +} + +interface ConnectorActionFeedbackProps { + state: ConnectorActionState +} + +export function ConnectorActionFeedback({ state }: ConnectorActionFeedbackProps) { + const deleteDocumentsId = useId() + if (!state.canEdit) return null + const { removal } = state + return ( + <> + {state.error && ( - {error.message} + {state.error.message} )} { - if (actionsDisabled) return - remove.mutate( - { - knowledgeBaseId, - connectorId: connector.id, - deleteDocuments: state.syncsPerMember || deleteDocuments, - }, - { - onSuccess: () => { - setConfirmRemove(false) - setDeleteDocuments(false) - onRemoved?.() - }, - } - ) - }, + onClick: removal.onConfirm, }} > - {!state.syncsPerMember && ( + {!removal.syncsPerMember && (
    setDeleteDocuments(checked === true)} + checked={removal.deleteDocuments} + disabled={removal.pending} + onCheckedChange={(checked) => removal.setDeleteDocuments(checked === true)} />
    )} - {remove.error?.message} + {removal.error?.message}
    -
    + ) } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions.ts new file mode 100644 index 00000000000..e1a1539aeef --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/use-connector-actions.ts @@ -0,0 +1,143 @@ +'use client' + +import { useState } from 'react' +import type { SettingsAction } from '@/components/settings/settings-header' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' +import { getConnectorSyncState } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-sync-state' +import { + useDeleteConnector, + useTriggerSync, + useUpdateConnector, +} from '@/hooks/queries/kb/connectors' + +export interface ConnectorActionsOptions { + connector: ConnectorData + knowledgeBaseId: string + canEdit: boolean + disabled?: boolean + primarySync?: boolean + onEdit?: () => void + onRemoved?: () => void +} + +export function useConnectorActions({ + connector, + knowledgeBaseId, + canEdit, + disabled = false, + primarySync = false, + onEdit, + onRemoved, +}: ConnectorActionsOptions) { + const sync = useTriggerSync() + const update = useUpdateConnector() + const remove = useDeleteConnector() + const [confirmRemove, setConfirmRemove] = useState(false) + const [deleteDocuments, setDeleteDocuments] = useState(false) + const state = getConnectorSyncState(connector) + const actionsDisabled = disabled || sync.isPending || update.isPending || remove.isPending + + function resetErrors() { + sync.reset() + update.reset() + remove.reset() + } + + function triggerSync(rehydrate = false) { + if (!canEdit || actionsDisabled || state.syncDisabled) return + resetErrors() + sync.mutate({ knowledgeBaseId, connectorId: connector.id, rehydrate }) + } + + function setRemoveOpen(open: boolean) { + if (remove.isPending) return + setConfirmRemove(open) + if (!open) setDeleteDocuments(false) + } + + const actions: SettingsAction[] = canEdit + ? [ + { + id: 'sync', + text: state.syncLabel, + variant: primarySync ? 'primary' : undefined, + disabled: state.syncDisabled || actionsDisabled, + tooltip: state.syncTooltip, + onSelect: () => triggerSync(), + }, + ...(state.canFullResync + ? [ + { + id: 'full-resync', + text: 'Full resync', + disabled: state.syncDisabled || actionsDisabled, + onSelect: () => triggerSync(true), + }, + ] + : []), + ...(onEdit + ? [{ id: 'settings', text: 'Settings', disabled: actionsDisabled, onSelect: onEdit }] + : []), + { + id: 'pause', + text: state.canResume ? 'Resume' : 'Pause', + disabled: actionsDisabled, + onSelect: () => { + if (actionsDisabled) return + resetErrors() + update.mutate({ + knowledgeBaseId, + connectorId: connector.id, + updates: { status: state.canResume ? 'active' : 'paused' }, + }) + }, + }, + { + id: 'delete', + text: 'Remove', + disabled: actionsDisabled, + onSelect: () => { + if (actionsDisabled) return + resetErrors() + setRemoveOpen(true) + }, + }, + ] + : [] + + return { + actions, + actionsDisabled, + canEdit, + error: sync.error ?? update.error, + removal: { + open: confirmRemove, + onOpenChange: setRemoveOpen, + syncsPerMember: state.syncsPerMember, + deleteDocuments, + setDeleteDocuments, + pending: remove.isPending, + disabled: actionsDisabled, + error: remove.error, + onConfirm: () => { + if (!canEdit || actionsDisabled) return + remove.mutate( + { + knowledgeBaseId, + connectorId: connector.id, + deleteDocuments: state.syncsPerMember || deleteDocuments, + }, + { + onSuccess: () => { + setConfirmRemove(false) + setDeleteDocuments(false) + onRemoved?.() + }, + } + ) + }, + }, + } +} + +export type ConnectorActionState = ReturnType diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx index 4ee82c98544..d6fd26e0db5 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx @@ -193,7 +193,7 @@ it('restores the existing People URL search and requests server-filtered results ) ) - expect(mocks.people).toHaveBeenLastCalledWith('organization-1', 'late-page') + expect(mocks.people).toHaveBeenLastCalledWith('organization-1', 'late-page', { enabled: true }) expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('late-page') expect(container.textContent).toContain('No people match your search') expect(container.textContent).not.toContain('loaded people') @@ -216,6 +216,29 @@ it('keeps header search available after a people request fails', async () => { expect(container.textContent).toContain('People unavailable') }) +it('keeps setup fallback in the standard panel without exposing cached people or actions', async () => { + await act(async () => + root.render( + + + + Set up a provider first} + /> + + + + ) + ) + expect(mocks.people).toHaveBeenLastCalledWith('organization-1', '', { enabled: false }) + expect(container.textContent).toContain('Set up a provider first') + expect(container.textContent).not.toContain('person@example.com') + expect(button(container, 'Request connections')).toBeDisabled() + expect(container.querySelector('input[placeholder="Search people..."]')).not.toBeNull() +}) + it('retains loaded people and retries only the failed next page', async () => { const fetchNextPage = vi.fn() const refetch = vi.fn() diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.tsx index cb595dde0f8..bf64335350c 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState } from 'react' +import { type ReactNode, useState } from 'react' import { Chip, ChipConfirmModal, ChipModalError, toast } from '@sim/emcn' import { Plus } from '@sim/emcn/icons' import { useQueryState } from 'nuqs' @@ -33,8 +33,14 @@ import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter' interface OrganizationAccountPeopleProps { organizationId: string + enabled?: boolean + setupFallback?: ReactNode } -export function OrganizationAccountPeople({ organizationId }: OrganizationAccountPeopleProps) { +export function OrganizationAccountPeople({ + organizationId, + enabled = true, + setupFallback, +}: OrganizationAccountPeopleProps) { const resend = useResendOrganizationAccountInvitation() const revoke = useRevokeOrganizationAccountEnrollment() const [peopleSearch, setPeopleSearchParam] = useQueryState(credentialGroupPeopleSearchParam.key, { @@ -43,13 +49,14 @@ export function OrganizationAccountPeople({ organizationId }: OrganizationAccoun }) const setPeopleSearch = useDebouncedSearchSetter(setPeopleSearchParam) const search = useDebounce(peopleSearch.trim(), SEARCH_DEBOUNCE_MS) - const people = useOrganizationAccountPeople(organizationId, search) + const people = useOrganizationAccountPeople(organizationId, search, { enabled }) const [inviteOpen, setInviteOpen] = useState(false) const [revokingPerson, setRevokingPerson] = useState<{ id: string; email: string } | null>(null) const error = resend.error ?? revoke.error const pending = resend.isPending || revoke.isPending const enrollments = people.data?.pages.flatMap((page) => page.enrollments) ?? [] const peopleLabel = `People (${enrollments.length}${people.hasNextPage ? '+' : ''})` + const awaitingSetup = setupFallback !== undefined return ( setInviteOpen(true), }, ]} > - {people.error && !people.isFetchNextPageError && ( - void people.refetch()} - variant='inline' - /> - )} - {error && ( -

    - {error.message} -

    - )} - {!people.isPending && (!people.error || people.isFetchNextPageError) && ( - void people.fetchNextPage()} - > - {people.isFetchingNextPage ? 'Loading...' : 'Load more'} - - ) : undefined - } - > - {enrollments.length === 0 ? ( - - {search ? 'No people match your search' : 'No people invited yet'} - - ) : ( -
    - {enrollments.map((person) => ( - } - iconVariant='custom' - title={person.email} - description={ - - } - trailing={ - - resend.mutate( - { organizationId, enrollmentId: person.id }, - { onSuccess: () => toast.success('Invitation sent') } - ), - }, - { - label: 'Revoke', - destructive: true, - disabled: pending || person.status === 'revoked', - onSelect: () => { - revoke.reset() - setRevokingPerson({ id: person.id, email: person.email }) - }, - }, - ]} + {awaitingSetup ? ( + setupFallback + ) : ( + <> + {people.error && !people.isFetchNextPageError && ( + void people.refetch()} + variant='inline' + /> + )} + {error && ( +

    + {error.message} +

    + )} + {!people.isPending && (!people.error || people.isFetchNextPageError) && ( + void people.fetchNextPage()} + > + {people.isFetchingNextPage ? 'Loading...' : 'Load more'} + + ) : undefined + } + > + {enrollments.length === 0 ? ( + + {search ? 'No people match your search' : 'No people invited yet'} + + ) : ( +
    + {enrollments.map((person) => ( + } + iconVariant='custom' + title={person.email} + description={ + + } + trailing={ + + resend.mutate( + { organizationId, enrollmentId: person.id }, + { onSuccess: () => toast.success('Invitation sent') } + ), + }, + { + label: 'Revoke', + destructive: true, + disabled: pending || person.status === 'revoked', + onSelect: () => { + revoke.reset() + setRevokingPerson({ id: person.id, email: person.email }) + }, + }, + ]} + /> + } /> - } - /> - ))} -
    + ))} +
    + )} +
    )} - - )} - {people.isFetchNextPageError && ( - void people.fetchNextPage()} - variant='inline' - /> - )} - {inviteOpen && ( - setInviteOpen(false)} - /> - )} - {revokingPerson && ( - { - if (!open && !revoke.isPending) setRevokingPerson(null) - }} - title={`Revoke ${revokingPerson.email}`} - text='Organization workflows will no longer be able to use accounts contributed by this person.' - defaultAction='none' - confirm={{ - label: 'Revoke', - pendingLabel: 'Revoking…', - pending: revoke.isPending, - variant: 'destructive', - onClick: () => - revoke.mutate( - { organizationId, enrollmentId: revokingPerson.id }, - { - onSuccess: () => { - setRevokingPerson(null) - toast.success('Access revoked') - }, - } - ), - }} - > - {revoke.error?.message} - + {people.isFetchNextPageError && ( + void people.fetchNextPage()} + variant='inline' + /> + )} + {inviteOpen && ( + setInviteOpen(false)} + /> + )} + {revokingPerson && ( + { + if (!open && !revoke.isPending) setRevokingPerson(null) + }} + title={`Revoke ${revokingPerson.email}`} + text='Organization workflows will no longer be able to use accounts contributed by this person.' + defaultAction='none' + confirm={{ + label: 'Revoke', + pendingLabel: 'Revoking…', + pending: revoke.isPending, + variant: 'destructive', + onClick: () => + revoke.mutate( + { organizationId, enrollmentId: revokingPerson.id }, + { + onSuccess: () => { + setRevokingPerson(null) + toast.success('Access revoked') + }, + } + ), + }} + > + {revoke.error?.message} + + )} + )}
    ) diff --git a/apps/sim/hooks/queries/organization-accounts.test.tsx b/apps/sim/hooks/queries/organization-accounts.test.tsx index 9b3bda17025..cc86097962b 100644 --- a/apps/sim/hooks/queries/organization-accounts.test.tsx +++ b/apps/sim/hooks/queries/organization-accounts.test.tsx @@ -8,8 +8,12 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ request: vi.fn() })) vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.request })) +import { ApiClientError } from '@/lib/api/client/errors' import { listOrganizationAccountPeopleContract } from '@/lib/api/contracts/organization-accounts' -import { useOrganizationAccountPeople } from '@/hooks/queries/organization-accounts' +import { + organizationAccountsKeys, + useOrganizationAccountPeople, +} from '@/hooks/queries/organization-accounts' describe('organization people search pagination', () => { let root: Root @@ -17,9 +21,21 @@ describe('organization people search pagination', () => { let client: QueryClient let result: ReturnType - function Probe({ search, organizationId }: { search: string; organizationId: string }) { - result = useOrganizationAccountPeople(organizationId, search) - return {result.data?.pages.length} + function Probe({ + search, + organizationId, + enabled, + }: { + search: string + organizationId: string + enabled: boolean + }) { + result = useOrganizationAccountPeople(organizationId, search, { enabled }) + return ( + + {result.status}: {result.data?.pages.length} + + ) } async function flushQueries() { @@ -28,11 +44,11 @@ describe('organization people search pagination', () => { }) } - async function render(search: string, organizationId = 'org-1') { + async function render(search: string, organizationId = 'org-1', enabled = true) { await act(async () => root.render( - + ) ) @@ -43,7 +59,7 @@ describe('organization people search pagination', () => { vi.clearAllMocks() mocks.request.mockReset() vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) - client = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + client = new QueryClient({ defaultOptions: { queries: { retry: false, retryDelay: 0 } } }) container = document.createElement('div') document.body.appendChild(container) root = createRoot(container) @@ -100,4 +116,45 @@ describe('organization people search pagination', () => { expect(result.hasNextPage).toBe(false) expect(result.data?.pages).toHaveLength(1) }) + + it('waits for an organization even when explicitly enabled', async () => { + await render('', '', true) + expect(mocks.request).not.toHaveBeenCalled() + }) + + it('does not request people while disabled and stops refetching after setup is known missing', async () => { + mocks.request.mockResolvedValue({ enrollments: [], nextCursor: null }) + await render('', 'org-1', false) + expect(mocks.request).not.toHaveBeenCalled() + + await render('', 'org-1', true) + expect(mocks.request).toHaveBeenCalledOnce() + await render('', 'org-1', false) + await act(async () => { + await client.invalidateQueries({ queryKey: organizationAccountsKeys.people('org-1') }) + }) + await render('another search', 'org-1', false) + expect(mocks.request).toHaveBeenCalledOnce() + }) + + it.each([400, 401, 403, 404, 409, 422])( + 'does not retry a non-retryable %s response', + async (status) => { + mocks.request.mockRejectedValue( + new ApiClientError({ status, message: 'Unavailable', body: null }) + ) + await render('') + expect(result.isError).toBe(true) + expect(mocks.request).toHaveBeenCalledOnce() + } + ) + + it.each([408, 429, 500])('retains one retry for a transient %s response', async (status) => { + mocks.request.mockRejectedValue( + new ApiClientError({ status, message: 'Try again', body: null }) + ) + await render('') + expect(result.isError).toBe(true) + expect(mocks.request).toHaveBeenCalledTimes(2) + }) }) diff --git a/apps/sim/hooks/queries/organization-accounts.ts b/apps/sim/hooks/queries/organization-accounts.ts index 9fa0ffc8e67..aec90acf84d 100644 --- a/apps/sim/hooks/queries/organization-accounts.ts +++ b/apps/sim/hooks/queries/organization-accounts.ts @@ -1,6 +1,13 @@ 'use client' -import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' +import { + isServer, + useInfiniteQuery, + useMutation, + useQuery, + useQueryClient, +} from '@tanstack/react-query' +import { isApiClientError } from '@/lib/api/client/errors' import { requestJson } from '@/lib/api/client/request' import { type AddOrganizationAccountMcpProviderBody, @@ -193,12 +200,21 @@ export function useUpdateOrganizationAccountWorkspaceAccess() { } export function useOrganizationAccountPeople( organizationId: string, - search?: OrganizationAccountPeopleQuery['search'] + search?: OrganizationAccountPeopleQuery['search'], + options?: { enabled?: boolean } ) { const normalizedSearch = search?.trim() || undefined return useInfiniteQuery({ queryKey: organizationAccountsKeys.peopleList(organizationId, normalizedSearch), + enabled: Boolean(organizationId) && (options?.enabled ?? true), staleTime: ORGANIZATION_ACCOUNTS_STALE_TIME, + retry: (failureCount, error) => + !isServer && + failureCount < 1 && + (!isApiClientError(error) || + error.status === 408 || + error.status === 429 || + error.status >= 500), initialPageParam: undefined as string | undefined, queryFn: ({ signal, pageParam }) => requestJson(listOrganizationAccountPeopleContract, { From 94925fd17b3c3e5d0cf1740257171a3412e1774e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 14:21:15 -0700 Subject: [PATCH 06/14] improvement(search): use standard source row navigation --- .../organization-integrations-setup.tsx | 10 ++---- .../components/search-source-row.test.tsx | 31 ++++++++++++++++++- .../search/components/search-source-row.tsx | 7 +++++ 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx index 6c07137bd77..714e33fbf9f 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx @@ -2,7 +2,6 @@ import { useMemo, useState } from 'react' import { Chip, ChipConfirmModal, ChipModalError, Switch } from '@sim/emcn' -import { useRouter } from 'next/navigation' import { useQueryState } from 'nuqs' import { SettingsPanel } from '@/components/settings/settings-panel' import type { ResourceScope } from '@/lib/core/resource-scope' @@ -66,7 +65,6 @@ export function OrganizationIntegrationsSetup() { searchSetupParam.key, searchSetupParam.parser.withOptions({ history: 'replace' }) ) - const router = useRouter() const membershipQueryKeys = useMemo( () => [searchSourceKeys.list({ kind: 'organization', organizationId: organization.id })], [organization.id] @@ -210,11 +208,9 @@ export function OrganizationIntegrationsSetup() { waiting={enrollment.isAwaiting(source.connectorId)} isPending={enrollment.isPending} onConnect={() => enrollment.connect(source.knowledgeBaseId, source.connectorId)} - onManage={() => - router.push( - organizationRoutes(organization.id).searchSource(source.connectorId) - ) - } + manageHref={organizationRoutes(organization.id).searchSource( + source.connectorId + )} /> ))}
    diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx index 68721239aff..235965ee47f 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.test.tsx @@ -38,7 +38,13 @@ function source(overrides: Partial = {}): SearchSourceSumma async function render( data = source(), - props: { canAdmin?: boolean; available?: boolean; waiting?: boolean; isPending?: boolean } = {} + props: { + canAdmin?: boolean + available?: boolean + waiting?: boolean + isPending?: boolean + manageHref?: string + } = {} ) { await act(async () => root.render( @@ -185,6 +191,29 @@ describe('Search source viewer actions', () => { expect(connect).not.toHaveBeenCalled() }) + it('opens source details through a row link while preserving the separate connection action', async () => { + const manageHref = '/o/org-1/settings/integrations/sources/source-1' + await render(source(), { canAdmin: true, manageHref }) + const link = container.querySelector('a') + expect(link?.getAttribute('href')).toBe(manageHref) + expect(link?.getAttribute('aria-label')).toBe('Open engineering.atlassian.net · ENG') + expect(button('Manage')).toBeUndefined() + expect(button('Confluence source actions')).toBeUndefined() + expect(link?.contains(button('Connect account')!)).toBe(false) + await act(async () => button('Connect account')!.click()) + expect(connect).toHaveBeenCalledOnce() + expect(manage).not.toHaveBeenCalled() + }) + + it('does not expose management navigation to a non-admin', async () => { + await render(source(), { + canAdmin: false, + manageHref: '/o/org-1/settings/integrations/sources/source-1', + }) + expect(container.querySelector('a')).toBeNull() + expect(button('Connect account')).toBeDefined() + }) + it.each([false, true])( 'retains the legacy knowledge-base link for canAdmin=%s', async (canAdmin) => { diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx index 52d08003e38..5311a217b96 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-row.tsx @@ -19,6 +19,7 @@ interface SearchSourceRowProps { waiting: boolean isPending: boolean onConnect: () => void + manageHref?: string /** Opens management for the source; only a surface that offers management passes it. */ onManage?: () => void } @@ -33,6 +34,7 @@ export function SearchSourceRow({ waiting, isPending, onConnect, + manageHref, onManage, }: SearchSourceRowProps) { const scope = explicitScope ?? resourceScopeFromOwner({ workspaceId }) @@ -41,6 +43,7 @@ export function SearchSourceRow({ const membership = source.viewerMembership const usable = available && source.availability === 'available' const supported = meta?.search === true + const managementHref = canAdmin ? manageHref : undefined const connectable = usable && supported && @@ -86,6 +89,9 @@ export function SearchSourceRow({ } title={name} description={[source.sourceDescription, status].filter(Boolean).join(' · ')} + href={managementHref} + clickLabel={managementHref ? `Open ${source.sourceDescription || name}` : undefined} + navigable={Boolean(managementHref)} trailing={ !supported && scope.kind === 'workspace' ? ( @@ -103,6 +109,7 @@ export function SearchSourceRow({ )} {canAdmin && + !managementHref && onManage && (connectable ? ( Date: Tue, 8 Sep 2026 15:32:30 -0700 Subject: [PATCH 07/14] fix(search): verify setup recovery and refresh guides --- apps/docs/content/docs/search/confluence.mdx | 6 +- .../docs/search/connect-your-account.mdx | 5 +- apps/docs/content/docs/search/github.mdx | 4 +- apps/docs/content/docs/search/gitlab.mdx | 6 +- apps/docs/content/docs/search/gmail.mdx | 4 +- .../content/docs/search/google-calendar.mdx | 4 +- .../docs/content/docs/search/google-drive.mdx | 8 +- apps/docs/content/docs/search/index.mdx | 9 +- apps/docs/content/docs/search/jira.mdx | 8 +- apps/docs/content/docs/search/slack.mdx | 4 +- apps/docs/public/static/search/add-source.jpg | Bin 41339 -> 79992 bytes .../public/static/search/confluence-setup.jpg | Bin 43037 -> 93826 bytes .../public/static/search/connect-account.png | Bin 73702 -> 117806 bytes .../public/static/search/github-setup.jpg | Bin 0 -> 94476 bytes .../public/static/search/gitlab-options.jpg | Bin 37068 -> 91818 bytes .../public/static/search/gitlab-setup.jpg | Bin 40577 -> 94777 bytes .../docs/public/static/search/gmail-setup.jpg | Bin 42066 -> 92460 bytes .../static/search/google-calendar-setup.jpg | Bin 38878 -> 94711 bytes .../static/search/google-drive-setup.jpg | Bin 43690 -> 103051 bytes .../static/search/google-service-account.jpg | Bin 34624 -> 81494 bytes apps/docs/public/static/search/jira-setup.jpg | Bin 34511 -> 87866 bytes .../docs/public/static/search/slack-setup.jpg | Bin 27967 -> 83176 bytes .../public/static/search/source-documents.jpg | Bin 0 -> 69718 bytes .../oauth/route.test.ts | 130 ++++++++++ .../organization-credentials/oauth/route.ts | 1 + .../[connectorId]/source-detail.test.tsx | 150 +++++++++++- .../sources/[connectorId]/source-detail.tsx | 10 +- .../connector-access.test.ts | 35 ++- .../connector-access.ts | 7 +- .../connectors-section/connector-recovery.tsx | 127 ++++++---- .../connectors-section.test.tsx | 144 ++++++++++- .../connectors-section/connectors-section.tsx | 1 + .../components/search-source-setup.test.tsx | 7 +- apps/sim/connectors/gitlab/meta.ts | 5 +- apps/sim/connectors/gmail/meta.ts | 5 +- apps/sim/connectors/google-calendar/meta.ts | 2 + apps/sim/connectors/types.ts | 2 + ...organization-account-invite-modal.test.tsx | 224 ++++++++++++++++++ .../organization-account-people.test.tsx | 130 +++++++++- .../queries/oauth/oauth-credentials.test.ts | 141 +++++++++++ .../hooks/queries/oauth/oauth-credentials.ts | 41 +++- .../sim/hooks/use-oauth-return-hooks.test.tsx | 36 ++- .../organization-credentials.test.ts | 120 +++++++++- .../application/organization-credentials.ts | 34 +-- .../orchestration/connector-access.test.ts | 132 +++++++++++ .../orchestration/connector-access.ts | 9 +- 46 files changed, 1430 insertions(+), 121 deletions(-) create mode 100644 apps/docs/public/static/search/github-setup.jpg create mode 100644 apps/docs/public/static/search/source-documents.jpg create mode 100644 apps/sim/app/api/organization-credentials/oauth/route.test.ts create mode 100644 apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx create mode 100644 apps/sim/hooks/queries/oauth/oauth-credentials.test.ts diff --git a/apps/docs/content/docs/search/confluence.mdx b/apps/docs/content/docs/search/confluence.mdx index 1937bddd578..a7b9e5276e7 100644 --- a/apps/docs/content/docs/search/confluence.mdx +++ b/apps/docs/content/docs/search/confluence.mdx @@ -63,8 +63,8 @@ Keep **Content Type** at its default for pages, or choose blog posts or both. Le Confluence Search source configuration showing connection method, account, domain, and spaces @@ -164,7 +164,7 @@ Existing organization members see the configured Confluence source and their own With a central account, Sim applies space access together with the page's restrictions and inherited ancestor restrictions. Group membership is refreshed in the background. With member accounts, each person's provider listing determines the pages available to them. A Sim organization admin does not automatically receive access to every Confluence document. -New content and permission changes require a sync and processing before Search reflects them. Open **Manage** on the source to inspect errors, edit its configuration, or trigger a sync. If your own account needs authorization again, use **Reconnect** on the source row. +New content and permission changes require a sync and processing before Search reflects them. Open the source under **Settings → Integrations → Providers** to inspect errors, edit its configuration, or trigger a sync. If your own account needs authorization again, use **Reconnect** on the source row. ## Troubleshooting diff --git a/apps/docs/content/docs/search/connect-your-account.mdx b/apps/docs/content/docs/search/connect-your-account.mdx index b9c40c28fd4..76f90a85d50 100644 --- a/apps/docs/content/docs/search/connect-your-account.mdx +++ b/apps/docs/content/docs/search/connect-your-account.mdx @@ -23,9 +23,8 @@ Accept your Sim organization invitation or sign in through your organization's S Open **Integrations**, find the provider or source, and select **Connect account**. Your first connection may ask for required source settings, such as repository or project names. If the provider is missing, ask an organization admin to approve it. -Google Drive source row with Connect account +Organization Integrations with an approved Gmail provider and Connect account action -*Workspace Search is shown here. Organization sources are managed in Settings → Integrations.* @@ -67,7 +66,7 @@ Connecting one Google service does not connect all of them. Gmail, Calendar, and | **Reconnect** | Authorize the same source account again. | | **Finish connecting in the other tab** | Finish authorization, or use **Open again**. Allow popups for Sim. | | No results | Check the source's filters and sync status with your admin. Confirm you can open the document at the source. | -| Needs admin attention | Ask your admin to inspect **Manage** for the source error. | +| Needs admin attention | Ask your admin to open the source in **Settings → Integrations → Providers** to inspect its error. | Your Sim role does not override document access at the source. Connecting a different account or receiving a Search link does not share someone else's mailbox, private calendar, or restricted documents with you. diff --git a/apps/docs/content/docs/search/github.mdx b/apps/docs/content/docs/search/github.mdx index a6ca8d92fa2..bcf9cfec4ac 100644 --- a/apps/docs/content/docs/search/github.mdx +++ b/apps/docs/content/docs/search/github.mdx @@ -111,6 +111,8 @@ As a Sim organization admin, open **Settings → Integrations → Providers**, a Enter the repository and keep **Sync documents with → Connected members** for the usual setup. +GitHub source configuration with account, repository, branch, and path fields + | Field | What to enter | |---|---| | Repository | `owner/repo`. Add another source for another repository. | @@ -129,7 +131,7 @@ You can instead select an existing account under **Sync documents with** to supp On the GitHub source row, select **Connect account** and authorize the App. Teammates repeat this step after joining the Sim organization. For private repositories, both the person's account and the App installation must have access. GitHub also permits App user tokens to read public repositories without an installation; see [GitHub's permission rules](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/choosing-permissions-for-a-github-app). -With **Connected members**, indexing begins after someone connects. A dedicated indexing account can start syncing immediately; each teammate still connects before searching. Admins can open **Manage** on the source to inspect sync progress and errors. +With **Connected members**, indexing begins after someone connects. A dedicated indexing account can start syncing immediately; each teammate still connects before searching. Admins can open the source under **Settings → Integrations → Providers** to inspect sync progress and errors. diff --git a/apps/docs/content/docs/search/gitlab.mdx b/apps/docs/content/docs/search/gitlab.mdx index e8aeaa52d1a..eafff4824a7 100644 --- a/apps/docs/content/docs/search/gitlab.mdx +++ b/apps/docs/content/docs/search/gitlab.mdx @@ -9,7 +9,7 @@ import { Image } from '@/components/ui/image' GitLab Search uses an administrator connection to sync a project's content and permissions. Teammates do not connect individual GitLab accounts. They sign in to the Sim organization with a verified email matching their confirmed GitLab email. -GitLab source setup in Sim Search +GitLab source setup in Sim Search Admin setup uses your organization's **Settings → Integrations** page. Teammates do not need a personal GitLab connection. For workspace Search, use **Search → Add source** instead. @@ -61,7 +61,7 @@ Open **Settings → Integrations → Providers**, approve **GitLab**, then selec | Issue State / Labels / Milestone | Optional filters for issues. | | Max Items | Optional positive limit. Leave blank for all matching items. | -GitLab source configuration scrolled to repository and issue filters, item limit, and document details +GitLab source configuration scrolled to repository and issue filters, item limit, and document details Select **Connect & Sync**. Sim validates the token and source policy, then starts indexing. @@ -72,7 +72,7 @@ Select **Connect & Sync**. Sim validates the token and source policy, then start Invite teammates to the Sim organization using their verified work email. Sim matches that email against the GitLab directory and applies project, feature, and confidential-issue permissions. No GitLab **Connect account** step is required. -Admins can open **Manage** on the source to review sync progress. Permission and membership changes are picked up during background refreshes. +Admins can open the source under **Settings → Integrations → Providers** to review sync progress. Permission and membership changes are picked up during background refreshes. diff --git a/apps/docs/content/docs/search/gmail.mdx b/apps/docs/content/docs/search/gmail.mdx index 107422340b6..3f6b67cb346 100644 --- a/apps/docs/content/docs/search/gmail.mdx +++ b/apps/docs/content/docs/search/gmail.mdx @@ -39,7 +39,7 @@ Click **Add source**. Gmail appears in the **Sources** list. Each person, includ -Gmail Search source configuration +Gmail Search source configuration ## Connect your account @@ -51,7 +51,7 @@ Teammates follow these same steps after joining the organization. Once an admin ## Source options -An admin can change these under **Manage** on the Gmail source. Filters apply separately to each connected mailbox. +An admin can change these in the Gmail source's **Settings** tab. Filters apply separately to each connected mailbox. | Option | Behavior | | --- | --- | diff --git a/apps/docs/content/docs/search/google-calendar.mdx b/apps/docs/content/docs/search/google-calendar.mdx index 4509563522f..f32b30af937 100644 --- a/apps/docs/content/docs/search/google-calendar.mdx +++ b/apps/docs/content/docs/search/google-calendar.mdx @@ -41,7 +41,7 @@ Keep the default date range for the previous and next 30 days, then click **Add -Google Calendar Search source configuration +Google Calendar Search source configuration `primary` means the connected 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 member, and only members with access to it can search its events. @@ -57,7 +57,7 @@ Teammates repeat only these connection steps after joining the organization. The ## Source options -An admin can change these under **Manage** on the source. +An admin can change these in the source's **Settings** tab. | Option | Behavior | | --- | --- | diff --git a/apps/docs/content/docs/search/google-drive.mdx b/apps/docs/content/docs/search/google-drive.mdx index 0918de1e56c..b0b7c2ed052 100644 --- a/apps/docs/content/docs/search/google-drive.mdx +++ b/apps/docs/content/docs/search/google-drive.mdx @@ -54,7 +54,7 @@ Select **Add source**, then **Connect account** on the source row. Use the Googl This requires a Google Workspace domain and a Workspace super administrator to authorize domain-wide delegation. Consumer Gmail accounts cannot use this path. -Google Drive Search service-account connection and source options +Google Drive service-account setup with Crawl as and manual folder fields @@ -95,7 +95,7 @@ These are Search's central crawl scopes. The general [Google service account gui In Google Drive's Search setup, choose **Service account**. Open the **Service account** picker, choose its connection action, and paste the JSON key into **Add Google Service Account**. Give it a name and add it. Sim returns you to the source form with that credential selected. -Add Google Service Account credential modal in Sim +Add Google Service Account credential modal in Sim @@ -119,14 +119,14 @@ Set **Crawl as** to a Google Workspace administrator who can read groups, member Sim exports Docs and Slides as text and Sheets as XLSX spreadsheets. Supported uploaded files use the knowledge-base document pipeline, including PDF and Office formats. Unsupported files and oversized exports cannot be indexed; Google limits Workspace exports to 10 MB. See [Drive export formats](https://developers.google.com/workspace/drive/api/guides/ref-export-formats) and [download limits](https://developers.google.com/workspace/drive/api/guides/manage-downloads). -Search schedules syncs hourly. Content, deletions, and permissions refresh in the background; results are not a live read from Drive. Admins can inspect progress and errors through **Manage** on the source. +Search schedules syncs hourly. Content, deletions, and permissions refresh in the background; results are not a live read from Drive. Admins can inspect progress and errors by opening the source under **Settings → Integrations → Providers**. ## Troubleshooting | Problem | Next step | | --- | --- | | Directory access failed | Check the delegated scopes and the **Crawl as** user's administrator privileges. A normal Google OAuth credential cannot supply this central Search path. | -| An existing central source uses a normal Google OAuth account | Replace it with a delegated service account. If the source is **Disabled**, choose **Resume** first. Then open **Manage**, select or add the delegated service account, and choose **Change indexing account**. A **Paused** source can change credentials before you resume it. | +| An existing central source uses a normal Google OAuth account | Open the source's **Settings** tab, select or add a delegated service account, and choose **Change indexing account**. If the source is **Paused** or **Disabled**, choose **Resume** after updating the account. | | Missing files in a central crawl | Open them as the **Crawl as** user. Delegation does not grant that user access to all domain files. Check folder and file-type filters. | | A teammate sees no results | Confirm their verified Sim email matches the Drive permission or group membership. For member accounts, finish their personal Drive connection too. | | A public or shared-link file is missing | Check **Openly shared files**. Link-only sharing does not grant Search access. A named user or group permission can still make the file searchable. | diff --git a/apps/docs/content/docs/search/index.mdx b/apps/docs/content/docs/search/index.mdx index eea2b5d8994..78f00ed06ca 100644 --- a/apps/docs/content/docs/search/index.mdx +++ b/apps/docs/content/docs/search/index.mdx @@ -39,9 +39,8 @@ In **Integrations**, select **Connect account** if prompted—even if you create -Sim Search source catalog with Set up actions +Sim Search source catalog with Set up actions -*Workspace Search is shown here. Organization sources are managed in Settings → Integrations.* Source availability depends on the deployment and organization policy. An unavailable source needs operator configuration before setup can continue. @@ -78,7 +77,7 @@ Some member sources offer **Sync documents with**. **Connected members** uses me Invite people through the organization's **Settings → Members**, or use your organization's [SSO provisioning](/platform/enterprise/sso). Share the organization's **Home** or **Integrations** URL. People need their own Sim account and organization membership; they do not need access to a workspace. Connecting an external account alone does not grant organization membership. -Organization admins manage source configuration and sync status through **Manage** under **Settings → Integrations → Providers**. Other members connect or reconnect their own accounts. See [Connect your account](/search/connect-your-account) for the teammate walkthrough. +Organization admins manage source configuration and sync status by opening a source under **Settings → Integrations → Providers**. Other members connect or reconnect their own accounts. See [Connect your account](/search/connect-your-account) for the teammate walkthrough. ## Search, Assistant, and MCP @@ -115,7 +114,9 @@ Search runs background syncs on an hourly schedule. Large sources, provider limi A completed sync means the source was checked; some documents may still be indexing. The source row shows how many documents you can search and whether indexing failed for any documents you can access. -As an admin, open **Manage → Documents** and select **Failed** from the status dropdown to inspect those files. Use the search field to find a document by name. **Settings** contains the source configuration and **Sync history** shows recent runs. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; select **Excluded** and then **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. +As an admin, open the source under **Settings → Integrations → Providers**. In **Documents**, select **Failed** from the status dropdown to inspect those files. Use the search field to find a document by name. **Settings** contains the source configuration and **Sync history** shows recent runs. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; select **Excluded** and then **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. + +Source document page with search, status filtering, indexing recovery, and header actions Temporary indexing-capacity waits retry automatically in the background. If automatic retries are exhausted, the document appears as failed so an admin can retry it. Other searchable documents remain available while this work finishes. diff --git a/apps/docs/content/docs/search/jira.mdx b/apps/docs/content/docs/search/jira.mdx index 0c16e6ecabe..7c7c6463cea 100644 --- a/apps/docs/content/docs/search/jira.mdx +++ b/apps/docs/content/docs/search/jira.mdx @@ -47,9 +47,9 @@ If you already know the project keys, use the switch beside **Projects** to sele Jira Search source setup with member accounts, an example site, and a project key @@ -88,7 +88,7 @@ Search manages the sync schedule. Item limits and sync frequency are not setup d Existing organization members see the same source configuration and their own **Connect account**, **Reconnect**, or indexing status. They do not choose projects again. Invite new teammates to the Sim organization through its Members settings or SSO onboarding, then have them open Integrations and connect Jira. A Jira authorization does not grant Sim organization membership. -Sim checks Jira separately using each connected person's account. Issue content and tags become searchable as processing finishes; changes and lost issue access are picked up by later syncs. The source row reports the number of documents searchable by the current viewer. Admins can open **Manage** to review sync status or update the source. +Sim checks Jira separately using each connected person's account. Issue content and tags become searchable as processing finishes; changes and lost issue access are picked up by later syncs. The source row reports the number of documents searchable by the current viewer. Admins can open the source under **Settings → Integrations → Providers** to review sync status or update the source. ## Troubleshooting diff --git a/apps/docs/content/docs/search/slack.mdx b/apps/docs/content/docs/search/slack.mdx index 61ce37a9c81..22994407428 100644 --- a/apps/docs/content/docs/search/slack.mdx +++ b/apps/docs/content/docs/search/slack.mdx @@ -8,7 +8,7 @@ import { Image } from '@/components/ui/image' Slack Search indexes channel messages and threads. A Sim organization admin configures your Slack app once, then each teammate authorizes their own Slack account. Their results are limited to the selected public channels and private channels they can access. DMs and group DMs are not indexed. -Slack source setup in Sim Search +Slack app setup for Sim Search with application and client credential fields ## Before you start @@ -76,7 +76,7 @@ Select **Add source**. On the source row, each person selects **Connect account* You can instead select an existing account under **Sync documents with** to supply message content centrally. Members still connect their own accounts to establish access. The selected account must itself be able to read the selected channels. -Admins can use **Manage** to inspect sync progress. Search reads the indexed content, so source changes appear after background syncing. Slack retention and API limits determine how much history is available. +Admins can open the source under **Settings → Integrations → Providers** to inspect sync progress. Search reads the indexed content, so source changes appear after background syncing. Slack retention and API limits determine how much history is available. ## Permissions reference diff --git a/apps/docs/public/static/search/add-source.jpg b/apps/docs/public/static/search/add-source.jpg index d2c1b6cbf2d76325e849b695816510af67621677..1e98c5502a4cade6e4b43fd17f629076bb550625 100644 GIT binary patch literal 79992 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 diff --git a/apps/docs/public/static/search/confluence-setup.jpg b/apps/docs/public/static/search/confluence-setup.jpg index e2fe50864e4de2a671f8cfec5484a80a1e71729a..6b9dfd1c47d0eb7cff65e7b773d4d2d916e32782 100644 GIT binary patch literal 93826 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 DswYR5 literal 43037 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 diff --git a/apps/docs/public/static/search/connect-account.png b/apps/docs/public/static/search/connect-account.png index 6f4bb5a06a01ca8d8b356c64020eef6e86b567b0..5e7fd98d9f88807c74f0b26c52cfde81796b842a 100644 GIT binary patch literal 117806 zcmb?@i96J5*uPUMl`SNMHrbjaO_DYHzAqVTWY50uP6{Dp&j=yQjO<(XN{ETEW~Z7o zc4;gj{O+mF`@Vm`&vmYIb=CBp=ld-8{n?%(wKNoIjc>TN%Y;vWhMWjSd*-)D=vK2M(=YPzw9pB!HsZBFmzPCxeWAs3|#qwLB17u?@P z9pdAZkNcwC66deA=q~c_Tj`sR9!1em+Us2OJn)b~=cux9XUgbgT1N2ZM#BW2^r5;1 zS<%UT|LgAdgG*^2dM2(lEKZOzH7!I%Mb8u72&%D!6Sfmpr}k*COc(gnAL*zpjoDn) z7$ntnulwwN-(06_4elKp8X6d23_pjfC|QWgncWFy2|qHwLkok4pB3aU&cN67p> zHql9-bbtMh(}-WKHQhW`nnYN({} z^{F}Q#ArX{@uZy2HKP1I?P-ts+asS%UCd)bDGvSln^Q|8O>uOzzFpr-gs0RMc9!n( zd@cH3`FG+XKE6!MNX}|pI@KJ#xc}PD{rk3P+cSd_E3Y-*T8kf93a|pZ{mA5HxeVe$n?}e|3lX!pc&#)<`4)t}G zEU348bxw`rPkfkqe1f%fvXpUjHzzYg-ju0%aDS)9Nvy%|PJpiNf8#4*XAI!Qi;nJJ z?dF^&WCkq>M<;r>>^fX&8V?cv^W0DLRYf#n1RCA;ol?R3>7KOjbtSZYqK+~B`C}25 z_IJ)9ojq6v?na}}6eWGEVh&d369n3bgvKSQB|+zr&t)S{hcgyugtIax=V-I?Oeb){ z`&H2e!*0(G9cNZc6AB}UNYjU&)naPf3>x<0=!mzjGbl<{$s0BcaB_7mD=scJC|Y_W z`*+MEq**JU#%rYbNF%AnBQwH`mcs|7xxbqGcvm;otwx@VQ6PRu8yFuSCm$3GA0MB4 z_ZAp6#ZN@HsSP}qJ0E(ss-`CR`-3x$n^OThJ3EBcpL;h2|GtadqO+&_og3d4_r-!D z9!du=>aert8YXtWz+y|Ax3Ly1%`2)2Ofd?z&Xe;Z8bWDFTzpiaj=}-&PAERg8JU<+ z^CMRl_<8-$Q!n>hI^hR}+U}m}R%8qo45;j~H8F3n)wTD&D&oCQPnoTQah$BzXE{lE zf1$q54wO}|iW_pcP8I5-^y%-8jL`C|xUn+6ITakh(^A*U97Fi zetk4yBBNnyJ(=!P&72^$H7Zu_eDlij(ARFy^6l$OA}kDx4dk^ScMzoM%Mix=$$I*e zSsnk?i%@^UhiRyYug8 zVl}2VCfBDL)21r}p4}2_ER}e~hr&o3d>y4YLt-CG&*%^rHSXe zaEHD~W%tb8eR~%h^y0UrmG4iyrI2ZbE4U5wS5kzN)0;<*9Jvtx$R3?Zyh=?F(YSl} zZnaUhlW_vq{0v{R%KAz1KSQM0arxLuE2cPqDt5PZ#Al~rz(vT6QN-9PJvZY?>&V>( zB?oWc&jRfki(lSmgk5RSji?a2J=Jz%Iq&o5&ql@GJvWJRx!QPAP9HC>f+s7`ojWo6 zYB_s{e$h~%q&b2a2=+LO-jW@0KlxM8|(woEm0bY0+@J zH?(Iz{<|oR)^Je%gD16F_EjLJH!muG5z!c4m&v|m5rx1>(>D&-RR4MG>vKk46+0GP znb*e_qf@e0r*Io|R&-I4?E&Hq&2PsAb~6f*R&fu~k9G(?#$rnrDiEi`v+dCph=vkX zF(0T?9fanU0qUe}slQ!k5sIE;N4IdII@PY9?Odnu?eTT5_A!gxE`desw>mAUwLxcB z9xh#T8F#L{q4=uXC-Btt^Chv$nyrFK@gI|VnzB$D{4&Ga`m;LrE_JxQSN}86J1q)4 zE<1aEiznNAo{nV9KaNBzU)65oBQ#}1)=#g-B1ZS>CMEG~0lP~@dfrcuIECyw2}}ob zeqYANOMHrF{QJ7^6nVy(k{$OWoPIX9v>LON?q1WeA}>#B+^`&tz-Z7o7c%s&{V*vS45xi@Tiv<-r0M*m%~Z7sbY8C z#~}Bi(%*7O`whjjF6FYX5R_iqC1xyJSy`Sh7C>xSxLVi{B1WjTB{=eIG;a_kGcwd4 zPUg2;MbLH_*%c9kB?P@SD9IyY*|T3;+WJxFjWiJYMPGj7^sY~o}fomzYsZM5#xP^AWU*Oc7Ry92P7 z_{P~oBqm2}4tI}pw)e1kcu!7V(>4zN^YAyI0x9FjF6ViVtDtoeSmm@gUXG8W+?WS<07hYU+L%n$y&f$Bh*>*gny+P1d zMxf)y@xMc2J7SYT^Y?3BHyp_M`=%8CX2^K{eFjCD?jw!AAEEF*)_3&3k87M0{kzd9 zM)>6Zo(&2Lv9Q^{FHCW#fc`JAqM%r0`v388##0%;Yv9UGCh?FoeWcu5LF&+diGCq^ zf>9jSC}z_EFVk=fF6Eq3Ym`9(*RYqDDP8ET1g=bCD|9*M#*V*ufTC>WJ7M<#p2QM< zg3=-#_u%Xu76m5xOyXsnJ9`At50&!Z>=WxW3l>~O*No7OuFaqhHzxT`E1?wYlgAEa z66LjD>hYuV)hBZQd*Db*pE4JNg+iEx(sgd?Rsgu+=aN$dsTnDyS;CXbd^2swg*)7G zc#nnNlE0K5JsAV&W68IuL{^k|k75qC1;l)QePt~|{`|QdM z5y>jmMllYWg|zZ47o#leOuX3@6J8h<+l+hPyH{kv!rq~rU^VWYr}NoQk~2>8-G%=d zl&d}u^2GV>u{rPRpL(cER?2yRbni~P#@M5 z-2QhFKhX;<^WJx-!Bw!GKHWmfSaFVueyIeibh}EE0+Q**rZx zeI~9$0)JO=RlIbeK8H6=&1SORtLl{^lRPSAXM5YSoTbA}?@;A1p5^bL*k#%!7UYK4 zQ&Lh45gVPF!9ULI|Lm9_Dw4qG9xc6eyM#%8_28MGuUCRM8^XiGyVGw}A{r`VZZbKE z#I_2mod*IKO%TZ>UQ~8)aHxm&+fZL0I6YluKTsOHe#vyWRj_eyd%-+-Yvw|%NKR8z zlMZIWwUs83Tit(uXL`D~x6Gn7{9Z{NcPj2Gwa2g34s-8O>&urfXA;-f*LUY{w;0tr zXXNmr^R-X+$%(uC9kr{{9pKIF>xalUuy+Y85#xT z4foQ#C6l;C%nI2vp5Fe5DahRZ^ngw!Aqh`x*{CjsJ%gQRwS9I~P|y{3xz;!H#@%*m zbm9+;W)QZhXdx$BfQ^$gKbxN?!&65zgOio@vtMxgV^&#NS;p1IzYXN|Ig5!tW&UJ; zQuhtmZ(mk@%MI1?bO4i;ET|;t@h5wlPM2B8awl4_`o$}~C@n3`%d;l5#|#u`x;Quh5i40pQMuSE zsHYD^R$X1a0gO;yj9RJC1@@$)p6X}-u}&xyMM+|x{^y4gs63khUBy-hB!##ri%Ld=mQJ&&PX=X2Ja=lf@l2`6DGV& zygC4WN#DBncu^@uLk>b|OqAzRadjmNewq3930%N2JKVOnx8WFZ`p=$g6_nF?Cm_67PncCdz*dIfiv0ynS#HDS&5X$q`$vo)co1J-|Z6Y0ox{m!+XT1 zWyiF`ZMkXFOq!laz8s-SPkBrl=)q(K(Jv~ecNdOsE^M!1Sm(E4$J5i(TXvURG}DAG zQXNRKzKk35LjTva%WCy`p!sCsBPZ7OGV=1Sh7>gqhO9*Vj;+X{_-A zRp>%}6#+`MHj|=)f_t3_v?XiQR$y~=_4PD0bpG50b{vuV`6gtiHl)%? zj3IKu120i$BES}-bMu4mnJa&1lfA3G>6r*aB)iXq8|*(l$Ns*)a+_{8GFTD$^5}xF z%M{EtOE_%udmmqBKao$F3HexChQO1UY`GYYj@Q^T9Mg~O?Po{3%Sfvk8yj;mu(GhY zn%>rCnqLLV26_Tjs8Ml>Mgg=-i74w)x${?{qbPB`6-26E%g|6wutI%&{rX?tD0tuc zSl03~8U)WD`uy+FSPlMU6%P*&TU(w(?9{E$6LIbsJqGzcH+C}D3|c6zH5ooh`DQZ+ zPb#zqtR+p4!0|Ij)6mc$aQ!nDENtN?BIV%Z7aK%(5MUpFVHiN3K7IO9^064*c&^A2 z3~!Xvc=Jj_$@t*l*PY-z9Sc+nL8QyvH?v^96V7st)3C#J71z+SEW?Db2dDo-n@>N@ zaxq7rjFv|`zKyX&rC6|7B$X^MIh7$U;e?t_(U8&O^d{gGB%3u$zKH-ye5Jm`X&jw@ zF;RKE=6KkF>iri3bMAF&>wIA{(%MO9sT{}igU?KFI*rqY-qP0(w@@4KG)*OL$(@%T zkDZ%x8qde3m%as{W_1`_vK;>pGpo6J%1mB`(w6W-CGU$Lrxezxxc|9<`T#q~ zSEEREw)4Q~xRk~5>G{e#;SbI#6$}9JB>JfjP`4Hu6s-}@QWct9q;3u2oVHVt9lAtT zU4RS{{hC)UMak&%h~sr#Vx7h-5YU7c>KE$M)Y{$Hk7==lXD4^A`UaZBouYOA56j;P zy|KuZsNBWfH3P@Sg5|KZRHHI-FhcR=X=xIE?iAss-Ae1b8bhxgs zZ;i^I5eq$Ahy}zGlR1Qp;WsfdHtyK*{agM&X$ddWhyeiPj--@68FMWPIU4$W z@3upIcKfmU(QF;2vB1T+eq?d5ximdh=&ieUH)D^tKFKdxOfNV=@u_#lFOxS)@1#;p z;^)E)(=4-7b``IzQR~C;yRL;P)_vIP1IUZYIdl}WLs1NV()6<@vhUH6&;EuunQ5_H zVv8|K0p%~>9yWQn^fj!vchEg1^;1!8mQ2-pMMJx;&)_IgyQ5M7@6o(wAg|YFu^{2s z6}~}aO7`#m@q%y)in80VghTfXQ{>YJEz6%ejf*uj=i8SXK0bDET|4wFS7K*S&@-qZ z<=T3$mDKa|bnIPSpEy_{)uZLkmnF~bc zVV<}zB0V)u=<={XY{*j{$(ddaaDh-KaW z-cHL}-j(X=YCsTdmo6zMEY$C8i(FK${~Ufgc)iH{y09>FbeomXT)lHhh!n13cXu~l zNlss1Il-YC4WG4eyiEQY_Nu<4>v;oN939!Jg*PX>Cby;fIz6F1v_2vF;YoqhwkTnC zdHG48lH)h=q%}>(pReV#Jxy;=9f&1_o^^#jF3)u5AcdL;o&*m*OU2#+ls8eXka&?T zMl`mS)M$@JK&$KR?`MeXAOjKgbYb~iZRG?zy<<(ha_8gkFg3Xjn#<|wUsq2w6PwM8 zSWYcr4nMaflYa?T{e~S&_*p98Nr@U<3~ASFHGF(($y(Q`=r+J%0;r0wAFko8Si*%@ z$Sp>w+iW#xy2dG%fK(?1O(VOZ3hSB%PN!O3|yKyA1RJ^hR)<3}hc-nyA^Ct~#Y>q~q*JtqQInu-jH{Xd7D zlHA|I4@7;rF&#*XHve_LRj_tCIKacBk|0unprfWHlTHBmn*g0Y_V@p&%-VgKmlqZs z&;r}be19860l9KRa0{5DC%wm=Kzv}1PRnPFQShjn0BRz&S%;qt+275#pK`}t&f5P) zG&VA7{xx$&YGdRsFhV>t!mxK@LR?6we|UKF4PCHcvdV7OJ}IO}oTR2c;7~nA!b@FI z?!P{4LVAB8?$?}Vh(96bM)PLV3Joo7RE~(x^2C*pEgZB~fS<-Sj$1hMJ@;W#A2Q0x z$jG>D9<;tVTIo_hmme)qZ};PCCl>2GS}_wL_3JY{*}P~-DDA^Uokz=RjEkq2mtW@a z_;|p$Q?0~WudD^j$68u)>3w}p&+9k90F8C+z8M!oIpUt39d9a5{(QWZP$wy{+9)sa z?)KSuqF=a$#$yL6$GIKOoJkSs8 zOFY<9aWha(7wUEM)wZ^WTc!Y<0g`TRZa!rmxcZY2cZ%{e(DoCQ*_D-~`)=s$N9UYFa>8I=AIQoC5hnd!?13@MTis$+ zCv}+Q`Jd(gunD&?OsRHC*RYx+bsm+T6cxu8=siUjQ|dq2ZGtS zIdE&}wz(;O*)MZHHDoI_E_f~1LGQm+4+plX=1`?0pU+IRH}9F3q<6ZgoKoip3L z5#PGgZBfkY_bU)P$)$laDVa~S7~de7&1gEDpDOlqD^ITl{KIt*dgof2l7E=;bD%xjzof? zxvnU+tzB%;@cr#^T@2IuB1^z<&R4GN;&l^rVRm$cR#CmX(!>)}s#9^{^_SCZhAXlq(PewsBZ& z|NC3$1FE(k>Pu{e(!d!b>t;gKvcq1(UWcTgKfEY(0^r?Jf+C04V0+AI)w~1*E-FWD za0y^Vb}};Go;y*w!%aa!!P69PQ@QHfsK>94Mq)}!U4W#rceD{!fk-KF2|JEF(I@~( zLqmM^os|$~VY?D9`I}46xTg_B^z}ja^3B{I$lCM#mS!9L?OIkHsYmRjd>yD?mvKhT zfj671V6_fOmsz$&spP$NduEN&gh%Cp#x!PM09KVs9*pzy`$#z%rZzS1yDZ^3yueBg zit+~L?2u?Y=$AL=3v(GF-*Na%NYi1pcwd$5jNL1}e&faw=_lPbtl`@F>r(+MdA9}R zwWoXuF(6Fo>t9OlIlW`J57OsCy)NBT^z>f8P z$pT)S^Z_iHInrKC~#bHxkX*gG$R9-6p4vNW}qy z@r2E#t;ms#oB2({1}~`u-2kOI=Xr#`w@55B4u^a9?xKX*Vu0*~TYw<@{{17O-*53s z=eIR9_+%%NX6JA+}USE)T>EA2W~+p@;4hLG=qi?fi4SG$iPGixjyw zmrds;o~42s19IBqK*@bjL6TH1j-e7&@?s@6MiMnd=SFR_^6LIg;Od)uNf1dw_4}+f~u{d9GXS59{AM$-lI`mDX$L-m+uw{xhhSqwj5m?y-U@<&wr3!0YN&P&3CXr5TQIL&SwV(%r3WC(b zUUL(vY<>1dT~egXK1=2fH#_3hp-Qc5@fIuy+z)Y0b8EB>f;o3FoFKB@*jMoq5W64e zwI~C`N_xR5icg=2^(Ex6!oXQq>ih#ry7}IZ)Y69Kdh)3S>UPcML*bA^Y176SxyOOv+X&?umTAZ#ndoOad{J3QJu!H{ zp+wAS49*fbCb3pRe9Aif$qx4RksX8~haoRh{~zTl$g{!YvO zB`O(l&W^`q67sKX`TRrTR$KI`Y0m+55V{gO2OX{}Ly67NE?pQdb%FE^EUfiwI750Q zwY1~aAK<*o4^%BLFT;UI#aXusHm?`E^f^K_f?P&ma}!{f61M<*Z{9z``J6OHmOnw; z1%#GK-2EOQ^vpHP-21!02$BSP9wRu`KspAG#ev6q_bj^%ejT8E{7L4VRdf-H`?&ER^=E?MiUp z*jRnw){jlV-vBX=4pqLda75=@u#mxHZ!djQuO3-A21u=XrOA_QV!5@QMBs$4Unf5- z$>dQEON;_;<_G%vJ&l_)N#y+it_k2lRZUGg(`=*ScFXc{mzG_S+Fh$Pz&t``mKV|0o8U8O|0syULZ=nT? z-3C0Xn((!L`TidBZydi@EUK*!JEp@83I)+`)z^fcQeGR(0CfPgce;}J@^rux0ogNI z<>IzsoG@E2tGA}6radqv3~)ulm8iF{46(w+Cuw8;5pe#-f3;=cnxEIzZIPSzO7l+ObU{L* zL$%5dH!1~)gZQ_ncR7RBv>ld&)pZAuQ18woa24eAR?vi7M+VeeAdAST72p7`K*XpV zT`UC_=3e(}s5E$Jb61U<1gN^y5J7fjQ^D~&ex>o&g@achlLNqip1e0<-dsnmQ;W@8 z$RoxOM9AgDn3t)f@rR0NJQTTmV5E5rsNa|ba6Rfs#-(6?0y_fdXB7(I9v~66@XtGv zt%8G3;#hej^8dJJV=gK*mdz^>7LOv|QZ!s)j;q1KNXI zS)A0~E3kLZgfxm{!Q#PSB9}7`H+y?}KFwD)b_Wp@prIYf?R-278=EMs0b}I50Zl3O zBMKKjfNud#1Cx9?GJqpa6#n2sI7zFZB;@>j*pxCaCTNM_lxD1c@D<ZpWSA!8ao61oDL^>EIkcd#Ut*&q=p_>h61FoBM05y%3 z2T!tK0eLa5Bg^kw+Q~}>g47<{a|LHYeyy&64JnS_0sH9;*&KWYy#(?P21OXXF0V-l zY3=W=>`Rh9Tx)@n3`&psK%vkxqluMQ1lj>4xMMwT6Ttd3_g^e*Z?^33ItmwIv4CPF zx2)(Xb9g~AXhU{?`)1=Xl--(7r@GlaaGb*RI}A91OFQ(FpINcN@z7f-*8DeWjlOiqxEWNH(n1{;dWdbGkC#I%9AMEEM;p&+AN zv+Zg85_QRBcxhoF_jQgQKWO}!&`}%DQc<^3N(&;9Fg@5IY`*=dqXAj!FYJF}aN%~* zkP?@WeLraS=c#0b(iT@%@K!=mIq=!Ny=Ca68nZUQb#u~ts-{67#cK0co2v@pWtRj-$+(b{`K>X>PGjjO$6p{X+Aho^K$?9_O2!hZh3;mB>*&fRu zG`Jai&)K<#Z0X}F3cCx+%gap!bl;xGxeKQ+EiX5NU#SHK3|5no(j8X}lu z6y}ERZ~vRnX_c+@+^>9XEE|gzQ(=h9-$rbK02z%G3#;y zP6Nf_^sJnAl5JMdM%93Z*pK%YZWkL_kJpgXM8KD>^@u#+7ek}bCc_YaSV-d21;)_| z3&Xz#2MelLH1lPDAUZ;6)JtWs3kv4x__vw~v0`>KAW3W~i=N67^_mCrvfePg+k@;* zcdqB7mL2PPO$rp}Jj2HJBPayQ1E8^qRyrvloQ~toKe{g6aGClAWsQ&OfQn%u_L;Ec zpz$@kz_UH~{-M}-${WSR-uu%DW_2NEBcm@Esm)}6nypwW*Rw&7zwd1Z8B~85HY)zu z*QbqO=IBU6+Urys?SffKf)3pR`d0eYyFdv6ZIB%}a-AMP&gFG%1{u+@Q@;8BT`>7R zxIijuc8`k)BES9JW7fPAU~ogv!%&$HR3O4FfME801M~<6jWz0+F0UU%PoQ2oI5}~! zvciS~h0v1%3`rzwYS*01T*HTe8P*%#xnAbRtLfMw^`|)+C=r%w}{<8%=5WwLT=tIVk9RO}B86;aZB6@82ABsDTcK?Wb z&GxS7M4jd>E8HIvd@M*kCoi4AHC{6?haB?!O7g?%WN&>*GKXrQ$A4W&C}+VxTWfY{ zNu7%Uiv>bBfV`Fl4xOI8(qu-S4yL$Reb@^eP)1!Qc`PNkek5^J3SZCj81YUkonbHj zsFyCUZZqY9aiD(w(5(u@cnwEf$7LLNN?N>fxqX)9@5xzaut%L87R8yyYjXPv?a|b& zy{9<;XNzA2gQFi)fFSd-G_`O^J%DY+D?6Q5KW1~|yxECR3;Vn>Qa))3N-r%V_p5Vr z2~v9mDgI>OV4-IlfBnEgCmsgo2?3Oow@vy+N0nubZ#a&)LWhlc{MZDDTL-%bwHUUb zpdc@A=68p_V)lz10s=YmMeL@p_+F%DpykHmD5UU59leLJ`s7r;tZXY_on1&#Ex{17 z@kd==eGZ45%gX17GbMWbgUuRQNnakkk!5Uu_b1);no^Nxtz8JZTMm~pyyF3m`O8^1 zJ#6@syKE|}wX1&o>yLxHQLGzUUgr1-aKZ9)vV~l*3y_Nd%@3*0Po3Srpv2WbHipK{ zI8+-Un4zlxuOx^V1t7>FvmPsscgm&4C>#{uV5-d152BJqyd8Mb&n! zi@$#J&;J^@t+C+X<$jLI>2ZzHvqIUh*uZ52EnY2iNakQ#j^}B(D<_EKFQwx2Ou8!& z$w=^J=Z>n+`rx+`xBk&p=Wc z9Yygng`Ty8GY09Iog7I&w24w4k`VMaOHc9X`Hkh-hc?k#1W{bYnwtc!BHZGI4j7?2rQ%>wq@E=&9r-V6mVee3cp_ zoW=d$Gj%21 z_P1IB8u z9fnJNMb`Ph3?SpjGJ>BOOZeag*`tTlV~U3y2D4kqhA|V!GZ&~145jy8x0lLW0T2V} zMoq(688D*^Bkj?8Su(|<;TCpig=hvlMYtW6zy+2miaJI&TP;E$dx0dLrNjlkHMF1) zkZ_#jTVDrPw}G>LM~__M;ODipizb^lESr?Bv&`k2nZ!OLML4n@**fudNR@Mkz_jjq z5e(r`UiL_kQI#IHSHsM+v_tezUFv9SnL$yXA*xHuj`f8#O3#!bMgfBe^WNl*dP`~~ zhI1uvQ<+n$+SLEsX&B5A{!Tggd2xPSu6#SG9^F#DoU>`pzW z2UoHF6c+OWe-JP@t-;t2h0+IW{0ejrh5WUdF2qxrDkZ*!Ke>GgZdcGJNG3klJT!kL zbnSp*Y0z4|GF_DOLj}*iUtS$>T1cv z|I?J4FK-WTYU0WkCx837x2nJD%8uj=_^psGM%x7OGf(C_jf>-pun<+XMwJ_W;FQ1l zh)WrH4p-ykPjX=i$6~=$s9Az2SGa{x8e9*kpwni`?cTb3JQ^lShNL#O18I!gtzrG;)2m--J&)JLyL_c}*3xB5Dk zc%|B?IQZ0zd);p+IqXm!8%vu43<%N2oTQeP52_>IdKp4BWoDaA?3f#`8E6m4Zlhua zzN6~La!d7@!kVLmX#JBlxfljjRZG{`S1t51StI2j%YEpgI36UzZGH(+chli})o7^a zIOP+O)~L0cN3IirCyLNYs3ys3@96^q?knU{UdIdDeHgvJ*GG;z{cL#}8yovRc5oWB z@c>^R)*Z&3nmXm%w{L^a5+rImy)E|{7ktz3-v|FRZ524s`pasx9jfYkY)OT_eNkD5 zI}uv%0a^e65{XzuFDhJ^>UE`*jP!++# zXZI71^Gm(hrW&u|!(<e^FiQ2 z^*{E&24-8bs>FMmo>J5=g2RPW&z-#=g_^I#^JxgF>uM+cR(+ck6zCs9)yh5?l)O;y zsV=WQzoi}2$ssWWU4v8aN_#dxi~nKj*5@5Mbe@HbAH5)i_hnUNh7SrG=b;%;cEX5T zYTUBPidZajw7e+ic#Xb(vUM6Zpz!EzdP;PpLaoBx9$>};bDqTpxh)^XLh07x$QK4* z@2_thD!&_GF{`%h)I#~`R<_TTy9+NU?wD61aL8@|xnADhIx|XjCR1e=2iL8&IPPPy zQ8`cZZwdA9owX`lsK(&8#+yKjaen9gWf$*$6<@8q)` zfmGitl|A2S`EyvT&fViDEqj&R=Na;*&jI)vsDiyY%}(5bFiaAqcI>S~XPK%grJwV5 zegE!yKK_#ksFb~AftvqdwkTUH0VaZ$1C;^<7pzV|7v#%N=?sif&KThcHd|3KF|gxJ zhJ!$%h4}PI998HYmcz-uTC7S7R0GKGNtP1rDyh_Fl6D1eieOiaRA*Q2?Vp;5M{K$Jh5&f0Jtd%hmyU%()d zr}qrZ5YUV}+~z#}0fPbM$gPSN^`=|HUnkGCvmDR*<+p?VY7miGab2f-hM{bdEQ62{ zhjIcrGSJ@-Ixu9e9335h=TJe9E!h7D6aCK1G?oCb($rbt(^GX-9ppmZY#TF5MxS*%+1nKU3_lzrTz!W?|&X8%L zP=xZEgU1QzR?&h{q8>aTNR@y{ke{EQnVIQNM|<+$@8Xb#w{PNDCk&3ef>ywmw*U~U z&u$GYYH~sX2m~ZsFshGejR%nWa19NMz=g@cZD%_q^!BFu2y~@59x{y5^kCS?YwLk} z0}8<$7(k^hd!nZI(T(57Ps2(~ar7O{km=hR7*Q^#fR(5_x^`c1w0u+~FFYxB>!Y*^`9b`~3E{wWA zMbvc# z&0e6#zbdY&{b*$;#Tqz$EP*%ZIqGta6A0oP>+5dpiq|B0DM69UxA)I1;8oGp)vY!P z0%3e^6EYJ_;@TtHEB3(hVG+GM{W2l$1F(ZP3M{)gF6Br$%Wogjl8!*Q-?|dzfX_~0 z#a_bDd1ExQvMZR#w;y10Hr?ok@*T0Guvpk`*sOe_CF4)@B07nv>J4&OHx-0}&X> z@xaDoZGF87BzFrIjV#Hgy1KM_rNC)W1I8NtJjxA0&URK*Jd&J74gCffM;H-9;tA6T&#UK^^bk zzXzoSs3#UX_;Qe}Mmd)o27*#i*qaYCz|;n+|3EwlfV#eLJ?GP>PY{~;9qS=S449*H zcww0{3Qh6*xZq=u zRN)f2x3_n=#ZM63FET{J83*MO4s}h9uyO*3!K!)W&@d$OD{W#3B9oJoFl>l|z(#_> zv$L@H{^;Z>(8v%4M_7sL2h1bbST76_k`Va9VtXE_}c( zBhX@fZ{HsNSZw@1c&2)Q{h{Pz>~Q*^RA<4q8PGgHTkur;|A2U#RbeOC`o#c7udf;U8qa39? z1-R*BB2Zgf3p~X{U=u8FlDG@XpxP+orU&08!P`lkQwq`w;`njsR&Z-m<|>UB4wSQE z1N)&>z;r&oVjvN%>x&^RZe(cC(a;o|HTgrF8x(4&pwA?O{DspYgzwyq><*M%@#CC4 zb(t<-Df(M-?~&7MN4vguCPLg(W*q@{Q_LED|2Q@vY=dtDNd(U-$ZX{of>-mztoml` zCFW>PAs91o3b>f5ub=0iCU^b~DX`qI$|;@pK@YQC`uhF7-z&8YcsIp3%J`~Dk< zzJkqm#s#`!)4}zq({em3qT|Dv?62AfYa^4fMhszHW`HUUt9Q0Mi3_1PJ+T{Mm(+;AFOn=dNukB-FxnuRNO zyiA2cp&Q?HjLzZQC9?`_W0Xsy?GDWDD+YWg>In!O{;`o6_gDgG+9m>u zyVAzB&Sa_-EB@m>guWrBNWL)by(^zMFF?~eGP*?0f9UJ0pl5&Det6o~+Y3fIG-|jEN)=q5&xl(!=~P$;Wfe zJ-QGJJxj02eNbBwS~mp8FX#c}v|s^uy|S_rfZDd_tT`Vd_uG|N0)#s{$a3R%4VMvC zG3UxXGbFVvdS9^sjV?K7-6d5lEKzM!JJ2s{geYB7d10`;7_wAnIA>s)2p|Vmiyd_}? zYin;HkuXnSfB@+8V25ruF+QHI#6>1Ce77LHMD(i?HcWW2ZD2Zorrargs(xSr8oXXW zMey#nl@J7H6}u|fV-&zg?*&i+$^@s}ZJIif|pk`;6>y*l+QLSI4b-5Xj4Mfz}$zf4}6 z$;eye+-ze^&vCxpY(_;8q7lbA`17Pzec8_hHl5D?PI)H;n8CFUH}JNMs_aheN&;8# z2eiB}rwl|Pj1Q)YPU=@#zI~O*Gf`)da>`LytbeBBY1g3XVPv=4Gk;e|&yX)(I8=*5 zlBU~67c)5NGrgM$DHX`eGekm~7p@AOrGix#!I}ufJ%0R-uxeRe$Qxyk z1}I@tWv2~%@g=Gv|Ui&%+}k z$d!Z~#{!5XwNy0#E^SE2K45%aE7bqv?9KnFZoBtkNhK-DE|RH|B$?VFHbTabv5-v^ zQ6!>_DMBbpA!H6w5lJFcl1efssZ^3-E6O}S$LYF1-#_5#b^ma`x=MS$hjp%XtYawm zfw=lCK7X1a9<8cp&-RF~Yo^{uuP2j)&I^nkxs-ZIn~JB_t8@w)v71zS({lb{RR=_h zqA|KH=6n4g;Zr$7GWpa?8pwJ$8BXx7Nv>U)k+!j9wECH8kb0T>ov*j&UigDM&kydx z)?}|uj60ylQ|z=JC2-s~;VDXbR|$ZI{0b_i{D%X!droQU!SRzz*1 zKx6*WIvX3M(SX*tu?4GP!89myUm}amP|T3P?_QxqP=02DqtVeLbWm+~kCxe4$)(FQ?9Q{mt7g!-p`y?Cr4orE48%XzAJ9i|@*uPD5 zt-ydz6UeR@S?>J|$79G$b(dTJMx2`eV^t284OW0{*VL81f0&~2+`1!ZvCD_g*8hQz z8V*#m3&*>z6*CPePpmsth zbIdpFe-@?A$M@ zS=4)Mx&!b5$jvCtngtCsicYk12X2+=H=PTsL2J^_5oJ@_19^8F2u%V40+E^-qsd8A zHA}HVsu3RH)!!xWF=)D9x6`7TnzOfhm}X`MAFprUQu7$(bWh$BpOBktdR>jb0!zWf zI0}X$H!vpE+DNb9^)lt53m`~JZp0qu z{ny^#qA|B1IJ}|>{#Q#&%U;1_e`z*0b?V11nkvqI=Lnb}LV zCLV;zhqgRlF@EMTz)Qo+hyr7rvo~dv@!u7@eD}Y`$zVGFy@lp)%b}Mi*GR&O*ZSNMM@@T}`*SJ}=K|)@%wgk``h2!}0G+j;& zBj`KJ0}W5A(bGpSSR`a&T6m}e{BzT_k0oxK>mD0Zg8xLyzHcal_k(ujOis(SKM`Fe z0C#JH`ma9#hr+&nd=?+hKPMpzaJ-(^Lk`c^ws5uP zmjF^tp%-o0Zqw`bd*}=X)AiOPQyaqeicUdnkG+|0+0>kTn`dG|f(IS@$|M7muTTW^ zb+JtCy%3pe?S&Q{grKW?w`?>uP+RN<9MoSEFdX{lKCT;5?0CMq#YdbQ^y9O1Iu&yR z(zfkH5%%)Bsc_sWc1PX*-3=*<2W*$oZfW1 zo9YfrcjL=d0udwF)epv$~lQSfxE@^|XImXcgd} z7A!-`I-Xb{)L{)%8^Q(d3|(XvO1Pu@d$%cFEh^HTMM0Ri!${CWH*-6cEv{ejjVTTJ?`ss2)^52W-!#;Uq%owcp<&iKcsV;gTQGdiWNWzZd8Boj4voM)-h z88frKtBzHx%(5Et?Yt>TYryOEIp9<+qhw5P%Q3v9Y(vGX^GgnLljqS}_Br|n=H{wQzS&=V@{7;&CET}s`g72j+TKLr{0c599>_e#ImV&R zH3W}tVE+Wx^a(&hg|!mCV1$C+3|1@TS>8ax!14=ve;*n+8#JUdAQ6xFr@R^%9T~Cm z{r#wNqFR#hPw{iv0*9W|`=3P9xj?i774XQZQ&K7Qpzc;@K4d*F?-Xbf z>5M6Giazv;n4rT!9- z?OTRmQU?^wF>w!-R|%9s4Wrv)4B*&6Ykm)$xg(HRT7%6G1cKO1oC7lkU>)E;Xd-az zoCB{3!%U2Bw>lI|Fn#z3-YYn#MG*?VGcR9aTn+&7XDr3}fz1INbn2+4{GU`2Bcp~_UC z=g<^#07wIoat7RyNievZ=2(vp9;5`%m4bA~!3P&A^CLZ1))nq zFEkC!1sHm0oaA7Fg9&UKXZ)@cvFW1dC&2G5s1eB6^wU}P(B0Of7J05`ZikG8O*s7b z;4nQ?R8~m)(+g@6jpm%-ppXQKYkvOzwo%ZaPXNw)OPG<_im=DrDW5jELm~UDPHkygd7I`$>VD`ia=RA7U zTKpTN;{D)HM&Bmy0iZ^_s~QmT+VV{LodcyFH+IwL8xtEjml`1Opw!9e56?{x3JM5( zpu)NH6nb?GDMgQ@S(!g^=`0>|EcyskQ92Oo`hbYJG09V>2L z8sz@pGw}3b2A6&_Zgvy;8NgaWaFdz%Q61q#+Y2q}dwyQ4#}OTAPyAIm!QE=}gyTW| z@MwGhRUp`X~gsC;p?<xqzB2TtX0yx8T$Bz0;EfHrv3C~4Wv7_xdM zjdN~`vcD1J>^9Sr=lll1`-I!$JHpr8?wq?g`!A#_~V*evFNlfldJ|D%|EZEsxu zTgGp8w2j_oX7(s2CkJ>n9=A;G^qd?WO0`O7B! zE*VT{@clmOHUE^CNHUnN5M+5yn7LrL1qKT6TFId5kzN>$)$O%4ZvQ6zGK~p9?&ITw zdIn*NUgx-L`RDpBa3Eg5Zi|>9hiP`u zinW*i^FJFsa`Ua)u2kFIU^QHg-aX3+v_Q0#Y4H0&?{3SJ`;;8sqdRJkJ3EW7iy)#; z{SezbmoqCXRTAq2Fa@Egnd9L>-+98!Y<|>cK88)_zlKKU7aBEK9?Hdt^R0rp9&2Pqn(l^v=+5r;sEhkCe_Hw|W) zM0Wfa1<#{VV}WS_->8c0>`(y_&p%kpDMX^ZAnN5lRCh9sK|_(BnB`>g0S66)yF#p> z`F6=0Q9S8w)Rhna&v@|b6+*kKP~bCfZk`6~Ty0Qcb+&huRRU{7)+v~94zzrU{!_6o$30Ee}p3f26-;{5E- zfusiC*FKfYYurXet{aEh74*u#C&PpgD;#7+u8Y?KU6EoB4GHm}!UBbFp!v*5S%4$JH+Q*z_sw933?5?JAW3 zq-e{@G9n5K5ygm$bA2w;Cwes`B2&}q5W%ElZspS^`gw;R7*3=Qwo7)HcS9(D$^Q)h&Igs+h6bMZNigK#$BpFMN?rhSuz_^a*jCw^Dn)$^S}!>I z)FDxGV}C}DAV=CczT?C2`~dk5&QSe=rT=8N2zzWCb!*uiT`;Mwv~s=gY!d&^u{N#D zszq9zE8f2DS7G{pUDxtFg*4_XQ@*dK-m!+OQ3#C=2dS*AgUtF6TbN&DIbm>-wG&%o z%j59WY%Ar4VZ2WHwh&v8F7Ft;9H#MB>UxI@>nvbgtZEq3J)tRRxoILvOH(nqVUnMf zwoGHN;BlDInfat)**2{URTs>nI{E{?WL;+c?=~E^OXt!R?QNbeSh zv!fkhW$C??Vo!L6YEt7?>=MN||El=e2?lW|Ef7W_hda6M6|4c`xAJ}Fq zr+W@`FF0(qy4{ju_nu3!F<>}}-p8WS-h#LC?J)S_UB6@Q9OE4Itn^rcYo3cPg-j@h zW@gDf^fs{5osJ&|osL@PNac;F7S&m;QSdc;=h$z2iqXEUN491g-d1Z{f9Oi#L!M0K z17`-}o+)aTn}wzd{qORNcOunw6 zsyk<0AJy$*9I34FoE{xHop|l*#5{%EzEv~sKMKk`d*3}$KD_o@QdnS=&zt4B7nsJP z_zl87IV87yotf8GT|O5@wm#?2T6q}ToZ4C3x3qEj)9Wt7@7Y|7n8t#BkC#RHFUh&P zb(`X$sfwK)?5k?FFK8K_KFl@fS3mT39px+iRoPKqrm>H!dXAbX%M^E?PGk%!w|O!$ zB3_;JTaay>4iAs<^ zeSWcElJnvXXTBw|n;9`pcYdTEbq+O{ov$gN%ldLAwe;LDS!cpw_n#x|vqg~xuOde} ze*K$uKg{H77drTMNPWeFPF;gL?=Gfaclj0FViNT?Yin|k5vRJGfv4#7H@Ah4bh)yh z#Z`V0(>E6*xs@+Ii`q&t9nn;e*^n(3#=x)S~T3a(`=HHG3+`A!MgFWrcGX(w$FiUYdpi~*PC3=mwV|21I}$Wn10_ZqFgqz=*Zei$19P(IL@&^jY4z}ce!Mw6 z9WD?V@{va@4iIV8+roFlv@PQD`L(YiO*$;nTqOoqpr6W5TcLbHum)jTAe*4dh@n(!!erqC#zZ z{zdO`Hb^X^_@>{84;eRQ)Cyueg}3}ZhS@*{uopl=|>-<;&5}x0R(%_@-mWqoKPA zq8{!RvS`gv9NO^{xC4Xl8=Zo(2u2e z$%C@P?Y-Au*rj~vBJ9tcEQQzfF&MC(gbtqJ^7so(0-t)(49xIqS;USKNF@P2s_^_s zNKAy0=0Bo`P8SWag&G<@kHjANf^yAHO=Hv)`pv_ z%k&+nHT!N~$8tq`QXA$fL?`?{VOMSOZ#WHMdiea=+2Vsl?yg0LUB7LXAx2uD{@s25 zaodA3p0hHif9buIB)$fg_p=xZ`ktf2%Lzmc4}~2%IJ64IPxC!~D80#p`^G23=PT$E zI?;rz4?PVm;KgD@_9y#cW>CA z_EFee>ptrS?xZ@NKx`;I>7`m&j)vgrdG<0r?lypk((G)oL;hgDP5pbc>9!8QCSn&9 zCuyThrQUYph5eJ2cPhvFZ$cOMzgf6fkNaC5UZ%GtL)EnY&mBzija2>mVbK9rh^kA> z#T^pBeaQTNuiM@G*kg4I9e-|jf5k%Lb!QQ)vH5V<-x48Kh|I8C%3~mb0sKX@ydbf_ zCM>Q8GMPC*N5CCH!3^F-tFJA*Wsr>%o!?) zao~ab6GF5BWPv&F6FfnkekA4Q7R`we8zv_q#wyorWz)>aJXjdC%I;*}TwCar(C#do zWRT*~qyrxXctwWT-tzo_6&2h}rx;t}tYqN3Bzf*{1imVEG+&4^?A7{X+R-;^yYqm> zfuIA)&eyMV@YKmHC@`W_6XRJp%n+_kk2l~;_ae!ZBTPt>SRdlnq_cJQUtA>yC*XQS z$q}n3;+-4-3KyYwK;{c_3jSeUZ-cehm`{`*ymi zq{$*#7?8N@ZT)Qe56|@A@lkqp#UM;euWR`cH&;UTs2?VCKC!h3+l#mEmJq9{*@E92 zrp<&QU1_#%nX-xug;HU5bu%+aKyiKsUX!$00ze zjEU)#qZ69`zCJL@m0eSpcenig^!f8sze)F8Ih^RFHXMlX;JfvTKdIps?d{&)qt`@e z!!#IxyXdf1T{T|Y&(XQjBDU}7K>>{|9~|E;X7Y;5?cp9}1DNie{8&7~#~Qmk0BE@M zebaN8kLY(>v2ur3g0VnmZmzIS#b87_G)vAMvBHq{V_8A(9F*-AAaf&P8N8E0z7Mfw z4djfdhS#=qau0mvaIsNI{3i;70qyMm_iox-*vA2bK^h^}& zE(nWIzk6E`#M*x}4Yp1q9n!K515p|g8_CfcHulGYig+A^&>`s7hJrutS7z3tA6b<4dn)N3U zCI%3p_$gO{WLG5xR{+=ugSFrqFx^2WYuHCuMYH}pi#{%zdFG|*DW?O-MpfAt5%Dsa>Cw(l{v=TH+d^7^P_%43%1cuzth9<_Uc57uFJd_ zY;W<7%FN`|mS!{8K}l|SYyC-IeVaFyu_^%-gVO=9Bxjp`wSde=&uRuFa z?Y&~o)A;u?-pR*!UQzXPOTKC>hxeFAu71jwM!`U#J@u=Yo|Ubb%@r)`%Bm2)d9ErV z{WURicf>j#`vA}>k!!L*>RuW6jVop1gCI#~QL zZ&NOE>(Y$1x3_>iiu_|()s7H?1OUPGxE(O>f3Lu#ch9YdLODHA;mWgAL)g?+O_0`v zew)>C>060(K%VM%i(g5ky$nISeAcP;jVw1Xbe<4#@ZrD)(uoEbN`7(huA5 z{35s*ADC#nVW&%)0}xhGQ*l^)aVZ<_YnL7WBfn~8haHcm5gvTC-<=hMDx)nX!D`4$Qo&^!!=I0uLCN3m}GzHYtFWTmKPi5 zQiKrPPuPG!>9JzPQUq&o&;r**5M#(#dk~xHeuqo2!vS?26g;ed zU4E-_9_H9Ra10a+ERsgp_GYZS^FH9%P9LVjzO?!k8IGN_Rt|(vkiF^;?+S>%fEX5z zVsW{4Q$iNeq7us_N|5ym$2~faEIsLQmgl_A9b6JUn%32#qkC5W1fV@=h>Koc`5@d} ziK$C06yh0lA`7}#NloHg*b1Z@>~N<9rvzX@k}MXnP*%dmyT=>vtQIS1{KYPB9UC5E zNSkJ^k^;0NV?uB1>wc7$c0oDb5bidYK~XsiDhbvzs+ zAhwArrR`V>X^!$n_NuE6eUR^D-)v!%sFm3@3Uw@eQv}xJ8$V$)y9cj+lE<)9B zTh40x`Z+G$QEtiK;0iVzUy~F~l#@kBp@0mKd!>MN_2S+m{c(MOere)b~^ZDq& z@w7vE2cLNGu{^&lC?z0bv51Ab9JC-DCGdDPG2vRW?!T}!yt(P6YdVVInX0c4p)Ycs zD(-Xmuuzf#RuWJ0u;coWZ({>?Vw@zwaGN?h%AA@-j40RN{Dh3$VCT%-+<0a4H`sm3 z!o#<7+&dY;0af3=9j5Zu9hHG=U}Uu&TQlU?3nL9?w6AvbJ%t~?dj6Las+@NsEcS!YRJ&S7?y?+<^6jDg@A7Plkjzi zaqohmIV45z3-5tjr_k&I!gY);9(oU-y5Sj|>VZPN491E;p%~r!3(iA(j3}r!TW*Wj zf@uy`2>8X8*p`XcY6<##fcysMsR``=ZlRwxeI|?bA_y5td+|kz#kWIekxZKe%SW~V znos0D*ocGp{o%ubg(k1Hz5NMx@>qo}@bjbV9KZ=fSOh+sSPU<~SYBSZLz31|3LO<} zWIadwTNeynKq%R`PhCAoG#r8g)IKz=YOA4sn*gY`-uTwjB)#@F-YLrjSaUDuq0h55^abcyK$qhUo7G{791oWWz zpJO7^uDoTcXi=fpTefs5W_{6cumv1c;lRFc-GV8eJN+?ido)LY`!)$z0zj$lhN~k& zH9cXjI)Y#0sV zfDm+!Yr=@dEv>e&Wj9#*7|dzdbaNTVrx}V87Y6idR%@O2E@k?7q(#vre-7z?74GMl zGq}VYa^#k^GOS+Zsee7!v5I`FXNxWwcqI@1{+*-}aL(6P(dG1rzY5GPWa44Q0Dgsh z2DYFe+{q^5Ex2+2Cj9#)^si**6FnQGcA)qH3;`wA;o;qb`6o}FOvaqzMyVf0!Nw}r ztQD~Hf(;+x=YkdI^0@?xTQcDeKUGUh%@wO3hI#4rH}KeiuQ7IvAf7IuO+QLcLV#u# z_ZiF!kZ6)s0_G6Okn=qBQy^bW{P}Dy^l<7LRs(ZTk9_0-4!9MB*h2a^YYT>B zwVhFHH@L*_<9GIeHNvgocK9&-`YjFOp(xz2VSR`+dq!p^G9gqsP0dijVc3BgGCW;7 zdhc_6UteFE0El;5d~Pf?Zg?}n9yCGJ!$m4f*Z)+H%lvaTu_tUNL+Ty4umO{h{F4MRVtqt5nl4R_WegI!lJ88>(82rKTz(nQ`T4+AKEY|j> ziNS6x?4Cb=zA!#RS=}WMa}`YlJgi?2-sK~E3p4={+>-0y`1lmB+4gX}JUe~IoY7`C z`(eJSl7dSJvFOm*n)H(dAV7=O=IM{GjlYGwBGy2-v3w~MCs`AQlqFyO!5}SUEUxjr z%%_!lCRJO9B>Mdoj&N^m^WCxaOwocp=rh>`sk9>d?;TOqc35ivgV&3xij#6f&5~tl z|5Q>~C%jwBv{a<QrFIAN)a2bXSFu?Gg^jKxr zqq?65i60yW?mJprJ!17#!)$p1g$^G9z*1&Z-d32LI4~7A*)f;fDH8B}AG!yejQx$v zcl9CTC?1~fgPI-GPXqQ%(z4ReBNjX>_?jA**HK^%SL`CTTlF#NtQ8c}8jdpG)i5Ln zD?X8rhgt@3LAY5B)5O%;&uQW3KD~}1R94!%qxa~sN5V&H>LSaRv?P;1{%j*}lHnC( z6ojXjAUNa1ve~-9W9yC)S?c24R9HUB9_^5t0btm8{L7%E_YNOcsQp0zzMa=zB213*U&Ma9EWS z{|=*cWSNh6au1S|+&-(Mj5me?*5}V94)F-oaJ$7QMGR?$Bx|58Pk8$4LMwPY8YtCc zO$pM=-_v{tE6 zw!a^K$|%ipTB-`gs#1Nk=a=E9=Hi-d*X-l-_AGPa2^pM*XZu1ehh&7_wnPeP zpxC&)VDNw)3QtI(II0wj>Qy}v{boS;#V#5~qES3xO`D3PiyHIoiE1GPU#<+E5D-Yh z(@*hbGZg4`o^-aoz57IY-1!h*C&dmoyk#1@0m-rjB5)(5syQ@5_r(ZanfQ*oTt~gR%u3xow2B0d15_TxZ&5w&&dFlxfDn>hc=*J0QdJBsScnl8E~lH-f@x5pIMxtsc6!aXFX1CP zCdfj$)PAu`zGCoDETV+zZ4hlQaPqr1P?}i-apm}HfFt*LSW>E;W%s#pbg#Z)XP9RT z-mit}8}JbDWpK|}gxRZ1#gO;3J_JPPLh-w~yez69L23y{rU%`2-#`+XatSt%@Y(>i zJLVx3h;kJ(Kn)bYBSlPO8S)01#ztnl*ww{c({k5~y+RD%pB6VhxYx#B6mZ9SOn42p zT9+?F1dJ66ahAgU(8X>Hb0pkEsZ_(=?3w$>tj^p_-L~SPOQJ1Ll@w_G8pIKl6El-1 zJ-6Xu9Fa;>dA4wQQTiU_a+#T7wgv_T4{H*< zVMGD@Rd@{|uPpB;WWjV6&lq3>JQ!716Kud`;ABA*Ng);}EUKsIa%gcOyezy2b|dm0 zA-g{nl%OjbmHIm9lUblpD%)x??MBZp#V)b-tw!Rt3X$r|vT}0?=*)^tk{R^YnR~QRe$XXXqe4MspqKPG^+lDN0E}k~R8-DkrCvVe~c`K1Ff0h2lHep>Ed8DN54$GUUoCc<={#C28(VU(VcsA)<4?S7?;}rzvcX@xm+$WYU(Gh z1WUE`T4{zbR))hG^AevG`l}cFuPtxS`i3k4H$pA5@slQyXPH~qtLeeY0G#WHZ!C5> zUH~~Qp-Szxh{b|ERF_{A?=+{n%Vz5O+XwEVKn{bNWXn^Ux37Cmp?G4JH$lGPI7^(B z59V9zk8T^C2x1e3fX3Om#Zw6m4{5sSoP^g@4A$5czyn=R1ir)yRZ{1snp65q4Z^~N zbxd_sSMD{v46G!NVd_d!La@1k?I+w_XAX<6yKW!9G~aMXSUNt61T6W9IoVgg;W}gj zShkH~u*1{<(2uybBGDk-BkR$lQGiVqP6-6x0>ftYPSZcCtx5@5_*xoBv~hHGtpqIw z3q3F7J8-it(Qk&HYtxM>@ik)MC=Zl1a6!M@3Pia}9>&XF+`4*q#x70;IjXJnbTIm? zzC?U9biX$z-Jp|q>W?9v!|d(<9&f&PW?Rt-j?A?WKP7s?zO3lj}tc2mJ)GgpuQ5vRzSbK(4tNJ;I7nOybDr7BwkfX!KMBg z9B+2irq9>|()F=+3>Wh(YcPxkrELj}!2l%?BTccHrZCM^1=$c==v*A9HDKa{75`#L zvDQz9@l7 z4G}k*`}VCc3utKIsx8E6_GO9ZqlN~n4UF)~A;OB|Ss zo#Vx8(UPyK8iD{C&;pRA7dbwy9Qr&Uw-}1TVgQNof(?)d!j)|GeGvKu4PjVWbv2}T z0e->>otsN_#li*Ioj{`!ec*~BkO}Xk(ajLZo!-|eLfrLX5S);;;NoQ9djo%B*`a*7 zG@mX1-HP);yA{9&nu2fbYs}$f*@~giA8gixl66;}W$ zCxsJG|Hog>B<3-SPHS;qgkvKzDD9pHE&&Mw!d>DL2r3(ZUxg&X4J1F9!@pO3!6LN5 zcTRBT+cMyi$kMT+@*?h)*f|sPS*%!)HrWr+AJGLvhXzO;4%cqr3a?tZ5_pIXEVbXj z%g_zEiDx`Lx2##7U~+=z70G)<3`Gwdk|z*%`PR8K;t0Xt6<+3{pRQY@K&rhlM}1}yMR&;JtbhP5ipR^Uc$}*7BD^@b{%7w&-rTl z1_xbFo}BB|QX$sW|7e|UZD+AEB-j9E+N1hq*kXp{cG$0 z(jdPjA&oeA!$|A|Gz5j>47`D;C(**Qxb!F~_}Hi_mfCmBLMyJ?@@N<#lLVJHNQk&z zcqeCH6D|7K9kw<3s<0DYd_eay@t_=F?!X;9hUcmWX5l0@21?atp%|dpaGOA$0^O{Y z+-4$Hz$VihiV(wt+6qa@xW?qj0pXr(79h)8Ut5U%0ySrZICo=1?guoJWEF|mzUumm z$Ga|BX_|;cuvQBgf8-H`n0`D0TcIjg&7R3I zEu9_fKtv;GU{d34gi{>JQ-+BM!p&Y0+CTaW@NTo5g$aClpDUL@oSs<6)bH(67Cs8@cN;p7q8JNt}dz?Wgw!5%t^7WZzEK{p$GH%s)?-etl}Clk|H1r?BBBKi&sNttb8)@DbCjpiRY-vyn zJAkSt11iL$>x1VS|24&N^*dPUl-gCZB~;14*^Jj13 z>@4fg$=N9og<;Slc4bxScEhPXCa(ZC>mBti@&h~1(j`ljZHIm~>nr~5=?X?EJls0( zh}R+n_^w%G7d)3fdYe=Ha4e%wM!LjQmycD8)i%Q7D+){!Q4dS+EtPONnsM#>h|aUU zv^XZFWji~^q2Co^?ekDzuR>H$?gY>@&j)E7J0WKl)@g}`n`51ld_(BcQ=%GMsfR#O zc#=mL4|j5Y!NF<_GK*W6=F* z=tj^J!1ves`$Coy%p31NgbB!wx}(zi!%%=I&Cd)w3A>=7#fKCXBPnQNF(hC3CbSG7 z=aJiv(+a~iDZn5hYG$CFtGH^sJhBU(1?4E}@TdSqeTP-aDd_dFTxs<5hyM)vD+vl4 zK9Y)~2Ls$SxQJsvK(@3Bpa2zt0JXxxtQGb}sA#}7WfJS~5aMw8iG!^aOHj0!Q!iFX z((w7nu-?(xX(JK05(D9v?^JaD*wpl1*)Yo1klei3--;>J+ym6pzJM1nx64Ms+m17e zls>d+$V2Xz_%w{B>{9N-XW*YK9pt!i57!#v=Ch?@s&CQ{JST$3_k3_!_ z?q)4|CVx#E_I$DSJLC0a6U{XJ$ICjg1Sp4}{=zs9hpH)@XJGxJ?7}a;eT78H9!x^J zWeHCc!D3|5>0utu1Q3V?>|ek-$7V)0{sf`!cS0IS8SS25um&VYC=Hn-QDCEyTSiiz zp%~P0m37pw-&s#P4eA>SW5=;Sk6z&I@C>>_Gc)W&-=j4D@wNt)CKT%r$JW)Y>CFfD zKh+^ByT=>vMYSE7>(LTS;5dMQWqkH;RDhnyb?o~O+SqjBH!-nEl=h}$1|q{cTrl94 zz+Q#ODU$eZ*kb(uFRT~!FrbPft_GLCf zGkPSshnS;-=Q~APh)2oIg*ebicnv5oq+q=5{`dN|HefSkR6XKe@NH464cSqv0Pz`7 zN3MQ@yfS+WbcHu*-ZCo>p(6V{7U|ir-Z0qRcd|&sN!p^fk?d>v$99F>k zeSn$m5@ogUa!1q4AMI3^0MI>TYPX2GG(cLjz_yNq(s1eSYvwZNr1px3%^l@CA9wot zOjrJ){hFEF;uyFO)&tciZkC^}bsE1l>|aseGl}5Ieykp6P)6rSw&~-?L;^gBQ#Rn= z^_0}pQc%mDJ`IC0ka%D#$ibl)nZcNX#SIR5u#_GiPZw^ws&i?*1dN5%0U`-@{8LGaS85&;|l0h~P1{syu znk`#n_Qa|Js^#IyneSDhIN176$@^heT*|yil{2q$ZVCxo($Z;8pCGj*oI~tzRXHmV zzPpw!m~;mn#V#Hy{pO+`Z}cvs zKC`z@zb9Qzcs@M65uLm>qnNW|?EUIWLO>t*%h>8n{KxAd{7 z`_DMTH3KO$eiILbSaWk<$Xrq2SLFm?lVj@6rv?AsEWklP=Y*Hf+UGs_l>qwRFp>J! z)YSO;_>jxCM`(yhy1}}M*Gpd`!^w&QTR(i%;#^zVS2OW-+rkrW-FiAdH@z(!U`Ba) zc|sN)HiA5{Z4A!^gOL8F?*jRzV%mHcyQYwoT;|fjp)|r-CDrlR)yCW$qFMQBcxgH% zj3JJ5S6pq{j=%7Hgt{6+R#S;Mw3Ch4Vzl&={98iwB0xk{Cf`=%DO|{{gFzO$g*nW&`i76?9{QT9< z{iL5Kk1%d2n0TS`nNFWb^ki*ec=eC}dPk71ASS`vi7K}sDH*zo$*_$vN-oy?Kgs!j zujDHJBHc*^vmjcje+d4`$f zw4WS$3*3xDI1|5?`vQNR4Uv1gzz&6oHu!1cm$I{!zg=9*ekGg$(gzkkx}nE*Q3VgN0y)~D$M^b;|6TFEC?RXMqHs(t z4Uqd1Rk-ia>K9U4bItA&-vWM^m79zI*nciU?vhNeNk|DAJdyApKrr&3{Nnwn&Z+A@ zKRe!urGLQ1jWoVhn;oEj&=Wb0_+S6&j?S--T{{(#ZiP1c8-{Z19z=g$n7Z6Au<-0E zOQnS0dI^LLx`baSAn+{Qs#8!e&R%u-^5ucgPlo5`I_Jwyv`O#?hfOE$@yg5O3h>dl z*mV8PEd@{bOoCU@-rl~jl&EpTrmB#9>d{rgv27{Gt7*Wu556h=UqZ|WQQ@#6KU!EBr%O@k9Dd)~yJ2LPxfKJt*^ECMM*Iqr2p}xVWBJ zVcQ`V&K%c81h2r$OkBNd4`Jhiz)Or|b5(+KQizuddhSz>$fn-jUL1LA!dO0o``hVO z!w*-8L={M%XR1_Ysye=o6%%AGkAZ>)=<7~yf9anWFJ7PqW9A2PnPVC#*pt{f8M)!VJzTFnk>Y+7yVsC<7Ehs;f$J8g_~Q5bo(d9DanQ%KTm+D-Mj7b&dsGw;S8 zAh<>j+Z<*APzt=$;#T5p&B!$*(cfz;)E>CmAnr0il4DHPwYum4 zLr)$HQ4}3zXJA0wkJ!>erOtZ=(kgJsj=U(mrzaA`yUw&W+ZY~pv2_l}#xZvA@7VqB zr?&A$c?37QDr$|0e=ukph0mA!lgrn_Qs!T}SxNESGZhmxkHr~+krLQuh=zBEG1s`g(fbLT;h5Yc=V}^J#i5^I*{v{^1uY zo!xn#PES8@SLy!vxYn=U%V66}AYKnA%m9v}`fhh1JfH_H;}CcXsmWFm5y0oOzv3>c zY-B_@x+EC!c z!IHmFtbb=5%$ypM;Phz!(+nFtWa z#)udWF8va5$Ta*z00@=o_IeU4`UNSXWUa8OKtM)%w<{+r%Zqtd{bqtPA?;q|gD zSJL;z+RvVGxOt(fl||E8zZr>{-U4}5J$sI;25)oVlg{Z2O{zRKRCdWO_hyz8(K3Q` zVas!axq*6L^ew5SBt3Gk!bVPm(Cpb+L_Sqq%+1YmdLi?>Z27m>=gXg1=V!e8+4n+X z(c`h1nHliw|J`@>$4PSE;-My`n)IQ>ziIt39i-{F|jg&#U%bRNJ`bj5Z1q z+&-}R#KEBW)Tvip{7w2k?~q1Ox-(V$^p1oK?`s)O;h9b!GA3RnNuDrDw&TfiGAZtP zvQE8STwj`6{g7Jw&-zGs(@$?(AR=GBB)M13HeR~+qRvi=$I8lzq9J`vJ9XP3;L%Vd zpqawJZ)JtoIb9S?aVT9P$n*WXy)4>_sILSBN+SZ?8F7+W$(@*M+MMEh9t6mNB z&V%jG`}x7#>&EMo#_{$%7LM<-jjXGN0`*Sbs^By?ki2G)O{_(#q=a>vJZD$fOfX~6 zkazo$GC!HJvZ@!Km%$(d5D9R^sag=_?+ltPk>oigfJ8}r^|PF?9tO7q1!DfXASb?eA^KKZVDb>k`%5$^YOB`3A`nhTww zC4zgowpJXB;i; zgh#wIF915eC-99Yjy}g^)^`+RtcAPXUL*FUL6{fmN|@6)=UBg@!K<&UgFC)EUv}-xcVDX29_tH7nDa*&9gKeVOM_UqRdjrx4qFSSJ?Ol8&Uu~ScdlfmE$A4?hR-h^3JS-jS=@*HGI7xttY z=Y0F1|C1*^T`yBap3==jX&y?}j=rauE6zd-N~c*KcB-<~*I2z_cY&C_xbeMxf7$Co zyrMie?8;=X9ujx$h%7&I>WZ-3Pp=LsrBAyqcYdjTkphb$Twq2iU(NUD7!eRM*IrDl zfT3rNwO^|tt$*6xU1nWGSo$3&-qK3w9|;Zb)z6>8^}__b0d4wLeb4@68Zv<(0zkCE z)mttWA0GNw8sKdVcyY1H)`+51uihhLu6?R$tn4Aw?{`~;b<|v!nI;`hUF6!;>=HMo zb$aj`$9}M#}q}1jHB(CzVo7{lU4O_M>6Pn*huVetYIe`o*pVpll+P@Y(Gog0Nn`)Agwr3k7KdcKSqs%kn|7zH=eMHj@z>3_k@8akprh1~57Cm*bR~KRRS&VFZ~WOp#0{;JAqG>BnaJ2Jj5J4&tCOR znDx-qX%qRN{ciNLZf??;rz^Zq9uH1lcVQ3HSb!DmyQ?(VT;vL#IsW+m_zLin0P6l} z%D0sJ$paGJGV%{6t}IQ?WBhy*yRPzFsO?QCLDkaEE0>&;zMa3HD_Nq185iy+^8;~) z{QJSBG*YoVhW5A3*Y8r3a|%B;YvN0$MiGbrx*bkZf(R+-ZOrl6#2n9n9ZWtXR<-H^7*_#B?!OSRhI|Lx!U*dW9dV~HVi(m1~>p~iu z76_YXFehY7pz>-VYn6ZZsFSXOYd@75nv)v8~fmfT++*RAWTI{0`N=r-MUQS=sbTSFb8^ zs*R72AA8tNXz{^nY1aA3l{p|512~&~>F^|NO`+{7j$pM1O7q{Asc^DAbg)cqTNKK%k)W|H#;k9;erZ%2FcIwm+z#(Fbq+-KIV3(SjC{4_;_&>y+g^?Q)R#<|WfU!?q3)C@dkHmCZ3itanjuCe>3v2U)cSbDy_h2}o~n**?p z@OLxN*1oWoPcF{OJI&DR!()CNM^A6uOiJ>9TZ18qq_Ptx%(DxN#cP)asfMSc)3h1Q zJxJEsgomS^#%a)Yb@Ac2vEN%+C!VpxSPD(snlSmupo*P0FKL|C(Hlws`OrFl8S|pb z=S!N*Rv+pp3E%OAm%j#n&V+8`-yQS+k#*+bRIlyZFPW#7EHbQ+%&p8*B{C01h@!|4 zg;I#3WFDeWk|`NWQkjyX$e2onR1`8tR0u_;_x##>|9(i8!*`>;5l~T1r1d#5wXi2s+Z3Ee&Uw7e@!jJ0Pc4KB*oa1w+LW)N`@6Kut^?bX zu01wwAUj?;@@YCEVCmw?r$dM`F*!OC)meD%zQWc|Jqh;`S!!Hdiub*>G;)4u;>X?~ z9Fdlt;hp8h&rbd-ITXJf;+o3nrR8(mj_q%P(50?MA6w*0>iT_EreE2|Nz|q+Eb{M0%rE79iZj)(@C5b2!qoq2nNY>}R~aZ7`xCCNf#+ga{(A?fRE#v|c>0il7lb zk0jx!1J}>b|Goir3A9DqFg=1*?%J%R;4E(B)Q9hD=F#vQem4TAdp2wTRSzX0bd!ib9U{+79>_G>~&^XF%GpT{gZy7Pqaju?gzam1gR4*kaQ zaerGWaj=4~SDAHS3p!H7U@#>mW%yj+I>x|M(zh^_NsP^E%EotuA5=$$J6-%-?tdUU zjz7U|+rEI}5Bmfw2Fkk6AZEruB%k+y^^N=AjD)=0iq$Ns!(-87e&i<8T|?J>AL-rQ z5S{f@-1fnUhDdlvS&YH{_r5vg>9y1!SNZE|xC`=QR1dB^H4ISQ!$_RJztV_AYemNy z1z|TX)DL1cIa|4eW*2c5hDUh;=kCr=pXP`bEQAK-647W@0DU-)hQds1T)=c2Brr*s z8xX27kJGz%?|zE2&ba~fjBzc_xw(yw8R0j!-O3+D?>Pp)R}S&wpgsExVjbfCoIML&Iw7^N`};15kfauZL4gtg zqNtQy+~}wHfs4dnAZRf}6B?t`g{-ybu_by^&PvjkhEs zv%mVB3}(sQc3p8>UWH})m65+X3Chl?Z<|eWw^tn9oX@q^JgOs*qONo@#W|F@!R2ah zLqum-u4MBmn^Xsh)FWyUlgWBZObw4qjs4z_KggKXis~u(@v{F#VB^}+kTF`({+rg@ ziACb*?mc@DSvSgWMsD54Htb~E&KogTyS~Z;;VeX6G?=IJzkdK33}H^yVEnGjs`FSE zHMlQg6M~}+q`|4^%>^%<34mRo;f>^RK zwZ*aS5dIi__EBsMkU9|u9OE{)DfeP!n5tA@3e&K@;7#nZVMhhxvRR}1LnV#Be%&Jd zL0X3Y`?uSVKW&$)EbO`_JZ>oE>`JH#2olQHLg36F9HW z@ZGp18F$djNZM!0`tSH3uAe(;C+B4r;)EHc&iX&38)afr!}%m^m{{*{Ix-L$o!Q2> z?%=KoKu&-M!sw6~m3rIikG%Z-qjTk6-nFcg1=R>!h3T`l&!5j?@aFC9O;mE2MPXSc zf=>a8!(TybFnz~4SR>)3KRsQhKO9zGUQUdMu{gfP@&5AJfTg+NfisPspriMcS zQb{_P0Xk%`1siQE`;&3An;Xpu9+I?gyMugja zU_?g~9%@Cl!^D9x%4FOwGlE1)AtF z>wUsk5XpSU!p+gK)~6dn(w-h%fc*Rp9lT7ukp|*K|HSuemgFlX$@CbjSnH3rdq}fC zxtiwppL^dwArl}ZVI)Mk@hExf&{V`1jVIHO8Uu3}uKFD8Q+@eW^kTpDtHY9!S=P@_ z@pE&>-AYP;M{);qO2E%|8X4K&$!3MJ*M;<3+I7;s%s6Hk4!#mB7~4p+%pPd2crlHA?z%0(DFxQxgLO;czBB1g!0RZ3dA}DYx%Id zWM7XPtH9Y4$!$0YrtC%s-ndPDI%}<^)HPEHi^6uuBd}PhQcl~hHyoag3iur_f)S52 zm5NT7aa)VI5SbaV_84)7}FD#n7 zC}jNj`i8c47iauRv5D8N>sS&UUXy)!iqIP>P0i`vBd%uhATRU==Y zxoi&1ER9^*8|jO!zW-{HAv%Ka5$l*KvW8~oVXFd@{H@{}d)XHy-yuuUHLI~lX}^GR zI14Qe&5~gX37>m(0dJYT>5T0#X8iJBZiqaXKf$xmyHVH9Ct`)56 z#~O*5ad%ji`a6$t8>UqjQnr92Bew_i zlP71!Pg5G#ifQ=$ayoVDfkbp_E^ewzDtBDtpYa|$IQOOVK254Mm$@s(!%UN!JE`{U zM0W*#pn+8LaFqyY$$R5FCZbeJ=dw!dmo#xob}?X$)Vb(&O!3xaN$K&K$nm8b-IM1J zI=1CjxWAj^k%>Hh@yNHJv5B$|Eyju2<~B*c^7L8^2h1N1ZVM)t3~JA5XLL$DnjF~G zA!@JXXGCrCO4Aegan)V&raf_A(iJF;867Zn2vf3}ROabad>;;xY8&QO^?gS4QQ!xjEP-p;vL`E57>i_=zp0hP1?Wd4nZy}ZFT!|KV<&UyXqF7AHo%mg|{Xq!e^o9p(l!o9PMXxoC% zgmd}0Z{zmeZ7@N>d?b4bx8K`YZ)yNMC+kE!6-SO9g?d9tK>_mSsY(s(CC2~mC2cg! zbobt-<|_T|SIqq((Vjy+c;=1no{Xz0B_ceD`dibSyqJs(O#4c|nZ;8*6PnCoN8YX0 z@Ab(QjsK;Vlq>OMvg}@GQMzyJK#BiAw{NKl(vZVW!i?^m4Y z9F>i9hepptXEU;>A;zW!V@B~#*61rE8J_5@xBDQuLASNAUygOn($P}6=XO^*ZoBdc zl)CeG`}gKzcBYU~Fjm{^o+=h_MTBXK2(4!IYpGm{SxW(7DlHguOXX&y6&l<5=ZZ5V zggb?TxYv$6Io??|?AO6~fy=gi}!-b$X5rQTDts)80MrIRI}!4R%HN;u zWoN@>{5SHjV)TuQ*cZne@I9_xy*hJt!|hMdCjY#o@Rr9W#3324n@IT*p&RH~`q4wo zp&{6x(^zcNI8WFrs{FUs$r2K9Fa(w$4)N-)@Ig5@0u7l$`Y?LMkXcJxCxX82k6Htv z<(O)TtL`8^$CB&}cM);0AOshLR1$g5i03Qv;^ud;-GmKTbrV- zl0-vJfbaN3O;+8|*_5MqE*=VaJCwvqZx!t+89d3;jyQ_!%8G-2-aRJ;&dw%P^i9M+ zbssC6YOdOu>y(sDYgFW;KZr17t-jt*2b6Jv^|{(7f_cW3AASwL>GtH+LzQ`0}diMjR@rpC=Wb}$O zP|LA;0+_|)ysX#J5G|rrX7u88?_>|xN*~V3$Qw{KB?*c4-q_L<@{4AM;oX{2&13fTAGocDF!0Y;C|e2h2iq5qP$rliM{%XQ+%tRk*>W_?1 zs5Pdi6{o44Wt*-rHhOl*s5NUlPpRn2@_1A9+e(r6tZRnEC%nGWK|&!^`b1~X_YSY4 zE-;Mjt+6+?qlwf}X6v?s{+u{@Hu<}$k{ zpNcW((NzY6vr8DDILSxd<6H>)0?~7Jt3<57T8K)i`#}V=&iN%wVA*X`^n6v~&fm@+ z;gIR5&4J1Qdx4S?*0@X8@C|T*=ARFEKGWyF$$TOC@yJfGhz<12Vg>6T&xJ|SXRj^b z@MTCJ1}t+4!BXdEZreyl);VZ&hG*xYO|x5UQY_aM1!LL6hYrrgYO~&5J+M0LD4a(F z&r{p24@FI|#{v7lERS50voR4`C()Qg-+nq=3&P2ZG)M- z%cj%ICvCbFMGSwsjyX%dy`}cq*($Cy-Qj+}LtoLY9Q`*lFR0?FI+nj>^_Y=*M&v@+L(teM?DHEoXU-F9AoK&#*xs9ynhOAZ z^ArLQR4EaOv~z13*PZ4*gn9zPBalmPnPbhD;&O3_0B9MDt^X8E4Q`o2)w*>3Dx%sL+L+6Gx69h&wTn z+y9J^tV54O`~JI@-uB_T4P`$(RBh~pG583s4I&=u02YR{lJe zsT#DRovfOo+fVZ6u(zm*B71ot#z3a8b0ibTz14YxEjkNz>301ukG=7vR54b$#l`e$ zFrM6CGJ9D+>uv9lse?xiRAQHnbj|8Fsh;V3E!iaB@4BVw7v~u*);9=Z8I(a=SaeqzplwKRR)iG*N9GHsUJouB((&EC?6Q5qJ} z;W>2s-5y38alf{7lv*1j;%xm@mHp?st{J|F*7xsmz>~XV6!>wnw21BaIWw1$olm+P)%Z>jp;- zg$k>Sa3>TM_4*ycvoj0^B-3GpH6)wdHnRfK0zL(hx4KAu9;(;h)EZ-QOQBr0m-UKR zO?xbQ&XRRDr!`Lm%57i_oa7~=9i@{n+$SVudv)a!@HVNl)?LsMt~y^g_0;VlbJXoa zh1%~z_I>E;vY~QA*Nm;>CR>Me(GYYyx6D5wl(X21A}EOPv6S@mM3FlW&>!BN?PTxi z$x#S$_=UsMXGr_*Bb!-8<#5w{pDIs7P4znFa7rVB$jWWlAH1nLEf(!4vMwbfW7v;i z4-I(MOJhv>^kWi#OA1%x+7bm6<5)Ak4i7hP8@q?Jm;3u9qmg&km>cv3`ic5YYK&}* zVv>}+yv5+h-zrXsUByNj;J_{wVd_h_8Np&j$L7L!5dbDIv*r|y?J==9dZGUtYfdmxXOdZIW{{9O_KlIChm(Vxp&4;-vzH>ky1V` zKkKDwIXT4i>?_B^?8oZ;T5FUz)z=3;nC&sO)2cP3Z({n^R+wMs^*63sCMs^H;Rb2$ z0PL#HSvg=zDbj_4^$@veQtusxh z7AG9rTeho>#&~a8ovJ{Cm!n1RmREz4rwyg8`R<$DJ9f^buA$#R)6>O;QFLRBwdd_t z*>}Z!a%{46nfK_=l)iNGI&q=^%JhBiE3}AAJA2agH%E|dhawQLFq98Pm9XOlFNFNHFHidoIYwHUM5}oX;8TUT03#d&d=u?}R#|nOqb#LA9 zMZr7!@}*$xEYzFezU;dT=O;RXcpbNd=r$%|(7K z5glgG)d5kZe2Sv+gMTu`D+>1P-i?G<91UyY00#H}-XYgig2h%DdGhk|B}GNR)e!kt z=6AeDTC#SFwe|D_ezZP{0cTWH6uvTEYAfpL=@Bz;zYchViVrt>+x8%`HbMdelLJ;( zc;G%A=N4UzaCrUpEsO%<%B>FT}{nGQVo63AxJvTQ{o7P4V*(trN^ zg0~CtDeYsBf~MWLv4KLtVHLdxkYQR~yzylqorxDg54FJjPW3584UK2#{`@3{g%E$@ z5DdeI#^2VsmW!pgZ{Nu3%ZD6Z!)1lJ+BKuBgZj$X!yg&6&)|l`+_v%j zSF~WmwN`IRgO3fOupR(ZJ}KFrrwmBfgMSgB}vb@db0`_u%+fBsbW zpY;&C3Ts|R6k5joaN#r#NSxRP3H9`}x7bx{oM{BqJo|M3g-L3fzhvTGcRTOPL^Cc4!UoS(=pQb$~!EK~>_uV^NOkGkV{MeRt zR&i3LOewN#LE)OgYX{faytn77IYn{}JE|pE)7U54qPg&}nn9CM?}I>eypaDYyRShs zG?op4<$_;nc-N=09~XPP;Ba=;M=niLFS(9oqn(z6C*`P@*Dt^BImkE!ymml*KwIl7 zhx>SH*rZD)`?%Ac7vYb#glFxJ^|ESTClP(pDakjXZ6vep@#4b`ud;Yjk4Pr|_HDey zTbNbwxM0|dU0ZJ2{M3zz?b{^ID$l@84$s5ut97QmJ*NhKbM&!%^Zu;(hEv=G+XUJi zJga37LE8p^G&oDs(=Y@<*$_O0&Y_;Z{-!H0aKdc8FLcF#qUMX9?{O$GT3x1JT-gLO z3kd#bu<`Kn;@V5hIaqVw8pr#ZpRbPQHJWdikDK3lkN+Ib2AoI7RM~$~N%_&Q{A}By z5%~V8D9q`>Cx7+0cZ-m?=Z``qgXR?Mmrzp%&fK-zu+^*Hr+aBBAmK2`(pp&_z16ED z9N^&V6~x?oPLxDxdH>!UuORG$n9VKD|9L=qX#d$HWBUM4Z^smZfa-eo=A{1*wHpc+k4to${<#O>RTon=OH= zj!y^0WMS6r+lYK7nq`m*T4A(+jhiO88dwR$m3c1APOf2KS5#8kf~??Mx11rj!g>SJ z!AUIC7>D(3MmbGP&Db|=BeT+H&1BlsKHNpRbom3eLBO(c!tuWAs}_JSStpBrIT~7~ zNeOR`z{zs-$PtrtwW!ogRCUH}M~)m>K{sksm>k!mXNiPDICT&!{>Z&EckC>DtGMC> z;1`lzcqC?4NRU_@5{*`@oeByHc%PEBVP!xB&<%C8^-;~S3##undk;Z#AJ(9+^--L7 zkLvm&gGp|w_@he!g7_||jG(c`T7$Pax^V!OYZTWvOzJ*|YW(<8`2_YuyruW=vvJPg z`6~MXE42kF>__LLoXZSiHvs>AgckV0GAeRULNzr`?I(rl2(QjUR+94r>jVuPXRwUo z3WB+BbPG*)xT_jUh;auvPq4A~PpYm<$e{4f`)6b@%1|+JM4$pkeQ4;LGupiqp^QJr zHj&8w44eyOoOr!RmgicOg!WYL3NcqAuYo^Pb-?r*@5P48rKlRrjx!Ey9OP<(*|a31 zAf#feH}&~&ZDX*S&Jv^PWy!obmUheOI3AI!m_Lf}Z1`H`i0~U-yL? zg@Wk>X@i+E!e4CZc{{MZfyB&0$C=0t*7bKVcYgXqO}O@o$v-DFDwX=Z=UL$C)7;uJ zv~Kd`Ex%ZIZ7n_AQg-CJQmQ=f=$SXhd@66gkKbFM=zA(|kqyz=rPeS-Zmvi>+M1wk zrr5v~lW_Ir%a<5ag5P`z%u!#jv6RUmi0uN@2tP;8O3@2R$ZD8zW~_jfqpP{(aL zt)`IFgvSKi;>(wYtk!+4fU>EdotDs{klCOLz}k|0 z&+i?@kafK0*-aj>FS?x&s}4MoLi_&Roz!ti?GK%dT+#|6MPa5S*GP#W?5 zA@Rk@srX~DC@jCoQ-AP)xM`>;-oGb{Rc~m-=Qn;v7h$7#xbr9QZ`u^4Uexx}+l_P?<$Sn3te#02-o&IiW=>x|Ih7-v8+jn<^M!-`b ztB3tGM!B5#E)A9qsN#yipb1u$ndJSv+(cs9`lY%tyq7cs=;Bvjr1i2oh7d{op;r0bN^P2{rvl%v)@Bk}yO#OG7C z5r-vnv!Xg;^|vcFnE!m|F3_lWX(_G6;HtZU_zCU4Gt@t`leka=5l4(xUvX4RbljSH zDrNaLFZbuk+_rBRc7T>|y-(~aFs8wCTd%)yOU2rXLk_f_B6qMz#@|H8HtRyJsf5s6 zwvBWhIViml%kJa7a5X@pp~HF=`f_?b^;p57lYJw~nW(-;VZ8suvuIGL;5Ru=$orOUk zzZM+4m4^@_ospazR3CbU{(S~s5wEl4h)ltvf-z`Gc+@QJTJrpIwkEPEHx>#lilppz zl(r!2b_8NVjSk@Fu|Y2g2g1nL8ya+V9--K+Ee>%A?eWxZQ+&;IH$S>wU!!Tw=8#K< z6xlNO^~~Yk+hS^1XcC)K7I12) zrbg4nql527V@(A>$2-?X>!F|HpcARLRn-XYS@hODzdKAKx*?QgV;~-&`V(hXRSFn{ z$zA9=Vk5&rCEWZpHrl~~(F%2CdVEq3%L!vzjXTn5@AqLjf|@QsVd zx;oCw8!rB-sokkkW8JC|)W=;jfWOY!N-w~)*YxD#^WO&RLj=NlIQI7I+stoyZdMz* z34EQH3_q1Lp0hR{F&P<{Q)=`&|GNq{4X z^Wx68LDZ1W^NI~RDxA}s(PqG%2Ye!BcWg{dp9yN9^Y-@ksA0?8G4`)MkBPJYA7Av4 z-4*q2C)_p;nf4^`vRkk5|<9S6s-J@@?DK$@J)@IJgw9RB7G8zj9M+K#@hi*G zPL$VOT2t^XcX%6|oKfJwJ`RaSoS=rfni_?bp1|-x6zA)Qk`WD$a4jAh0u7B)9P1=f z5^zFG%?0mylNYE5kmWhlTS;9Dsp&--2)}QP-|^$81~qGs$63}DM_$wA6nuTF?rz-2 zT^;RM%y7a4v>QkTWk=`Y^DBN;gF6-n9@S%zyg4CXa}wcdE)|yw;R1}##*XW-`$A~X z)KeW{IkbCCZsTE4jXmb-s%ZhkeUT2>XBHU_y^&dW0zK4wZcEg%T#WM{+(ek{@bpCr zY-^E8UkDQyRH&l=GuY@rTbH-mQLdEBE^tzp+lASehS|;E=XtZ$Of!Gp!^xN}zU6|9 zG5QOl^}=&9lWp$jCk`aLOfZ^k-xIs%_dzjj#@`yPC!-ezljd21H0CmXo@5T>%~a70 zZjd;R=K)f;`oI3{z*(38i2&Xi<#WzEfKUA)!%@RA5pIX2#R_Bo|aZd4v zGMTeI$33nr>8YsngPZBHRO3%6f40EU2!*cWT0Z2U+?tRl&b4C0MtVLRMdRBle%EO4A2+$dj;u={{CnaAHmaT6T8`h^69mBDuq41fI5XyCzf* zwhJuz=y9rNwEOJfzPK@k%ZzTMjg}4^)ornDI7qg)i!*Ae34k)bV$gl&G9;VkOJiOisS4*Y}Q)hk_enkHrCTP|bgq#7T$F z7F@NLwXzm2rWO8)nN$Wjrf{=#T7Zypm*{1!jD?2ho2qP#3QBNvo9L&hc!`Pzy)th? zqKMPGZH2~RUri_eZZC=0^;@gtwjQxg&%M*TA-1FtQfPAK+dSrt&YD=LOLE}=Uuo#ZfKMy8XZfBs|EJE54O>S2%JIOLP7 z%f7(=0+tBw7~zT{=J{2vQBh3RiTIh1kP-jk1OBK0ja1Zv&lY9r-^C7~qyqcX?L&T2 z<#%UPVd5rfJR3H|G!Ddz+&J}i>qAi#UN*{Tymbr9{;)12AgOpl@$sQN>+A0kT0+9~ z3&9gfWtDa#$|k(+!2Z2HaQ`>3k}M&z%F53@yP!zy+r8DZpH|sbI_cm;H?A*&Of(Y= z4Fljks1c}fO5>Z?ud6lN(04(jllJ55=4QAbxHj(t>=jgq=xlTo5E^Go^DMX4lG=CMW z$iO)&en3S8WzccuF>#@t`gL9F-lsG)G;r-gBo}2Nd1IvB$F8pLeuw;+fHK=m`;GQf z-OO3rwo<5oFn-h|;ajOFE5iT|)A=@8S?IvfZi(Hn9kV`F3Q%-}Sa~sf)u1MZl1}pF zMMXi%?>6r*sOLnd1_>c+H*70KatK(H9;z_FT;$i%2w+U7c~-YMc&8bTWdxDH!g7%S z$_Oq`3KBvp0-b`sRlmvEBa><;oty@txJ5%|-sAK5*qHWv7`9x{>Erp=WRLV_ocAuW zKl~Knr;sbwdqRnI&52QQ{hf2t@>b(~Y~srbwR~romUcl_8iA!37kamWV^Q!EOUEE# z($b$y^EICVF@X4uc<&Y=@_t_?k$CHPyV7p9Vn0RQPU#P`XO*fPxOM$ro2N1TD2~b4 z)w8{+$nT1R&)B)1<)4qL=6>K&v$VW&!wf@}Tr;O&kpt61;Xi2dHG!D!>Z0)FI1ZvP zwy;F+`Cj`No<3|vvg>>0yBJNnybk)NR}A`aFuQ zrukLukej?T_h7BD_#Y9AMS zoyXwtZyLkwi7-b$kB1Em4%7`Xdc(uRkO0IhT{cF%c4&>zUz^%(;9G#LR2JmGL%dw? z4skqMJ-^22fc-{IYf_^p#=+~o^TbQ2b;)ZMb;-I3)T~*?Wf+BdSigF0<=J0+lw&*1 zB3(=vNgrUFVnpAf=RCp!SVggLi%b58d?7~28G!Y<$8>(1r@?I1*-~ga5rU{46=cb+ zD>u1uQ>8e4$AWAxC*~Z_8(x%zqoksxWCV0 z(`}iY*|%i7-F{vV1%fBKh~aDBw5AlT-n9@Rv^de~lVd&e?QVe;>W1FG!8&RmCBFQY zh&$nHZ1ZSiN=rhy$PH8PoS>tIcA4Gf-;bY`{xkct@#o^7d9mE*TO)wg%KH@Yc$MzX zJ4%Y|CNA%v*$1s>q=iR7ZuGel-I{S5=_CUYsLc0EC!v@XU=Ei}25GdS0Frb+RA{Dx zvTAy-BqPAz$o|E6Sfkwsj~P0&S=wd^P}hvXbrPCGyIx19SopSSyU+V?_M}+qx}dnw zMcN096JnV=>H&<{wmF9_%%2+bbmU-A=*v=qmh zmOL7nX_-G21)DCRb)xg(@7BVWvZDDGBYO4=I2kjVTX6*HA2!}-)w?L?9oa&kwR(Wz zyUU0q$x3nFH0^p|Jo#AmP4z_FdFK>GwDmo zW&OUshuh+gg)B$7^zF+XLMNlLtqR-O>Yx&~+MX~a#4mrvU~tNhtU0gAbol`3WYi|! zA&rWHfgSFh0Fq$b4FqT;Tk!^vqI9IlP-7)nr|| zR+?;Z?;4qP<`_;zG=fc(<-pdLBD^jN6NWlj5Spm~w7o3*;l1sC{^-gwx65!_O*aM! z`j{>KOoN&d|EgIpT#(Mm% zrsZIy)iJC0E|rMx^H3zmJ|Ac`wUXVEe8pQo?97?q%X;zPV;k!54mA5?2rsey{QW)d!*cN%nlJoRU0W{ zXi7_3Kx?h#IGtZ{5s%QD)dIA38_+~I7@I!Fi}PH9ttX{AFlqAlr zG1wgU_gCmvx$ljc z$yF+}^bIAdx~=;>;9~!xa!OKNZNda z`e>7w_||Cd)ec{8e#G-~jtH}4J_rS*UutWa3Jo>}dxB~2{c3{KZ(&;hIHwD9z)mq8 zVPC^c)17CkCxbf0FUUML4mmP7zE|YE*2iE&@r>sAnO2fc(RO>g+CgsabzZDL$BL>0 zep3pfTsF|Kpk_EN;N7eDxxm>vV3XBy!1&A4hrM=)s_~}%^uKG1wv&usSUM?Pa&+eG zip3fo+5=Km`Kp^Zu)i5>N1=KmP@T@GQnDNa&7@?f-(H!Jeh) zb7H%9MG(DIBQuLz=E26>cvx%ABEH3Hcv&)r-6q=aVQt7(#EIDG7ELfF_fTu-c?RcJ zl%&SwwZF9f&VR+xWgO1k$Mb((4E&i{V(JH!ks{ z+JGm=`zh(!PRrmc^(uUsoXmO+9-O`It-rY2b^P;s?Aeb&SO#v2e2UH_JAL*nqm9bO zPxdZAv=xjok{S{l%YMy}FImV{>%G(~w|V}#hQxfWQRWNO(0O{n^J^AEg~oct__N9; zJni$EJt=BRd5W4^I8D2h#qSooV#LBl|AmuwESux?)hD_;yMx|_-_@Wn=lKN-e|@4Q zI}=hSpI5K>GS1oB!XC##e>ztb7;bnH`A_OSO& zXJDc)BQt7Onb8S|N(k}L&57A{U0XCcWaD-|T!h^2(`v}DBLacf*Y=96vtAjIkNDh| zFajwl_5_R?7E*iO&NlvD$&;xY3yWE^KQ^$PLG(pZooVCZ!i_XW8C5I{`}wcg$==AK zo5gw)XkI3 zTXdnn;cp*cbS7J2%Ss2K;RpM|dY45OOS&rsSnonTk~d}EoaOz&)AM(Rn%5e1kbg)wV9VNo z$;eMGqfw2;$2|&X#c1p-gD=u@3beXdn2{5m&j&L}N1$QbPrgT9XSHx7rAm^EhW53N zYNG!dc5jjegEn30g@Gm~Xx`{B>90d|mEODy)WVQaWT%@tqO{Grh`%+Eg}&-o ztM+t6*kF5t!>5JCp}Ubq1@^9R1I@&BCk(8&_=w5^NGKdcK^*V^Y9UuRrHV$yJDo`<8x)45b>w3Z% z<>KPv={bqxj8+-oiV#lRGAFpj7@QZ3LCCkfRwhW}-r_iuq*MJa-wMJ^>YHd?!JnHH zpd4a6VVCoOJw{_oE6F^u#N?@{+0aXkj7D8?XaWc)C~4`%*ZK>MD2I|;g0y`c99HYK zVIrZdOy7J|>YBNw57az!zpDn;r%d2)CpB%HR;RE(DL6Mf;qZ_5C-4CE#)oA=Iw#2u z3(M!@8Qh07loG_3MgIHzL;mlWy0XyWTWQ;UtEeg}g3Kn?$hK6AL}WRDZsMXS72S{F zcMIJr=i$7wAAB}^I?@>Z02|bN0NKR|$sO&z=Q(cwEl? zhSMjYW$;>}Y;+1p&E3)jsSXmUVq(yjLG)&$r-h~Na5!E*^nnm+fI*|bI+o6WzVP+T zAs!RGHAjys5mcN1y+Y}n-@$MnU8VMMij*lw55(-EkZ1Ox^DsKr6aRD!G|BFj5<^S*RI$Qbw ze^Bk>k_Ku>2&PjXFBh6Ot9`4v)l+#Zqjdh}QNrB2avNl*7sggx-M7PCfy-%Cgki}w zHAF}?cEB&)c{Kglsi)#btj6aOhdL4)Thtm_$l7h>U3+Pa4RhL^_jN^C{c*12lV{3#a5p4bP9G91>!LuAMSmxar@grZ0R=x$ZwwAr68z zfu#mk0D(9JY^D#prm{z7Q=8n}D$Tc8CyGXAi_p20Wl8#`516s}HB9B*TIR#|HotSz z6|9d$XUXW0#*NxLd4vD9c--|(ceV}@g7y-b2Q%Ar%`S@&9I-D1;nBj<-DWiLOJB-? z9-u6(p+;$SNf=Ni>_?OEBY65(q8E$|FHMp}G&3y?FzJe0qO%Leh>+BJBEl|qpqC92 zhFtFWe{bRhs}}R=m3wml+2kvNP`#Y|e7&63i0VGG#1oTGUo>4BQYF7BW}45QUdLN)Dn@`A8b55bG|eymYW2YI)b7*hiSDLEbc>5sVmQ51XIa6RqVYhAl}Ymy zttLsAW6bi71z{#KA?rFsovmbdxbWZa9`Zk8OiY3n$XTX{xMwzr_K;l{*Kjo|nPLyq zxeK=p?V$bTKI?7?6?qf2)NIwyLlU2FNnXu<8u7IDSAITnp^e+%Oe8w*^`4Z}+!Rrl z)YD0st_MhAP~MJ56sppOYSziliuUSx+U_Sepr%FJ?$W(NAx0{a(t3$t%n76eK?pAy z{Z5f>7n~UA5BEVURPfFia4C;u=>z&6QMu{Iqu~DIK{E4wjbM zS*B2ZeQ@(=e1X%Su`G`TIlLYOz?GNzX^YT5u1XUY5x7R%34x)%1i1pzvYy3)Go2Mp zOsu*ptfB=&iuu-7(HyGLW&GBnyNX504K3-rTG@)Lr=H@d;i38zECR%@?;w&$em)+E zwW8*_rVgkwUYzL`t?~}JKr)QS;-P#U2Lad$zLJqLd69Y4IsM9v66*jg*;@k^d|^pl zgT7O0F5p(Y9Piw0+p#&JqC}uCrX;F)TKW6#wgmNBdBVz~XlV&^D`AM(EtYX*=)XN# zZEp)SY|S0lK}A-sc=802uq)b8FATluH+rrC22jA#^4z&|n3=!y?7DksCZ90lx0q6{ zdf7J5P!qHHE4?~y6-mZZSwEVSgSzixpGtcN-sNaT}ckcMIHWl@FYUwH7i*+6(#I?kkE3O z@o7YP_T<&9UODS`W;~I4-`<+Py<0C!zCTtm><2NLPd9ESfp0DJdvnaDUAI)~0C|2! z6~3LL7#Dz>3)*S!^%FRZLH0(ZfrQrd0*F7C+Wr*l88+VXpYcYgJ|hjsiu!f`&-Y_9 zE0Z`2OJ{3k5+gRblH-+!9#JjN4D~n~BAXy!6UpSX(EHlM0EkD`5TycQwb5qS^{SQ*=6$-rbFwiCg|D}bRSkRb^#DbTOP+6%OB zbpNyE`DdG>9j*60JP_01NEo*X@(1F-H-R+r2Qr5OSYe3~nZ$=+2c5(r0})5-ME6eU z5rcOUS`Ua#A%IA9Mw#CJ^sAD=VFboGe}euMYCa_ul}9k!?P6zVhYTHlTEJ!GxG(O2 zY6i&gGZ=)-wA+oVvTqY6-c{n=O}G57WP}y53nG0gxAt~^JVNcvji*DksyW3^h$H~N^k?w){{GqBB>Ot$X!;yz zyhF$@`UG=54ys6s3MLQ+u)D2`A`I_DY{B|xvkjQoL5k@QzwbxI80Syz;GIG}m?A#gsoBmlzcjPnK8t0tSRVK#1U;6Sj@Iz9I*n66)sYkazr+mh0EA2SGnQ9XYRs zg=i+NkP~oBdt6j>*+9g?az<^O_<4vpB*-M#9lD`CL={U+p`q-6N#hT}pu%Yebz@E| zR9GI^CjbrCs$Bcu^7tvV>m*UW_m#T1x)Q*s%N@+!I_*AYWaoX}lApb8u9i^u`A7@| z+b#EeDo@cD{KCsd@7L_K0qaFo(;?5vd@g<+X#=yY+fSu5`BbsU5pyz09AOIvRA)JD z#EUYjebF;(`{u2D{m1C&I$bkTn6Fy;n8`04tT}Y$ZkXWNf~dnzE7wqw zZ|2x3Z(H~lj#wuSs1jiW+_ajOAM9mER84>=w>z@Dv?zN!vrwUVD$yAyaEvX%WT~7s zk8nUv4FT(5V~5V<+isFl9eRFdaqE_za0i*fAk%IX zPx~R%Az3didf);m1V^ac;8=iCLeKBG7? zt&j!_Km}la$KF-RSix9XdV7wl~@VNPhH;x{NP6*|Kousl+w7d zRM(7bjDMLU0QI2aodPBpQZM`=lpW94?NOVA2?Vs<_?zC_b|9q3Fy2`yb;tj_&^ru1 zuHZOKpp4+N^+~i?+jCAUMPLB>oXOJ6yE4qP&VHOr-~pN$@;P%MBo9Lx$>)0Axhnp-Fl=j ze|2m*ve_N+Zmzka|$~_)?RTO)Y1LCeky3g*!IVz_C^i?-;++J_ahr z6vo#D0Q@ls`a`T@(Jw@LWGaCvIl)6A;xB-VhpBi=lX;Q{;gANAMuH4V4UjC^f7aI=n8;IwefXlpD8XQx6IVXiNnDoU3@h z?q&pmqhlo7jM{Bw){ubONvm<3^O<5MO~&fi<`sSkmUH z6Hk69D>9|txWN`#S5YvfCK#g!rL;u!N@^%YBVYk{w#5A$_M~``^TXSFtbwr~R{v8@ z5Ke*U0!{C@t1I!6Py3G(B{DYbuq4|54r#%9vPE7KYH|9iQMWHWxAUpwVSk`ewR|o( z(PM|iN5%VF#rUUg-EAK0jAwejOPr>_<$>4aU_m`^ciF&XaOn@T#HPIh4O0oX{Nk(4 zq(!}+zVO14F!q~QLfzxs?iS;geuf?KY;}*pVb++rvxnF%alzw7w#GgHx*HFjhl4}# z@EieQA14@Jc+-^CG;;m;Ikt_m0=E{PQDg8AoQs6HTa%*W5B%)!YLyO76 zvK!;mNW>)kdA7U=>Z~y0Sn>6nadZ)U0^pa-vxQ&wvX3FO4_q1!JWXMcD-Pfs;y>|t z^~Yq~1>$$`@``uhA(Fds`~v>yP~rAipflL&;Hic}#$Z1={Aim=QE zq6UcPpspu6&%I+ZZcW(rVbpS~(c;+R@~^3Z?Z;N36KapZS4_t~A^6*QV} zZ*og@3EnYTO!s6 z1gp|Rg@`RM5b5{B*80KigQD?!PV2-E@7|dgwo69ipaOmukywBC1J>Z0V*`_qT~jX~ zAOIwG3;pYtr}r$^%kDcb^}9e+TD*$B!@k zewi)tb!yIv`f;S?yK0D#fq9+S-uwF|zY*2)rlyjDF(@FAm?g|Hn9LJVLp1B(4tXUy zqhLC`<=rysc;dgUh)L7tAI#Sg-;%E*<_V4F7Gd}Ie$Z#v5I#DX zfB#f^-GPL?6VhiJjw#c!&I~Sj*+zx=Y8Q-}l*{fYmFhN{q%rO+|RudBW&)@(Y zWh_Y&LRz$F3AI9!B4m+52$@5aAw`)Y%McP#BxQ)mQ05deCrXkeB2)+=i6oNm zcDnA*^EW*Ga$m3O>SnETIF9|;_icM`mOL|p@T!I$LOvkTSVNVhE*5x)msFQJ5tZq5 z>kx}=L{1KNoG#3v-4AIC|{C+|V6H347E{IZBRQ zH|Z()Mmf^Mwf_0kNXEN$5w>vr@xQm{pZslEt*-yh)56GzXjfe$BHo}bu;|>>80Zja z$Jgi%xo5{I|Bh%%bJh?}^oCLw!BkYnx{i>yw*G!xfZvn-OMn4#Ukzkd)#J?o<3A6r z8AB=i#7uiruRqAOAR3{fJDFqIRkZXGYWG#q6$oVltGaXFzBNm%_qgNjfnGhd4SNXR z71cX|LKyz_@xK^TTxZaH~W%T{4I6LnNy7EOkI7XO$ z`!paI+5BYtfhFOoXR-pDw-sC;DPQfhg(rN!`~LgFCF3^yp+tSChX@~xnwP)-gg6Z|Z8YaQ6aB%=lp zLUSHjNGA%RJVH=aSob3eM}S5$Mb7X3n_0lCdSjL;;fP5?;pfl&p&u{e7B6|Zv85IPfF!Scf05JnA@X@g^i9= zTB7uglXmdlI(bX8cg>Jq^1{8D&GA3?l8{&pa(GI-#5T=VTh6Mvk{f6cEvIRN~!eWV9_VBGW0; z=~N<%1+G={u#IvdMW@r#gE(UpQHH1gsNJn`Hy7mwjN4u4-GWvuFTozl8urdowl(Fu zBGtS@7u>8eJ+ksv@G_SNKA*+8{;wMNp*&f=?~DGc6ANp``z}P<-@f6~>&|?O&-Tz6 zi~d^-NhKR^trP4}xN8?sDZAZ?@3iTI;b4o`O&fYgO*17M!tZ=H5!y!dtRp+Q^~~9q z^r;hN)khXPsp#5tdLrJGCFsZ9CwUxenYx)Y^jRN;R5MNl;`H?4FqxNr068)7_HBRo zyFu*3)cj`il(Gmb6NzTP+u+#?o2QyE5qBC%j=-=|`tmhv28~dAQ&RJ{^26;OL_;y7 zvJ!8VU4G4$qhvHdtoff)bsqq_52Dl`i%uinkl{b-VzusfGM!pq_@hrm916Wg|2MTz z7A$Ctex36xOq|8JHI=N8=xo`)_Y7om+a&A@Z+y|WQIftdKUF+^zU8Y+?W2-w+&NP3 z>eTZxOz#Oj-zj<6L0U^rhe}%4o#E7)ZZZE`Yik;roxbAas$iayhk>^A{+s0zV_I%N zU3HosYDe>PK+&Qz#+M%O1x9*wvvYFt#xmQTp6HMxPAPLCA-#E&rmkwpez`s|(_QHD zg=u9>ip~lVu9|JD&SDlP)JSybg{W(ls|}^vs8?T^DN7Trd>qu%a!yeN)@!Uy-q2GD z&0W1L>GX< zDlHGzd$v=TWoXgrVn;@K81lx%0yR24A8e_Y#jkXix)xs`2?P1cRaaEoJ+MXGZ*OX3 z_V1HUj@Bl7oq0n=y9C2+g<)^YSklwGd1K&a!8#_6dqND~HurB3;M35@*uDrO3+%_n zxts5X+VI=8i1P5eZt05pd!#lojq|0I);sUf^3|j8EyD*})kd9AMB;#+(fY|190nMB zT&@qb!8GCC5(X@QSRf;VHS04_RNWiTUTIT@66op6B1*#T0{4Qu1zKIqO*=K;Mdkm- zf}x?WchMnHLb$dzx>arej@7cJ@mCte&Zm%QUI#io3ze%U;hiB~fgg5FhG?#dav$aZ z$b1ir#`fx+?r+|WMEN5U=3Z&+N!3= z@%(d^7SJkKC@nzVX&gYt(5JA0ClDFk4a8)CT#)-oH<>4D02ZCW6%?s%5>VU3&^0k7 zrISj$QR(`+?HI7;&L1gyvdB-2sVa67odxS7`l#n2zn5&(XEDOvwM(4F)3;20VEhvJnGrVbYlS7^1ujYAsYSTUR4)Ug^?&vx zW}=>RuD2~@72i%UPuMoD-p1f0$b;41M zTL)hBsXL@*PQ{P1DSKjE_+g1FRR_fSa2=V3C~w~Tl&`TT#6;x zl=f5MSPBo!$aI?WGB+}c)QZ`0Jil}52jogJ`{iL)VsSrJ;L-7kVDKND7#yy!Q0Vf^TPuqyRe^xS16C^-s3Yu!{yuW$P`gd zNHeM8tSS>VoK`?=CyV~o3Pgz z7GpN~LV{?NK&F2CkOcgQ_NG~d2E5E_JVYSFF{$-);oO3e_12IV@UmyLJ87A5)*sT< zRh6P|e=hs#?_WQO>wzyBE4Zoop&~Cm3-j+@u-34a4YVLi!iNTAUW6&#AV~^GSL7Yf zHpFxp{;fM)@x|ub1w-N2(GOxd#=BaYdV>BEtfX1Wy&AaADK-fg*+UrWW$|SCt`pkArW=iV48z{MjqQ25?vw)`ZamW|)!1D+wkvV{ z(&6kW^vd#Ovk)uq^t7M+-m*oAFnzLTRde4uo8pjI8XLPPTS^kkd6X-4hA5 zfeA|FOp;<$F@iDStx9k$7{#Oyx49%(#^6aF9#q8F@fpPrAx+fLHJ|jH$Zl8if#p{P(cFpp9twq-HlgmT&y132vXZ#C1Y3 zKe%4V7tjvn)_iDMAhSFp_~$m6Cp4IiM`PQRiZ<|A zIhy^~Uzo%*mr3)4CuFiUu-Ea`IiAVdpExzK^WWOE9I5k6l*5H4kpoYlTf51wotyen z)&9Eu#`l|@ZK|c%(|B5^M`nV#PMh-at>;RH{u|{5@Ai`SP!@!WE<=a>%Kj@V>qJ8T zk9&kxBd`ZMB$NLtHtXkC`L&k`9xGvb%6po5#+Ke`uyW_2PO)UZ^el2isH46$ef7Gw zF0Z&KmOaLl>K_IXL)is~XeFcH?(DCKdLe6QQ%Gjx(Jd~WFas=%OTT7XdEY_wJH3>J zIax4xIMnX!;$rdWlo7H^?&|6BGK=#&h6KG`f1@WMGyE*J&M9YJ*iQ(il64Jxj#E%|p%Md0e|SFc3Zvc&UozMlGrGJs*7 zAtP_`{yqEML}{_set19uWdsW-55^jecR6r)->|*=xWtCPV0eE$BA^H}<4S235%wNt zu@gAt#-9Ewy2h`>rDy2u#y&3H_8(MMlOK-zf7tR%qyPxcV`&TSR~reiEh8i47HW&L zykK-=Oyp53dZyrW@{QRVzThbNFBT!0`so78A6Wp|EFCa(aH_ahqf-#N4*Hax(ZEp&5=eLQ8mZ7t#dC=trLaDg8 zJ)e_@>GP|dt-KoUP$za3oZ~6%fO*m$e89u^;g;MS zVT%MY42QwlM!v)3q*bv4*9|&oJ4;oIK<4D+gs9nIbs*Z#AH>Z&L)s9J<7;hw$^L`+ zb_HNIK!$!yc!-*d7#SJc9N)=Cf{p;@OLGy}Wh~*^?IlRJ`Kc_z9s<{$e%D#3|( z{rdHjf*{w_X(K@x!NP#UJbU&G7Yr>h>`V|2l6ikByZQV3 zJ32N^KlMK}C2A<#| zo=z+U)I8K?`;$)yubKs`37sjR(~2qJqbcp(d-YP6mvUccr-HJwIdain4C12sBmNuW zc<{DV|Lwv3$9F-Z;TH^im$9R3gq6e2>t}uQaXrHSU;Rbi+^O?l{S~728QI2VKk7Ix zcCt0P3lDWf3TR9ZyM`r|{j|@dG1p%Wea5M?t0Y>pVYNmDZ^ht64}R@4l85iAhwl)& zeO^V8980buKq-L*i+3rS|^?hXENT<65Y~HZ9#=& z5QERfB`81MTXEAS!BFZEM&wus!DJxwVqi<`wQt|j-%Ft!7PyMpE1LAlNOFL1;!-No zYH$_j=H_5nj1WgrWZ0 zfbdsn_gNB=wx+aemqxn>s2F$(rOZ7nQtsSA1I;8LAmGT6R(zAwr^moAgCZUP4UAoJ z1Lkflto;`Q;uN~7xOwQ3ZDBL8zA0nn53F3gJ(x}KbP0P8#u#MV^_*80wkmbLCCXa8 zIN^rzBJ{1u_4wz3N0HJD^l~~?H^uwwExbPX7RW@!TMd0Kjtl^}8RynsLuH0aMJ$Gp zAvZpMj<>f0PEmL+mynL(;^bt*?|>(lR|6<0?D4Z8;lcUe?zxD6po_wrkJ<>a0?zW= zXm6XEAn1T%In)NYoGw{Tk2EmcS`hWQ4CgYf^m&w%18TavyMFu-UQx(fKYTD%&w~3E z{jo-OP=s(5R8pcfiO)&)-;G3ZTw=Tvds}<(mcS|req+pA`YSUbQh6TAbo>NBHzLx! z!10odIJ-Py#rJ2A$;-|j#iNSd4jBvZM@R4b=k?H-_#v=d;$xC%nCl@hgjfKfMaIT@ zl3x=;zJP$G@O4{L$1x2{-476tp_F*@j+`v(3q)qo*spnHlSt9t0&##aYGL6hbunC1 zZZv@qc+=D<{@)RH-~XC8clfXg19+8n@W(bs^Osx^VmgIU+1e%iT!opm@I3ILBhnhL^s$LLO+47R8+&gN|06o|5_QTPxKN=m%{z_ggPa8*?ozbKy2Z5W4H?&bJ3G0 zBjwwR^tnGJwm7)-B;UG4EIaxJASch9h`0AX#g>=}uvgKC2NVTrJ|xx1Sp*6a?+lJa zRcb(jjHDym5?26bOc;h=`KbV}^lbWXQxogkQ~Gp_b)b<@8pqPAtQ>jcIyf~mRwia3 zrR^p-QrQqNvWH;7gk}M#Q&CnhFPh#%72dE=Oxf1FBUTkgkkmaTrKQUO8vxbeDP21b zRyztQsW=2o;lUtp5)c$TUsGVWEH>)x{%(*=Fv-JD_dTZY#z9S_8Nj+-34H!mhUdj^H;yNDQ zT*T14t9yu5tf5^s8cEQWIfb=LrTuv$2k7rRrr zVd_v!Ox;;>ij|}Gu5At{l*2!ZG`f=)uaPinZZ5i`o#EVL3Gy@cdJTPo6~TKEW~Ivn z`VEyuB|;uxr^lKH(fPGU;c>{~y!gn>#nn~i%%>F$iYRdxNru%)dg-P=4W2)PWnb(V zCCL^g@=={TEW~28w}2>Ma^SJbqqU97<$nv+Tev!$pO-x%Pd#F{ssVhZ z(cQmCfO7%d(Y19-a&on@hhQ6XN`&M|?S#NRXNcATE5Tw7jzYOXHe$v(c1sqTJgBZt zu_s8Rekw8%NC&=i`}TGFGD9gq1?{H4wxB9a0^8bf<44yE?r`H!S*>*xitkTQKnkMFqGE_M#dibR3aT#znG_dK zKdxSsetZ5u_;8^ZXT1rO;$ro(n1TpL1HXe|VN*cs*qi?$CwX&~JdJ(Z{ z*aA?6zz)2tgfpV(YA8=2iP__ui{S@79SdK<{QA}=1jwy>VRiIQrl{4^e|ilIaK-bF2he9}RRHeykVRUSMundk@Q|D3F2Ck@;81dNV6S`D$8h@OcQeL6(F1g?jx3 z=jzoU+yU4JI-Y{USa`Uf9nb9m>Kt%q zUgo5GD0T~9LLvz@-@w!vMb1JtnP8s4=+myQnk!tu_Er}QE715Y-st{j53TbTI>||h zEcdiHc2f~3JBU;0wbm%pu|S~Y*-ly6$W^l2?qynK%zz@Q2T=HU*>O#f>67{*YCy4T z09*NwxYW=Qq;g|RE21D(Gdc=JUw5h*1nsMk2Ut-4-+*OKWb>x~`30;C5EzRjJLF0k zQux+usD2y`prr<1s{1Q!onK>O5lf=>8}SYisaH4xq?%$kiV)MhS427R6y|udhjmW^ z4U&LEgm?>LAQcs44%}U<$BUCNC>Fq{L{?Q*LB<8;T{~5u{`sZ_j;H#(I5m9!37tQv zW6G^NIfJ$L&ndZgNQcfO5MTeTdtEXpMb5Tx? zW84makK5WdH}9}Li2E;>_MAhyS#9g4c>Dh{QmFziAih=l?5dZA>8|rvRh5cqJoX6` zmiS4X*wXzM=e0--yV$uds_V}v=NG^q=$~$`{9W-i&Y38F(%Ky1>3?kfEDe>+b zX2-_v_sGKjl!Vng2&{^ZPCuceEUcirlb0Qmj&$omoC|<6g9!JH>6^#)AWI@%?yyo)y!}S+LiiW} zVLhBAYjpnP8M==(7O>LvRTpQ zx$cyR6I)1Z$YQfB3U=~t)eHB~4K?w{SS`d3plf{MDK9^N|9`M#?st}L#zeyge5_lC zzRr*3E9g!G&4$=7^rkKE!uG4ri^v|t!{_8=7|`N}Yzq~!ec;@L4NZ<9`FNrcfff#q zk01nFx;L!ntcMc-HpD6A0Mw~y-Qoqwx()H>a3c zi#~8ew_6vmWd9W4TJTbik_ta0vF@s7e)Ye3?D`Y`emBW-c6zSWnOfDis$mCaVC~}& za{b1ho5TMOQHJ8dn!( zJ!OLc`cIz-ZX6M4nC?4K9>2715WM%)TwmPY7gA`%wQ^IL7tG9bV6}+nbpf{a>OAk$eL^dXC<}S(bla^p zRD+UH@`bCTvJHp0%FHr| zs~t3K_Kp=nq%<4Rf42M`^D6A>3;t zO0x0%p#nGi(V&xQBP_xxfF`$7JuNObvoUNe75rvDC!T6h`!Jo%-u-32zS=0az*dmI zRC6rz2MWB4`hv^1j!1g#etTx>6)LHTmeD#f>?; zlB&DqF>|a?l{WtC@gwm=IN0!q>XUh&H#WLA)lOr+dRLB(zQU8mRnnQOzwf6|vh;t# zlS1??>U0Efr&;f>k&^tx7pS@-L%fKxl_%U?o$UTlw-6{H8M?yLc}iF?3>{w`B-~Ji*ojB242G@w*C2mm4@5pUeB2+<#R0V4`?sK9|IY2Zbvc zIRXTQWaULaXsLPMyVXW=`stDIx;JjJ(nw+H$S=m<3e9hYdeZlMsa)Rjd&ck>3WeOp z{`-BC3+x^(1reGt493k_pZ0IR^iRShJ5AQ+q01hp+XlfBUR%FR2RPg9_YV~OwD-!9 ze`_tRJ0ez!voaJ=4qj#acC?_Fu|s5()9k@u&%`Xc*>B(S_;|yxYG~q7VKMGlBgLDs zPHX>LBLx9J6p@b9YjvVX0y}MQuVK^yu>bX-y^>nneh3xzuWB~aZASv&;+D}Ghie|} zGA!>=C5#_XeZiTw>Lc50n*41Ss(?x1>BLaIEsKlsEQg#f(TC%z*u%WI1@AI3_M}2k zk>iGFGAS$W8=^|JtzY`ymH_yADiP-+44COF24xaLg3~y4+t0Aw9o3Y$t{Qgz^@s*3 zIDu0zk$dZAcGV9Y^cByJcfFu1am=iwon%RuWjY#h=3&|~)>sa6FQ?$k-U=iB^t~!i zvI>03DXj_uT%;f`X}xzr1?eB0Gvg?%2a7&X`Y5BXB!gwNZk$*)S69 zpDL%cS&aCTHW^tT9v=4JpZCv3g8%oAj=GVD|M!n!|9|_}dEuE(?m`PyG7)K+PDPZ1 zu!vi7GZj(b@t$N-<$f5^$<2giRiAfv)D~K78X4M48vP*6_;dW6&%*&)ta>czBlsqM z(h* z(h|mN_$W1CmPm9UjOL{-jqc9;n!FlGhYyh*~y1MO#Mh)8q?Z~G!wr0^(|7fbDxIOMEb@~14*XMuvhmTZE zv!I%Zv27|6f~r2})}iOr7B@-jKO1yn(I>VmHdWjd?E+@9DAHNMg%K1kIb;+04{9ZP~Fkrpd@aQ|cEoXM-Gz>MW-0YY;7 zDEMSr%nA#ozk?E^d@5CT?SkMIwdc>Dkl-%4b-cK6$ytq8BY2lS@8`8Cx#zcz)FV>y z`$qx<&^;lqCZ^j?7u_$iPM>$@t;k{TCvq=sh(mO%XD`m#H?lmGHd%D;(uE`(Ap)Fw z%b%%7cKI_w1U&bG^1x?zA8Fi45^n(P3M03xs{J*?mYRLdb|rwS|hDkk4}pVl>?h5pNwYS_R$c@4YZJI|FK?w_)Fy_rX!R2G~wmj_m*XGn7Z(~XO#1XS; zYtnwLFIqpIc5$g4(TeSRSZ_&*ZT?E4h1HML)Cw*Qu1on?ILWfpijR6a+veoi2Fv|1 zq@o1YDTOq4-FDgU3fEuwq4n?)nR1wN&G%F<_J}NWH6m089#Q{q_x&+zSB%2b{kZ2j zbgNS>VAG{wv%i-`KDMlb2c8p(*KH#|BF>klkCl6)8o-HO^wD&ve7ixM>*Fhjv`xXJmK)~J z-X68G;+p07h7>#pBdZwF*NKUhOXTFhYpb2{bFBK`n4=`5Sb4e0A`SFw#XG{uT^4&H z#8hLLXzWk*HUFI=6B8{Qh;7o^QgfPW$e{5W9XzAz)g;*Tqr8#@YE| zZikulx^=-%j=f?CQ-*6BfT1G%hGF=KkV$=VyG8j7JnByudM8)c|3F$5l3K0CySn(F zZ-oK*L+Mp%`A23gMHD-+23xtC%|PpLu5o?b^TGMOY@}v-;J&npv7bNBBIR*f`erjN z7LzwLHb^wIDt`Xl@eLkOZDbn#e6f`-S zB<{6syV&Xr^vF*qT-*q`hbSvi)y!wXk)Wbp!D2#hI_5{pt5&6@E%GMyqw9(>bO6%&Wn=ZOp`Kok+a8RMwyNun3vKHR7^nAY|3{nk@AWXBG&#(d!D>}{5 z#^!UtV*XOcwriv3(RZ_&21jA)s++l`B^p4)pxtj~1mZ`9-MjyYEDZ!aU7YPX2TM;m zKuQ$K-{GadDMm(*D9zJPMOpjio-06Dm+vWbkhcL?f#1_9OZe9i7Ipq|C`KF%+L(`f z8Ysye8@8h#HAkQ!#>P+pEREqKAOPx1X^$&L-MVf*?Uz+%?pDuTsrKru=rf}5;Wz({ z#TyYg-! zKY{hdDGHB{TACJpptSE_`@S;wMXixX=Qi$*U{vMXvU%+>g?CM7^Bu)$v4`*PR95!; zIY=WE%RCN?IXONEnIf(_aM!Bbe``hls;Z>GN;rq%JPz|JFt=IXekJqoi%ivgN520E zYI0NgzV*r})p;i~NHOIcfm6&}!;pzo$jL>=#A_>owDD_*rJ(Si)p=I=;tlbS`F8^0(BG`+0k&FEx4|0uwj#8z87_M0MOZklkrF=@d+ zwaF}YCbZkSoxM8-kwo$WSMi(h4EcRom!fCXLD;DXB7`Nb7hUu(Zu1N5DZCnGa76aQ zNPURxP%PEViLTJxx3WXc^$thKcb4 z_!GN0>r)oWQjYS9a~{yp_Xhyp2i{W*TV!U(ju7?fVszW`6?c|j$Y1(Z{XOoMqX6G* z<$IDl`FTv%jJDcG*G6iGo|drE{7CzT!^;1fI*T`&?o_LF>8~1_Klah%_rFatam)vJ zcjPYk`lMOf#)jpt)P7xL{&?}_v8R6vFN>6qcbA!0jrmqS+*^6Ru(B^t%SE=^0Y_E3 zC~m>`?nli<4@6lZ0t*tA)jfx(fLPMrsb}lDo}Qcg@%aK$)o&}f&0gGh{l(w zCG#IVK)4mu52<@!Vy+>Lv3s&ht{ToqGH#?dDvJq+NPfx z=R&Hk+;yzm5eM@iwfvIC3Dt`vF<|aZd-8Yr?^5T;~$8$1Mo`x5v2)P4-r7 zICoyRJu(eRiLQ-u9-f}E?j%Xty|80S=dAYpd~|(7l#bc`b@Q`7&zf7cU5H}7dd2^Q z$yooLnSZn$zKc3clBO=}xBdFccSTLeEYsb3$QOkr`J^>rL}YH7q}BTH@AB|HJl#zpjDU9u#Tw~bFYBGgZ_gSlRg{RHHoe;7+Pn`BA?<|g{Gmie4)*%O_s8s zlu-|Auby4^rz*M^rDU(yz*Sl-B7aULhMss{k6?MkBRzK?FJF$MB(^|gpnNQGYAuZ$C78KV?=qzs+&3sv163s6a4uJ72MAYsElRwEe?fV>k@wu{|G4E2?)FB5aLv z#*K>-?xK?6&ZkO0CErop)t}s7?v`%Ky{oq+_xpRB=}%EB8&ZxZ`>37CYa_fATI?Mq&zu6O+b!S9UHNeYs`i@tg3hRUCt-*8>wiqi?R8zVdbLtiI{9S} zg6{Awh|O>wWdEN!)iXMTC6}unOzFV24&N!#(u-KRYq4gdev;u_v*vNn1jxe|ktYfr zI5sm<5{ZV9@$dQ0>MGQ!|KtrAD!|0oJcQ*&AtH^Cozr5Kfzv5< zIfB?VsW?=9)r-aZ7K)*koJ33B@j#EWyw!N;a^1BclDmA;d*=RtTp6HSCp-Q~aV=AG zQ80-wn9Mhz9@b4?tSOGZ_*EyRZ^&kAmGmrhp z9{Z16_IJdX=H%-;g)Y96eU;GX{r+RLLB^8Ug#HLtPYI^{9o)*SI!7$IBw7_9ETuhw zJ&gkA(2_iy1ZCi+Nw0%t=Ac#WqtIdp6cJ6d6k;_O;`(?2OR$Lx$ zn*n7oXlrLcZMb3K*H+YS^Zy!&wobAyO-3Ja^vUj`X)1( zo{~Rbuh#p!7#~TCh&yfWla|GKidl!-T+W#HMTD*DHDAUk-z7uwDFvkz=pi#Y;^AV4cfO>ZwD5IaO6GzWR$ zriLBF4s2{}3}{B(hAM82w&Q(2!8^jS=VtZap)CiaNVFXgpXPQz4hzU>QWD|ZCq_j9 zOOs0%g&J{Cwp#pli~t2-bWWU$2r`3iI|5gkG=F5}M4aCmZ;$7a0Pdh=Q_+iD$`Qa* z@D?F4ZTg}WECk&WVs2dppAU%4zY*;F5xO*QwRD=B zDR1l_wt#wQF9cB!uU%WY;#pf;+lDXhVO85)x(aM;Z5h@n$r`S|$X>v4DeRvl6fSe9 z`BT3!4Q-{p9W#2%WqxFq$Mnxwy4C#0Edl9#ByqOjsE58uez{ZKNrG!0G%vI`9r*Dx zbm&UZ*Yaa#x82sOZ(B=Il{~+N7C&fd!1GW(n(OZ|lsjct*3ol9(ge2NA=`aX_Qf$%iPp4m^IQeAr7g^hL@4kZMjbOaI+dmO8F_rxru zjk@j6K7Jw5a9NNJcC-1X6ta3+i(QU)dNPqKXUp`150gXGRAcYSa<+4mqE18(fEfY5 z)I!jqcJzdbD5mj(S2cwiLv22VS1abr;ZbW_!$~w*WcidXaF7(gj*O9k1&6i(Y^{xH&-?tuZZzu;2mAm*38RW@HIGUPXJFz)J z?{utR@jLa1b#i;akt;ZoD~Qnd^!lmIqTK#TK5344{fSD zCVTuuNCc%>OPsTwo2hnMd0ZLUXv3{3R%T}NpzvL>ZYZ6=TX8S5X97bEi_XH^&)x4p zvw^54nn6XcF_HF}o6|k&v8=1GeuhK(0(<;eaCg8QS9GBp#wsC(DUb?Xb7ZY_2XY&&(G9((POEr2;2@oSBq>>8u<3@zQ8x4HuN2GIb_@5+<+#fWQ+4P< zS6GjHu?!QNEze@L&2Kr#uMuy9zIqZgP}Y620`wBFsY)?QUl$KS>%{p1#phANs@y>T z2sM`Hofw9Dz1Q_|ud9when12{qRE`9drs(Jygfm7y_%Nw!C4?Qro{n{i1QUlIvlu# zEHVDjSkm1ZJ1D-}shn?WlLdsNKCwcK>C*FjbrKq|5XL+-mIjA(#i|ri_*l6<@2$+y za@X9BpUU`9Xm;n3ojufu3&3Da{BP^!IUTFTw+&^q#-n1DqCT0MUleVv{@1bZBaQcf z;e=i@)Th11BPj~$AG$1Gz0Bd3c>UJaAys7GcQ&bN`}D)t z@%!Q-33<-+_EBp!z@u9oiXAV}CEnmAGLtqkYF{glu!EEOxnNR|Xldk}Tqe~K52YuU z$q^nF7c7uM3~*O|Ck!^`ozOfGJqH-}_^w>lJP>d1aXV_ja$CG@VU`oVWc?;O#sj46 zoE(CniZeK(Q#(!>89^?n_s|#@y#UJJ`|Xmv?Brv$AmZw`my{f(uy9r;$n02NIYQk$ zdWiwWO;z_`QP#F^s|6|84-%?&v}Ns~?Qk~h^!@(5tM^xX{!+`$@$!S~Iy8?JXf(u2 zseLw<4rm&SznXflJF)LDdrbEes`L|=1M4%MO|~c=_Mrunvh^vsMdA%+LQRzr}XGB8EA~#c~=YZm@@#p+6ikhx(x5b-I9HU#vj}`;= z5_Q6mZapizV>PVXGJMRE5ot`Smv->Yh%fh@OOm06tbZyi)acpkr_%2%4+TUKzeg}v zJ@*n?)4zQ$p3$cSF&*mPMvI9#mm@Z!>XPzKSWKN=p^pTUs$D%Vp zuRW4+;fjHPM{sx=>)kj}R{Z=z9ic|AmrW0U9382<{lX3`Vr7}A6CQog)Sg_?y6qwx zG!M0Fg_$j!&cNo%+9~^GXT5BB@AjyN73>GE2yTf!z<>D)cYYK=H&Q|*0UnI7bXMPo z9#)j~&G+98{vv2ev|XsnS?*XmRtC;y|ksbeTlK887Q%v8dX(SB|e?6LOE)~?15`WK*rq$nUy*A~I=mG}NkwWD z-&XC|dx!52lyC2T33l(O$C-y>&HJAR9v3syzP<9qW!``6(#~%_Zn$NZZCE!3Ma^5W zXNQswpG3a^$6v)rSxyAZY~bVb>xU}(NzFAm&kBp?B5o4#242|u-+-jx>$CaYR}aT( z;Ycqs|L&&9%^iX{9cdzCTZROaRVLO`E!f5P8TjezH7MRpuy^Y%PaS*aQ0ALwV7NhG z*5$&-?Myk=d=>sTvLd9|_4zq+ctia2bsq>Fq$NBHFDSp!F#NY^!`t3%tPFbe!1XG& ztdzQX**hsI$9S1fk2@6KYH^5RV5MLBtO(ha5#!tkTmYea2(7!K@u0q4|C!f!6UNht z@h|M&Y%q?ucP^|I+qlIav-6@4r4y)lsHX}k94ooMX>-=s)W0Z#jq2wg$v^;3p>46Vyp~bkaEQxm|?o+QMUq$@{Wn~gaEx`AK6L5^gA)BNGJ3pn zQ72yIKF`ZLUvc%mCN`7)NBqm3aMdXWzVfC10OrpR-Kxg&C#%OpcUz48-qJ!$CU*Pm>CC|Edx2=acwAa%`Yf3j!eifb-=I7V)tul)bkru}LG{bn@ zS5N(tFGd7fA-EAaTi;wN?R8D>QjfQ{+h($UOXvRGK_uE$&3gAcwuNC=cV=+|{s%d1 zuB#zU)V3z(gu|PfnicF~de7;6rA%f+=kMW8Ut?atKAzh-_QwzX0<^YBqU1-8^0(*G?MK!|ELp%<>m{XzeVTBe%_H*V-Qk$6$ zc(oxr0f7K2N$CBYjBsXckVv?4<9jyk_xPvHe*Fit0^hNv=f^PF@3qAS*zl!@Aer2)QU01)(Yp1klHMl3Rs*x`jl0BFoULTzBdc%5KIeo_9Btaec7GVM1PQD(Rw}DEqK=l=Td|0$fzio zUPT@EbIR@B9ZqMB6wjt+#l_LO?!Pj&`^ZcbEpuh!@ zwMHTd2f6U@@DfjsgtnI6@8D2Mi^IB(15b{>GW03z zZzKxCr2h@rb0GU3hs=HIpkb0$TI!X$J$*&3Y;g-IPwo`Hj1YU$aV2xRge{M@D@n0( z$cg7NO~D{mtJts1Z=j{q#s5R@7ui_e1M$HQJ&!3ao{W0R5Ho)}MS6xNRS`vtmM?$8 za~#!A-q`DwmJg+SckV2Pw%4b!@6;pb9z=j;HSd>XDm6R{3TSXV9E3(X<)RCQ1&1aGQryS_}{Gle;Or%Y)zO=(ayf;jg6>o>{ z?07cv@g9AEuf3udpNoL?mz9(R$MW4-c?XWzAc^d(5!HbAFkJ+tU{f)Al%MYg99u*h z(u>A})z)fP^lEPVh(0Q^pPgae)+WDFZCG`F1nQ37ZH`J;5+ozUW{hAANxF4Qwczq?U-+y46r=G%|u zcNT`TaCz99e)muU2w>6ujQp9Y^hjnoK1)#{utZGF%wVxRZ*jrd*%{k2wAas@AsmcJ z-MqI}$L|+Og6NC6))RfPJX%Gs|Llj8o%vSL4_D1)Qq)gpr$$OlPDgdTdd>I%HyOw^{yxm2P>F!*8yuZoAK1w;mMNIOEb!nJKTy3nitAs<$fp zmUlXcao+1Q=6Dh9Bl11>Y`#=2RoD4_!7+&5(eZ^HoAd&mR%B<8Xdr)La1Pxy?jj@$ zYWZ)BbAJt9Kl1%!+0NT7iJ6Fno4PCwN$8yhoEs_0Mn+TQh%_+e+&(^$W2K`V zf%drTV|Z&I&m}jXg~$e9Yg1!wbS{B?he3AF&YkBF1!P-@UbzB7H9=gkTSbd4F@xh0 zF4oJHy8*qlFf+^P978uA{d~=ycOfAmz(Ze2gLoP>S!igey1u!Y8E_8}sx*Nhx^dGc zi)#PH!NI|oFWH}0-IKOP$$RIscOQBnds_ts1Q5k=@MOGkt~hHQnnf4Jy8_=PK+a)a z?%@PE4{VA6qhRb^I&m`DTY{C2t^rmHOr-rz`ukTIWMdM-Y%khz$`f*Wd?@^VSJ&?| zqwT<+x0k@3L?E{@ONvMX+4N)S#LcIJ;#k1Qo`i+&!gry>G9=)n8zRo~7XSqKrEIOM zX>R}w2BJ=w=s>~!f%9g1wviFYvNB?^n2vX^^Dy%UFuA;_=*z-COv*zzHhfWp>gL4u zn}ULZr}LEp{`oEC;Ib@KrL+$J9{)hNNAWQ0-j+v`Q85ZRM2u^c&n*7xgz6qTFI>as zn=-3ZWvNt;g^9=MD__Et2WK<-j9pzOk9$Ba>~;MOj{sgmJOFTv!FX3XLG+B_ZRG)S*VS?8k9!Y4IdnO& zSL{V(MQ%s=|0C|a|FLfW|KFe}m6e2$(3upKm5hjTCbP`!QOM4oWo1N0sR$vIO+sdN zC6|>bp{T5c?1b;*rSIqV`Thsret6%m>wO95c^e z_Bw}xYg>A+tLAjtmK1cpU0A{H);gn{B;^f&uQfa<_~YaRngpRrh}UdsZC$Ra2Hq1b zcj$7!0%ntNn<4^vQG?)76qA(n{xdrYvH}sy0AqO+w}%t}GA#_>l-FKaS^LAD=flJi=ze&(!?= zH=K=O4TBJ&e2RO#0Jveq5Zt1kiNj^KBJuhws)iTC{H$C;7TI|fx=AB9@*u(+1@;XN2?Kk@J# z7!_bAvxaZELjOPOxl>e%9b(Eq_X}*6w;L|XmL*Yol0DX%!U6>O9!4LcI;r-W%5U#> z%9jh(p?tH4Wy!RmA*yNt75q=Eut+$ zxvf#bG>`biZF-sH3xNEp;*D=fdH5P*L*#kUHBG;I_3GzOYnZ@vUl`YI=`9w(gaA*o z(~+7+u1+B^KK_hm=I_iKR-V2vYNwt(%jq(2TW)R)(i)n)0UQ&@L3_`NZ+VU zkh0IOV2IlD865X73k&`B)}hh`C`Mmf`*c{Wq~|<(kvg$BpkC<8fAJek#iIoOD@spX zcU@kFrob99`>f$dHs;S5>t*83uLz2Ql*wR?bs^)YiQ-{*-`@v)e;1cj=JeTK zJ^rx&zpz-FXQ8yz1hbqXI0d2AHP5P$o;c(zvy%-ZymP%@(VnytiZQrNv?psUs z!QpahSenq##@`Th1u*n)j%6Ie8zCU?v|$McU=&HMye7C7#F{HzxbQ_xB}r<S{P_xImxSe{djn_ZQ~w&MP%v{<2}U6 zs6$F`*M+48=y);UVKTJ;Jvxc7Hb}=(+W{xc%Y(dCGb`|8CFCqx$*QH0W2W=Qr+>uN zobn9}J-e$Yy zabqA~ZbUAVlWyPht18bf>Ebi*qWM&Am4(6A6d%4#QQ`}JAPrz|!$vAdlaZbds(c{h z=01at31v572QAzJ{3DN%xArEqouD+{_8Y73{u?uJ!Lcd5E6A67fWG;<2fD1=q}sB%HQXXjZq%1(3UIU|Ejc+E)3qzlLo}Z`u$f-J z$Q%^hYM(@oeq3!Wp3A&!jsxBarJe8JCf|489r5bZc@utzk>5NOs!0U+)Vi0D$?%X1 zZOW^w2b}x3$&q2G%|MWYOFo;z7EN+_~^Z7R0jsO|L&c;^% z_*w;%Snmjb7~57J<=6g~GziORko#E@r*4VuzFg8fXIYcLB`GS%`9H(`jKzUhTkJ4& zw#Y*!s(JfTF%R|=UnbigLRRiK7y)g`n6w^gqB7mi=G^lp`4%-71eo+4l(mXP_AS`wL$2%p_zJLq~DXFUK!^&O> z%KWu&>Z@S25K`(zfv+5gZu0Nrf`UeIKTw1HmnaFo;mnd3a}drOi$jBA|KUTlh2k72 z-hqYqmh>Sp2sQB|0yRLSIeo$ZPZau5HD`h5fpkQ!Jm#|POJp1(7hrnY0bJe|I5aTV z)#w6QEJc0Gva2d@3^#SU%mI2LxQ6RpWusKO<4domeXc+ID_Nfx9Gj!Q7!VmKuU3SG z(_DyZ)DAmoO-&8>8-NQC+64S?fuH4shJDpt+Zl7LZaKBP9+gO)N>+74^wQteg=$|E zlyzt7Wb($Zb%a-F2g@BBy%!RkA`o2mRKbKlIBQ0(-T>B3g{Vlg+qX$n-!DAtEEu0V z`|^_b%)5^ZYc*Rr+@{9M%!Aap-c}l9gz_yVoWAWj<61Q_JyIqmB=p`|1XV(||TCn`bLRT=s3*~G|X#12L7^kGmhE z_|)!V&xE`f>w%Nz3^^LEHnrLt(y`6vLJb%vOW;C*bBBmqLhXysmc+>4tZQI^TA~Bg zC45v^jERY7v#*27gG_SKz+V%I$MJ<86M;+NjakxK8#4qn3pLhYJ@rqU8eMM_ z6BEd3QCb5c01%MO)Aruqj1&$Ce5AbK1~Y}v$7X{dlNek+x3ogkl;=HhZR<|9p66FV z8z8=QMkfT3-*EmBNqm6ND)U4P@e2qL9Cw_f%F0|THMhTVlf4Fr#c0foP_B4mW*9FH zswBctkOp*S0rd70>@HKC@){KZ&c-FpxDUU4qO5X zR4=Kd=I^v-ARAihmh@t@$?5{%(EJ?yG^n|cAE(ci<))KY%jm?-4_x#fiNJ4gK#Q>K zpkY5N0^~HBW7l>UWyoJPc^`z!FQBP+n=xN!Yr@nfjY~ls)8%{TaRGk1SLWl+XqKOz zwLV-w-^sqal%pw}qjk8;LWrjBblo1d_{n9!z7Pi)#ZB#gi}26ERjsw7E(jMk-JDu)s zc8Vpv(5O^RZk2gFF8*s7WkVlBjc~xnVIN-(1dN^5Gd&Q!OybDZ@Ttu0xs{bt!+K zZ6Q?vG79-vbOYm;?Q#vK2_Q_C{RljPenko*@9VoOxIzy6vr(U`Dz@9)g|$ zfDbqa=!-kMM+6$C++_INW|K&mtip2_ngaR;=R?`~fG}etqYY}oq)@k|eD5t8Lg88| zq_v1 zUX{!VZM%dp!0cAm=tA>%|DmUnHDjVl0|quZgx)uZVDmssAV6DCIzT>^kytuwS65iR!S6s|JOo^sMXH~gn7jhS&$6uCC|?9holwgE8Q5zo*NLDDaz zO5uqc_r2g*vqATr<=K`^9tMvOS(e$Qp_Vxj-A=RnTv%o#+7+`=4QgNW*qUT66OHWr z%?I36tvfK{{eeaVaJzq&abIrS9x&keI-2&v;~XxnBrDCE&6P#~J>LznNmA-mU|-GK7Z(fS=D zoD3B3Of*e%rX5#e*eC~=@cvzIji(?i*3j6!^@c8cg_Q#vK3@F_H<*7OroY7fdN*U$)D~?A-c4 z$;lP*5(Dmkf3D$Y{{Q^H%_pjf{{DT2n6>dcA&ae58}UwH2ESSJpNC1a0UG2`ZgM-H zeDrRaODS@p^2g|-1?f!GVm0dWqvbBps|Cv+V@m5l#k}d_#)IK z`tQKfTWOg>KD5fNPB#sYE%Ch-m2!^M`udeSWGxZ*K|1e&!L=;BGu_H42%r}vwD3;h?nBsJs7l)FtO!gXcEjtXQ?5eMs+}7%ENHG-|#Xy`gLe@ zi*9D3Yv0l0F|X#Jefl5Ze$9nCQ-4l?BvEtcOZ8&Po)(3U>c=;}pOUCAkvq}aB}uqn z+Fkem(<#&nBG@Mu*Js=x@6t9U8(aMzV@ec+FeNy(enOmlFv{FrSTrj4mmL>xWzv|7 zcp?9uFi_=AB}5Fn_w1Qz6;I4M5It-v8qVK5x-Y$*rdb8GLvYode=b`S=CfttJQHg4 z+Y1Hc$Zb3PI73YIHJs~cDQgzIb$*%e2+5BVqoVJKk)vf)JFayd^Mk;Op|Qxpq@D5J zkrte1LxvVlUQkIPmHqiIZ#8cHTMPXA)@bcbE{`%{1Pm(15NGH8$??g<=G&7eU9ClR zDsQHcZVn&JN+_l;C`mZ@=gL#Mm%mP@88SA2^@N?xHalYIiH*)$2n0$$qJQwVPR#76 zQ;mMo^)}An>`d#CP{K8zGI{df==gC1wQQ(zMr!65+OKDunrvUrq|)D@h;lG-bs8c3y1&bW2qNntKWvGYcHbmZ{%1liB6xFrIDekJ-wSp z{zCxw=%-v`-4s%=Uyq`SoXjtq-cgO@;1s0$5@y6xze-Kve6U;nVMplO6HmD!G0peG zG$%>M_;pvWRbtjiy^vB-Z3CP6zo&U%VO{L-Vw>M-4W#;jANEIjZFuc7y3oA^N96ZB zG2o>SjLvSB<#L*choCobDXlpJ7C&7ek4?{&mCb@MgmpjdObFYJ2JT_F_w-E;f^S)G<5aTwJiFxnVr5fNgu=-g`{!c(QQi0~2+NLuC~nBC6E96GOi z(r>YD!Mjcn>RKo9&=jLmmGVBsg2~WY#387pq!+1;p()af{?d!fL~1MY_{bcUdPkS5 zCdDF*nM>Esrxg|z%@Y3&^Oi#XuoP&7Si>8Mj=eNEw)f6A5Dw?a>Zh3iZ}qROE)2l% zK$vTt^_z-0Z@a_g^5C;Ib0a!>#>|-Q_fCwJ{VMweTPail=JeI&XfQX7953x0w{_suz|G^HK*In4d5Dv$bGh^3MC_^AtLaLeKVmyJc*5 z+##B~hwcDXZMbOvBJ#1OU?Wf_eC;@{)uei&W9GF-*V&8cN^$Jlx6)wvw*dilUlFDa zA4B!D?`rGXOISq`T>F<`8B0|q&GIffl@DrkfRy?ylh1?>x}*#B4v*fLS@%L!Vj;u= z9g~sKE9X8=D%yG@8k8&$VCHB-@0!d@`4DusyZp^%xt@tcPTnuVkqj6eI=jd*^j*S2 z_O3J#ReIhz8esgC(9z?Y!HJ2XCc$?L&$!)x4C>YMX`ECL^5btk|HvN%e`)<^j9-IC zC|~^>!)A0A@L#jA7}4_iu9dBUD^z96;bdCR%2{-4I06fk8`V4JPN^|&lchhW#wIVz zw!KndlYDGP^p0;Vew?>&-zHqC<(MArs5^ZS>WEa*`DpG?bhL-WY+vYRX6nWw_0@GB zMl&j_-&A}i7kupSJHiI%+3MMksXOl7B1D>7mynHfy~?goDOG(elP9F}jPl`U50L2@ zor-!P;Z1sDhEPUfh;HSh#>-MjLBxoiNjh_PeEKW@7M)u6PEedp?6F8ZC88ltY`xY z4Ai@x9wK~+1nL5%Ef3oXuQD;(MUy7hToPyl-`R7%PY5xrKl&$ z5&MjcIfozb9ugn~A2_11_4E%6tP$OA*g0;k5(a7bb-SEb2y2iYDzLd>pI^g-8I-Vt z!-+J^f2G8?+wVca0#_a$FWhqB>eZ9OehsMx|FW2n&rNe6(w0d8_BU=ipN^?5XlDx9LTD!>w=J zz!i;@>gDq4ahGzu-s?%rdbAXkbj>o6EmwRAuhjDV1YyL57fD)F)O8%a0Q`0ztu-+! z1^WS(24q9dNOTIJZ5qwJ(C3;o?2hT>NKQGNBBapOzpZPZ3$q~_RDb4#={Tl1@Tmd+ z$j^i*=?{<|C}+%+0nP z4AL!s?sY+=g7M&Xzii7fS=VE9Lw<>h0k0Xv4H)AJt*8p0o;Qg!yH5Fef6(0H z$q>u9@Ux~^x?oPATLJwHvzh;goDr78&5jwJGNw@;l~sj>>PPQy53KbBOaV>j)fXJF zc>!JCJK;hkcRrHx)};-ABdG$MbYB?8-0_;w;`5n*p0q-oBxh5n5!yYS%CRy67jybT z)j}m&+?tHvi3L_GSY)$IIB*}HxGK>~48{&bb1X$+to7~nTjX%kb3U7!Ec)5LZs?9QIIkFx`;6ZAd85;%KS$)c6PrpFtWbnQ z8?%7zbyIMJ+4&A0^g%>ZtJjYcxRhYJ=;AV;FzIy_9i=X-|J^_SnQt*QV-vIAV0ze{rmSm=j;HT2?E)?mmDO zQ%J}`tFHFNQ-nD<%Ar76fmGss$y@o9M?g7;ZW5eTVU}>jquG|AbLIF_4=?3~E;;%$ zHuO8vtBY8gacE@k*>j{B{XpOn7FLuqu77!T^N!cI0}t*!cNl7%8E$0_!ia6Wtfz%B zXn&^ipcq_wdPgC}K{$e>q>au8^zWgiGiHW}!HI3F%KYD@8E7#;6@s7LIhq>{&p!{7 zmL7s*_RF>Uvf5qQ`ua z!e(S9MtOS5f&*@M5>HlWU!I+P{FtwBh}!4k@8LN!`QP{bAE%CuD@h*C-nnaDLIr8k z7X!GD@94CBA!^fOZBaQ}vum^bsIbY7zXso;{^Nt}v)BgDTAwo%Cop&swUt-|TI18# zs^_m&O`6(aMCi)4H5o1w%zVhv(9{3kD->1fwe%Z?Wsv)i8dk9deTC;PmasTxX8ORV zQ`cE!!y4~!p_6FHg61JO$xEj1E$*a~Kr4j79xW_l(dH z#VP?O%4ecx=VHHeQrXk&l9+n6xVSiOxaM&ociLN;$`6~>wK(3;K^SHEoB0^G;cov7 z%0eswagSLGxNvdAs!jkQ4$%Pc^t2Sx3)iLh1bxk09n13}kTxpB4vgIw6%PU6*?W82 zPCp}@B*YgGh4*U9z~2@)crakiPaPMZXE0tFW$GGu3nCj;n{+cOmKr(NQzf-n{A1_+PmQy>{O^~ z*78B16|I^M$8ZGg@ApCzL9Dht)xK-k_MokRc!A(?{3YC~U%t2nhHhtN9Fd$dFiE`aWPN zfQWdIkl_7yy2H8t}-$AKq>bs%P zy&*g+&yYjD9Z4GCY-zxf-8w_aWG>rPzUZ<-Z~mOx?8jE0d4G<-UkE3=7k)0HZ&qOG zb(dEop8G)KU|D8d3gK2<*OCsOF?kTm8I=4*IACn3RqD&NBRa3|JrDXN7eRk#K5Og3 zj>CPr(ZLR1j=r-vlh)#w&Rrm&pvh&~KBhVZjyox~UOTehz>BNik$=ug#YFyu(}fNh zp5Sy#NJNG>)&Q?qyu*PS7Dri-F$z*h7`y?FfI1Lv#nmb~sVr^v- zBez|CI9e885k(Ysup|h#?sAU;XY%*J9SN-Bkr4|V2tq7q4OdML;LWR^IaNJ_2>a)n zS)lKzF|Li=Sq1Q}>X&ogGB6K_5hU_Ms{b}u!>xttZ$vMin|$>C@-)Yq!@7b59|X>y zwRuoXuofKH(C}WaLIzFegv+ggMo;c64`VkZ@>i^Koc!csHO$ys53C>$U6*C*1+HDb0mXf9r;JQE&dCZYpz6 zk*r0(Z>cM6DUwY!|M|IWNwj~}W|N8qrD#v@X-wQHb%;|iJ8b*qfv|Kv$X8V;r z>O4GVT%X9%n;aq!DrcDLXl8VR0|!97m2i^-R0OFc%&chqPU|2W#TG09T5)8GkRiJS z9imMr=cBc4Z*hxrA6|8H;Uxlx5^LV=3?Usc==Z`wLL`#6K&pwc8C-VyL@AVC4St_e zCkg;_9RmXc5gOEb%%&b-x@vs_akmU7CDKA7hVZ->8IsY=v7(f@@q^!(8HhY0@bD3# zlM#lJ)A1!{CV(Ro21{ka_ey}=PZ#hXrt!=OBsSATX=?^WyknKxjIuIDNo!~jBGErsM!U}&}84fD+=D0RaIT-+}26Ree1yEYr%R#eaV&UARC zPm_PSc0zO@anBY?9roV8(LcT&NSU;d)0=n|Rpb#-N5z;He>znm01euu(wfOQq}MszcE|aRbm{vZ=1T;0M3Y{R;Zz~y7CVo zegM7rfpcn%+z5==QK`0m-Y(UxpSQmnWclCLMqR!0mhw46Q(&!qNkTwXwnF1R(f*0; zy3cdWT>AOU&zh!@nol00-KumzFLC_nQL2c;i^<>4$#Om&U74HT&=6AkiBIz`g__e( z^oA?b4`w1VYQVN+czC!w=W=)XoYmGyFk&o(Qb@pGovRGuCR?6JB|6)MHl8jn#UKOv z-@N{k?aF{y1Uei$>Vk*FLQ|mB&^y{aFaUfeH~HzJDkD$Ko6=m?CWrDqCJGr$>KRi> zh(2iGC7nQQXrJvlwY%x;kmB8MhAp1&o;^1PE;qway4ZZS7MVT(C)tEiyAozo2g!b{ zc#roi-CLK}Z~WKSxi`5?3Vy{NW1w`4)@x;P#n*k(&?V(DtAdP{z?E|phMwQ`^TH`p z4=Jb{%h8_S+-n<};~XAA;~3n0yFJAdViA_}F4W2HSWZ;7Q-;>_WJUcB>A@yv{d1Y1<{L9(?ZGS2 zoXy`{BdQY{=(Hsn9gz{!vSF}ma$q`M z^~Uu%*A2UF?R*i8w;K-s1q=~(KGv$pB%$JN7N(V_v$8SMX$(=ibAsl~1=mI$S>YX3 zXYboe2-OM{W!7wdQ+T`6?>=*0L<-5xZ&94)3?}h2MxXB>H!5>50Fte%H?M|Y-P2UL zo!|Sc*p|QD3*MjIJ>q9oVZr*75}HEwLRn1q^M?H_|50yC=!m&p*BJFh%E9e-CMOjL zo1*e+G+Jo_hn1B*emh8uNxPjDn-RP6$X9~$GudPB7v-t9=~q|BvbZF7yR`v?HI>#9 z(rNdn%8q%*hn7n=@J$28u2|FO(6DrqQ8)!g>B~KNlaJIr&7m_SnSdsF?oW zjSJq{BAqW7m?pGOJxmV~K3EoR)E6kM%^QQ&-)?~{r_ad6*6-deU!(7yc*}e@OA{tJ z6gO>pEtH~j`8qZBGMS3)B6zfScI(noAgK2mTRt}#rpjxw5=RSf2-56pYIl~DWY0#? z@Z5%Vs{#a_9e{z%s-_;qXN^{~U+=%96R z`=#(~s&MeZbg5fa>4Q#g%A3j_38{N&|MQAdG2V%`F*JgmqhF{8eHi6&rX?t25)3-y z_}<~YTW{|X+L2*zq;S|i*K0t<_vV*SS)-d*LoXg_cJwIHvMW~{N}Tl?ywP2jn}2Jk zQo8p*lP6FSe`6Ik(|tY?K{32-rsdUV8)v#lZ^@AEI@72~HT8iC~+CTL5 zzbEI`p5Jv?H2XuFEKiQ6g0x#x+0L-F*-ppo@qD%h@x9Jlqq$E;__dMu$0QQHG7rDz0OSs@ccsZvzXA zoP&vwbIqH5C8t^L`?byZ981EJJ=)RS%ms{1$8yPtofmv}<#}oT^iO;DFOQ%A#>%1@ zdGDXaBC3#8)RA^7Wv^HGaBzm#T!5Y4-)L@~*n6=`X$|~tZ%eJw@)XF)+8P5rbynC# znmUD;JfX)m7nvwFj&d7h&vwWzqzJt$`x7VQ6dn8K%ft;kA4LKpb4_2%@{6DB6CjDt z$bZ-M$aL79ro((Re^&pY^6N73V>SEtzps;gqP6E>Faw=8$2#tzo4fCT{oEfJ#(*TR z=GN8e;a}mW9?G$hO%B-I%heOooE4N;pg&K3$@ni6&Q(XuYymTrH=_|I-> zuad`m)xI?EmAuVB{yDKmM^6q8AW`w?gbwx(_ZXAnt?YJ(zTbTKl_1Tjgq>Dga35R7 zEe7mWJkQ^i?{P?JEhmru_8pOF`?1eFe=V)?TFC*2HSm~ zPtfoEEY>IJIQQqR!y}x1R@Bk3WHKrHEur!zvofE-qcz)3E$CtTbk%_Jc=Tj zZ>y)v)B#JWU^8xS>JCTtZ;8Qm9g=w5u;cQ^fJsg7=d-vIUK_P8p)QQ_F2dv2FFP_BdVM2N|;Z9D}fYh1r;` zaf#1?tvvS{^OnJAm-2+-E`@QKspMnnQ;*+s^?mhIVjB3ZcG86E37_^@M)DTT49nC| zr&JUTJz9R=8^zRuxjXWy70YL5{?7VzSgp;T3TC%YETAbb`|4*ISC$KjyMzqmOQX8& zQnSVUhxMm}j4gCD%f`QsRk8MDM-?lP6?La-JU`8H+c5dR-*A=v{>GiG`_(=LZ7I2+ zXxYI_C${0yl9TV-E>E7^-1?gBdnh)_G6=OPaWD#Ob4<#*?DM5Qed3bfdFqUv%Z44^ zl9n7y5`*x=|NSeG_`))-kpF=9V(fwX>rEl+w<@EiZRbt%576wTy>cXtM^>xk-RW0Q ztlZ!GVGL)WqPO)O*|T5V*>i>Ty2^3^*=O+Ee1sQ1qTdvvhn3=3@jYW-qy+z zpQC!s|As)zP)C+%cx(sN0q;qppoNk?fBz~%@z=4Hye(JdQIU{gSPIEIDZN2#!14PR zg-CVd$zA_h{TZj5jN9{Pfmj{g|6KjYlscUOZRprZSs8fl^SJBpI_cTW>c7jTiW5JI z!?)68bvQ7n(Ulu$eUQ@;;nt7XY#3^)_Ecf;@eloZ)8+rVD`j3YQOc9e3K-nVQWnxj zpGJ4j^S7wW@kDI0c~Nm%wW{FU=5Y)qp{`^JGEP>7M?y2pSv&!T+3XnaffAcj_nSjf zdTdKTKQ`A{WW&U*^b#K$QA05^PJ1@9@O(*~#FBD(=A?n1s~rA;sTETiWBV~IsKsP;fmdJcO2*o57T#7P!qY6-C0sKoBQg{x7$DKeX^;l zzBK!#Q<*qh$}@RpbqU_Sbde@SwOc7~#&_<=&vkS$I^43YfoOljtG7O)1Ai3v=c%Yd zti=oLHiz;b$R(nObgOlylWS-8XIeI+7BEG&2l}O3PPnjcuXd86(sW&{*r#|tyCvVK z?h}7}3!n!OqY~!c6=t?9)w_a5JV8HFM}OQex_?ghUaqXF{W&=wm`sNU{l(^YKQk7?;{&3s|rOI z#pt`#BBetZTB+Gb!~KOpvXl7J(bFt&!bd%L;u>tgP9mT7iLyN?^Kxsk5q>L-g+$|( z7zkjl*A8E7cfR3W7oKI zZ=>CiNa@}V%(386kV0N8ZwxejIgz&857r z(LC~vS!4{B)cw(311bPyN^$Q@dO&4uwm2*!WDsV>HON0@cjnyj>y!tZoGEyeOv zZEbCRy&O!mPaUA4ze}wh`vQ{AQ=oUj=fb{k-;TPehgTEPz{Ms3;sPiK>d!#?1)>uY z7Hm==o}&$mr30=63=MXlipXkr;r#_F6eJ6a&Ep!`DV=nHR2!`9_hM_p?uC#7w80_n zcX46LIg4e91a2Ubo%PY1ul8DUgqJ#U zF(}aw(qG#4iOZ|~Uh;x70WycVZbN})$E>cnxHvRc-vK=2tDyl?rVw(Jn}4sT{hd7( z0tb3p8c&@dBCsR{1qG$0eKGyNcW<|x{L|aa`}TzoxtZJ>cE_j=f_}nq1J~W&Cq_hW z035K9A25hTDg)$MU+#4{gTiiy(IbXZ^O=G)@Vdjz8^bMQ=C4)UZh;1xm{=(i0g?Sz zTIvRu0e)_i146<*J|a03uLf2QrskH>B2&2@Hx6 z5)*hvap`_obA_$KC7K%?Px$M1?A-aM$}q1R=EX`3KfR=UXGhdzXbEEk&Qbh04CMht zkyk^{59a9ss~1>24!d!%;P=q)#{OHNeIY*ii-+=zOg#_PHCo$w1b&8xe+`hpyhw}{ zwl}=CPG|T=25SSiE7*L<1CbD)N7KoHb-y7d%)qcla$CYgw>X4jrC<{N+Fww&Sy))C zJ5)1~s5r9(_Br$n9*M31F2Kw4ga+T4=<0*Hf(Unz32G0$W8`3C!%!;85;4`+Vf^s$ z_*85&tNq68IF<|M8-hv7J z6e2ZbGy~jT?2xbcbF+k-%A_McCAC3TlZhhlFsYCflEM+{^JFaa5ov7fR)^tIQ(kt@ z3y<<+62~v)9Lb8KyH!cQ%gZW!R|=XN$J1c}4wDD9clsCxf5(mil5>cv7LWSePv~7% zW;+SZ;~Yc|1To)WM!Z~)*a5@DJhSRld$@n}lo>+tab(g1=DzzR^BfaNLXJoX-L z82FW;%p!b8mVU~ILG+byS7&U%C;`(cSfJhUfkIof^erYdMbCF-Zdg+%)||QV-j?87z%_ZxxD+A7m~LVSy%_>4%*i290fwUwrhYuz zYi(zCrNx-5-t;@m2W3Ki`W>94KVWAP@Lg(dO*n-Ox!^YfO9|B%o*vUXlDt&4C_IFe zPI=6ZU|~Sha%PvL8FS+f(a)d_0#By8+Y#ZO*?a}M{pGHC<~qdu8|6J-pG0dss2TQO zUV%*!qavkq^gi$nYw+-=$6U;J-NLi$0dsifLqb@TJKhhO3U zkm>gqRnj`mU`FvdCL$to@}xWbppX$EdKr5x)-fJ@yqo-Fdj3VVxB{dRL;nTXGW153 zo(mD-;rL{KJLh@!0YYG|(`bnIA2FEt0*RP6px<7D9}NC-tPnw(A?W|k_}x%UL0uLB z>|$>*-D9H@@4Mx=#s#) z0R%pblL|_x0fe?-mji1!87u}20J$5S`-rbY6$xim4`dY(jSy4|L7Ebq-ucC$JD6qx zNqxDq2r^_OrYJ{qvrWNs2DwW4GlRGe`6{AQ!bk8e84B|$0-IT1=xoID*x!TX%)1jpZluhm&1&Cm0d@B?EQdqf| z#N58E_tMcEb~{LUup1g07)U|J0|Bep$&)WDDsF3@k2O!;{9o8g7UbHw)V)jnNtSnJBn%R;Wv=-KcsJKW@yIzb|W zY6D>(lTZTSiHA2F7O~XVYq%H8d3eLgkz}-0#vY16paO8pq&-(`Y;0`Pr9boz1YCHg z*Ch^Mv_RVl#Zf6?d_Eid9Us=SXNRoUYVLq}5B?7R9Y`H7S=egde*X>C!`R#(9AXfA zzi=MctP@1y^My`ik;Ix4F}6K=H_q;d5$(_`4B*TARtNVGboU1JXP5H2r`-{#RnN%o zWc*5GtI+iqHmv2=;Gv``-X9c8Oh{OPvMS>DMyJiFQXmY#9u#Yia2MbLUv!QFas!N$ zeyP2&qa(dH2`QD14B3uq752bRJbTt}ZTa&O!Aj86t8kmlS`0%*>_ceXs*)C~Fb4~;+Gp)n^WiomaPocfPY zqdj;)EAN1-@HDogv1b`=nN0VOot?tBA$$PEHc8-q*dxUYWnhmhMs`Y_6@Y0x|HuYE zdU>HLDci8x=gO5W3Fg>b_FL;=D2%VfMw{^HkzCgW027#*+nfnkfebB7svJ^YVtq#g zT&KHI!@LKQ{_-|CT+zb9*f=Z~{Y3Am>-V?2TW28Q9d<|YTxXXEjLE5p>tNN)CeSxc zcXV`MS0RPQnunwWm%w-8t@1A#g<&>m5lrJ{BW&aB(bS$>qYyme0ws?r~YX}T8j@v26$8%eBW3^*JI|&!z zda1W_$eHc~lJ^*&6lucdg<2Wo*a;W9)<9z{^+xO?;Azw0UX$m>qrnh9k=M=lEi3#%6a9!CcTx@gTGx3a}ia+Lk#leB@#gRq2 z*{VK>k3Tt`VQhfh+ug&1KxOr0#<Z@)+I7U#hU!7+!w1d*&Kl7fE9qcSG44~2ey z!$pLRoxO4X5jMmkf3)u*pihEJRzg~OVAKf$PUaw-{79wfENnjj<`-%NoUn}Lc2ESO zL~GkZxtn8@2RE2XSpJ2sLi4fY)$i~K2jk8oS`Oh~OE#8m!tER%VS*g?s^IOyN(dFM z6*kP#bOq`o^bT$>x5FBZQ!9`nCE+0+crY{tuXX;I7_~((G)Uk(Ff*SvhCLK_-5#32 zyQ;C@VG2A9+dj}qT1oZy+c|rby!DS&oXfY@Q2>IhiH44O4?q%sSx2V^^o50t zcwSXrS_&D^UE=*wPJBIay-pCgc>Mdlrf=WOfB+kw!K-_!_p10V?oBC$r#pqLD{I~| zgkfZj{$XeYYwmc8(B^Td4A(;xVB7{`+aNDvNGo5Ts!}$ERNFN4^c;E({{RL`I&S^nm(IBzZ;=qmJ6+pz_MSc%&cOb2FW6fv$2 z8b%4Xwb+j6gRKFZ&3GAPeD|BtB0@oR{5X6W-^zYL{d=puL7}uGTsbs_^Wtem(Qol#EiROC8zC7)LC$H-4h+XEm z_<32{XPjcEudzO2DAM}~9$#GXPWZI1jJ2QR=yLWpH>W(vbX97?RQKq8NGkeSsPYM+ z;Mvr#Vmtfg9x(bpr7Ae^>l^Nj*nr|iY=Dr6M-tNNAWF@uNwC9MbXbpNod_5<-(@e_7-jBud!vh8LWG!s0GVngHyDR-bY>p zuB+YS%yl=r=6?RjE%ylvdw;2%&bumO@=gotTb#)+IdRgS9ak`VD`sXsFc zL9kl;#BN2~3kC9ioXzN1TJ*Z3o5XQ^buc`Pp5k`@z zFEUD<#H|hpj&A3yEL=8RCACk0ZoON`Pup<9=h|M5d$rpPZpUEIclmw-h!lTOhgzn4kTS zxTB0pXEgS`$S9xZ(Up}8gcF-I-)+@OKf1mLyTYHmaqh#$Ij{gX336L-PU41b?~ff3 z>q(9k6%-8d=t}gU=7$tgK(90(ci43rJFedz0}Dr*Jpj`v_Fi^TVr69c(2p_1M|j zQEJIGFvR_E5l?_+5g$9cANZ@ehSmLr{PlOy1&tU2{Vk=3;v!VR5c^LUIqOT~+KaPC zb?7;uXivD&EbOcHl|FlCAqQMLk|`|KruS5ZgFF~6D5+~WqhPeMdh6V`y6SWLu(13A8ES z*JHk0dFV&Qt&Tk9#Z806Ub8b|U@2ih#*^wBUC#->-vLGbo6k#wtC=H%w-axge(# zfWU*EyL!t@>dqVfVjELVs^T@ybn-Aod9EjP`v|`414F3C_?WP8p!su7Dm%A2R)iM4 z0coVqvH1uA^FkS{qvH;xuiE7T-!&pD4`^;7A^CXi?D4kBO*#;x0X@_#o!tiPlSe6G z)^Mv@2b?5pX4&+W%{8*x$@PFO7lIXbHZ`jGJDQW;U}g@*_XtBaJB8@R#+eGVS}*WI zIkW{TtdFn&{i3kkId)E>wH$XP+|g|-=QJ5T2wa}KJ5rZ$3w@k$B$PM5KtZExWqF|$ zEk-4!rK(Bye$?qijv9c_b>LHpi}T`Ve$Wi;6Ch7_ke5 zcH06+@;n^evU#-kfL5gW?2bT1G>rW@-9U5&1Pv>_KpQDX^|;pif+h5Y2KF!m#s)w{ z&@;!mzS(YXk(j(u`>2y@vVX@e8hYGUFpbqvBz5ENR|zhp0jy!7EaAAnw$2c0ZZ!Fb z48_+{5o{;@qG+gcmJousaiNiSBv#|%*+p99l(?kLhOLa^wD{#WvqOctM z53ULK@2l0^>?V5ix#M{B5G`ur%4~JIZPN#5{Z1jg9QaKTTbY6)2{$~mXzmWVTO}F1cOko}4r2j3me*EC#6K93%DoGAg^ze{vEnGw(5_#-wKm1!0~{dz zxXSxGMu2ei=_*pGF&1pUVqu{`8$fuh2xlR>i%~ltCvw;@BHYX45SiXlO-_pJcGdADbMlbhmKh z(<=F3ZDDaJmQ1TCbdo&{2e*&>c)E_|j0pD5PtT5t+Hr-zKK?ux+>hdR%!Q{NoHf~* z`)))uRMB83cnx`%o{JTs>28{Q!5SXDN{IkIeM6|r|!nqzkb2b)?5?!@n~aO466N)dnaGO zpU{E=FI9uO0k6af#$Dqk3a4&_VPf!$Bpd?N$sl0A9;@WNW6<;F%0)aq%Ncm!rvIF zr&JFCjo{#5dnZG0t-kSl`Akpn_jX*imhG0G@vvUR=0ArI3#FI7If85{hjdzSJjGyM z40c%_ifwti>C~RyS$~5DSFA-aarz#g38vkx5U=)?&l9+F+RF-=QZUJnxm-r9`LvO$ z(WF<{atp+^y6Dr`|6H#TJ?Kb zm8=yq>RY0JJ-%s&@%*J21=!MJboD!7%cR}f5?r@0m|zw5#Hz6MQ`Zfg0~@F4gmpoI z{+adNThLXx~Ee6K*}htWa1@e0!!@&{V#fur&=ARbTaGP%HTzfBAz+5PhZUoK38_P?=LDT*mpR3SXn*6#JnZw)xEt= z1|i83q%##fp&q+v2kzSF33pkW@)_+np3^jP89FAXpLSc*&N4*TNI~z`K~3R^eNPyY z`(v7{x1@7PZZ~^+%J9}_o>(AfAJyrnt2kj5?;N)`%eERxi#Df=ov0aVG&chJNb5Dp zkRWcQ;nTMSMP1e%-}rQ2Y4RUr`u;wSN^{htEIQFCm21yC8PC2<5ruVf<$p59r_sZ z9Q=Q#S7Tj>JZ0;6S-?T#<-45H6SOd4C2X7opL+I+~D-W=}o=O zQ|=^Vc46O1_c-fIeGNP}Gid5JiBCuvgteFvOX2hBq{ogaA-_4eVL`AVQ zBHXw%W0O)yS6HS8SV9$`oW0=Lw2G=*V>ezz8Oqho-eK&pFiSQIhag{VqJXAAb+5wh zrD8TcD$F^T9`ja7C)F4Uwm!s1-W93?(d)ug?Zjx7zRe2VDQSb`fX8lE=-2Uu!1R3y zZVpMmlM^03xUs5WOC@88dl zake+b*DmQB&l}%MBvhVgEK@aGdV4kM-9Tn=R)p3x99JR?pkZd}rKc@w)Z?TcqnY<(Tt611O7 zM-}D;Z;5ptP@j{_AD?KIvPhcMp_Nm#l9Y5B-NuySuReF{3Jhd+LwyT^7WIDqaxu+N zNh9*p&OAec6Xk2QeVf*Dx4B#v?Prl*{FD4F{q&KHJV=V+@&G>VG^0`ZyqST{ zPO}=JjOI6Hq(Vv&FV5N9i#g|V9!v)meEb~U9o^R8SlT)DX(`~vM-GnVFD;Y&h7U257UzIuJD z?G=MgF1h;Cv=)QE>JBils!CO8&OjdW{($-@6q*H**z?cFbI2RXGxSZx@r`*9w4!w9 zj}QN}nTuK;6V8q0@i3au%=So9f6RWC!T&y9WmwUFZs@gYi5l|I>gA#NBlSLd2;n^B zHg>XdOC8ttF{aL;Y5OG2a$1z1r#8w)^{?IP!gv`a<$S$)@mkHdgX%hpvqb!E#-4cizSDcxZFNW4$~OIK!ZdkVq(4kp)BJI&q(t|z z)FH>{Fi&Is$hKMWn6qi_oo<=&vhnpmkbeodUipm?dzmG=o8k9PFG+E4Bb_L*D1Uc+ z!#+`RY9CQzMC%6pUXhfZ*$OGF+0a=2)npMB-#^^l-QhWEk{LrOSh_PQgTu)2p``|_ z@ro;{eHJ^TYHFM8ZRGm5nDlz(Z#Q4UI+g=rj{>N@~xpLy1j(3AP?d>yxO&?U(C;w6+-eXed+H#d;QKIibYbbLqR98S9+x>7G3+7^quRjic@pDYt`s!0WtfIblU{z zad&Wp?@$GhrCRhI>>N{`Gcqy)$)4)+!ql|_ZwUPPRDSd^X(n)PATi)`3iZz1{6iF8 zJ1XR_bA7iGL@#_fnqi?pJ8izL0hr_H%seDcOb~A^-*&jI`%aV3Ad(ijTZ0e~PuEG8 zLoE$Oz|s<90^|t(2hsCBes$Q>MmcmWXID>ABS)2JMVD=c z#g8?Ke1PEmrt0OfgN-ZpZ2LTSwPUQ&^Ze3MghYXB zK@MJlnKIBQG#RXT|Ao?!L?VHO?JD)UdF|RrZIndJr-mh!)u>gz%@#RFyV@koONzSN zg*?oAyo*z!lgL^5buU^+z_b9$LO3{#=b^?2)(l>knJo*0H>l>Iy+_RUaYPJXzfLAH z2kK-05+xX))LOJUrJb`zy>wBE;hwgmUAE-TPGE5qn9m=Tk$LszjW=XiSMwA>q`(~c z=+P;}OrmVQR^HBjJO63VPG&P5Nk|oG8hS(u2=6AlR4V!T&{|I<^$r1h0`O$%H`59+ zxU&C3u^9no8Yn6VPZYuQ{i^21_+7RM0t<=dQeM{7_>;>r z3>{(GlueREM+hKPFhS6M4Zat&TtMLPc@q<6^zhUT2uBJdz9Y$jVoSaBzq_)wS@}&bg{N6|*5xD)R?5X-A`;EH*i9CU< zOZZ%04>@1yWF-%>=OIbV%*=#potbF|%_K4mSKR)fb3s4?y8bKy+q`t%Hevcgp@FML zRhytnzR}5~s&kwcIe9e2gB+Q6%Je*H4rG_!fCL?v2MAn2$1(#w@B%~h-~pl_(o4TX zf(c(>(5gV#e%D7CwFh%3t={~1Lc2u2z4?Zt)n4jUe?CTasIWZfek3WRoC${_icdu0 zFzOQG?Q9CtLDAn#&Yy>#5WQ|Y2q$17g@ym!dT*xX%JA6OK{fbVlg_&{uMmaZlWV&ih1e4dpNnzSboD=olzL0?&srHx9F%IO z-Hg<$k^MW&mJmkSR=UP5tas^<(zW4nZEwyLUH#qLzn5Vff$3M;v|g~qe+wi@1SYQS z8vFZ1Z{|S%SGfeKB}v-KSZvz)H)`3CL)@)g`ucLelBl*u^Vj8JRz-Esl&$X+Ds}X8 zt6)PFEq_$%%^i81=-~AxTV(&L1)s&X58IkueG&vN)S>PN~(*o2yk4<|Awm zceKjYoO`>Un&oFw7xvxVXt0qvY-*h4R(gM+Vs?9Wp1PmaT)ID(IDR_$vVmaVTaap! zIZm@c4X_;#&eOwRY_pqbxW=*Vj9hsqw({oEo}a26$q?dpM2!a&pQWXSIq;~?L2}nnf z-XU}dy_XliTi*Sze*b%8oQxz4a?U<$uf6tKbIx_bv^12-uiUr-0078URTLfq07STt z_;`FPpC~|%^+Qy$$TQV`bjWy zz2IoS6Ua648PDA%Lra1c7Aj0e?Cgl2}X$h5_p& zCa+ZK|NJijWD(kc>-Z%2f4&Lam1(m`GQpzYzx#Q6LsH{4eAG8;gSc*yY1GSmX#&rG zWD7iNLX>n1kH;PFE+qzErAb(l#CoyW|J{9R5q~D9zN4o#P%-XcP+k;9$(|6ys+{nw zIpndVU0)#{a!bT}Z@J{>6N7l1*&l6#SR?2~3ikH)26zAdq=TJ9Q1>w$r`sItV)k=U1v=y`#U4b^a3jIp3)R5py&2O!ALgY z7lWS~c>%B^^|X8C?o#g?kgrHdnZ(`m|K7xLfiDOU^*OYnzDHZDz)&_}|FffCr`SeKG^gA zu=zp!XJ=$4NE0f;`vC26v@zZWD&XvyB52(+Mgvfe^1Jhf@%*S)Y3@=y#%%Nrc~3uvNxOjcMFH$6G*~QP~}~@)7MOmbz);9PY(d= zamDjWabMXE;=YDBK5Df)$`|n8W3yaSW$ldXPl^8;YOkf^C;i+)QaSy5v&iRRCvHm) zKn3XSO5P|lOwS+L-K!oLHSgypouWPx)J;d!A@>R$E=!;v&+>%6sXD@$GjCBv&+MsP!g1~hE zBOmczhd*va;d#wa%qQuQ{W#I(<&$)QB|Vk<_iQvB0wc*80NLhZOUpma`S73e=r z2^kTw_tH$&obW+(WI@gu2nmuZ)2qSH92(dmbGe+?oO zW!PLE_Z~1JrIM3t6_k@`qQGx_EDJlcFaP<(a_wtnf!Pi5Cyuon6;TiDulm9@KJWqq zA$XRp({KI|uwD|Q0iu?JN|cfU7AJ%1XYInn}hUZbM}SU&)+ zJ964b0%$d5T4YZ+L@wNa_dknF!78E#I@S!MO`~ef%=o9 zJV)7RoXP*o{cSzp4}%rwe+mw!9DIEPIe@B3B>K*wNmcfl@3;J&a7)3?ENe|JP(hNu zzthy-PF87dymCT!e%N0t&%fBtyAEggX7J2`tbn8t{Q^lFDCW>EE|8Dfv3ju;+U+!B zrRN0K(7btuK}{Tu$NauW2KLO*0MPX=OFJ{8v7M~Ai(z_PJK%NmM>`^k8xJ?7t+hE# z{Oyl(Q#3iHQQns>Sg+j&)!5Y?$6-nI+04Rs%y42C=V7WKdirVr=^BHGgP{?Y98`#l z=YzvYsTBJPeJam~*qjuHrzWNP_?CS<1-->~)PXVz{yp32x*hX3RxQ2?tI=8|gLu310Z96Ef@bJBOW`^#2~?dmPw57&ot9m^732C!v`0?YKnu2TCk z?B}zzODVNYF8S56tvc$1QRKoSra>pK-`K!URMSwo_IpI9eNu?3y|CWBc-Ot)v$aCB zKlXJe@Uu2?8%o{nT-X+Ktui zm4V!0e^>vZeEo8hn>$va#;bFJq^EZ1^MifQCO7M@r2g70UN4y152i7-(ZM#aDeDb% zJz?jjLVA&m{xeqL?Ti4*-_4Ilw@mgDZ;Q7>gm=8|Z0|2Rb?PCS8| z2W04B$B90D$~k>*bG+U`&>@+KE{cO!eL34%_3P;E8GkQP_Of$lgX?hp5TDu7q2xQ; zMLScC)7L{6k$?hOpvU1Ye49Y}6srbcG8O%{y&gPg$P}42PHw zKLRYAcK8?^A2SXdE`PohEPJ*@M z4Zu#|7VwLz$QrTG24$bQz~GsI>!(!-wj4B#q4V2p@`Ml2UYc~hew(hg)eE^A#?N`% zjv3x_yS3IjyAhSKKPV$-xh@-CHXkYegoR5ucY4G!H_iRCU-%*GzH(oLQ@a>y-ptW1 z02v};TJT=lPuJ+G~bXUZ?Gjo%n@(w?}FFV?#6 zOL29OQkKs+0GBP~&oQ^D#6hFbo>w0dV`3bmBoCIUuF&98zrsf9D*+eshtQheHU^no zH~KOreBVo=@D9zMw5LpBaR1|zAHg5b7O!G1>(_of^!L^D+G=*ZgQ1ze13&Dsy?^|( z4pRxO{@}ZNb_-|VE>3A9{;Uwtp$8tg5hS}n06mh?uX*{r5D=1dy%8Ar`riB-nto8s z6$od#70`8Cl=Yh}H4D|BXeMH60Q z=ss#$2fO)!$}&b|j&aUhCvHJc5Ft7h0hCvNf9HJehMjD>mCCk``d;kTqjh*2qeq-L z7FFuI6$HHlJ?RVme0al+!MO#3VTB&6P>s)3EBh>y$PKkg9TbG15s-$(w6;7kt_?h1{3GEudC@fjzveiO}R#v92pT;E}RtvDmEHLuq~O~}w=ZB(CsoVdR)s%b276;cOIf{DUr zzUgf7Ud-{nNUNN5H}Jx6nT&D?JZz(%+6r+Qc^3LpV4GTPGLZfF+L)R&E0Bdjkt{n3 z7`(kT?>TfkLMwTne0cC8E?h5UITYa2#ordU+aq3h7xczLN5|AYfHShqj)l& z`g?Z7?X-8?!o<)=abloY9?biw#9ChQ&u0rm@gL7NFCO|Iuk2u`9&|L*Y#1_0*uU^v zj^OSjpjm&^x!j8jxfeuqO`ZpM4<>u{|<{k}E1G$Gw;)}|+gi?wL2?E>d3U=l& zquF;!KP2UfT&4xJ+TE9vUWP7hUC%o2-Um|(Fkl<x}L)0 z()e6ZRH_WQZ&GWwTj{@eurhf;%&HT1IZLbGs|c?*Na+{y%0Z1^#l?`z%*A*3bbNmb zXP7@E$xhtg0+a~yw0q{raVg)@c%6BAo;`_d7&3eFQZ zpLAqFIWXacoF-_ej2(EP=%+X=Iya8QA%Dr=^Q3I&i)CpC_DR?6=^C3ve_RcSylJ?% z5UW}6s(sDm^5pi&jP~JiFTDPWcA|;D*H@2kuc;oNv98D2UVHaiuT?A(a&laMSXY?p zHl$xC{$mrh+k<)I=xa_s@KJ4Ni>bGqrhY59JW@wP?Bi<%Pc%!%?CfDMukZVz?d>Qy z>W(q0YDnH#g8F+nUx;3aR*O%QT4}DFh*E! zU9aO#6XVXTNzX86CSHZ1IiKB>X~X)XZ@fcW6S}B5s-Hd)yAaWgNFe}cC|G|C%&Ukx zEa4<31<8yB0z*{3TPsLOtb(hHKLtb2N}Z|3K| zsjmQDbnj?(&~UZu(va}hd8r2U1EVo~l<=mpmoLqh%oGWeXQrXYq}$^-R%kk6FVuhg zoMn&4pdvqkN>lSh@$z`eebQ~XWZM7qaj)`7&FN-s=lJx+LB}mOR|cy>^u@^uV>9Wr zq}&Jm%u9<@o8JMAmm%K3ts0CimpeCzH|+_NnE6vLi{k^#=~6G}be)sz@oaD}*R-*4 zuJ2*$@&5UAns}|R?Qz7;)@W%*Z(`4FIJ|LvC*D<`z-iK-8(?KrSLnb01=A(in?Fa{ zbmJBM%Ak%Wx5(s69jbl}iS3q>rF5Ss{baMmf#m%l*`@W;-U1kvZ9k*eLW~>ZJw$@v z;bi6O2%rQ~5VsRQ6}vp!{jwa44B|t22FXzJV{u;MPfq`_C!DvwD)r?LRm>#T-=jMS ztccs6kkW`wrk8!Pb+d)msm@B|)8FKydvy(+6~9JFZ6}`;%?HyM>jlG3R2UPDy`OVK z--AEAvBC;Ki`c(XCp59JjQlP66^BEL~8}+EmiacU$MKD z)-%CyOKNT=@X%KzE;N_^6^*?-qInaE@N8tMVQWdk;?w8n0f6G8PC?#aDu^!RF2wU0 zk+$$`jbUhX=%@P`HX>?$!ec#NNwW;^TS%b3PE;pH7Zeg(4NsMi7WO}c^L%dNdo?Y2 zIH7}9MlAVY>ng8&FT;NRQt;Vs$FGUNO!!=R`3b-d9xd_*ge~yNU-guMgP8A&~*dAO3#)7@U%CatG48Mct`UTb70z zB}80&bpUR}-WpREL&l8&XTuRPtv%%<)|cmph4zxO2ug2BD#&D!(8i3O4nUzL+fZWZ zsArk?Su4=A44T4R1S^wd#5Zkn5DOiK8i((Z#3bBX0Tuf8mYq(x_I{m~7N@u7mQm0f z3r`9?gibJDx2lugVZAdK99Gro(e3e?S!Ma&w1^y^7epHJs+jV4`)uAv5t+@?VPPbb zWDpNfxlik9oPw)A;x4oQSn?JTHP|cLYiT4^Kl8eD9#16U8O`-|#qeNAXn1*~B^*O{ z>IN!rN2LmuOStruo&4W|KTG;*0AlP~MVO51ptkbkKwuPC(;cs0oYQMltI-lfSyYq0}c=B+uM*6;w=ul|7ML=FcFl?LP4xEbZi}eZ(JL z1C9j;fp#IyQ|#0ed`!A4<>h4#U7rrgA>TtiwNuMIVT7ea@a9 zR5zH7$7Z-t0nU{-q+k3wd0;;z<0=)_&rPlNG^^e|GU^EJ@sd5BvkZ;*;g!nt#eDGV zJS>pR_r<T0x_bz2!c6qV8oB_V!Hmp|8b&_lj&OG&!*ZV}Fan*BM)_{a zKz4kZbO&Ty8ALnmo>vCBgbgK27Ae2dx-2UDO{%htoahHh#4DIezlQ?z>bH6D>>J^j z&_0Wue&G(Kq~?oiVh~EGTw1uHHoAU5L#}B1mD(xzLGdm3tPP+Us!b;n8!P}u7m4|9 zG0v)z3a(Q`h*HyU)omxca1zuOnjpW^Yw~pN*pF4j6 zUcD4q=|)zOhG^plbm#g2g%MdoStnV;EMLM~EdmH3sri)<8$>2TlqyP=P=JtYEO@3> zXjGMkpO}RLDeICYDH|#qR8z!& ziI39TQ_{S>6!WuseJfGQ%MlIAHhg9*Yphm9GBP>vLFbL~;h_^7c6=5X>|mz$$^Vu( zs~V`MK5Bh) zIRLp843OtwW70>8BQ20#KxO??GLVe0<&5MjGJNt^BFN?yLp>EHk>0>pdr=2{(37ytwi-{w84Nh*g)C|>?eQ{LCK_N5cI3KwwSLkM^){`rszpV|xT4m?(nF_R}#fFhVW8U!7VcQEDtgp6`( z&q1%QFKvH#aCGNfUIxZHiz?&C=fI~iwjJdl(7qD$=E6c!el;Q#Hchl)sB_9{1-s88 z`a}BUB)-u1<5;x1pbZU-Yw0NcQ=%JCO!E{>1W_txon{t1g*r_H(}QNfY13zQj*Vh(l+wNa@C`s8KI$0akmZ+kwFF0o>^j44`i zP2WxRPW3fZo@8jFhzqV#ycCNJh;t`y6(V8?jO;U z!)0%`snJ=yK9!1%J1k2RHV^f+9xTnlXMV+mJuVRKIgV3DgLlE4<{srK)qM>zyy;K(x(yCl>5&!@Km{pdg$Zb_Hhl zjR|sUMp+OBK6;str$V zs;b$53*do;VN=c#SR!q{HnCPNF9_C!e2)Gc!?1x7Eo4y6>~tGU)G}{r+GCya9i-=f zhXNuYtOINvv$R;%g|MX$_@<{psNZcB@E7qCsR&?@M5)mV=0`vUQMgwLlaHMd+S!uq zS$#JD{3?#@`io~WKdlB-RZz-N;$L4ID;6VqUxo-Op|=;d=i4`-Z>i;*LLwa?6T{tV zA^*|>ln^)xO{ly3HTC($9&Dey-AL<3r64xot|`pww}vjImf(ob5h zOOQbD=lw$LA$nT{lskc}fYt~6W}~sBHUzhXPW#owqAJZKWNL|IP_Xd}f3-ibx0!-K zyFOf5Il`ay;)dWsF`v5dzRcd*v(hLfZ#A;B`4FhN@;TN`eu98+S(LHv|jzB5p~tUA(y=zT%vBB`}pfTt>9uum-o9akQDfBhQ@b5I7qeqD3Kr z7mWqQN05#-`jU)m_4m`~NL<|Q72c`=X$q-5?)M>-jAeT%JVrzat zqojE*&CO=Cr~#00VAlE+-_4Z!Ws_0^vE$6s+Pk4h8s=$RlUX!@I>7Eq(r6cAelN<& z`eb_HZieOXbfkIc?+~zcG%(=jS|Q8DoAdd1@T^k}p}R*>$1dGkG=Nb$+HKyok3y0F z61h|Ls7sb6n6WdW6}E0g868*yQE5tsT$UK{`^hcbRWQ0ZKkxiaEAcW!1?Xh7i{*zz zbxXHKZN`zNX(W&A9<}iINLI+U&ll2n;4|ARsyx2}hY;?6xIru3;Lvl8xbyIJBE$1c zEHMLrbUm|!Rpv_P8m}-N5H0;DmT{R3KwriSh_rVA?j*H~Jlp#uP`s=6Zg6*mtL-yD zPvqQFE#H;A;gX7bSJ7$`ZI|CCY?{Mfi6>{j>+|A@$>?=L&4$1`_*Mkq6Uh5_QmwY- zK9lIwSQEH(B=iqqy^#gr&Mt8VK7I>3`MIZz!=MDoUxH-*G_rp%qRV7A@wSpRa3H)4 z!%fRSiV#fs1pBf8pGZu{!SDV6iv4BRm)8ONfS1gFFIrh%#gad^sTC zzCKcd!w?gH$x?n%gJp+PK8Y!g_0E5<|G-v1P;o5qJgBitCW@sY1W-x-{AaXQ+|Gj3O^K5CQo<}))Aj67=dSQDKQWhP)Gl93N!1Tp~s zt3VGCCIG^>VJQ+`E_7lp7V0`VYMhl*-nPey@Z-cb(ueAJ9q97Q%G*Ay?Nk1z87$rr~N zm(^znmFNv}`Sae(GfnvbgDt|AP4#D6CYSprKGNt-w?eMJXx)ps?|CGd<^h)^_pSuk z3QB6?^+A&fzW&dk(GXzD%#ww|k)f)wZ1KMckl|fk+dfR;adkCM8r&8O5|@to3L$1C z?8%TuzxMw%?pE>dxNYH=XW(c4?w}2QmH|FZcC>*@wD{N7I&PuL=M=YlfG~^YJ>16lFPQfptYM}4 z+O0{{Gfmk3DYk}rVOFHqQ4$TO_U+kcVD$|+jG#-Mr;R0T4MX+n#T*(qR9lWZHIuLD zHCuPsgh2Z!rUW%&JaEk6N_U$OgJwJa{B_Iz97Oik{b|}-(H>DHsjm&JKr`S%8 z6#VdF^WWiY%rsMs#%$`E>`GWmJtBK?0t>%9y{&|)0X{lT<(p%F+E#E{le7GDV|!>% zVS#}@ZsCa6e>+^NP?g^Qe9h$W%Dem&<+`%EWcFd#0(}ZU4e^2cxSwSG=eh8c+_o?` zFZJ{s@*jzd`;)k=omt2}-F<(5@@_Dx2%fXVHvGP|)75~9N3QbKlkVd`={0U=+;e+@ zRlhCrZhf`ImiQDIg1Qa3ry{CCW=IUnRBV^G7{h_UooOCZ`cl8BzhCSvrVi`pXau#u z=>gm#kj$Yn)U#3BFc`xUcn&;83x!cznRXsE7URSSnM}Q#=13z*H3#pj`6mYUkDui0 zX>a0)ws%pze`yf{RQ(ky?JGue5)@NDvAgxBN9dNVU7lrJ>f~r<7%Mg`SVm+OAj-7h zV=`%U&;gPjZRk9!n}W=OB<3x&Rtp+tTcpVL#FtI8bV|ajyXGEF?qj^Mgp=@%j}K=9 zU;T$NuP=kJVN+eYMw<1VP?R5zQP}i@zQ41S(quZtYNt5yV$o+NkmQBI$YcT2Uv3B3TVkTK%%P4Rms zF%t{4f6KD^{`Qto@4>jEiDN-^F(xFQ-ov3Jg-LP~f4yP0fq#n@xpf^RgvdF?qS3xH z1W*nd6JKXBT=efWm_8Z0OYlc%1y`} znRm^Mc`mZJeLMj#+++7BwD_3`QY6!Du=;my*SF&aljVaNCM6GJDml= zN7nY0eV*GQx*V{zdvE5E&gzb`tLxO)Y89&;G+S~$CAtd*cR6TBuhkA4t7Uj?IPk)c zHTD5^mmZck&V-kr8vt%P3wCu&i^O{#JI&*`59Ndb4e_t3o^xU4vJ)dNf<14<2>czg zaZGe*dp3FcZ30Nn)&XXhzl}jh>TDL27^^8&EwUchxV+&A_t~!xALcuTG}2P;FbAN3 zk5I7dFgKoMKXZoPQcEw_vW6fzSjNt9~=9g2&f^a(zp`*Qz8=3y1)IwHl)Da z=gLk!FJ3qreR+y5bk%?tG3G_~DaJ$MnG9xNBm){&aJ# zv}Z371(}207p^<6QIs6p?=-pCac*m;1T|UJpWT8Fqyzmp>E9QN4~odKxUV0C*j)$( zlS28#6OJyk1&@dtCO*09d{<|0n#N6|p`*8#QH7m;-E+$uuk4|Qy z$(8#(O6?W!v~Ka8?dpwyZ3-pdxmkc09f4I>lJ?X=MPLMmL6I{vOXv>U;SG$@3huXW;R@~6f)Mmrvd2G)8XYV&A5!`7@7+<2unr^@3d zc<@U`Q7+Xaw564u=IGUF&_T+cszoHclf9X*d(tXWUu+!YsVctMoub<&)XHP*ShJFI z+wZEliK!V_iGZh92Zz#(noXNh(@HKz9+f_Wx1X zg|HEPxdx~WuGwS^NJ+PiqkP7-wu^aJKU8V!-K}V2F7;hvHD&tD%BcASM^v3qzF+&r zW9{mXbxL4=kt(j}vNiGPV-2zOqUO~)Zjrez^W<@XVGIcJ=3wh&AmgG8wH3^p@7jBQ zIF0V1OW81stZJqZkHcxH5(IlhvwTm-rwjI@mwqv``qeI$j{cFZ>o^kli~DS&xT|zW zgK!sJG1seGQ*VJJ3M&#j?W}d~3IK_f?ATR_xQ}%l($mTppK`~|weX70r{6xe8U0Jg z@p|j#EL+MII=x8IIb<8RVK1PWxdSld_Z3&RgK?RQjwQ3PFY*~(G`JaDfD@%v{L%)* z(V%9C9^1+3H4{V@STPTyuoG~A(@-%a-Zson8#wWbwXm@x@EcA5VJ+T>`jF(pXt*n-GZvQ z*Dj4jG=li=FQc*czaB;tLW`oXaeS1KZ_kPP)C;JKYeLg2@MV5!(e7MC&q+*t!#!ji?Yx$+0ZEzx2ktx04+I*kT(5W3v=UTHp)5MOcCr+ut zRchT^0J0oK%r8k_dZlH-7Pr9%ztkmZr~KCIodixea`5))Mx{wwmXXg!`F`V;JV^4< zT1Sw{*!HiK9!C~SS@xug)fxMCQT<97+w3iVDSZaTM6k)RRs<-J|5lJ&*0sfju1hdU zGP;DH3A9km{=D%O(Y~ydtJ-1=FtAv8b;CA`l1QcvbQ$_GBmsa-BqIhKg@EP1q zS)+c*1imvd`Nw6PlnC-$3Tph=OvI^d+&;7oJl$dL;ZG8j5?JxZsTC&ZAF3ts#@=hy zooeHH>z@6!Z0VOg%E)8?#{=H4_TxBa`HQ{#gmc>qlCdzEq++p4iT^-yGNnlayfVs{ z-_0?)3VxtZ64?R7k)XTmT_VKTy*&FSu3u-paZtX7{blfbOJ8FpB(!$yHXnH&9QI|MXxcJ#+KiyM&W`gE$le4+ik4@dyLrEQDkMFYCdP`m& z_ZGf??g^|R&I}3;`qp60EcbAzY+i4O03$l5BeAU#LF#$P&(F#d@{K+^H%8*41-{%T zK4TZehzl7chW%}!FNSMP$CywCwF@hV;fSi4n^iJn?oy(Q&|dgXaHW-*P_0Ekp>d(x z>L&7~Cr}_p;iY_Bwi??b;7d~MM@CLBTT z87+sVd%!wnSsESjaj~{-s@eOY3U*tW$)W8E)^{&qFj$Wek>aYH zL^d}_`pl_t(r4~@lyu1V1l5oo$Ex#wH{(d36u9A1* zBeY90FP3EP4pDPKL)?QZKGzph%1&8oJM;D`bzL5LmB-4Hi0iv;0%8)&J=3|;=POUG z4&NbHNcLURrI=w4dp;(H1p`L%1HfMNNkZ8xv;M{1e0JYb6` z3-XQY6vb_n>e4GDoCo)CrNs-zh%XGCR;&?;`Q`Vkfe|AlDSZ65o=Gbxj&%wRHn$|@ zHX^@_I1C$ke68pRN;xb2kLIXA>$ibjjLEFq>BDFHxA@#H6hBwDsjOcZ&wWhB28vkSJ&*ax?FJgXb8F4XlLaOq(gT4e3AF{VvFJ zuDG6=^8PjaTa;YFc<-@$bXcX;9OG6EHUor%7MpRPC#8VcP2P$o)|lvPY@bHC=?t#j zlauz6>#9MFdWNx&?9p$>`S(*ukS1sU&!uM0j8E?>DkVbH!2a}0p+S|ccZs%!!dLby zI`$Vr9utb$=A1MNLc)M&{%tkB3I=@|izbN0oxUV5)26o&V#sU~mgy`y|D(d%`~qDwRWEK_l#$Xzy%gTXJ7TOi&pk z!4!aCWA{yrwql|XT(YmoAUX6rDn?L%l2gRbOH@f&dKYpdb41K8e)M(?yGr*7o3PpQ zCDHw=Iu;fa6j!R9F^h3ZeBilP-90K3>y$g4>MtDjoK392W|CaP06QowR@n11*;Y!A zv=8B}bhSC|(Dq=@R>zE@5d>hjw$~e;{j2=YNZ9I`zkwprk4{2)Ub1}VuP>^Y(nX*A zym1h?th{`ujrORdoqvBuvTczrf?q!u1QKnLQs5tQ`JNfJtfY^i7JM(K(4s@v|Hc); zyMxRns{ z?G|qnwke$>b1Mu(O~1Fib%$?d>xcDu%(rlnP)!X-+D;4$z**yxs%dw{7u!>9ucQD2 zM7#MyPrDucb(W$=URCqkoA$I@F9snIT`NgwerWb2Fiv9Ks;7IuOIA#i{+JaX@v#zi z@Qim%74f~Ye*f!EY{pr3k7F^tz3fre#zf_S$Pkf&RyJClSHW)3Uj71h!3ntc&+0~o z`d~>Zg?oqbJ{vV2||7v)l!xd&5R%$-5lmrzLF(U?JNtV!Gf&qAY_&Nl3KHsXhUfbF3`45aFpdAua_uQWnvJ@Mm1aLJRy!fGx)`ZE6BE)$)FIXtf2 zX7p(-`pf>7*1Kw$EB6O6WWfxJBkBlwW-8U{%dJh1QogG;4b;z>M82|XYD7hevAQ_hsLvA};x z*-A9i6x7Bps@GZvhv) zBe&lP?b7Oi$stsEtn;M!j7wsXNuilk{NYrj$^)2#zK^8*|tlNXaL2Q_B;W6gl zHR;L{-Hdk9i^H{I^4AhoAEjFiFh%w!=DWS_QyKpx2)a{5b3P|A%)&5d)UFpM+Adb` zz2>fAEWa>;WCgCd2qrz-j{0%ndHXGmxH&HZ?dw=p`add3CIaU%X8yuwQ$MaRJ=v$x z=3;V?Snk^Xxy{@KeP5^fL<){T3rk+ji*?&>-^B@8D|D~hUa{~5zqNUQBCQ=)l!jn9 zqR3?)Djia^16|KP@itroMy_8j77FP z-NM4dfUZ>WLxNubU0Ne2pu`w&)>XeZDn(zy9=6F3oGFi`*L6_%o>7iR1z==gU?Aop z7=28Q_xcd|_^bdj0OMnMyZugGsKi-Gc*!P`YC*B3$y{`vD2Tp^N>h}R6-NExsY12q zIc(+}V{&219m>zS7Ma7NP=pK~{g|q|`V63$-8JTID31ouS0xMsWA)eKY+*J11^Gem zCIcZHv5CHe>f@h+B;u0ayuC);Y`r5QqBHk&wR>}A#kR6iaLGpSJkx%VDkct_lRS*; zL4!;G3v1-NPS<|Y4+&3NI}?Me$AI}iubdw)0RxWZ7dotH)IkkMQ%LJOIAr-Dbk0C$ zT|S^Q=VqA*j2@fEYi3l+3puW;@JW-u;6T&89Y@tyH}mel6|q;SvaQ!-RF8@FZ~Mag z%1na(bSKsBfp`0kfP4EwkMJ* zWtLtV1u~1A;W9mWiyy?A@qrR`iZ*6DAtP~b#7exBgfZCDjnphMVylktbM4z^+1=aJH=zgfg6D74J>SSAkxPDJC6I2j;lh~jO33yu zsTEX*4Eu_RrNgQJWkp<@_LiDJv>323nU&?~*T_Q?oru>?RI+Qm$7`K}g~w9q@JTFW zrKZ=dka6TXS;}lFA3T9TvX07Vdf#=CBrsc)q3k{K()3dIl<6AY{71GqFTrz(%hF#&3-A(qu`m>0t>up z7gx$~FmT|UknA4t(OE(%E8i7EysX*FbKbR(X(c#pv~ zpSbXi6vTmqV?Y0;1(=!-3zbPU3fPTi5hvPx%^cE4t%)8~q$`u&2oGp?+pg%m5eRfO zjP+L_RHL7(YuiS~q;{V8>;=u|g}RdBMT#)Ht9Uv}fLQNZO*VTfvt=i`YxCG=t|KVe z9Sh#*n*R@^RgzdB>REa`$v33VE50wOg-1!8@^7@I^mqZV%cVmC|t0A z?bLlT5VC0weA)d*6o$eW>Zq(a7(@ywenY-eFO;}ADKRK5s9*n)*f)~MZn-<=5SZW% zAx+M3FI@T6soh7Hif=mpU0sI3kiqc3NIYU<0;GZ$@Ll=)Uk$iYia8FD*N3BsrZRWC zK5n~%Tlh-MsQn>>wIGbd!U3M^DVld+ra~4MSZn`|kwn7vuS)e_v16clMvC{@ha2tS zcyC~=RQAwB@MX16_qV!(u`k{(Z}o^nb=&aTa6N_`fK?otI3x34jsJXQbnR>|caq=U z(i3&Z$@Qc(Jmt1*LrP8#yUtjSAXBxUqwR*ymwX=3nkAe)PvMOfrtKozTgLk{_1v(^ z7cdiAsVDqoK17&4Z_;ZituE#9%R-OP!_n0O%H`>I=Wd00wAx^-w8ULUT;t?P9m`2^ zq{y_b@SH1y6GL=hBz`7S00rT1PhyZy2?Pd=M!ZqK2`12QNjLYHa8^G4S?K>bm|fvh zzI^TxZoF<-o(V(BXf&>s@x8-IV)sGGHpvvc0B__1+j+Ojz7NMHG6mSn|K3*rr5W%+ z8`TyQ0B`yopb}EqGj5g&2}}~gBV}h4ceg97 zYT+qmm`{DaF&cmk^f?6j_?q~FP_V&YJ)M>(dn^0p$BZ%Hm*b0_+2q861d`skSsf8Z z{71O>$NU!EBV)b^*$FpAjD!}oIZv@Nv)sOgibFw?MSFcBlZOh(VRsem+LwHJk1tfj zdOWOwMSrolLCSzGQ<*tI=_8^2^#^p_a3H*A|E0jjoa=?`-8X;Ko%|zTO~ZQ;RL%oX ziVkneU>C|C4KU!_9J77P5mdras;^w?K-6#`EBJ@*fWP`-m&r8n_<~Cn#my%F^+bqa zYg4?wTvlyr%ZI{lTDqtsT!ALyL$!MQ zO16e1V4S4uH=_5Szx~zkEz{&o+OL?ub}+{J^*PX~<9UL*(O~sGTe4q}OmtB6|Kzj( zC0hAKs}EHGlKQ4|R6?C-K=nf8m+E5bSh>~v97Q<1Hahull^Mi^08!_;mbS0QG==CK zr%JXweT`CzNbO1-+Z{m=@i*7A{Ofv1c4HHKQx70kM}5*#h)8A?*LeXI_&YU8pzIw$ z!TpAD_i=k4kF7}@Wc)c=d3lpUd|hjJD}~=&Nm5y=$FdoOI?d5YtLfOmr5UCSrvDYb z{=>`z6#!&a=%>nG!i!%5dIlU%glVDFyhFnHQp*pGtv?+KVJ4jG7x6pU6Yx1$A5)3s z#65~3=HIZ;zpVGqrXQKy>9I^VJa8cz*Y8@8>b;tWNivVjYl0S@u9s>``s3942`LUW zc^=JR)Wu&K5Zj^rRnAYi=Nu^f=Jo%IZE60tK|@3h+F45RyS>urJBC$7-uOy`DL7vI zTmtvR50{mXi3wi2i;o>;d%9D_O4(ZEasJ67@VEZCXFy-Z1DN}H_#?5tEM&K&70ObN zQU+v0kp5h{1$Q1K+{s(J=+`R9iuqEiinPVuaPr^Yu=Vnl0HoiqMxtbCxIYzv{t}2+ z27wlHT^#I|*#fuBM-`b!QBtG|{Yv>{7-arD7dTbfxh_CqPaH=md=7=Koz7y~igCzv zS*lYLDJDX&hhx|T?pM8D(z$vsFnd5#x^5ju2R{Zr0_>4&{-JC7AL5+M0XUJ&(6K?W znd1I>XJkYEhVlq6Y#IlVbtuvpJrW^meBiV__sz|E=Hr9Jq3CBsGVqy;hJSPV|25QK zBWxM}i*1pEzDIikHp_>N9|IPN4tEW z#-%Xx8OrV!h1q3jGKVbY_(g=QB_ylw((r056KvLf$irdRnS?eE~8KpwrK z%v7(%WXo{wiavrqXtlJ<-=19>r;giK@jPe5MfS&p7L#b*y4A;z0TQd9vR1_q= z6F7~QSUTX(MU6u%|GdiEWpXn@0j%pWIOc!K#}1c#@#q@4JvPEU7Y5`Uy}KX}p1{d` z)@}rRxt&t>`Ji9*-h!!~Ei}+WyJ!{?}yw^K0gSBTl6ZKxT$6Co;m@-q7ntu>g#Hx4&WD zKH$ll3dpuCsLrW(iR_jI6aIgl=n!gq$#TJhZ)I(I?R|aiddY)iNgsD3n&`9u+#cU1 z0KYi9aYe#y^$}5n|NkNHE#sn2*Z=V$q+${+6zLc`L_k34l5XkWJ?^e&ch5QBv(Nqy{`+Luea(Jm=FaQ7-f=v$;`Ki8q6Fu<)xB0eFQP9;lML#!Wx+?un3#3jHkA-5L&I7|KlM&{M6Kl1@ zPj>tJ;GF~o+~}T2+ZLYS+^nrW^&6VUh}#xPG_ahfo5OsGkYA4TxhJKP26+pOAqDr( z$>Nja#{>uxC_!xC9l;hLEZ}JhC0{>}OL%0LhMbqR{TpYqPlgsB!5sy(>~de`p+MBKlQIM z*fG<^yBeebDS%)11C>-WFYRGcpM6MzrqXj^GbJJ<85bGXNkYIpr3?qehvPxc#AR)Q zFD#Oj=R{7Y-gVz=jj!bVxAlJ3DZAF50S0udYbk9k0g3~|swPKo$#kRO;Cc+`si%VI zd&mdSLDKJGOEYrcJGG6?D=B8rg)B}^P4@fK*@v9OL)TzuLgJI6SrbXn*xK$*w|7N!-D^IUC17h*kpgpd?zZ3!_GbsT3we{ zzdDhS77|U02{}eC;XRv11%l8_yQ0-%Teaak%CB3IGvmW~OI&xvU1p6>ePwdEvVQIw zWVgH1Zz$kGcQdANx(iX-ZDiAbU+CI0I9;DVEUX)~h90>G%ZZ$uO6uLjj?_njuOw?X zNsK%Z1Qoq1v8oE5(<>9(-Zt?_=!nU33|1KDV-2Wlwqlix_Ib)%vE2%{doqn)8-4cT zO-w3`GfGEpafx;kVa^tJ>`x^3;M&;_M9#IFC|g;~9cuWc&R%Xxc@xdOfX?VOQ8%{= zT5;$p^Uy9NpKZUzlL(u-obf!iZb>ukbhBgO_83>h@^&J%w`k|W`{JdJvJtj>m!F;Z zM3erN&zS4I)*%^R?Z1D5+`s)Tr&HGM)r3C}Ch;NfZm66fL=tGCR8d+eBcJF=noVv` z@t8%bIOvq)jfC!C4#iTnuSJ{@)XH3n!I2}%BiNoroK|c_o{#BE$NTRjJF*Gw!)cRyNVU`JxrA9Lc83 zyucbFGM2Od*O3Ry?xb>m45&VGA@&5$%h2?Y64IN>kjO%lnm%al29WSf7#Xl-d)07M zSlmd^#O434fDVtP)_zA|mq@8AknNwCv+U{B$b+~gx#k)vv_vm|VRiOBK_Gz*fmfok ze-#IlyJk$?N-8zEjAY7^=&%c~m36Ru$MhBK+h#N8MKmCxi^3MTvqqzj^F6Mm@mtTD>iM;K|-K`vT&R4;s)j~ z_kL2b)Xlcyx29?8s(waZ^-+Lm>ux#4sh;@uWN$1bKSugJ!^1({x0x7mJVr2m<5ii@`p`X%wVBbUhQAGLX)q>aE zQ2WFFJ={-!&Ioe-1#=-Ir&6hR7DscHu>dIpaAm>I1r!rjc_qj!L*RMDFec*Ykv>|v z*w+mLmldGHn)@*m!{5f>rg8p^%jpIsv_qi=1HN^bd9U8UxaeVgY+frv^T*lMlM^wP zAVempTbr}_rZu-yrf(BC5A_0Vn%F@jO>OBrCm1v3BYJX4y-&vc3vaHOOKxve+#?F! z)Qa>ik2W8gQkRHN2Uq2@0rQRs8lWg+oggI^($}gvOgHn(q!)28bW(Aa83{jeM?V<8Hn+(JV@QJ zkauFO#3(r>eoO}4I|Y=O%5dbDOEiMfm7i{JA!M0=5zOb8FczT?JFUh7mW>|b*+3@z zIUi~qhrce-kuNnEM8mdwJAtBP0?-!jc{~Uf?_gyU&yGrbi*e=PS8CQDMcS))KPP^z zHmc3#ET74pa~!Ox&-sw8B2_X3BGJEpTl)_li!2@q)}ERE$GlHY4!IDJ+*}QQmUl1c z1|hOW*qEAw~r5Fy%=5x)y_q`OS;n!$tV9e0!<^R9|khmQnJ!mq!&mcdleShBvZMA(~m< zm)(RP!1!5nLDAs3N>-+FEE{jyqrPh$@~C_=2ZeC^6vpW4`xuiT(+^PXYeSNXJNaaX zTAn5f#*3V`1LVO9hpvr;oP#1dcyq2&VWoE{78WHYaC{xS#Q(M)S-?%^pB7R{`iqke z_8A=#TJ51^-;wT*vJFl|KsX%E3laz11FF9p%^hVcw?wKfy6B>74VpJcKeG8+l2ZMPl0J-L>1j@B`4e(*uOmO0`gj9 z-LjnKPrJPXp1J+JO_i}Wmb3sKR4P`wV~!<2iHpl0&5AdT6{1IWkD*}Qr;owb|M5TYxD7a(3qGhy6t2k1?CrJalec*>qxPq%nI0KZA0cksL zrLeC2IZf7q?D*+uT09r{Rb9LAUc@j7lG-f=U7jXw69?22iRQ~SOXvv0#~zQxS}q{P zvzOl(;mcF4!=6B&ap5?<0~USPzo3E)Bv+qD+}kW|(&t-Vwp}oO#5!+@{S8TAx%nvH z?E93LVx>oCOMcvzVK3A&<`Ly+#PbkQQxV*}s4wu~t7v7v(af*jMKT%5Hg4pjn#Ry+ zf?g%$Y##n@0=X^}3o6l)Pfl+oETS(rncqY3XoNKz>46x)YYeJReh(E|BA;MAQ2kQC zwhOMEN|(k}&6IzoXC#;Kb^uM5sq69sP(;LRPmw>iXBrpVAXORBX1I>AFBz#sF@` z;3(fbBYE(KgV~c1r-$sLi9*JvVSzb;mjj%FU&=u>V>6u1gr+}Q#L}rlVX^sk1*uES zRc=b-EAFJxQPZ%nS5+KSV~*Oge+i<1K)#j}C}Mhqea^a181F5(@uwWQWNO|#FZZG6 z6Jz|52B!k@q)dEr53FE>p5#8X5?G_fmYXrrdzkng%w0LA>XmI44Zalo9_2;&G^#XZ z!>XBI@@#{aEiu^#h70Nop7%C9*T-hAj2d1rm?g~ri zraW5(ttA;O;nACrZy4}$g7a8Jo{PzIR%tPx(PP8*omq!meZ-03hnTN{+$p^tOJ($e zQ`HPJK0`n98Bqy@G|wD8V6J2V@mHY)Fv?B80;$YG=@rd0)x;QR7^yw;$y4%Rf&}sp zdZKx471i7ue>tT{NWqNnoQ@r>Yc20j5FxX)&g1IJ3I3jAuM!|(YY1#t60F$cW37X3 z*XVXdkyMlzsxP<@-j<$?1S+>|(`FvC89I~z3WD~o`3fz4PD3uch3Jc;;TQR4M@bgV zQf|9ofh*NqUBOOot=OmdK+&Z69@I(t(YL2Q!9t_d{7Mv+d5oFL#hv#XDw4_#L&;g< z-B50cuo&f06$yLFVSP?Vh1>$EV5T?ff)60%~Yl1B%d;tjr_|m<$`#?_1A9V8f@IVdt8H95(Sy6k6F*!*{ zwx?TuoK^SWUVzR`f2Qt#U0tox7)W_vUAiNR;F`DzB}_2G!v-hL;XZ7N*RsjTI5x48 zCEb=a3KdfkwfBrf5$%vGmo>tEqAsyWbAV3RB`SlpQDA36t$Grki_%AfE2ICLhmb2T zHrH^1Od!v+mog(BqtoKq)AA-(NUZnmmn@OM zTk=TN!GwpqV!h&9iixaB;}ObcJ$9N>-#eZ$!9+4_6)iOE1%?&HSV@_sYr^kVup&$w z^X_OzyOClWH_JrZzO!7R&x2v{NiYEeK#B}e_q8aR+mgK2qI#oQSqX3G)E}v6of5np zAuQ{^0vXFe{@KI|6PtlDW}j!sdL1d22<}KgTfhRH9i$;zj=&Pt%|W0F^b=D3`c1c0 zfbQilK1m>phi~t2-dYzYZ&v-{9PN#@MmSA{Nxl1YArB~__}KV?4Q-IKMOBaLGCwnU zzc;7mxOK%isojzr(w(yne~x}JB0OI_irvP{kK&=du99gB!V7k5y;8Dk_@lM_f@F@RWy^?NbjIu6^uWf(-=4G(>Duum@||F;AQ!| zc{pFLKcN%q8_x|K+`GW}_eX;=!u(R#myCYNv|-^kyOQ3_oNAeU$T+dHcKt`Wv3>AA zV3$!u(XfL7x_OlZE4GB;|YsfOxN46NUU-=AZN5HGoAk;a+N)^gu6YM zUrDPIPFe6^+TsMcz0ATJZumZ)<3vvCPifk(^kWQX&KSb z%^9|d>);({{r90hv(5Fc?P19Nt*FCbU6P{-p*%-r*$AdOHy`M=2LOJ15+IJQY^@(D zvtE`t1SBB(zzHene4{&jyJos%G}`Ngi!X>Wwx z?Z|pfvc;v`yyt&(?H;|yM~nZgg4}YeZT~2ev7Q?S!kO%e^%pyD9u6f7>}#-tA{h-n z&3`V#Vqirs$OY{2|A1!wQP&3=Nh!#G&`AC&RbKT1PgwbPl=F`V2=xi#j$HXa9)a=T zowVD>qwEZFD& z%`rY8nhE@p{{Z^_e>@xtwqFST-~#*_kzarO|9WVCjl!=#vQ8wYSaoj{1yYF$51C(n%fbmH*>vz_S&p=j?|GV`3 z50KPug9v%Ok*_ZQTGWdul_xNQfSR^#awnM!XdWgc#={nHCcr}2rWlYFZS_UY77-Ynt!xbV)P){kAfy08g1+lm> zC)$?I%MTTdOLV)V-YnCa%kUpP3VR^$Z7a2z;bM}?gIs?Z&`jyd|sNLeE;c}`_(@~^kla4D$)bX z)&STr{G>n|>f^mvdWUi~qJYywY~R3JahV{OTWV@4hTFzsma};oQms9?V3s<=>h{y84kukajKqgIzwJK{P;IxK8vOkh(TT|SNx}9ls!}w3C zonNjGxx%s-A?aFm9}s#>tv6!;iZW*v?14jvJtCcpp%bpf zPB_%V^2qo0GboCb|zgEbKPmkkf4N+0@*L#&;ZR z`&)GVa}cfu$w6kHWo(#BI#;!G4$^GKT-)e~l0Jaq5#kqE)@c7I#m<$%#cvAelx?n@ z4`F7Qd8cX5M~+WR^Zw&@dA^g|YJIKV(82OcGYWDF;5jH8e65BU)Nwc^$o`yD{86`% zwL^{pW<}|00X{fFG2lXZ5xy0DpbQR$BKzdNjNP&D=4?8jAYvATee%A_D<`vxSv4!(7HbduT(*x=i%*|qYZBBf{ z{7&vrq%#(%8W{^YG7w;|TWFqy!TyMdX%|T<#Az=7#A~_exiE;uZ}19q61p(vfw(E1d(4u2bk}yxe%-3^NPTK6vnz_6mjEWHd{+P(ig!FG+ zjv9xh=FJt)ssIaYCEarJtL4;5o^OzpRGe(qg!kC$AN;0(0JQ8j%PqI~_f$wz{#Uu!E_8cVfi5TR@xk zWZbp$(p)%C$>P^5V!O7Ns@OWv^UM{GA3|7p_ZAYPbPp+RWfxt6cxt9zT0e^Tp&VWa zI$Y#vqlarxKDbY#e_G<)&@d!U^atSojn|TK> zJc@YW`*Z~_^J~EC_upS^ZRecTU{t9W7jpdlFfQUoOnyJ6emfCc0fU;q9$fLCuR=qf zGfzQbalM-i3jh zA#Xg1za@-_?A;@ha^x5dbR4Lx=+sHGYdsxdJW@v90M5Bxzss*^e~?@rKJ4^~u~+fMF&Xfga$~>l%=bK@=(uy!#ZwsH_zsD6x#G#@t^E6~A(g9dUIZ(%%5$v7(2hv4 zm}C%cCcgh7b}rz`gt58hkR#h@h$v@~w`SWZT!(D0Ir^JGy3Xb^_dur9)n7bs0O8L{ zZ8OYQ6?=Ytbc8v75BYI03H>XO(2wHid{RJ>%DPH28M6gHn~jo13rb_$TIcdYnO;oQ z5qP7J!B};`ec@G(_$fwM!Zed~oZ(QedY<#<6-dd86BvwKd^Yws?{=f|f_DtjtUbOv z`OKFvnr1I4#a~+vHu{*+7#u{9S|;UL6g0DwwOrox zKqNZs6~)b-T~DGM#v;$CVK!e5nF$<6?H``s3$wUm{M;OIhdhd1v-b*C2U|Q3J99)4dB-}_!Y?&Hved&_oN~tDsdwQJH>vMJcan}rbh6292ZGB->WYMVQ#K{e(rFP)z z%Z|Q@1WfS%6BcKO2yI$eDKK%s>7I+V;?4rS@TG|#t)eeRl>N-U9OID7a$G}^1)uZB z^m4%XwV%iF2g~I13<2joV~9=TL!jW^Cqlv&?2S1LVaBOGE|(HGCC`hu2_9xWy5`_D zHuml28W=82pNDebSDu1NYusXn>mtOsswP0S*?3KFQQBOTIcg1O4_=Z+xykbvqNSuKs@h zJTwg_@SIXCwU^7{4Ow0!siGW~E*0^G7TPOi?vz)a=u%pTJ)59PNKH+pHMZ)~9QLpl zZQyeZ;hs1R!#OF} zwBh#Er7>D)zh98L9gFPZ2ie>8P;2pFgh5f86D*{$4z16`M$K=QdHC$4#PmaQnC@PX z6WTm$AFu!sOkRt5RkQKxRsj6hoMkCkkMY~duUanoFkpg5LJI|b8u(`#iTNW5DLI zaQr0c=*^C}(Y)K4@>yoPFnYDv(8Ooef;0H^4kgmd7}Xev{p4LF^8s2p zo_&Jnbxk}-rbT^|85c`s-Vz-F44YCe z)r`bE3EHK^4X1)v%Jt=@F@4!n4y=m>spT!1snLDC8w5WXy=flRIlJ;9{)E_)OmyoIWT~yufO1gc@L8Fe>1lnKCq$xsWmXxKBTjVZP9_jG0)r_zL&VtKu;< zMW*G6`})Uyj!vmo(oG^5X@AdVrf{qL2a_DbV>!bZMhOwikmV4;ewuP|;G`b^*{5H^`^%l6?(Lzk19>wR@@E^hRXRvOaVVOI$vmzF~Gpg)2iQJO`_e{&`yNT?cBT%8wBoHF1(?xTm zp)|K!wS0?ZSoG;|*to)XfxS?|VT+fp(~MnrdXkNz5WR{^E84IqGzrqo&|ph46iyHP{{A(ps)D}n;%X#U}d`Yq~)ORQTewvd(O%s#br-jvijyhYp+j_ zZ11(+4LC$NoBpwku&gJ)(#HBdJ`HM-@`8aiLcDWnk9(Hz@x-Dw5D!x&Rp8%@!KUCAkbP*($6BLPC*b$aNzcEHvj#C|r(vT1*8&^%}6B5pfn6>jXr@ zBDpO|qb-nch1CR+1VsiqTQQY0DTGPPL<&=ga~i0d2--6XQ7I9-n~w&i1`q@y15u5) zC>rfSpGZ{~h1)yige`vD36XTup{tSSrb*}G9icMNS6mUX$jGSo6`|9iJ}kww623g& z7&|Viv6drM3cgu}GA6f%Jt6RH9zP&cEgT6bZ^pr?+Cs=!eTCzEe^TsPVz1tDX_n)t z2*)xcQ^$Ka*46t|NXIp)in4d(i@AP`kWe!NYO(%F-R;w}2s~vqR)YdK!5o4ccS{0`L zxU_IM>EqTTW>8KNJgX?e5F{CUewcWzKK6ap5rhBnrs~?@oLDtpyAtE$Y?ppAwu@@D zCW&-71zblgDn)JLcG;1}f<#J_9f4F^&Kr{rceG+V$~hn@(BLk{c-_sgUk4ACwS^;z z3iGVr>y#oO6SBZGMN!?4wF{Oc^l1NqW{qh+KG>cCoQ)_@q!a!uM?UqG(+j%qWcI8l zRgiVbd{Ak4@-(tG{9ABOgY;VeB7rjF!|UQ~C`ml6t4js0nRj;-TWWf&Sw9%!waT{R z=2}C%ST^MQb_7bLv2|{$mWMQ|tzt~U5DGfdaICW*Z899oB2**CzlyU-$QT!cc8>IKb&@-HwpgR0*I!bEq6BBg;S85}L3UhMTQoX18kSWZ<_ zArHvldg7d2swLbG*7v#UcG|~v<2{L^k7H#V6*MT0VrgR=Nf#2g<-Dt^gk(0JdxW9` z4)T2TbKF|S+*M3W-Zn_O&6>E}uNT2(aM>1PDo>Ms5QV-=u4Izzfu@L$c|X{2?t-3v zYS7O0n+~PwlG3w0D;>6UFO?F#nDA&>4Q-jJgN{Qo6{WcjciJ=S=^W8>C~bjPxGWXw z6i|V4gs9>>I3xjdCAuv^yk5SpWh9YUKkumvtaypCT9$TI{P{S!5{tD&FfL!}uLLJp zj5r^Od`TOjrtuFYcL+B!9Nbaotfh#$Bf z)(gc6@)U<#L#ShzQ=VN4A~J@Io~!!ps&YV`gBPSwz++jir=dq;;&Iv={E7!uAb}Fx zN4k<`{wKSN*z#9PPpTKP)v4{9CG~SMB|-rAsr8mzJ#;v!Bs}0cj;!yZAhH% z=#D&((K|=jr zy}EHEspxf^pc{xWIvVP`=XX>{$3uekt-80E#8H=Uc#%=3T4^y2D@1pl1xLkd28;X1> zU>yv9S|W68^_2jtL)^~K0yiFf*f=tdvKg^J&l_meLn(G!(ntAQ#ktzJE96*So!b34 z;Y>G2@Hf>bpsx+dr?*JHRWYSfR`Gc`{%Jw*;Pu6L0!DIBPi{)_xJO;i+ zwobhr*xK@9#CX%3Y5hm@DHVH#ur6S5q(`1bV0y!haq-*$y{#pROqLNAT2oQT{J^G~ zHDBTjX_d!u)n!Mz>#2~-ScaDgOw&t9hLj-}^?Amqa>%xDT7uT0d{Ayf!KtB$r_A9f zwDdUg4spZ_z)vmE9&Pd>Myxh*K)7RtB8l0f-aW4gc+9IODQ5M80pxhL?+C|*SlmWh z-EA62bh2qB*tmwg)u!vETam;UiI`VE@r5&$FjZj5wYU?74|5l0#uFflam&aQ0<1F) zi&+dz%*rIG;&2Fqy)WH#)*DZ($DM<^swPJvzQL2=AtSG6IaWd;HklPs5`+)KV669K zteWLSIwq^X7#{qH+q+ zJ0@>jTtYl%KA^RWkDtF(ydZ7{Z_;_9`=UtQIM#g!pAT-Hlw_0|010*omYicihDySS zC&XnYk%9vJ0^OdncnCJ7yLvHhL4myob|hTOuFFbA%4CvkNJ`ttYmXw+Hm6(jMILGn z;LURH!WUyNErbhND4{nUg03$d&ic6Be^{aVbcJ=XKriB z_qU^f>gHo__NxqDF=kp@VPwPyA)rMt^8^dtQ}XHW5z!41qH7-)uP&0^RrnHg{vK2+ zl%|4cDd2u%r>fPytE3J5J>I_C_wT1Mej(X%#seRA5fd#!0(feVrTptAwqILA4ySio z?vVJ{)5a=gl!tQbzb2^I{j5Ay|2?KfozAK3t~b!Y#b@xWPH%zeRfWdrlskcrI8$0_ zeo6Fx0sRxCF8LPDFh0RGD*9@g1YB&P2oIjBVXJO@7=niAyKKFn6M=+Eq2!|r$;O6l zb4KoEKk}K@daEKLL?Dy2= zp|z}_cmKnxLO1@KT-j>wR_Cvq(dQYVBZr=4qjNDCU$2h$pN^OhX!7zc-ji zWC?kE59q`!5@`k!6pC^x^kFP-u}C812Z-A<%Max};tps)7)m}&@Xcq7UR{=(sa!?B zxFQ5M7sYDCT5B#xC{Gv^9I(=uMP*=P!dvz{P%_YY>GMkiy{-{*!H_w+S^N$P!CrVW z+)`%}p6xtU|CM4cYL;3pkR?TJo@i5%S7BUA_dEPO{DytRsqXs`?THn;smiZGe{cbq zo1xoD*KqQfd34niJD*h~7yAgv#hG3tzo!161yu5sqL;{9~&YPTWl1PUlNX zVSxp5fBu%;)Z`xaDOXl9gLbi-XW7c;nFfmlDM4NN}}MlomX0lNGwm70#f>Y;Cg=N$iIF;x_orA^>A?<|#Y^o)+Hu6!K- zm`nHED-ofiMP-?Ew1gikIXh86&8!D^1y?KAaHhn3{kU^k($kA>RyAtR1CNVhwlvO~ z8!St>Mje8><|H?>Jp9Ae!%W1Sb{fP(HD(hWJ5EV-mA$*pYxI%fa&14YMQP6mGF0P< z$soAtgoO&7W_fs|My=`HaNcyxwpFpawG!niOQ6XEDM>82UwELnju_g+%1Y-NuvWM^ z*j=Y2taXO0n3(FBhF=t4uf7(`J@fhP(%UclcE6n=Kl4`Eh1u**sigJb*eSDUGnCom z?8i)zX00ESj`;R{LBuGzgIhyGMW0sHHy{kEb7r{X>z?9aegV->1mKI%#gIs4OYUy`EYJ(Rjuf$ z#)I!KUvu#AIfjnQ5(aJrIOl7tHI3kZXQmn4-PM-hx)$rsWf@CTr4~;se>3E+`B4$R zZqP3LB=+F^6ScAdcsg7+QA|M*=BN|%C>4LZfb66!%NhW*8Q0Cru!@@e+Eq%beC(KK zSx<6fH>r(We#};K6W2>Fol}fyEplk>7~!$HanqHdjq~V1w0-Ezm9t~XZR4~YTf&Pe z&WEfl1TzZ~gnX9`qPtDsvs{Yfp18tn^UP7rs$Z5ed*qf!k;?q{aXp@^FR5j#(7MlX%{eA)SjzOEz>zi7jf#gg4#8v6Pe^f{Yq4=PEQ*POib zKYDlh_HO=m-m<)h!EybQVNROPpT#UJ>s&!At%o$HZGGkenfTa38 zJ7|Mc5Igt7AKZB_6#F@g8o@gVCl?t!A-BC|lZvLW`ZPtKMGp!$}2iu}IiWM$y4!5Ce&{aviiCbdIPWdiAy~ z&6Iigx@}I;H^vpH#A-V`BD`YlzniPdBw8A*r9thveDp-NM+733UF;O^-eGVxdKQfm zYEPZ9O;VLPzF8v^y)Yie75|u{4K=H;OF>l|F>dSE6(PQ5x@Ew~&fYKbaVa?ou|-{7 z?ABfuYY=_|?bPCZ47xn*3#oFvdo&xiytD4N|3PulmBfvrnthIOS*G{`-8+J7Mu{){ z=NrXyqrbCi+i09wkOaniRWum>=<%c~()4bu?x_<}f2o-zA^rG#YfF_9(@QDohtXG< ztJ(BZ*46Z$NGGWpHH+mS7C)DuW!pzEm+0>~-B2rJU-JRQ(z$Wr^9#4G7MV$^i|SaB z?QIsNw7lPcljVKokoR{GQ6*z!1x{uuq+}5l%Iy?@u-mJW)sSq z_ts{sKklf<%>{o4o1utXWVJZr4z9!yR_5U%lxENK<*BFeX}WCah$sr7HK|%SdS#RC z;OBK)X`LHP%+D&K8ri1hn@O8g{%EbTf%1e}?a?#dNA3-tS=JT9CUezhLh-div z{L5J~goW*Dw^-UbrXBX>Yx6ujimlOB5k5AWTxs?-8{O+^Z|pD-pxC+$v|`3r*q_ z&y=XQ=rtlr=e;J=t#eFT=i>R}wP(%mlfGveu8Xj>Ao+<8^ic`s(lmH7c(1)etn9=a z7lOO%-&(T zR;w|FzOaFj4WNZ;vX+$JM94 zHgH6ArJ~vsf{qK3k9M-Q+c%*~6>>+epSr)AxQWl(JVyysKNFyS%TKIiG!!;ofU2Q# zDSTwZ$aT(O+kmk$Oy&A*$>_L@2m+~U^-tN;t8o4v_Mw0-oM~N~idH^#nd+{-lAaGe zI5~Qa;;%hJq~@EeY{Xx9bue(1QyAENJXyH)gui;4=#%TE+k7wh=gfvO(COmBqNAU1 z0tvL^PU0g_N~YQ!(wWBC??FKe1KNPOsUM|s==y?cd5h627dxMlvO{)F32_S`FoHC;3*kzfDT**Z&jE67Wxe#%^Vm8i zaTS+3<+&wXMUyh}RY+S#6WEhY^lbAu(@-mUzA(iu1?wdBLiB~|wRxK)6MJ3UT@J&w zJVe0{G7#nzdUD@J_^NAp3Z18t=+-@%1#4?qi#wx&UtU%52I+-7x6opFwl zle@_)&kI*t`|cAFNgZ&J#%79A9DP20HGG#f#j^Gu*-EEr@p&A*o7m+8))E~OKjOQ# zNRU_0!e^dW-^q4`b%e>G<$KiqvXswy;@+AlSoPj7BoB_FN(N21{ zVa}%#+=*cisFsATnqAdh>yK;0PrlFdk&V2Fbsc-@o!8PU@2Z`PQK~GC;mKLQ!D3Ui z$ml;R4X*pfwu9`|IEvB5JF^$K$^#t{Z-<8cvcJBwG==G02r7=D#Tn9b#d-LvB=-9$ z`umGoMm32BBpt%b5X`4(j3c2 z-9eN_~RA?D4==ahJk#D<|Pr6|W+?I^T3&B*aw}T9k;foBjn<{*G7v{*ox-M)$K=BSrvX z{Fb@SH^o+1C<%cfk7Me*!eFxU74N!uF)vjOW&L=XC#)5?TA8!J!S6*#|99}QX(G*^*vqcfWO3aL~{BZdqdndL6JDYAdM7`o~9#S51m$l~SfcUa_3SJ_^ zQQL_7fX(9)ik4=_Yq&}-5ABqt<}KbADL9cl;@^dz!f9B}oDZJ%akO2zH^lqd@+`!L z?$LjoGf>9J2mlLV6uZc*o`4q@pAv?yFNf92vPs{yDpz2xh_V$Aij5vM70W{cuWLy9K9#Cny^iSTUH{*i!EFYjNh1z(Z0FB=sY~>YD zg`~gfIwL$f|8LEL6G7=*7oaHifi+HmK8Jcc}+W?r%&rSpyBDpba`!4DjFv zL@2>1qW|wve2y7Kl}7UN(}6oLZ@wCU->P(=%ewk7{AJ1ei&r15q*`IS7F(TK!hmoS zFbN?M_;J6IkH6kJKmSd(sJ|oE89SDw4(esI`xJTpGPye=;nYK>;3XH|}l#IUDezCH_Ll`}#bUG)t?_=Uyw z9RKk5mKwY^a~V+Oe5yqUDagiCeq=Fyto!3DFqpeM2~6swy!O|!@b3K6Ex9xcc9y29 z%;NQ|gda205&Y4ZqcuQK2UQQaj;z(V`%9lVKMVfT#hnOR{m8_5VK%l8usPQ-3b5-+ zg<(inhtZF7_h8Jq4u*mW)yR_*jf1^?6tEPHw~d!jtOQy zIoj7A@~b*7{|Ew>cA{8ZxE8jaB=Ucp(YG*X^aBltI>71taBSLa(V2WH;VH8V799hQ z^#thklp~FqTgd;I+qamxbqC^^5g~FL95v>Hj>9=BF1tn@L&$2E%z4!S=k|~lN z>mOYjhKF+{^(2bt?#Vh@I~(GbYX-xQMBe&y6wR_C7?${HqW`abfE3gj)v)d3BB+mM zlqgZ!6Xc5XLCpNHk(nsNZq{?wKN1162l-R=`_~2Ws|2HF4Bqpg>|8Dl9lubEB_uva z+YC|)X@8MIgHv@(PA|fHEt-K2h{?h*9kP~2fDexpV~|p*Jf5=yu))(egzUZ1zS&Gf zlWX{-qMP%fedq~;@>oU76SUL!H&9pJ9EX$^p$Xff8qof!K!iZE-eWPR5_AqSw(eYx z_$`P1Yd|J@84rZ?px*Xd8me=wZFDL>C^!4?`ye-mb~Xc0zk~sS6BmbOI#npMpGPFE zAmV4aGsO$)7VA3rxJLgDXeuav%|4Wju_F&haa=dYj|)M>LV8Dg>Kttb1?eU|0;(4? zbNME^4)Ab=SM#-D32YY;WxD-a|24PbfH-0;KCUO0i=)+f=5*;=tP|8r%4-J&7^a02 zvG<|QprxKa<{&m2b0K-CxUosdvX3E;IWEwmq$=Ch$e(EK{vc~8w5G#J_Kpm&zLQY4 zSq)5!+kl-T4d{$yfZ!0%KDAj@HeLzkou#deFxlCiTkgd0^ZqTo93-%@AeJ@$J%hrr zJqWoxBN2Qd*mQsG>kNQ?qWw+|**mZ9$vx**5S#e$a5=dc7qb`fnLI2aFI;(%dC6z7 zFR%R;6g&26g#>W)TpX`%1tN@VppcuuUh;b%sl zjfSxC8Olb`wcwsC`ihDqK{YrGl|e|C?|*i>Br1r*GKWXTkUAc6hw@4EOw85q&lkUb za7WC;X<|TkuR)HwJN|&AE@)AYR210C*ehKLG7Pp4-f6;i2GYp(OLR2msB66E5442x z70ATd7~3S_*uK68heH28p!Kv|SFq_uu=}WgW_))#;pV~cW#x@M8yU4P{;6L{7t+iWf2SBeX-j+i~Zaj@P{LXGo_>X(nJ0r z!D~M;F!EpMN=raV9X8)3cZI!_ip~L|uS2qfLf*QHu!r#EpjaPhxFPG7XFV4F|6}Ye z!{XYuZBg8VyE{QEKyY_=_dr3A-~@t8fKa#w2?-wDgL|;T39f!*&M54cx5mgmo<&^WZynh(7b`2R68gf49VV+~L&I z#CFs(T?f0GWU>h#k8i&vihj*j1vx{d$kQ&{%ZOt%Jhr+Qb&c1s$7`wYV z)*TiOlg|_)U~yqS9Hv9LPIjw+{a%Lh+!?jk!Wk$^`v+ocfz7!TzIHmU51!BLVqyu9 z*=h-k^@a_C96RXgzkf;P30}5j>D^CtG53@2eT5?4r(i|=Z=3UIair+?Fxs1HDB^X; z)Wc3}0W~Hv(*jR5Ky0K{Wf5`UUDrU2TDki)y#F`GxJCFBv&Na#e5FMZoDY_pp?P4j zIiISV;G?b_EXkPJpvf-w)I<9FK;n>JUEXn?fpLNKgg854B_Kan;XGOg32e#TF=U4y zRNYiA57e}_dw@T%!U74r-`aHPI^(|sK#Gd+0)+!lQRn0e^hciO6D14NJ`iUq9^_l2 zigTa@Qv=|d zyn1&!sb%8y#jibV4w$@)y8;!TCsXnbp)}W z;Nf^@)Hpk!qaTu43TH*~+30BO16zd5q)SU_*c50F!@Y{d@@KqNCZtbTHQVCZIF|dQ z>A`EZL1{C(HranUo}WrAMc^fWDmD!b3`hVaw8|I2c`4rIpmD1gk;piX4OZ;3akR%; z^fXNxcasy|P3h?{f4V{cTAuy$@j;roNl)E41r~7l;sn0s2aE*pr6TtmR?RisrgZdr zHd4$o4D};QF&6A>?VA}(f(F2(yx`FF z@IUTu@liT}PMsI<*~er0>?}!&F~`f3`fWsz^#Z6FQ-L$b*rkVH4Dc}kiVrCP=0KCc zNaTe7zv@=JNaLx?!&YirYW0Bvv%rawhwl;5$FoqnD~7&2P3i+WKK4e`(KK!*Re_Bp z{E$q)|Mc6(sUidF7<3{I<>Wwp7~I=fzX2F!S(QFfuD3B{d>j791RQ!KGcoP1@5T=Ly>rT#Q#y#V@Z{Xf#B*i zmLp?JjUma=h9L{R+?xS0V8r`W{=MJ)Pgw82|D(x|w?x~Ib9KcdPyE0}AW+#Cs0P4FqU*o&(`=>0*wIS|N zWd%_P;?q)1I)hJH##0mKR292F4=7idb}!f)S3+~;&-2x-_PSo^kp{I6YW2XYwf z&h;}e%x+^x^~L$?ziv)uK)kna^)uQy8CVPK5-|gW6~@wrfXOb4AHX%EfUuvg`QlWh z{vmj=0DnK{*T169ROCo`TU)w;wA8=hjPFjSzh_U@ypqy0 ztA^bQfmxtNrg?bziUCtYxkH6nSrZ+z9Y@kJ!v2@nF(;C!F~+(R!t$Hue|<^qNr-3T ztYQE9JTHV-V?Dt4BLuPidk(_B|Bqq`z2pClwcDVJgAhzn{^$4jpFb(q{YR_^z-Row zSdTw^1`?oNAbckI|9eCL^~qU{)4}oY%mTak#6?bw*Y!|KyLrnX5zj#y%FR* z1gv_>r=;83P_;Y*)<-ZSlT8{C7z7}KkPmU*4CxEbIW)=|I_H)Jg#RdIda2pj7i)#q1 z1D0qAutYy_=*B(Zvm5U*bP=^#Zj26oQ)uzRJ`2W&} zW-?N;=^aPC!cS0w<9C-JIk~LLV03_&l)z zqV-S?hWG8<#?6d3wNl$93wf7&IdPzu2)oC>DeyazWB%Nuo~yO&J3tW{1qgPjfrpF_ z*d@ePfuZ?N!PwmZ=kSDCvKb+q^#A&=r_dRQ(y|y48yZ1`sE^_VLCo4cVy2DrtLFcA z9Z%g`3~hWB7>j;6>!+9#WdOc5xLtVwCg|y@ZqKsB0AP=Qzh(lLIm_Yi)8NS5Ts*C< zRvibFLU)1+yUMJA4dAg2qYQcK-^xxA@T^%IU1WTu5H6hCwOH z!V(r8B@xV$>$LpPTjuiS|JG0ZpnsvR@e=lV=OK_55jpC2;Km6=*#LkB9WKdiz0>13m$M*T0|dtR-`twql)MHQCB7REyK38t!E7F*bALyM=yPV1qz_%+P3j z>&MRv0M@Qe*qwv#-7B7%%8&lD(j7&GYnA|a4qF#Nz_A0o*x=%Fvr_;C9GRYqz^L39 zK^EC4;&{RuU|Zl5q4qdfoHGC*TmVxJj_wh!z6w5)gmsu=@vs{c_OP81jSm<$s)JlK z9}+enjL~>s9uo2SALmbXn@UekPs{l^lrqBX?M`C{4q8~TMHUx&g~61@KnR>(!M)NW)ZOPNO^gZY$2smaav?K)Zr*kHPpnhkyEStO^CYm zu|+i4JQSO*1$LbTDlV9lG=>GOG(lCY15mq3Bs8*tW7#deB|jjAtKzC+y{ zV{NdqO$vD9Lz&BqLt!QE1s;z7wsp@ogbBC)(AvgtbXhp6@v&3&FOT6Iasr zQ$U{1#su>!>uD>N2DakfSJaL72a|$LzZ>;_S2}#NnejNMtH6_t&%GmMinP+|1=d=0lD$aZDP@#oNk+t z^^?}o(Gk8so8a`lITm({)V=k9mh?$Rp94?~ zwvNxO$gx%m4xeu&8N<$ydDRV$tD%1@eVoP0W`v90k6Hs96;%8p=%rT@8FKJt4GuN_WfOPrs;d0Gd?ABlru#e&dTx2GZ@-ivOEnDS{^zBXEhIx*GKyH!Y z$o)9Kvr)t0n{ok7qPc<9_)h<5vv5Pw*Z%))a}9b14Jramb1`{RE z%COKG&5ExoWPfURVfqtsPe3mV1$+V~a=NA1u@V+PTZ+Il%O}K@RJ1kOlblM##VTti z^IUg1bC5qRiz{c8jthtR-VuVYg|kKOO}#XUhIR9t9t&=<{LZ^c`c1AfrKJXI(~)In zI_{HGr8GycZgi*07_Ta~jig{0Yu#(jsY{o4Dcnl}$`v^}b#UCLa9C5I#dgGeN#^vqKID-L+ zq`yY&p?9MMS={SVciP@{SJn-YcZpUG?_YpRBf^XKpR%1a@AT;mj0`3!1t*;>*=Ecd zVYy=f{26-LcG-G0Ss?nc^Ti)+`K6lwNn*pv0PA2kjq8}v>zlkoAZm-F?c`%c(u`fJ z`=-_bx-dWB*mwS z^Vii%_2rz-&Q`)F>1IqBPFC(Zny+=s49_vI^{9?F2bE}x_jK`mYfHqED`;RRsFZ(^ ze(RXug%p!w2IF+Idm2bn2-!_*`g+~|1aJXq3kS&iybzgE^Ctrl&F=(+GDZeNsJ1ZS zvi$J#d6fqez08!ceO&Sq20OMGt_yKKFCuGAH6eLPB`?sHtWr#pd$VP}c#z;h$2k1N zIU*49UJ#;)v%xT_Wqh7bM5J-i3pg(^lL6@Z34ZDm{6jTDr0PIRvgP=dCtpU@6KSKk z;0W73;lhPhpUboK;};z3J)e0e{|7R>6b*Y&w%9c$b4FpJ1X^gIdc4~bQxp6F@Zp+_ zaezfv^rH~cU_iR`Ls`jsz|@pYFU~SxRfBsRrkYPQ+V;A|krZBq=+7&G))qSz;i%a4 z;hECrHo!b7l)DMHoQU_qGh*eknF_}sNSVurRjS$24UAlw)q6|#U%=#zQX%{1UNyj%gP6kLy!!d2h}T>Vba(I6ni zmEKMg3l%~yrY~(T)I?Xe|bW`pqEvfn#l;B-6&cBCeISjhOu zC;5B8t_4I1m>peh^0kvZB`PO29{{F(iSzjJC@z;kMkJ5HsRYK-+X)q0|ESFK#0%nr6`)xa{<(sCnMqdV9pOVL9 zQ1GhM_oB$J6|GhC74@%qpqGS>EgA$B1ySuz(hh8q^B+r0LW-*Ao#X0~WhN`C9!e@$ zo0ZlBure-(9KUWBsR9~do@KiXN8};Xnx5aj9dC_=xGKd!+*124yRUnNo zxg^oCQtb11e_7DYq_{1Su8$H0a5d3S6B!$|1}^U*tny@M&yMAy#QWr`>nD(t7k*ps zGk%~3V+TP9_}1ye)8&76r*8u$#XUfD3CWW$g_g)>eESa#XV(gLQ=@;n*q{Ik`0CY^ zW>7l;R*W-~>*WR(7P@JmBxyEYYl?fC(pr4b1NFW3$-Pr+sP5ee)mA#P&s*Lzb~7zg zz38C)$Ujxrl58b01z=FKBazJ3fz~;i4546={@AZPrrK!l;T_lKQYda85+47ZxgQogK^38lA1YQolA=7*0gHs`DEqH-EFNu&C#gvr3YHexm*iAnyzc9&|W(H z8-l#qXMBrsC;~Xv4f~RH5(5&h60`B&KZg?J9A)?%D4=ub28j4vDBnw*RF&gYAl8%j zi6?pV3CMR)-EYhFt0epHppR>mcj!-=%M8C)O-1OFS#$x!$71r+=4|K&Zw#bp4yn;~ zGTn(+{9KLx@}8k=FDpl)iMQHUR)4 zxi2m$XKDYHjfJ8xU%=tF^Sb+81<2IwzaC7qPY2#H)ahqp<0FS@izoYFmGBPK&SbCE zMA?Ki4CBOY=Eu2Sa$p5unq;{3F=em?qT9*)bXePb`tz#fakqY??T1E@aF4??I$G(6 zzcK)f&rCkL8$<--Rsj)Y~>G}{G1@*u8q{ce?@4mQVBB>#~LGitl%OBM{b`ojB18w0>yjajm@yZv4%=Bom0(gL*zC;4V?KRO*Bo(Tog>ER^ zqLyrZxxVeZ%yI(>XSzhMVjWW{0UJdS-<5FT32>$WBr^q)6gGZ)PsR%ao*HoRNI{-} z`Dp%roOc5%m>s1*?3`jcxHM6p2w3gy%5xB!?aIa6fVOYbEE&|63jn2?fJnVUq>h;u zOi4`rd;?B7J?>)!Ac3Q|wpgs`iH2ttE4{h82j+l!G~_5gQVPc5tTW!bVSuwK^9rls zwUFodmA=dnEdTTJ@B;I^&+~nXa3jo%9%BRUa_>&ufaJo%v@0pjbyo}ZZmkEAM|MfY zyrf<8_+;x+oq&dd&Hcji`AL_XA$FouPTs}xH5tdvQ#z$``H>H|CjxIU1UY8#bP864 zr_4Aie0?66=1Qo}%bEaDi=Q4vw8S}n8{=~Fpjtp**j3DSIA+zV`_!Ht;F$u{4%B>% zly{!ao3Qa=wrq;eg)vwI*B7fz7ZquEE`jD`Pb-REn5epQCil#L>%7!|(t zor8M;xb47A=WF6A?IlAOs#r`RdaIDpVaRbxRFprukX%J$8F;rd#-#)2k$~^#OD@X$ zo_-BIcPDLjAK|Zvrd2KF_OPiIXyqCSu2wrwehF3bGkpFitkblMZ)ip#nb1$N@jTQ} ziCKxaRpk7YA_*(9LJk~hDhND$G^!STCvqwRLJLVu1 zl6%j=!A}tz6n<2|qS;|U6c zbO{8!AUlX&A%FQ04sF82tZFsZCQ`V30xoXO^NAO_5dfFP!t_kzvot_j1^E3l#r}l0 zcG)^R$%202jhE4AFi^-NWL#7X3aT&AR7wYi_f5Q;3huU(_t&VPkw{K-jx)ZSww9uJ z#ud4Y{d&*UeYpR{1O8^HC6kv=)EChcLDCWwh22fJH?zC}Q4-x>7hT*j+z6`VjGkhh zn{Vu%!w;)0&t=T4y%Wv5H`>~MG(^JEDpoN4+NVrBV zy=KOo&cASg`wso&Il!jR~Wou-?2&qu382bnD?dXjU;QIW7oAA;`Q3{Tg>CTn4e$fK66Lp+} zDg8vOk9{AH`MHG(J;nOun~GN5^29`a+QI3MAt6=k-MXTtJN90Z^}fp2oO|=-Vw+|A z&-xV{22Gq~o^LvA5Qav*Gr67S>HXk1`;47Hr+ua2gmY`naaQlaNV>9uxuWEsLY{h> z`?`w}tHplp`zMDxU14#Yz@{SRA8i1!69f>+cYDM(>GJKmLbc(V=@&bSv(Iw0 z9bKy)4}tMkD=weKv@ZpScULda6+fin22NItJjN@Q4{a#U2ExKm3n7=r(H!aLR(f=? zVBsDCNv4rFbh7mI#-&HphqI%C7yWAfT=AhH0v*Gi0G(T{x6N!)hiA2MStFnnazp*a~-a54`3Y_++9Ft7AdQc~dQ_5RU#cR8EJKb2BMi6=`Y*AjN*$Zk7?cG3`c6 zCs3ZvU@4VQnZ2>xBrkY=3bgpGgF2~V(R!8{xaFmTnxJ=Ibej|C-1AE8j7im0@i$!_ z*U>&F7Iy~!_s)&_%UIQ7Tf_HXy1gB5ziHMf{tUFdzkI@O5gP#P_N5Lz0W6cs~N}r0!aE+J%#$#h$#TF-0>Jq`6MSM1JK< zOpHI<%#@q_rO(pO&0Nl-gI6!bGI2p=_E9?j%mVxrduiHM@5FXJm+E<(@{LyaCzXV2 z+$8i9CRZq*9*lx;O`AZa=yCOXHAp2;Vluj7lnAZvOVpUN%fZq02?5g_bmhzlB=nR} zQ-HtS5dT>ktbd_FRU$6x1OVUCKdK0yjEKU!b6>3>$D;_K*zyBCi8M@3&0w_0)5IrC z9{UX~A-QUMHR#m4MjR+(miZ5|oz99RefHe3sWUN)2x4qU zJOg4{ZQuisjVgU-%J8K92tYU-wcpV@FK-6Rj$LOA4-EK<4`q7F)#bj79Tv+ThYA?AO1cu9$Gq zJke^*o83KNm0XI}v>9(GIyM8XIaT|$>V;Y9wt6ScJdurrFdZEXkgl^Aq!_;=^;HO;-942`8$B@pQ zt#pA*Q1EB_6xK>d)qkEMuty(Nn8UP6j4C$8?u9NkL5hqYuO~7ek`ACD9Ja(%hroQU z+U4<6N(1{()J|5WFDKIY&lIXZQwJZtNez*LZdsCq5Um?ImZjo>Cs(c(Z({1am?I9p zaS$!G_!)4ON0v^clJ=6>+c-SeR6iXFmwKQdbT>fLWQz4l9Tcu8sVc?Y zQ&hdqWTRJs@n%0awEF{Go`@@Nd7}_~FBnRS(D*7|XV_5l6Cq3Dcc{HvkNAT0%|{PA zA_v3z*o&_w;J%LRt9#k~;-*@Z4jtg>O;_nJZwx^uXdBEMugYLM419Jf@^Ia z`WWrzisa54{>QoP#&`j~>q%D&e2m@I6*{uM0k2x_hdHW#Z_%weT~bk2t+wky;YtJK zm<{!m$&5_^Kwh4An$6%sBH_4SlwmgTO!C^YOzStnG?;c9gdtq)^k(JJ z+aJ!?zVXT!u*7hIidxcWCi-8E=%0y83fbqfN8rZTlsAF&71(cX-u^wnHT#*fLnP&v zl%zs0)#)r+EaCGS|y9@)nR|(@uUZ7f_^#d*Z*PU&Y5u;im$vDB2KF zgs2GO!nkvXGgNrQ-E|ygxvH2XGz+Vn#U*q=94;Vd$iCO9C0bTnN{Q- zv*txun-Mam4`EPvux!D1C3rOq1EEz_zg`mS(v8kR<5=O7KIv7O1z_l;K%K4Sg={-8 zdz!2HTLL1{8%!CY+UtMgm^#TIHgl)2_4L*MX?6t@g(}$0YSec2=JJuXDM~ud|Ics( z0AX+0{In~unQM_rGSus?r0L4d|MZ*u&7#|$8*7Kou}3K+Wv%vVDN!sYoQNEo&WVIF zxSfmN+nAR+-}m^4|E`+(*ie`dM=aLb-&wizW(D^6CPhf@F3Y;*yj87xVwsEtBzn99 zx$>EuI_7mhPhWRO)O`(WynJPlson?CK^v=o$}_3;?;kMOORatwFjS}i9Aixt@&(r$ zQV14vm+6QGpw_ml9#B48$GasjYws=*yUD`07-%$^w3~&QOt)Fj>L$cOXxC=+Ex$kw zOC73JE&Z|GXfJ9WHp4%iNg{Kp5hBx4>gY{JUmKQt@PDYYO56V52+s%nrmel63^thM z!SSee67JXZno0|#hSlMpea@%!5)nz4FeBtJPQdA-qHrj>>ZZ7`6>gTqw8kS~Vi15AE-Q}ZYC}CR(SuWgZGmDRCvD6!rC_WuVzaF@aN%w||XN*Zz2aSme;B zav`zJse8t~j(!cj8x`Cut)V)>rr6SJztJJ>dIB-$SM_glRO-eu`eb%<({WDI)Im{L zX+T$wTZ2RUq49nNE8zLwx9e-|Uhsn@!S0)Zy<*NEZ#kc+KmE5Z7{Juv_V`PyANi9k z^SUo%Jsj#|d4>35bqN-r9W?h^o6ErY*#+Q(YZ@9U6Z;lP`&W3NnzrTXP;|^Lm z%d1tKt97WH$2Z?O?~65DmJi!WOCZNYqutfk?W9VSsRT-GQ%rX4Q=F@9OUIWLmoe=R zSB3hut9lw#4Vf*8Q)Me;T8+zXhve0H($(720G~xWnHN|RLr}TO+3=OfKm*OE(S7T~ zFExWw8v9cs$9bl~@kNWtzh`5zTwaMceK^B$7=2tvjNg+4Lu1&RKiXv)%b%{{V_nTz zXR`09tBKve-G#4K3&C?JqI9f@vy3yMCG$Dku1fY{r_n~S?W9^KR~U1>T;c@x=B=CS zj~t)iS+KwR7@E`q%*EqxiO zwLb{AC?|&@XP(?WNu`4{X#in#!>H&+sJdgHVd|auT4+D|L|9>JvZ34p8e6NOtnF6v zSk9#I%`-CWsmg%!Hz?w7i*<0$r%Kjf9=;wFH9Q13M%+7oA%(A?!lQFcC!}){e35S| z#`4;fiz|8h(P?tBjq*GQ?(FT|{`b)1yLVws=p9W$3q93N=iz#XVr&m5k#4lRj|qaa z_;Bi$5R1nR1~rI;xshs)r{D3-iFpO6aUrEtIaJ8NrW|XToC(edE2;Ba>4jBK8Y^LM z{qg>7!IST^DO_cCWMQ3#^G6YY9hyFg`Ee=CeF&KLC$Zfm5$IRlP#=}I-Rz#F`*Z_i zd?t>_wCMFZ#^y97m4w0ohdo{WQut;&7q1BUJF=Iw4IXY*5w;NVpa6=*X6X5X502^b z&2)W&HNx#_YLM49k#U09{f-*br6JoLicu$j6>m2eXJ-4R_;<2kFBbotYFaIRN`qwp z9eZQ2v4R<`+((K5ivr8iNQ(tgLQ$Q+9W;ALIH-u&hf?XrEe5#2_Y#l@NWhI-XZUUa z&U;L%pHrRRBhqsTJ&oaw4K${`Fqfp|B+!*LrQF7d`e^|1b2@6x)-L>`lRuN$4sD>u zsEHm|ZI(`tz#MBDcC3=x^B8-#ee~El#YwVf?nZ1L5ISpaEbMFtrj z;b^pk9tC+YhY6JnRetAVFHWyxFPD|IOT-J`imbcRYiXY1=wi=0xrd ze)8QSbU6pp**ME$w8>&eX^{B<`)b52wi3(p0=1s1!Pt07N7wGXk;fjM594KFZRBCJ zr_*`?ei2RhevPm`>^$Xvc)!^e<3O4L*ORDrKqM;MbJA0-N@9H;#zS@UOxL!dPZF+Q zGTH-z-q#wG>Qw_JmbZwnR~r(=O_3-zhYdr_>XWJ)226b!mVSBm@h2p#bM6z*0J-m< z+Q9Blkym9hcB`KhhlC%f(P?rmkCDd;U4Au18K;IBTPx7MU#KWW21a)eYb`q(s(ibw zu7T(!6;z>AzHTxwJtpmR;@vY!VgC3cfw=+WN|<#lzAa!3IQd-d0z3zC|AHbuLR1~U z!En&mt>nL3RG>+*O0a6dzIu4i1quL!c9*_h$j{4p5cgF5^w@08u_U!!awFS#fia2v zs35fe@<}S@vLP#D^@y2v@Cc`Px5Q8fs*M)y`p|t+7`|H=@kyW3sqNlkQcj1h#E1Z- zBlr8=`1RPkkTU_}evfqOZ6 zNNXP}M2YPF+PnoUiRroQj#qnj{9%rJs5qM9-aM(%o>;SR^)A1Z(i;84V<>Uud}54@ z*3)oMjr9*6`RK|g7fBUImIVjs|9xw<_7NGPeA=(S}; zth}z-1Mto+)3fri5!*)QQFU{#^M$PO%ouA?qC1%1Lt8cPX}Avxo>X_FLen9?Ca!W-Gz6AeBO8%SQPk>8XR>z8t~vo8Vni7N{6vryqOd+Yl5BjzmAlh+I42XHyYQcsdy#s7%9Sov`_sfXgcb6^Z z-&6H6pmW54C|$*cfe|jx?JURR+F-$+(@SIAs@-T6Mi`kZ1z22~90WA4-(tJlWrg1s z31i#YTl;>Jw;abMSeq@y@g2D?#G_Zu=WsYYU$SyU+~&LO$$aSB!!Y_%OMbWC0NR`slOZhH zXERo9dss?BfXV@_Dk9`Fz)JM|eAjmRWgV%^hyJwxXQ)%-M)FHud3iP}nnzc!2`YLP zF!cr1I*Wp2>Mg(`Cho@Thl;I-3U4DzYS1%qjM!@}%9P@X*~4KAuqMCQr{Ok$+eGb> z#^w^;=^@|Z8F&MvFR&>8aksdEJEJwmK$@?Kh~Tw^SrSzgs*fNf5b6!23Cp9Sa_1zLX2=I*44c7NHO!yrc03d2 zJ{T@#OiT5b&MRu6l3-mwenpQ1Efnr@07cZ0%8j1YUrso1NG%K zgk>tTFeET@UJTr@Fu|%MdH%d^Z|GHTkdZuf4*H0&!21#jE02b_Afx&c^|I5yd{SwQ zi20y)il6Uk6g}%0H?YxYzv+zn9w+!96QK8-V@7}4F+W*&PutOnQLeH)CLJJ-eLake zphZ2Ur?|s8jp-(;`NGtw?sM0_i|wlF*j5AOHwC=<-wmq}#$vx7I4jW)IRn*O`bpMp zkofRSKgFQ1D=9wk$6OG^s_$>4CGnUV7uwP}8Lin}K^G^nPI1!0?YGr#MeX5UT(ZUK zDYdD1z99z9DjfN$9f@RXH~b$n9&IECLzxB5Z#D}aw>Aq%N;wg;1+Jcx`Scy`8dR*g zb^f)8)OOT|pUjFP8y?aJa}On!V=|B*g;}=52wFD*r5u|fZt#dVw_v6Tfe(i&pyAST}JchR@<0wp{MVDl2*M{klq)HC`c*_2!#nb!aIf~ zkz^xXdI6BHB8V;rfaAOO8mpB&iIz+%zCWgMoefE#0^$}WAhwQ>L!jKq_|^tzit4H= zA}=oQ$j~IwU!cOq2pOZd;ADc0%=p_9Muh}^j}GQ^sE&5g^^1+)L0%)nml&s1Z3M|; zbGYcw9pj=s9fJ#2R8}T=x~d-iq_Gaq!n=$s22lmuwoXTH9U4T`SZEVe?@Rn{9OQrT z*fV8zH9>T1yEu2T#$Tkw_m+EY(wE!}TFo6D1~-Yhji&T4ET86?p9LLcAMuT2;UmYT zM9P?vaU@GwE6kBaM6`RF6eh!&dJK z*l2jpOPXy8*>aSR>&S?r&PU9naYMO+Bm02a;aosr5q`A?Kn<=0a{%`<03ER6GPBY6 zRFj{rEKzerQ6DSZRk`%3S~bFQ%t)^+(jIKmtsj6wIV2QC-dRN-7s$ZUYGZ?$5pf6F3f> zm^bDbq(tXDZN{db%qZRBFNm?qrOyi5PCa8>HL@wzUji-)x8a z#R4xzX(eY*Zrp8#3lP^II0>rWb9)#hvQ%L}IXz-N3eU-jkz+Z&r6S<9i4;U2N-1fo z);|5xq>0i2lK9~s`+K3@i5zIgY}?r$QpKR-K+MM4g#NbF+Gt|5GX_{()b-l{wER}s zp*nM|fA{&%KsXQA8Sodn;S}oqJ`Gr?O!?q=yrfxzR1DT%`*@u;#{)N#RspsL_)%5kky0Dgs7HND*~t#fHyL}X`Ddp09>4NCPT>+@-S?J9jr z=MLC00GY2%vY##jVtnW|5#PfpvAj0|Q}6?bi0cqOij;pWrHCL-I1n{Qa9&mUUj8#6 z@Dcp*YXV!7Hg`KQ%Bu!_PTrmZg?(C+4c9jIif+{pP(dx9AA6!!RJ>n%eT*3==Ml9U`G~PetEK^KupC&v+1k4tO(tB^!@w z>cjnAsY2*J6v->_;kvI0Ux15n7m%~F)b@Bu0k!2brCU~3)`@E-DH`H6Jo_;|H*>PJ zF2#@D5klQp+X3r+@kLHtXt-ye-TDM_DMn!Rb42esUtiD&8IW*!#F&2`xMSk8Kx@b{ ziX3m@9nqV8#J<7$T!rOo zhN}9P8etX}FiMp7#>sOiEu-HPKMbND2p4N>PqF&+NV=SvP+WRQ{P4rY#cdOj1=JbQ zTkxb?N&3VA`@94Z-$&$gc53d`ARHW`=`^EnwONoH071hZ!&P4!!qok=4YO(28r+_B zytHYSy4`M_5p}t4!$1OK6iTB0NhNR~g_m z)@YT7lA3rH^kiDdaX`32ANaD4e4NIQijxekhUfWm^Br~OHl&>7z0!fkGll-Wxu08L zQimbx35uqSu7aVm)keriGIW-1WO_tP#C1g2Od191+8BY&ROxZ?Rq-V8kRON{dF=nD=mR4zw( zaum4>Deo~}H_K)e>E7s48I)tPgox##%;hL4-2~rpz7WbwybB3h2}aFSvIPOP8sr^> zmGCIbjXqzRE@JLmX%9&bPL2`o(+`%33_|DM3EXl;Pu7H;h3N^_NzQE|PZ7t$m1Wks ztk*{c%>CoiC*?%RyZGatRd139kywf^^pU(z0PRy1h-qGnVBQa zr9gIrLsjhIXQ6eu_P+PW#}oq8DUWxfkIFO14zy0|YH=Q$24|#yX@fh$^1)?Q-J{^P z2yFWF3JA?xs-A;2H6RjZrs0wLVJY@bDuqGG?Lkfw_br-fzW4s|Joujh?16oyF9Rme z-}z|1(r9B%%wEM#`+MkGmbu`oZq=Jx!m;uiliyWt%!)!aQ6`4_q{wQigiftB7CeV~ zL>gfg2c)sD2GX6%AnPmQ5&>mq`=l*~RwjfR^)GYk7##v~{m(DFmC+{JbTrIPf$^+8 z4KgQbo#9S((u&Dk zOld5r6qiJc#F=Fz3*VuedSm+fC!po|?3b4$uM_rJZ5z9U1$_khlxLQD=7g(GwH)Dv&hiorBA-)pGx(KmydH)Zr3*R|)(Cd;UVWaVy;9_u4+ z)5b9a+n}+fqwBIj%uROY!mzP52k=3j+;%z^l%qg=-_qFnOxs26vG?32C32%_*{{L< ztvWj%n;1G+&$cJlH0t!zjB**0%CApbj1`H#BK2h4UU!YE83pt68HWrVrCW^CZpLYk z2%k`CPS58>GqyO~5`J+?IKp)dDYTi=5Wuo1!c`7{8rtPa#L6}l1_1ayK6Tj;VFRi);lad?w z&9z;2EA*qYKn%AdHL}^dMyF*LU8?!po0xs;i!Td&7Y;_eXR!}kkvF4{3jtK{EqbbF z4^E>S(iEsWrsxPzmz>M3Z)b-aGdEu>g$}RwhQqgf0*)J(%)D#cZxpHOF~pW9wy!Jh zy9Wcv^e`FO?gj@(W0;8g`(<}iexbnzTo0PXm=78WMA}Z}0zpQMxFM4f1(O8`FHuch z=Ma2RZ#36V2K6GG-nSr#GS{I>6vrC0CI4W6m5*UCmpNZoav2$DTa@dJ4`DzZ!hOr| zOW{X6HsE6Ga9Flv)404S`#v2(&i&+r-LKCJBX&h00*$JjJs}!i7y=o>ZRA>T$>eSv zDWn;JTq#9-B&c6-KTQpl43hpc3!vCsx^5&aWdG$O?~0}_c;m+FP9Wcy@w>KUNmKjo zbxOyJ6|M7UrBu3&t;V94I?;u0x2W;1&9ws{G4RRj=Z~9vX$xpZZbn`lZbJeY2-?^D zPD#bcuQ(DHDk$C4_IBygUxDh=oXb>C5};oyrrhd1PofZtNgAUUog`a?>wx^Vwo@l% zhMECRM(W|ycqk5E+M4UfElvsj_f>|WDbR-5cU-YdGbM5CbV1JenrWNNl)0xq# zO@6yU`|^~vK0ixS3lKEraI0$b>g2xq<5q=#43qN6@un+5)aFfE*N{S1jRGpO%VyZ($|)lCr$nPSJxX`MDQ3xG%%%? zTJEkNeD8M(GEIdB?foB%GF%>)!ddU?7aun+f0ZKnuAv$e0?Jsx>j+B$--_~D}?z>4=O5RXGXv9K0KybXBgZf?!0Ti{YlKlfbYd> zy)z6NzqTr_OJx);Nt9S8`hA!1@ddqvY-c#aOLx~`v{~1*5IF-cz4p{Cu37@V`Y!~^ zQ_W1Ff-{3#1gZ@51DCFB*Zh|$4jGN3H(iP`e6W_HYCne^ri*tCdGr?8w5<2mv8EnD zD~6$;PP4CZMn0SslfQR+qW%WGUsEYCwSv9#^3`4f@L5cU3 zj#KN+T(UaPsmX!`H&)~0o$nCmhW`mSSF8v$8Jak_af8}^qJJX1=`8@fd=yfSVq#j{ zd<3|g7p}@)4=2Kwn5;0R`}>V$Lwb&MZb>?E?yH}6&r_zty+qcDS+vXcHkXY-G#Qm-k)1VyB;P%Mxp~Q@<=kN1nk9Iiy4j zQ~7&b&-K8-m)K=J{L&RFD$evq3~C&z2)N&SJhX3f5>708Onz+VTR{8FP5-#7*KTOE zk(t?C@Y!`>UG$k-hj_XZOe!CyS8y_)==Fw3`})?fs_1BXK~(A6zRMGI|0U0x+owKK?u$Sn(D{@0s z#m&>stTk@0o82V3D2*Bf*`qq+LZ(=X?~Ek0B%=`6b+EoU@WL7#fN0D*6Ad}PbUZg= zbX!1$*xkA;p=fXGTMrH2GmsBdS=XAhCBv}CW{)&|n$klZcO`4|J*e<5WiVFyIpVOn zW?U}WORhxe1~(9*gWAAF1@MYL<|E2OKB3mR-bdLR743h$CQ&!4;TB7aylc__4V&_d z`7~3Ea4MYNuE$Jtges0pt#)%&M+E%=d@m5?*;v(J9de$Mm6O`gWj_TKM~CntLEZ`l>i?eS;W=M~zA zn?$T8NA+p1wofYFMvfbJcJZi}gMTt8H^0h1nOo)mu&CXhB&a#Hx8U0JMf&&n_{w$d zkNMZiBB!fJ-Cf4az~o^44wak+m#TK(1p3mlZVKPH8($ODGx`T9`3}1BRGP|N`R0>5 z@)IVj_>qOFFD@5WPu*T)dZsdXm^HPs*T?I!{Ccv+X?o3}#ImHe%D`UFo~#D`ru?`F z{fJFTwfsP*WL{#=Xit}MM`2Ryu)U7_!D-=)6P0#!>wyR8uinrP(nW`r_>*4O+0JD6k2G+ZzssFVMX;yLk0fz^7417p zm-9N{O}K=#)mg9vvWO_hA!m<_{%AB6o5#8lRO2tKy3#gnbA8*y%Co-XdE@~!G;ES{ z$H8~z*lZJ^{hVSIUyTXOxLiDAzc+&A`N%zQgc&PHdW9`&?8}HnF*PBk>ZHj7pTh08 z_mI|7hFhAZI%Y%@EKKO_F!@VP+OxYOZdz^7a=e?ymTy$H*Xpjo=(!A>3^_03BEO4Q z9HuhaW8`4z97R}zxue*NR?fP$QQNWN7e-))*}bq;f=hNG#dh0n?y~CCI+6;U-}A72 z@*eJ@WWet?^N#OJTnFQoC*Z?B)#Y2^VH^7kvk<@QMscK8IJ3U2GJ*pwhel zkB#1PJu=RC(eFZ;aQSiN?w)Nf3j;{cH!jUJ)6b7C`%j|>$b=G%X2%o(ap(iqX}Fa*sH$Sj^pTKrxAj(KmN>yVUxq?l=J17-+5>M zz*0spiO!qOoX|7obxfh4>}z}gqwn&27%^jU(3Z_VOQ6(NV6gPt=fU%+1_hqO6R9vc^xrS7E;3Xb?`V=&%l0^fME^%OD7$RJlY{H2#Q7L}KeKXO$G%#KR?IaSx@No;NQ@hx=WA?vKP zEHhTSPufO{Mc;2YM>jt7>dYmtyhBzF`Bmh+OZz1^!JlvAn`kiUzckq>W5`+1o1>T& zAlHz00+w&=XbW zKyyl(Sx2^WTAMue21Wj8&`~)J3!vqe2XEAp7yI)QBKUGSDE?zG~ zC#6`RqddOS9q;d!OtHnUw`{_lyJPYHfwsMRr&y(p;0{p&rKZ;!#k&2nE&}`5s z3Tb@SynXfIvPjiPeAvu@gH(;U($ z<|a1AYy0oDrJFwN-sI%=)rRW!?kehG%nk9Q(+9Il%Uc1$&_s-pkLzG%3>E7>!gmkw zzK!LmSlex)m|}D^s_rEg;j8-pNYAPZY|bJ-$lQ6(Dvx;69GW%jOD8QS$IW3 zkv?)e)^S6+48tsbYO|orwB=XL;2r7yX{5T>NJGJ>TJHz70_$?7FM)c$^M65Y953oO zib32<3vNKTj#dY+yrn|@g?19`3@!t1X-6u{?qO231jR0! zBDvP<4d*KA-HNfsvcF$qcwVpWW8XgUckc*Gq3`GB|J?^4F4bxUf-Mz{&c{7`JIpC9a0W8PEM@WE3;TTu zWE{>={z5c${}pL<_J65P6Y-4vgF0Wq?jkwQ7JxYL!%n;ZVbxF9hBBsW z`|#)Xmv(leKiLfb+A7lO@$tq`Rg$KW4cN0ycnYvHwV6&>q>_I$jR{^jRe57mIMl%o}A_ms<;6>Z{F zmcv$>1mu_k78D`i`S054m>4XY6ap&0L3IN+4J9A$i{dU8oc(&qm)d9}m;iJpK}G!I z4}7k4{XURB0Dwx}Xw(Y;4irAwjTsVO?J@<#(*=v(FtTe_DA_@VCaXS;ndclTDYcKt zgK)lHU~Ixm?5&_5PCJA!+uRps!q3po~L;eG8AjphB%*yIE3P zP#5c?sI3HLS5Mq8(;NWw#D3!AlvXZip-4>fuY=fI?#p4*MyWfdoycWFjcr4FC7sR z^H6~N@_3SwuL2YYMST(k&zUwYFNd5t1|ycfd~|*q0O9n*HJ$-X^Ooe5e)Ye72WM*$ z96=7@-QfSV8qmZPy&(<8B?yO12&E(1vQC?K00uU{x;)5Ie0uSIhky5uVB3m6wj9Q( z(5QhMn|$`vH}`MfLF=I-3zoq@uZ>FkK{iE2YJlbn%ac7OF+ii?(daR#DA3g}zGBb% z_+1x%yij0>muQ@5=YgLTWvFm=#gY}0{FE~sNEIEF-n?k)dWm5mn~*KryqB;{V$2#J zN-Nn*NR)AO36t2UYtR8D!q0@&A3nRhn*(Pn=nHYODp6Ww1?t?X1mdncyPPG?tUM(6 z(lkhqlU-qrQsU&d)9?)8G2hMk*_=1p`L#Lkg1{!1GVf`{`})6fLvekh6AeKa!@b|^ zJR;$&X?_nCMm_Po`1xE)V1LC#umJ8Y;bXxVe` zQcLfL8Gug3H#SOboRYT6ot1y13=IRSJJh7|OwSp7N+1*5L>y)Jci35hy!0B$Q~aYi zFP-_231kSyfgbt9VM`NlV`^Y>=;PDMZ?sTVJ>x*LTrL>Tw%hf;6oPwcZ^i~hb;2N^ zq}Jub0m?nuLh_AiI~M5hGyr=}QigJy!b=&bCSrJ_RJj?+3qJ=zzAK zdhYRP(JAyXq-|R$neBabF)U@x%{>x)0V<~l1(CHo#wN_&S&1^;KvT49FCj|-rz0wO z{oD1aJAluM>E6NgJmVn}0`$3Q`huTSiC9;x>*s5h3X=S~kfqU3j%cjjGJ-Bt9%*RG zUI9q90gQvPIa$r{1W|EA+%!;Cs59k7MSy=YeXc;jdSSgJ7S?S7k$Dk}!Ac)ayFW8l zg#us|BL!33kcAu3N?VZe5kP$gGY&XI>OmoHSU1Uq=tBBp+I0#LeucAmtR;@@p-Ah5dmN~t}Teq zT^nKiGy?DwruSC@>x0#(QTgtQ+76bM?A@54pN7I#b4&ZbhH=Iu;~;Yy7D41P`58sb zj&?E5g#z>`B6NgzN$eKU*_S^r4=;vTlhy9wm_CBodD!oQ?h@87ewXC`uwf+N*;f?S zkHLz-@-bS-xAd z`=n{fezT;@x3tS7K{X%*DM<`=A|^dC@csS-rxUi(Z3*QRhTsHC){K;lA$dl|`9p?+ zOn{$~3S@x3fC8OESxYz;BLW;T=%7>_@yzZCsOVJ)-=be!^%02}iq@x9G-!lZS(c+8 z9W{dcFXyLq{~Qh73TON?EbAbU^^k}!t}0=3Hn1(=o3~0s#oUz!q(*Jg{SsDVVWzaq z1gJ9w3C>>*ul*F5Key`YWB_bgGN>7#S>RuQq~t+wuM2!`ylf2=DgXdh4FBJBb7W{7 zDgv6FQ$XZLf8)<{Q9=aJ4I5;V+P0-EQ<1buFcrv=4BZ6ltPDqD#Y3KF*8SlB+z{T$ zS1%}ThzXn>^m|Z7{tJ;cF2;66X9A&6Pq@!u^AkW9Vlo+hN)jZ8N*h<~U8QE7mF{R? z!MsY-T4=5v>+0HrU@ycLWpX=M!HLv;JNbgZ#EjzSZTgY`eQfr)*0s>b#XQd;N_ErK zi(2ZolMqg6EEF@ti4W6;eaB0<*j(h#kB|Iev*hOm9HSn;r!?k$@7@(si4p4$F+uxh z?@V-@v?NFj15t_D7JVrJBE50=e%09h8(NwlBdNA|u4+0j#dkl%(L!kLH|tc=dLkvR zVl=w(wZ^)xeT^|yx-Hh5GaXM<{BiY4S|Aj!72!VuLfgUR$A5bAhNHh^uPNW;yKP%r z93}V@=K(*(tDaf|`+8#rb=8h#WjdameDMHWkn?m@>r6lXpmg2lvytSoy_(sxh8UfT zRW!HOoF9kA{!p8=Ps;2{y4+52Gg9&a?2cXKys||2B!CSHd6ifLi9=3s$RI~v*0r(T zobi}-^=GZ6=G%OpBBTrtE;H!IJ_1xAV;LgJ#lqzB7D5ssZeY)Ac9UHt8G8mH+DNc- zlJR5BOddG}$x$|zmptIj8=)}Cza$bLs8FT2L6mE7kfI3tCbvi(!^v0!fxo@qT6~jk HMhy8M&yAW6 diff --git a/apps/docs/public/static/search/github-setup.jpg b/apps/docs/public/static/search/github-setup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e9d8101764f1886aa56d71399d53ee3853c26a0 GIT binary patch literal 94476 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 Ngt`68@4#d2zW}m}p^*Rp literal 0 HcmV?d00001 diff --git a/apps/docs/public/static/search/gitlab-options.jpg b/apps/docs/public/static/search/gitlab-options.jpg index 96371a64fe8c67716c4c50068c5ba87a1ff6e1e9..911ba48f620fbbb1f0733a25c60a733b9b028fcb 100644 GIT binary patch literal 91818 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%0A;GKP;UqOgZ zfp3OK#Tx%)b>f5sBbez_Pj_;Djqo{7=WhI}?IHR@+Yx5YNLxK4ta+%qAp<;`XyV34 zXiTed@YP9SZ2R(N3K!io{1pRvM*et4F{dp_m#nAnIKDHmI+i$yxlr`ofc5=soh_{biEZ7??npj+%FfL2jinhlBm(q z7utm`B{#a76|)Iktx&E5r~K%fO6vm%AxNaMjua?Rt}HKV?W^uu`*fk! zIs>YJPK>73ufs(N>npqACC3v@74CV-X4I8?G_3>0(Fs))se-!ulMY#TbIMVx8G7Ta zek*FiK&(DENG7V(D>*$qoWa7F0xSq>mI7&>+@XTa@x>x-{Wyo}_(_+O@PHCYXab!8 zye_9U-Gdni15rk~smOS|=N7?`J-GoMJVJHIz?F@;Xl%LKtUi2I+uV3?Ue7%zpdWvN z5^a87x}_cG$?0ZyqE_ba8-=nkQfg?6g!wUWWakFPwvE5GNAj0#7Ixl zHZER5!sl_mEqf8LeynI(2=_yRD1ZEV>}>n2)K2A#sD^CZWJr9gOLMQ(m_dEfvs>rX zYKLvDHRK3^m!Cghr?Rat)hA;s2Ko4mK2Nb7xOMd|9{Kdb^aXRA_f z?j;-E76QjI29xCz0O-yD1ynNq8Zq)ig`Kx7FpO~Ol9J3QY`zcXj_(bXTyY?a9OOub z7jj@Vl_>ZkSg8s^7K>^@H77tU%NCLglVyiZMGGH-#cRx>RyS~WKfD5b&plhguw;Hi zSQikss?2WQ4S-2Awk&D0ou-32jK_R`z9`t6xPV{V{$t<_BwP$8_*bq349*b;qX#nb9|Jh%^@E_%f z?;D^2zv=0-`tKXSP$cgpDH#yZdolt^x%DWJftdto-1$)ga7RlavB{Fygq!aUc-Id9 z(;sqId!EU(0_YMgC>8Of(woKxTxAc~fVYH%V$eMlm7sbx|E}>9J}2KDAL`&Cd5*#f6jtlPwT zp|ID@`PRX7k4zpxKwV0`6`~UK@=ET2gNovdu2_B6c%Kqw+k4Y>R0HRqEo|fKPqTWQ zPwwY)qM#QyRLxuACDHEUH)TR_$#)tFRWcDc1eDX==-qK z0!{U2CbcOO`XMVMuZ0$I*TR;k?=l}sZ+SUiw69*U#_AJ=pByD2T@&2LJ%_h+%x%Kl z&Bm}Qs)%0ly)-7hDR-JZ4n=|dMnZ4&E^$_z1kE$qFq!GWy4QY2kC@_)y_)Nq8&3+I z4IvV(@U#v;s66f=-g|>Vd-R5(2KCAMugh^<>VkDug=1aS;JhG`(JSZ0+Rm=h)lh5^ z?~hf;0h)eWzWD+!^;B65aol5xtXiDGPgylX&o}lhqeJ80TLj3KKk1 z;Za_gg4W~FeI*tpL)UVp$rk&9AS0wBaHe;z9Cj3sP@Pm zen>|6F&lVB7D0VIXF_nF__^OM9pSHw`W&t&gqO1zsVrOJI71e;EBZBpe?wIl*HhKs zSyFmylqtB`8<}gni1ON&NSpj8JqB@SsC=*IH=%8)g%?;r=yl;aHEdnw&5bhBt$=6Y$u`iM{CG|)WiXzoBhH^TYb=s?I>?qI z+?mR33v3@0$2JznCC}PrS>biM9#2>lJ=e#XVejaj&N_O%RZ$Rz#}gAHrgy9`Dp zXNr`fT_=%_v(fPs%3PqM9vv4X`H|^syFxJ6#5$3`kf}tjxBcb z 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 Gd;TBys)C>Z literal 37068 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 Bso4Mk diff --git a/apps/docs/public/static/search/gitlab-setup.jpg b/apps/docs/public/static/search/gitlab-setup.jpg index eceb8eab76e101dd97917d1f1643a82705d9ddb6..bcbf0139e33f1f7f59c68589c1bfe76dda63936d 100644 GIT binary patch literal 94777 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 literal 40577 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 ({ execute: vi.fn() })) + +vi.mock('@/lib/credentials/application/organization-credentials', () => { + const operation = { + id: 'organization_credentials.list', + oauthScope: 'api:read', + minimumRole: 'admin', + principalKinds: ['session', 'personal_api_key', 'oauth_access_token'], + capability: 'integrations.manage', + } as const + return { + organizationCredentialOperations: { list: operation }, + listOrganizationCredentials: { operation, execute: mocks.execute }, + } +}) + +import { GET } from '@/app/api/organization-credentials/oauth/route' + +const DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive.readonly' +const METADATA_SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly' +const request = () => + createMockRequest( + 'GET', + undefined, + {}, + 'http://localhost:3000/api/organization-credentials/oauth?organizationId=org-1&providerId=google-drive' + ) + +describe('GET /api/organization-credentials/oauth', () => { + beforeEach(() => { + vi.clearAllMocks() + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'admin-1' }, + session: { id: 'session-1' }, + }) + }) + + it('preserves per-account grants through the HTTP contract for access recovery', async () => { + mocks.execute.mockResolvedValue({ + credentials: [ + { + id: 'full-credential', + displayName: 'Full access', + providerId: 'google-drive', + scopes: [DRIVE_SCOPE, METADATA_SCOPE], + accountId: 'private-account-full', + encryptedValue: 'private-secret', + }, + { + id: 'limited-credential', + displayName: 'Limited access', + providerId: 'google-drive', + scopes: [METADATA_SCOPE], + accountId: 'private-account-limited', + }, + { + id: 'unknown-credential', + displayName: 'Unknown access', + providerId: 'google-drive', + scopes: [], + }, + ], + }) + + const response = await GET(request()) + const body = await response.json() + + expect(response.status).toBe(200) + expect(body.credentials).toEqual([ + { + id: 'full-credential', + name: 'Full access', + provider: 'google-drive', + type: 'oauth', + scopes: [DRIVE_SCOPE, METADATA_SCOPE], + }, + { + id: 'limited-credential', + name: 'Limited access', + provider: 'google-drive', + type: 'oauth', + scopes: [METADATA_SCOPE], + }, + { + id: 'unknown-credential', + name: 'Unknown access', + provider: 'google-drive', + type: 'oauth', + scopes: [], + }, + ]) + expect(getMissingRequiredScopes(body.credentials[0], [DRIVE_SCOPE, METADATA_SCOPE])).toEqual([]) + expect(getMissingRequiredScopes(body.credentials[1], [DRIVE_SCOPE, METADATA_SCOPE])).toEqual([ + DRIVE_SCOPE, + ]) + expect(getMissingRequiredScopes(body.credentials[2], [DRIVE_SCOPE, METADATA_SCOPE])).toEqual([ + DRIVE_SCOPE, + METADATA_SCOPE, + ]) + expect(mocks.execute).toHaveBeenCalledWith( + expect.objectContaining({ + principal: { kind: 'session', userId: 'admin-1', sessionId: 'session-1' }, + input: { organizationId: 'org-1', providerId: 'google-drive', type: 'oauth' }, + }) + ) + }) + + it('still returns an empty authorized list without fabricating a credential', async () => { + mocks.execute.mockResolvedValue({ credentials: [] }) + + const response = await GET(request()) + + expect(response.status).toBe(200) + expect((await response.json()).credentials).toEqual([]) + }) + + it('requires a session before entering the protected credential list', async () => { + authMockFns.mockGetSession.mockResolvedValue(null) + + const response = await GET(request()) + + expect(response.status).toBe(401) + expect(mocks.execute).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/api/organization-credentials/oauth/route.ts b/apps/sim/app/api/organization-credentials/oauth/route.ts index 220f8767f4c..e6e784b9a45 100644 --- a/apps/sim/app/api/organization-credentials/oauth/route.ts +++ b/apps/sim/app/api/organization-credentials/oauth/route.ts @@ -25,6 +25,7 @@ export const GET = defineInternalJsonRoute({ name: row.displayName, provider: row.providerId as OAuthProvider, type: 'oauth' as const, + scopes: row.scopes, })), }), }) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx index f2167a85983..24d0f6bd54b 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx @@ -14,9 +14,11 @@ const mocks = vi.hoisted(() => ({ push: vi.fn(), documents: vi.fn(), actions: vi.fn(), + recovery: vi.fn(), history: vi.fn(), form: vi.fn(), dirty: false, + saving: false, save: vi.fn(), })) vi.mock('next/navigation', () => ({ @@ -54,7 +56,10 @@ vi.mock( }) ) vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section', () => ({ - ConnectorRecovery: () => null, + ConnectorRecovery: (props: { onEdit?: () => void }) => { + mocks.recovery(props) + return props.onEdit ? : null + }, ConnectorSyncHistory: () => { mocks.history() return

    Source sync history

    @@ -120,6 +125,7 @@ describe('organization source detail navigation', () => { vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) mocks.admin = true mocks.dirty = false + mocks.saving = false mocks.index.mockReturnValue({ data: { knowledgeBaseId: 'index-one' }, isPending: false }) mocks.detail.mockReturnValue({ data: connector }) mocks.actions.mockImplementation((options: ConnectorActionsOptions) => ({ @@ -137,8 +143,8 @@ describe('organization source detail navigation', () => { })) mocks.form.mockImplementation(() => ({ dirty: mocks.dirty, - saving: false, - canSave: mocks.dirty, + saving: mocks.saving, + canSave: mocks.dirty && !mocks.saving, save: mocks.save, fieldsProps: {}, displayName: 'Google Drive', @@ -198,6 +204,82 @@ describe('organization source detail navigation', () => { ) }) + it.each(['', '?view=history'])( + 'shows a concise incomplete-update notice without provider details at %s', + async (searchParams) => { + mocks.detail.mockReturnValue({ + data: { ...connector, lastSyncError: 'Provider denied organization org-private-id' }, + }) + await render(searchParams) + + expect(container.textContent).toContain('Some source updates are incomplete') + expect(container.textContent).toContain('Review the source settings and try syncing again.') + expect(container.textContent).not.toContain('Provider denied') + expect(container.textContent).not.toContain('org-private-id') + } + ) + + it('keeps a healthy active source quiet', async () => { + await render() + expect(container.textContent).not.toContain('Some source updates are incomplete') + expect(container.textContent).not.toContain('Review the source settings and try syncing again.') + }) + + it.each(['pending', 'syncing', 'paused', 'error', 'disabled'] as const)( + 'does not duplicate recovery feedback for a %s source', + async (status) => { + mocks.detail.mockReturnValue({ data: { ...connector, status, lastSyncError: 'Old failure' } }) + await render() + expect(container.textContent).not.toContain('Some source updates are incomplete') + } + ) + + it.each([ + ['active', 'idle', true], + ['active', 'pending', false], + ['active', 'running', false], + ['active', 'error', false], + ['active', 'disabled', false], + ['paused', 'idle', false], + ['disabled', 'idle', false], + ] as const)( + 'uses effective member state for status=%s, memberSyncStatus=%s: notice=%s', + async (status, memberSyncStatus, showNotice) => { + mocks.detail.mockReturnValue({ + data: { + ...connector, + accessMode: 'members', + status, + memberSyncStatus, + lastSyncError: null, + lastMemberSyncError: 'Member listing incomplete: private-account-id', + }, + }) + await render() + expect(container.textContent?.includes('Some source updates are incomplete')).toBe(showNotice) + expect(container.textContent).not.toContain('private-account-id') + } + ) + + it('opens the existing source settings through the recovery action without leaving the source', async () => { + mocks.detail.mockReturnValue({ data: { ...connector, lastSyncError: 'Listing incomplete' } }) + await render() + expect(mocks.recovery).toHaveBeenLastCalledWith( + expect.objectContaining({ + knowledgeBaseId: 'index-one', + scope: { kind: 'organization', organizationId: 'org-one' }, + onEdit: expect.any(Function), + }) + ) + + await click('Review source settings') + expect(container.textContent).toContain('Source configuration') + expect(mocks.form).toHaveBeenCalledWith( + expect.objectContaining({ connector: expect.objectContaining({ id: 'source-one' }) }) + ) + expect(mocks.push).not.toHaveBeenCalled() + }) + it.each([ { ...connector, id: 'another-source' }, { ...connector, knowledgeBaseId: 'another-index' }, @@ -308,4 +390,66 @@ describe('organization source detail navigation', () => { await render('?view=settings') expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector })) }) + + it('uses the canonical saved row as the new settings baseline without leaving the source', async () => { + mocks.dirty = true + await render('?view=settings') + await click('Save') + expect(mocks.save).toHaveBeenCalledOnce() + + const saved = { ...connector, sourceConfig: { folderId: 'saved-folder' } } + await act(async () => mocks.form.mock.calls.at(-1)![0].onSaved(saved)) + expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector: saved })) + expect(mocks.push).not.toHaveBeenCalled() + expect(container.textContent).toContain('Source configuration') + + mocks.detail.mockReturnValue({ data: { ...connector, status: 'syncing' } }) + await render('?view=settings') + expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector: saved })) + }) + + it('discards to the latest server settings only when explicitly requested', async () => { + mocks.dirty = true + await render('?view=settings') + const refreshed = { ...connector, sourceConfig: { folderId: 'latest-server-folder' } } + mocks.detail.mockReturnValue({ data: refreshed }) + await render('?view=settings') + expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector })) + + await click('Discard') + expect(mocks.form).toHaveBeenLastCalledWith(expect.objectContaining({ connector: refreshed })) + expect(mocks.save).not.toHaveBeenCalled() + expect(mocks.push).not.toHaveBeenCalled() + expect(container.textContent).toContain('Source configuration') + }) + + it.each([false, true])( + 'blocks source navigation and repeated actions while saving with dirty=%s', + async (dirty) => { + mocks.dirty = dirty + mocks.saving = true + await render('?view=settings') + for (const label of [ + 'Sync now', + 'Pause', + 'Remove', + 'Saving...', + ...(dirty ? ['Discard'] : []), + ]) { + const action = Array.from(container.querySelectorAll('button')).find( + (item) => item.textContent === label + ) + expect(action).toBeDisabled() + } + + await click('Documents') + await click('Sync history') + await click('Integrations') + expect(mocks.documents).not.toHaveBeenCalled() + expect(mocks.history).not.toHaveBeenCalled() + expect(mocks.push).not.toHaveBeenCalled() + expect(document.querySelector('[role="dialog"]')).toBeNull() + expect(container.textContent).toContain('Source configuration') + } + ) }) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx index f1b7e8e02dd..6ef15f75fe7 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx @@ -36,6 +36,7 @@ import { SettingsEmptyState, SettingsQueryErrorState, } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' import { useSettingsSearch } from '@/app/workspace/[workspaceId]/settings/components/use-settings-search' import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' import { @@ -173,7 +174,7 @@ function SourceDetailContent({ connector, scope, backHref, queryError }: SourceD const title = meta ? describeSearchSource(meta, connector.sourceConfig) || meta.name : 'Search source' - const { effectiveStatus } = getConnectorSyncState(connector) + const { effectiveStatus, lastSyncError } = getConnectorSyncState(connector) const status = effectiveStatus === 'paused' ? 'Sync paused' @@ -213,12 +214,19 @@ function SourceDetailContent({ connector, scope, backHref, queryError }: SourceD > {queryError} + {effectiveStatus === 'active' && lastSyncError && ( + + )} onViewChange('settings')} /> {view === 'documents' ? ( @@ -36,3 +44,28 @@ describe('connectorMemberProvider', () => { expect(connectorMemberProvider(plain)).toBeNull() }) }) + +describe('isConnectorFieldRequired', () => { + it.each([ + ['admin', true], + ['workspace', false], + ] as const)('requires GitLab Host in %s mode: %s', (accessMode, required) => { + const host = gitlabConnectorMeta.configFields.find((field) => field.id === 'host') + assert(host) + + expect(isConnectorFieldRequired(host, gitlabConnectorMeta, accessMode)).toBe(required) + }) + + it.each([ + ['admin', true], + ['workspace', false], + ['members', false], + ] as const)('preserves Drive subject requirements in %s mode: %s', (accessMode, required) => { + const subject = googleDriveConnectorMeta.configFields.find( + (field) => field.id === GOOGLE_DRIVE_ADMIN_EMAIL_FIELD_ID + ) + assert(subject) + + expect(isConnectorFieldRequired(subject, googleDriveConnectorMeta, accessMode)).toBe(required) + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access.ts index 5b4171e0859..aab516c9f90 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access.ts @@ -6,7 +6,7 @@ import { import { aclIsDerived } from '@/lib/knowledge/connectors/access-modes' import type { ConnectorConfigField, ConnectorMeta } from '@/connectors/types' -/** Administrator crawls require the same impersonation subject enforced by the server. */ +/** Administrator crawls require their permission fields and any impersonation subject. */ export function isConnectorFieldRequired( field: ConnectorConfigField, connectorConfig: ConnectorMeta, @@ -15,8 +15,9 @@ export function isConnectorFieldRequired( return Boolean( field.required || (accessMode === 'admin' && - connectorConfig.auth.mode === 'oauth' && - connectorConfig.auth.serviceAccountSubjectFieldId === field.id) + (field.requiredInAdminMode || + (connectorConfig.auth.mode === 'oauth' && + connectorConfig.auth.serviceAccountSubjectFieldId === field.id))) ) } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx index 947d7e37708..00f9b7f7f0d 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connector-recovery.tsx @@ -8,6 +8,7 @@ import { getCanonicalScopesForProvider, getProviderIdFromServiceId } from '@/lib import { getMissingRequiredScopes } from '@/lib/oauth/utils' import { ConnectOAuthModal } from '@/app/workspace/[workspaceId]/components/connect-oauth-modal' import { SettingsResourceRow } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { isConnectorCredentialTypeAllowed } from '@/connectors/auth' import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' import { useOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' import { useCredentialRefreshTriggers } from '@/hooks/use-credential-refresh-triggers' @@ -19,6 +20,7 @@ interface ConnectorRecoveryProps { isSearchIndex?: boolean canEdit: boolean disabled?: boolean + onEdit?: () => void } export function ConnectorRecovery({ @@ -28,6 +30,7 @@ export function ConnectorRecovery({ isSearchIndex = false, canEdit, disabled = false, + onEdit, }: ConnectorRecoveryProps) { const [showOAuthModal, setShowOAuthModal] = useState(false) const connectorDef = CONNECTOR_META_REGISTRY[connector.connectorType] @@ -41,6 +44,10 @@ export function ConnectorRecovery({ refetch: refetchCredentials, } = useOAuthCredentials(providerId, resourceScopeFields(scope)) const selectedCredential = credentials?.find((item) => item.id === connector.credentialId) + const requiresAccountSettings = + (connectorDef && + !isConnectorCredentialTypeAllowed(connectorDef.auth, connector.accessMode, 'oauth')) || + selectedCredential?.type === 'service_account' const missingScopes = selectedCredential ? getMissingRequiredScopes(selectedCredential, requiredScopes) : [] @@ -52,13 +59,23 @@ export function ConnectorRecovery({ ) useEffect(() => { - if (showOAuthModal && connector.credentialId && !selectedCredential && !credentialsLoading) { + if ( + showOAuthModal && + (requiresAccountSettings || + (connector.credentialId && !selectedCredential && !credentialsLoading)) + ) { setShowOAuthModal(false) } - }, [showOAuthModal, connector.credentialId, selectedCredential, credentialsLoading]) + }, [ + showOAuthModal, + connector.credentialId, + selectedCredential, + credentialsLoading, + requiresAccountSettings, + ]) function openReconnect() { - if (!canEdit || disabled) return + if (!canEdit || disabled || requiresAccountSettings) return if (connector.credentialId && !selectedCredential) return setShowOAuthModal(true) } @@ -86,12 +103,18 @@ export function ConnectorRecovery({ + Settings + + ) : canEdit && !requiresAccountSettings && serviceId && providerId ? ( ) : null} - {showOAuthModal && canEdit && serviceId && providerId && !connector.credentialId && ( - - )} - {showOAuthModal && canEdit && serviceId && providerId && selectedCredential && ( - - )} + {showOAuthModal && + !requiresAccountSettings && + canEdit && + serviceId && + providerId && + !connector.credentialId && ( + + )} + {showOAuthModal && + !requiresAccountSettings && + canEdit && + serviceId && + providerId && + selectedCredential && ( + + )} ) } diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx index 44ed254a86c..961716063a4 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.test.tsx @@ -27,7 +27,12 @@ const { ), oauthCredentialsState: { - current: [] as Array<{ id: string; name: string; provider: string }>, + current: [] as Array<{ + id: string + name: string + provider: string + type?: 'oauth' | 'service_account' + }>, isFetching: false, }, lifecycle: { @@ -163,7 +168,9 @@ vi.mock('@/lib/credentials/client-state', () => ({ })) vi.mock('@/lib/oauth', () => ({ getCanonicalScopesForProvider: vi.fn(() => []), - getProviderIdFromServiceId: vi.fn(() => 'slack'), + getProviderIdFromServiceId: vi.fn((serviceId: string) => + serviceId === 'google-drive' ? 'google-drive' : 'slack' + ), })) vi.mock('@/lib/oauth/utils', () => ({ getMissingRequiredScopes: missingScopesMock })) vi.mock('@/app/workspace/[workspaceId]/components/connect-oauth-modal', () => ({ @@ -193,6 +200,16 @@ vi.mock('@/connectors/registry', () => ({ configFields: [{ id: 'domain' }, { id: 'spaceKey' }], auth: { mode: 'oauth', provider: 'confluence' }, }, + google_drive: { + id: 'google_drive', + name: 'Google Drive', + configFields: [], + auth: { + mode: 'oauth', + provider: 'google-drive', + adminCredentialType: 'service_account', + }, + }, }, })) vi.mock('@/hooks/queries/kb/connectors', () => ({ @@ -586,6 +603,129 @@ describe('Connector credential reauthorization', () => { expect.objectContaining({ mode: 'reauthorize', newScopes: ['channels:read'] }) ) }) + + it.each(['present', 'unavailable', 'deleted'] as const)( + 'opens source settings for a disabled administrator Drive source with a %s service account', + (credentialState) => { + const onEdit = vi.fn() + oauthCredentialsState.current = + credentialState === 'present' + ? [ + { + id: 'service-1', + name: 'Drive service account', + provider: 'google-drive', + type: 'service_account', + }, + ] + : [] + const container = renderComponent( + + ) + + expect(findButton(container, 'Settings')).toBeEnabled() + act(() => findButton(container, 'Settings').click()) + expect(onEdit).toHaveBeenCalledOnce() + expect(connectOAuthModalMock).not.toHaveBeenCalled() + } + ) + + it('also routes a general-KB service account to settings instead of OAuth', () => { + const onEdit = vi.fn() + oauthCredentialsState.current = [ + { + id: 'service-1', + name: 'Drive service account', + provider: 'google-drive', + type: 'service_account', + }, + ] + const container = renderComponent( + + ) + + act(() => findButton(container, 'Settings').click()) + expect(onEdit).toHaveBeenCalledOnce() + expect(connectOAuthModalMock).not.toHaveBeenCalled() + }) + + it.each([ + { canEdit: false, disabled: false }, + { canEdit: true, disabled: true }, + ])('protects service-account recovery when %o', ({ canEdit, disabled }) => { + const onEdit = vi.fn() + const container = renderComponent( + + ) + if (canEdit) { + expect(findButton(container, 'Settings')).toBeDisabled() + act(() => findButton(container, 'Settings').click()) + } else { + expect(container.querySelector('button')).toBeNull() + } + expect(onEdit).not.toHaveBeenCalled() + expect(connectOAuthModalMock).not.toHaveBeenCalled() + }) + + it('closes OAuth across account-type changes until the user explicitly reconnects', () => { + const onEdit = vi.fn() + const connector = makeConnector({ connectorType: 'google_drive', accessMode: 'workspace' }) + const credential = { id: 'credential-1', name: 'Drive account', provider: 'google-drive' } + oauthCredentialsState.current = [{ ...credential, type: 'oauth' }] + const renderRecovery = () => ( + + ) + const container = renderComponent(renderRecovery()) + act(() => findButton(container, 'Reconnect').click()) + expect(connectOAuthModalMock).toHaveBeenCalledOnce() + + connectOAuthModalMock.mockClear() + oauthCredentialsState.current = [{ ...credential, type: 'service_account' }] + act(() => root?.render(renderRecovery())) + expect(connectOAuthModalMock).not.toHaveBeenCalled() + expect(findButton(container, 'Settings')).toBeEnabled() + + oauthCredentialsState.current = [{ ...credential, type: 'oauth' }] + act(() => root?.render(renderRecovery())) + expect(connectOAuthModalMock).not.toHaveBeenCalled() + expect(findButton(container, 'Reconnect')).toBeEnabled() + act(() => findButton(container, 'Reconnect').click()) + expect(connectOAuthModalMock).toHaveBeenCalledOnce() + expect(onEdit).not.toHaveBeenCalled() + }) }) describe('shared connector lifecycle actions', () => { diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx index 59906b1f71a..8b8d5c4e68a 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx @@ -214,6 +214,7 @@ function ConnectorCard({ knowledgeBaseId={knowledgeBaseId} isSearchIndex={isSearchIndex} canEdit={canEdit} + onEdit={onEdit} /> {expanded && (
    diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx index 8692dabc612..27911a1735a 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx @@ -675,8 +675,10 @@ describe('Search source setup with real connector dialogs', () => { expect(document.body.textContent).not.toContain('Member accounts') expect(button('Connect & Sync')).toBeDisabled() await fill('Enter your GitLab PAT', 'test-pat') - await fill('gitlab.com', 'gitlab.example.test') await fill('group/project or numeric ID', 'engineering/search') + expect(button('Connect & Sync')).toBeDisabled() + await fill('gitlab.example.com', 'gitlab.example.test') + expect(button('Connect & Sync')).toBeEnabled() await click(button('Connect & Sync')) expect(mocks.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -840,6 +842,7 @@ describe('member content credentials in real add and edit dialogs', () => { expect(button('Workspace')).toHaveAttribute('aria-checked', 'true') await fill('Enter your GitLab PAT', 'new-pat') await fill('group/project or numeric ID', '1') + expect(button('Connect & Sync')).toBeEnabled() await click(button('Connect & Sync')) expect(mocks.create.mock.calls[1][0]).toMatchObject({ connectorType: 'gitlab', @@ -1487,7 +1490,7 @@ describe('canonical Search connector safety', () => { ) ).toBe(false) await fill('Enter your GitLab PAT', 'fixture-pat') - await fill('gitlab.com', 'gitlab.example.test') + await fill('gitlab.example.com', 'gitlab.example.test') await fill('group/project or numeric ID', 'engineering/search') await click(button('Connect & Sync')) expect(mocks.create).toHaveBeenCalledWith( diff --git a/apps/sim/connectors/gitlab/meta.ts b/apps/sim/connectors/gitlab/meta.ts index 043707af17f..ec6e79704b8 100644 --- a/apps/sim/connectors/gitlab/meta.ts +++ b/apps/sim/connectors/gitlab/meta.ts @@ -33,9 +33,10 @@ export const gitlabConnectorMeta: ConnectorMeta = { id: 'host', title: 'Host', type: 'short-input', - placeholder: 'gitlab.com', + placeholder: 'gitlab.example.com', required: false, - description: 'Self-managed GitLab host. Leave blank for gitlab.com.', + requiredInAdminMode: true, + description: 'Your GitLab instance host. Sim Search requires a self-managed instance.', }, { id: 'project', diff --git a/apps/sim/connectors/gmail/meta.ts b/apps/sim/connectors/gmail/meta.ts index e2aa64c2d26..c26838b4d91 100644 --- a/apps/sim/connectors/gmail/meta.ts +++ b/apps/sim/connectors/gmail/meta.ts @@ -50,6 +50,7 @@ export const gmailConnectorMeta: ConnectorMeta = { title: 'Date Range', type: 'dropdown', required: false, + placeholder: 'All time (default)', options: [ { label: 'Last 7 days', id: '7d' }, { label: 'Last 30 days', id: '30d' }, @@ -64,6 +65,7 @@ export const gmailConnectorMeta: ConnectorMeta = { title: 'Exclude Promotions', type: 'dropdown', required: false, + placeholder: 'Yes (default)', options: [ { label: 'Yes (recommended)', id: 'true' }, { label: 'No', id: 'false' }, @@ -74,6 +76,7 @@ export const gmailConnectorMeta: ConnectorMeta = { title: 'Exclude Social', type: 'dropdown', required: false, + placeholder: 'Yes (default)', options: [ { label: 'Yes (recommended)', id: 'true' }, { label: 'No', id: 'false' }, @@ -85,7 +88,7 @@ export const gmailConnectorMeta: ConnectorMeta = { type: 'short-input', placeholder: 'e.g. from:boss@company.com subject:report has:attachment', required: false, - description: 'Additional Gmail search filter. Uses the same syntax as the Gmail search bar.', + description: 'Additional Gmail API search filter.', }, { id: 'maxThreads', diff --git a/apps/sim/connectors/google-calendar/meta.ts b/apps/sim/connectors/google-calendar/meta.ts index 203f9d1dc0c..82489432732 100644 --- a/apps/sim/connectors/google-calendar/meta.ts +++ b/apps/sim/connectors/google-calendar/meta.ts @@ -51,6 +51,7 @@ export const googleCalendarConnectorMeta: ConnectorMeta = { title: 'Date Range', type: 'dropdown', required: false, + placeholder: 'Last 30 days + next 30 days (default)', options: [ { label: 'Last 30 days + next 30 days (default)', id: 'default' }, { label: 'Past events only (last 30 days)', id: 'past_only' }, @@ -72,6 +73,7 @@ export const googleCalendarConnectorMeta: ConnectorMeta = { title: 'Include Attendees', type: 'dropdown', required: false, + placeholder: 'Yes (default)', options: [ { label: 'Yes (default)', id: 'true' }, { label: 'No', id: 'false' }, diff --git a/apps/sim/connectors/types.ts b/apps/sim/connectors/types.ts index f53fb95bb5c..6caf76803e7 100644 --- a/apps/sim/connectors/types.ts +++ b/apps/sim/connectors/types.ts @@ -254,6 +254,8 @@ export interface ConnectorConfigField { type: 'short-input' | 'dropdown' | 'selector' placeholder?: string required?: boolean + /** Required when an administrator account supplies documents and source permissions. */ + requiredInAdminMode?: true description?: string /** Excludes settings unused by member crawls and account-local selectors that need a manual sibling. */ hideInMemberMode?: true diff --git a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx new file mode 100644 index 00000000000..6ad28cae208 --- /dev/null +++ b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx @@ -0,0 +1,224 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { toast } from '@sim/emcn' +import { QueryClient, QueryClientProvider, useMutation } from '@tanstack/react-query' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ invite: vi.fn(), close: vi.fn() })) +vi.mock('@/hooks/queries/organization-accounts', () => ({ + useInviteOrganizationAccountPeople: () => useMutation({ mutationFn: mocks.invite }), +})) +vi.mock('@/hooks/queries/credential-groups', () => ({ + useInviteCredentialGroupEnrollments: () => useMutation({ mutationFn: mocks.invite }), +})) + +import { CredentialGroupInviteModal } from '@/ee/credential-groups/components/credential-group-invite-modal' +import { OrganizationAccountInviteModal } from '@/ee/credential-groups/components/organization-account-invite-modal' + +interface DeliveryResult { + sentCount: number + results: { email: string; success: boolean; error?: string }[] +} + +describe.each(['organization', 'workspace'] as const)( + '%s account connection invitations', + (scope) => { + let root: Root + let container: HTMLDivElement + let client: QueryClient + + async function flush() { + await act(async () => { + await vi.advanceTimersByTimeAsync(1) + }) + } + + async function render() { + await act(async () => + root.render( + + {scope === 'organization' ? ( + + ) : ( + + )} + + ) + ) + await flush() + } + + function button(label: string) { + const result = Array.from(document.querySelectorAll('button')).find( + (element) => element.textContent?.trim() === label + ) + if (!result) throw new Error(`Missing ${label} button`) + return result + } + + async function paste(emails: string) { + const input = document.querySelector('[role="dialog"] input') + if (!input) throw new Error('Missing email input') + const event = new Event('paste', { bubbles: true, cancelable: true }) + Object.defineProperty(event, 'clipboardData', { value: { getData: () => emails } }) + await act(async () => input.dispatchEvent(event)) + await flush() + } + + async function submit() { + await act(async () => button('Send requests').click()) + await flush() + } + + function expectedInput(emails: string[]) { + return scope === 'organization' + ? { organizationId: 'org-1', emails } + : { workspaceId: 'workspace-1', groupId: 'group-1', body: { emails } } + } + + beforeEach(() => { + vi.useFakeTimers() + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + mocks.invite.mockReset() + mocks.close.mockReset() + vi.spyOn(toast, 'success').mockReturnValue('toast-id') + client = new QueryClient({ defaultOptions: { mutations: { retry: false } } }) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + }) + + afterEach(async () => { + await act(async () => root.unmount()) + client.clear() + container.remove() + vi.restoreAllMocks() + vi.useRealTimers() + vi.unstubAllGlobals() + }) + + it('requires valid recipients and excludes invalid and disposable addresses', async () => { + await render() + expect(button('Send requests')).toBeDisabled() + await paste('not-an-email user@mailinator.com') + expect(button('Send requests')).toBeDisabled() + expect(mocks.invite).not.toHaveBeenCalled() + + mocks.invite.mockResolvedValue({ + sentCount: 1, + results: [{ email: 'member@example.com', success: true }], + }) + await paste(' Member@Example.com member@example.com ') + expect(button('Send requests')).toBeEnabled() + await submit() + expect(mocks.invite).toHaveBeenCalledOnce() + expect(mocks.invite.mock.calls[0][0]).toEqual(expectedInput(['member@example.com'])) + expect(toast.success).toHaveBeenCalledWith('Connection request sent') + expect(mocks.close).toHaveBeenCalledOnce() + }) + + it('keeps only failed recipients after partial delivery and retries without sending twice', async () => { + mocks.invite + .mockResolvedValueOnce({ + sentCount: 1, + results: [ + { email: 'sent@example.com', success: true }, + { email: 'retry@example.com', success: false, error: 'Mailbox unavailable' }, + ], + }) + .mockResolvedValueOnce({ + sentCount: 1, + results: [{ email: 'retry@example.com', success: true }], + }) + await render() + await paste('sent@example.com retry@example.com') + await submit() + + expect(mocks.close).not.toHaveBeenCalled() + expect(document.querySelector('[role="dialog"]')?.textContent).toContain( + '1 sent. 1 failed: retry@example.com' + ) + expect(document.querySelector('[role="dialog"]')?.textContent).not.toContain( + 'sent@example.com' + ) + expect(toast.success).not.toHaveBeenCalled() + await submit() + expect(mocks.invite.mock.calls[1][0]).toEqual(expectedInput(['retry@example.com'])) + expect(mocks.close).toHaveBeenCalledOnce() + }) + + it('shows delivery failure details, retains recipients, and clears the message when edited', async () => { + mocks.invite.mockResolvedValue({ + sentCount: 0, + results: [{ email: 'retry@example.com', success: false, error: 'Mailbox unavailable' }], + }) + await render() + await paste('retry@example.com') + await submit() + + expect(mocks.close).not.toHaveBeenCalled() + expect(document.querySelector('[role="dialog"]')?.textContent).toContain( + 'No invitations were sent: retry@example.com (Mailbox unavailable)' + ) + await paste('another@example.com') + expect(document.querySelector('[role="dialog"]')?.textContent).not.toContain( + 'No invitations were sent' + ) + expect(button('Send requests')).toBeEnabled() + }) + + it('locks sending and dismissal while requests are pending, then closes after success', async () => { + const delivery = Promise.withResolvers() + mocks.invite.mockReturnValue(delivery.promise) + await render() + await paste('member@example.com') + await submit() + + expect(button('Sending...')).toBeDisabled() + expect(button('Cancel')).toBeDisabled() + expect(document.querySelector('[role="dialog"] input')).toBeDisabled() + await act(async () => { + button('Sending...').click() + button('Cancel').click() + document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })) + }) + expect(mocks.invite).toHaveBeenCalledOnce() + expect(mocks.close).not.toHaveBeenCalled() + + await act(async () => + delivery.resolve({ + sentCount: 1, + results: [{ email: 'member@example.com', success: true }], + }) + ) + await flush() + expect(mocks.close).toHaveBeenCalledOnce() + }) + + it('retains input on a request failure and lets the user retry the same recipients', async () => { + mocks.invite + .mockRejectedValueOnce(new Error('Invitation service unavailable')) + .mockResolvedValue({ + sentCount: 1, + results: [{ email: 'member@example.com', success: true }], + }) + await render() + await paste('member@example.com') + await submit() + expect(document.querySelector('[role="dialog"]')?.textContent).toContain( + 'Invitation service unavailable' + ) + expect(mocks.close).not.toHaveBeenCalled() + expect(button('Send requests')).toBeEnabled() + await submit() + expect(mocks.invite.mock.calls[1][0]).toEqual(expectedInput(['member@example.com'])) + expect(mocks.close).toHaveBeenCalledOnce() + }) + } +) diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx index d6fd26e0db5..340cff78379 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx @@ -10,6 +10,8 @@ const mocks = vi.hoisted(() => ({ revoke: vi.fn(), disconnect: vi.fn(), reset: vi.fn(), + resendState: { isPending: false, error: null as Error | null }, + revokeState: { isPending: false, error: null as Error | null }, })) vi.mock('@/hooks/queries/organization-accounts', () => ({ useOrganizationAccountPeople: mocks.people, @@ -31,8 +33,12 @@ vi.mock('@/hooks/queries/organization-accounts', () => ({ ], }, }), - useResendOrganizationAccountInvitation: () => ({ mutate: mocks.resend }), - useRevokeOrganizationAccountEnrollment: () => ({ mutate: mocks.revoke, reset: mocks.reset }), + useResendOrganizationAccountInvitation: () => ({ ...mocks.resendState, mutate: mocks.resend }), + useRevokeOrganizationAccountEnrollment: () => ({ + ...mocks.revokeState, + mutate: mocks.revoke, + reset: mocks.reset, + }), useReconnectPersonalOrganizationAccount: () => ({}), useDisconnectPersonalOrganizationAccount: () => ({ mutate: mocks.disconnect, @@ -51,6 +57,10 @@ let root: Root let container: HTMLDivElement beforeEach(() => { vi.clearAllMocks() + mocks.resendState.isPending = false + mocks.resendState.error = null + mocks.revokeState.isPending = false + mocks.revokeState.error = null vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) mocks.people.mockReturnValue({ data: { @@ -105,6 +115,20 @@ async function openConfirmation(label: string) { else await act(async () => button(container, label).click()) } +async function renderPeople() { + await act(async () => + root.render( + + + + + + + + ) + ) +} + it('keeps the compact People rows and resends from the actions menu', async () => { await act(async () => root.render( @@ -268,3 +292,105 @@ it('retains loaded people and retries only the failed next page', async () => { expect(fetchNextPage).toHaveBeenCalledOnce() expect(refetch).not.toHaveBeenCalled() }) + +it('does not claim an empty result while the first page is loading', async () => { + mocks.people.mockReturnValue({ isPending: true, isFetching: true }) + await renderPeople() + + expect(container.querySelector('input[placeholder="Search people..."]')).toBeEnabled() + expect(container.textContent).not.toContain('No people invited yet') + expect(container.textContent).not.toContain('No people match your search') + expect(container.textContent).not.toContain('People (0)') +}) + +it('offers requests from an empty configured pool', async () => { + mocks.people.mockReturnValue({ data: { pages: [{ enrollments: [] }] }, hasNextPage: false }) + await renderPeople() + + expect(container.textContent).toContain('No people invited yet') + expect(button(container, 'Request connections')).toBeEnabled() +}) + +it('hides cached people after a first-page authorization failure and offers a retry', async () => { + const refetch = vi.fn() + mocks.people.mockReturnValue({ + ...mocks.people(), + error: new Error('Access denied'), + isFetchNextPageError: false, + refetch, + }) + await renderPeople() + + expect(container.textContent).not.toContain('person@example.com') + expect(container.textContent).toContain('Access denied') + await act(async () => button(container, 'Try again').click()) + expect(refetch).toHaveBeenCalledOnce() +}) + +it('keeps loaded people and disables duplicate requests while the next page is loading', async () => { + const fetchNextPage = vi.fn() + mocks.people.mockReturnValue({ + ...mocks.people(), + hasNextPage: true, + isFetchingNextPage: true, + fetchNextPage, + }) + await renderPeople() + + expect(container.textContent).toContain('person@example.com') + expect(button(container, 'Loading...')).toBeDisabled() + await act(async () => button(container, 'Loading...').click()) + expect(fetchNextPage).not.toHaveBeenCalled() +}) + +it('keeps resend failures actionable and prevents another operation during a resend', async () => { + mocks.resendState.error = new Error('Invitation service unavailable') + await renderPeople() + expect(container.textContent).toContain('Invitation service unavailable') + expect(container.textContent).toContain('person@example.com') + await selectPersonAction('Resend') + expect(mocks.resend).toHaveBeenCalledOnce() + + mocks.resendState.error = null + mocks.resendState.isPending = true + await renderPeople() + expect(button(container, 'Request connections')).toBeDisabled() + await selectPersonAction('Revoke') + expect(document.querySelector('[role="dialog"]')).toBeNull() + expect(mocks.revoke).not.toHaveBeenCalled() +}) + +it('keeps a failed revoke confirmation open for retry and blocks dismissal while pending', async () => { + await renderPeople() + await selectPersonAction('Revoke') + let dialog = document.querySelector('[role="dialog"]') + if (!dialog) throw new Error('Missing revoke confirmation') + await act(async () => button(dialog!, 'Revoke').click()) + expect(mocks.revoke).toHaveBeenCalledOnce() + + mocks.revokeState.isPending = true + await renderPeople() + dialog = document.querySelector('[role="dialog"]') + if (!dialog) throw new Error('Missing revoke confirmation') + expect(button(dialog, 'Cancel')).toBeDisabled() + expect(button(dialog, 'Revoking…')).toBeDisabled() + await act(async () => { + button(dialog!, 'Cancel').click() + document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })) + }) + expect(document.querySelector('[role="dialog"]')).not.toBeNull() + + mocks.revokeState.isPending = false + mocks.revokeState.error = new Error('Could not revoke access') + await renderPeople() + dialog = document.querySelector('[role="dialog"]') + if (!dialog) throw new Error('Missing revoke confirmation') + expect(dialog.textContent).toContain('Could not revoke access') + expect(button(dialog, 'Revoke')).toBeEnabled() + await act(async () => button(dialog!, 'Revoke').click()) + expect(mocks.revoke).toHaveBeenCalledTimes(2) + expect(mocks.revoke.mock.calls[1][0]).toEqual({ + organizationId: 'organization-1', + enrollmentId: 'enrollment-1', + }) +}) diff --git a/apps/sim/hooks/queries/oauth/oauth-credentials.test.ts b/apps/sim/hooks/queries/oauth/oauth-credentials.test.ts new file mode 100644 index 00000000000..7de3f37daf2 --- /dev/null +++ b/apps/sim/hooks/queries/oauth/oauth-credentials.test.ts @@ -0,0 +1,141 @@ +/** @vitest-environment node */ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ request: vi.fn() })) +vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.request })) +vi.mock('@/hooks/queries/credentials', () => ({ useWorkspaceCredential: vi.fn() })) + +import { listOAuthCredentialsContract } from '@/lib/api/contracts' +import { + listOrganizationCredentialsContract, + listOrganizationOAuthCredentialsContract, +} from '@/lib/api/contracts/organization-credentials' +import { fetchOAuthCredentials } from '@/hooks/queries/oauth/oauth-credentials' + +beforeEach(() => { + mocks.request.mockReset() +}) + +describe('connector credential listing', () => { + it('loads organization OAuth and mapped service accounts concurrently with exact scope and cancellation', async () => { + const oauth = { + id: 'oauth-1', + name: 'Personal Drive', + provider: 'google-drive', + type: 'oauth', + scopes: ['https://www.googleapis.com/auth/drive'], + } as const + const account = { + id: 'service-1', + displayName: 'Search service account', + providerId: 'google-service-account', + type: 'service_account', + } as const + const oauthResponse = Promise.withResolvers<{ credentials: (typeof oauth)[] }>() + const accountResponse = Promise.withResolvers<{ credentials: (typeof account)[] }>() + mocks.request.mockImplementation((contract) => { + if (contract === listOrganizationOAuthCredentialsContract) return oauthResponse.promise + if (contract === listOrganizationCredentialsContract) return accountResponse.promise + throw new Error('Unexpected credential request') + }) + const signal = new AbortController().signal + + const result = fetchOAuthCredentials( + { organizationId: 'org-1', providerId: 'google-drive' }, + signal + ) + + expect(mocks.request).toHaveBeenCalledTimes(2) + expect(mocks.request).toHaveBeenCalledWith(listOrganizationOAuthCredentialsContract, { + query: { organizationId: 'org-1', providerId: 'google-drive' }, + signal, + }) + expect(mocks.request).toHaveBeenCalledWith(listOrganizationCredentialsContract, { + query: { + organizationId: 'org-1', + type: 'service_account', + providerId: 'google-service-account', + }, + signal, + }) + oauthResponse.resolve({ credentials: [oauth] }) + accountResponse.resolve({ credentials: [account] }) + + const credentials = await result + expect(credentials).toHaveLength(2) + expect(credentials[0]).toBe(oauth) + expect(credentials[0].scopes).toEqual(oauth.scopes) + expect(credentials[1]).toMatchObject({ + id: 'service-1', + name: 'Search service account', + type: 'service_account', + }) + expect(credentials[1]).not.toHaveProperty('displayName') + }) + + it('does not request service accounts for a provider without service-account support', async () => { + const credential = { id: 'chat-1', name: 'Personal Chat', provider: 'google-chat' } + mocks.request.mockResolvedValue({ credentials: [credential] }) + + await expect( + fetchOAuthCredentials({ organizationId: 'org-1', providerId: 'google-chat' }) + ).resolves.toEqual([credential]) + expect(mocks.request).toHaveBeenCalledOnce() + expect(mocks.request).toHaveBeenCalledWith(listOrganizationOAuthCredentialsContract, { + query: { organizationId: 'org-1', providerId: 'google-chat' }, + signal: undefined, + }) + }) + + it.each([{ workspaceId: 'workspace-1' }, { workflowId: 'workflow-1' }])( + 'rejects organization requests with conflicting scope %o before querying', + async (conflictingScope) => { + await expect( + fetchOAuthCredentials({ + organizationId: 'org-1', + providerId: 'google-drive', + ...conflictingScope, + }) + ).rejects.toThrow('Organization credential listing cannot include a workspace or workflow') + expect(mocks.request).not.toHaveBeenCalled() + } + ) + + it('preserves the existing workspace response and workflow context', async () => { + const credentials = [{ id: 'workspace-service', name: 'Shared Drive', type: 'service_account' }] + const signal = new AbortController().signal + mocks.request.mockResolvedValue({ credentials }) + + await expect( + fetchOAuthCredentials( + { workspaceId: 'workspace-1', workflowId: 'workflow-1', providerId: 'google-drive' }, + signal + ) + ).resolves.toBe(credentials) + expect(mocks.request).toHaveBeenCalledOnce() + expect(mocks.request).toHaveBeenCalledWith(listOAuthCredentialsContract, { + query: { workspaceId: 'workspace-1', workflowId: 'workflow-1', provider: 'google-drive' }, + signal, + }) + }) + + it('does not report a partial credential list as successful when service-account access fails', async () => { + const failure = new Error('Access denied') + mocks.request.mockImplementation((contract) => + contract === listOrganizationOAuthCredentialsContract + ? Promise.resolve({ credentials: [] }) + : Promise.reject(failure) + ) + + await expect( + fetchOAuthCredentials({ organizationId: 'org-1', providerId: 'google-drive' }) + ).rejects.toBe(failure) + }) + + it('does not query credentials before a provider is selected', async () => { + await expect( + fetchOAuthCredentials({ organizationId: 'org-1', providerId: '' }) + ).resolves.toEqual([]) + expect(mocks.request).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/hooks/queries/oauth/oauth-credentials.ts b/apps/sim/hooks/queries/oauth/oauth-credentials.ts index 47a06d5dc7a..de71dfe3c48 100644 --- a/apps/sim/hooks/queries/oauth/oauth-credentials.ts +++ b/apps/sim/hooks/queries/oauth/oauth-credentials.ts @@ -1,8 +1,15 @@ import { useQuery } from '@tanstack/react-query' import { requestJson } from '@/lib/api/client/request' import { listOAuthCredentialsContract } from '@/lib/api/contracts' -import { listOrganizationOAuthCredentialsContract } from '@/lib/api/contracts/organization-credentials' -import type { Credential } from '@/lib/oauth' +import { + listOrganizationCredentialsContract, + listOrganizationOAuthCredentialsContract, +} from '@/lib/api/contracts/organization-credentials' +import { + type Credential, + getServiceAccountProviderForProviderId, + type OAuthProvider, +} from '@/lib/oauth' import { useWorkspaceCredential } from '@/hooks/queries/credentials' export const OAUTH_CREDENTIAL_LIST_STALE_TIME = 60 * 1000 @@ -40,12 +47,34 @@ export async function fetchOAuthCredentials( if (organizationId) { if (workspaceId || workflowId) throw new Error('Organization credential listing cannot include a workspace or workflow') - return ( - await requestJson(listOrganizationOAuthCredentialsContract, { + const serviceAccountProviderId = getServiceAccountProviderForProviderId(providerId) + const [oauth, serviceAccounts] = await Promise.all([ + requestJson(listOrganizationOAuthCredentialsContract, { query: { organizationId, providerId }, signal, - }) - ).credentials + }), + serviceAccountProviderId + ? requestJson(listOrganizationCredentialsContract, { + query: { + organizationId, + providerId: serviceAccountProviderId, + type: 'service_account', + }, + signal, + }) + : Promise.resolve({ credentials: [] }), + ]) + return [ + ...oauth.credentials, + ...serviceAccounts.credentials.map( + (credential): Credential => ({ + id: credential.id, + name: credential.displayName, + provider: credential.providerId as OAuthProvider, + type: 'service_account', + }) + ), + ] } const data = await requestJson(listOAuthCredentialsContract, { signal, diff --git a/apps/sim/hooks/use-oauth-return-hooks.test.tsx b/apps/sim/hooks/use-oauth-return-hooks.test.tsx index 49dbe1e2579..92643e32914 100644 --- a/apps/sim/hooks/use-oauth-return-hooks.test.tsx +++ b/apps/sim/hooks/use-oauth-return-hooks.test.tsx @@ -35,6 +35,10 @@ vi.mock('@/hooks/queries/utils/fetch-workspace-credentials', () => ({ requireWorkspaceCredentialListResponse: mocks.requireWorkspaceCredentialListResponse, })) +import { + listOrganizationCredentialsContract, + listOrganizationOAuthCredentialsContract, +} from '@/lib/api/contracts/organization-credentials' import { type OAuthReturnContext, readOAuthReturnContext, @@ -240,8 +244,22 @@ describe('existing source settings OAuth return', () => { queryClient.setQueryData(oauthCredentialKeys.list('google-drive', '', '', 'org-1'), [ { id: 'credential-existing', name: 'Cached account' }, ]) - mocks.requestJson.mockResolvedValue({ - credentials: [{ id: 'credential-existing', name: 'Updated account' }], + mocks.requestJson.mockImplementation(async (contract: unknown) => { + if (contract === listOrganizationOAuthCredentialsContract) { + return { credentials: [{ id: 'credential-existing', name: 'Updated account' }] } + } + if (contract === listOrganizationCredentialsContract) { + return { + credentials: [ + { + id: 'service-account', + displayName: 'Service account', + providerId: 'google-service-account', + }, + ], + } + } + throw new Error('Unexpected account request') }) }) @@ -257,8 +275,18 @@ describe('existing source settings OAuth return', () => { await renderSettings('connector-1') expect(readOAuthReturnContext()).toBeNull() - expect(mocks.requestJson).toHaveBeenCalledOnce() - await vi.waitFor(() => expect(container.textContent).toBe('Updated account')) + expect(mocks.requestJson).toHaveBeenCalledTimes(2) + expect(mocks.requestJson).toHaveBeenCalledWith( + listOrganizationCredentialsContract, + expect.objectContaining({ + query: { + organizationId: 'org-1', + providerId: 'google-service-account', + type: 'service_account', + }, + }) + ) + await vi.waitFor(() => expect(container.textContent).toBe('Updated account, Service account')) }) it('preserves an OAuth return for another source of the same provider', async () => { diff --git a/apps/sim/lib/credentials/application/organization-credentials.test.ts b/apps/sim/lib/credentials/application/organization-credentials.test.ts index c4389bfcd03..2370e8f2216 100644 --- a/apps/sim/lib/credentials/application/organization-credentials.test.ts +++ b/apps/sim/lib/credentials/application/organization-credentials.test.ts @@ -1,5 +1,7 @@ /** @vitest-environment node */ -import { auditMock } from '@sim/testing' +import { account, credential } from '@sim/db/schema' +import { auditMock, dbChainMockFns, queueTableRows, resetDbChainMock } from '@sim/testing' +import { and, desc, eq, isNull, or } from 'drizzle-orm' import { beforeEach, describe, expect, it, vi } from 'vitest' import { OrchestrationError } from '@/lib/core/orchestration/types' @@ -51,6 +53,8 @@ vi.mock('@/lib/oauth/utils', () => ({ import { createOrganizationCredential, launchOrganizationCredentialConnection, + listOrganizationCredentials, + organizationCredentialOperations, resolveOrganizationCredentialTokenBundle, saveOrganizationCredentialDraft, updateOrganizationCredential, @@ -70,6 +74,7 @@ const row = { describe('organization connection application boundary', () => { beforeEach(() => { vi.clearAllMocks() + resetDbChainMock() mocks.authorize.mockResolvedValue({ organizationId: 'org-1', userId: 'admin-1', role: 'admin' }) mocks.catalog.mockResolvedValue([]) mocks.create.mockResolvedValue({ success: true, created: true, credential: row }) @@ -78,6 +83,119 @@ describe('organization connection application boundary', () => { mocks.resolveToken.mockResolvedValue({ accessToken: 'token' }) mocks.update.mockResolvedValue({ success: true, updatedFields: ['description'] }) }) + + it('lists each linked OAuth account’s granted scopes without combining provider grants', async () => { + mocks.catalog.mockResolvedValue([ + { + type: 'oauth', + available: true, + authorizationOptions: [{ providerId: 'google-drive' }], + }, + ]) + queueTableRows(credential, [ + { + ...row, + id: 'credential-full', + accountId: 'account-full', + type: 'oauth', + providerId: 'google-drive', + accountScope: ' drive.readonly\t drive.metadata.readonly,openid ', + }, + { + ...row, + id: 'credential-limited', + accountId: 'account-limited', + type: 'oauth', + providerId: 'google-drive', + accountScope: 'openid', + }, + ]) + + const input = { organizationId: 'org-1', type: 'oauth' as const, providerId: 'google-drive' } + const result = await listOrganizationCredentials.execute({ principal, input }) + + expect(result.credentials.map(({ id, scopes }) => ({ id, scopes }))).toEqual([ + { + id: 'credential-full', + scopes: ['drive.readonly', 'drive.metadata.readonly', 'openid'], + }, + { id: 'credential-limited', scopes: ['openid'] }, + ]) + expect(result.credentials.every((item) => !Object.hasOwn(item, 'accountScope'))).toBe(true) + expect(mocks.authorize).toHaveBeenCalledWith( + principal, + organizationCredentialOperations.list, + input + ) + expect(dbChainMockFns.leftJoin).toHaveBeenCalledWith( + account, + eq(credential.accountId, account.id) + ) + expect(dbChainMockFns.where).toHaveBeenCalledWith( + and( + and(eq(credential.organizationId, 'org-1'), isNull(credential.workspaceId)), + or( + eq(credential.type, 'service_account'), + and(eq(credential.type, 'oauth'), eq(credential.createdBy, 'admin-1')) + ), + eq(credential.type, 'oauth'), + eq(credential.providerId, 'google-drive') + ) + ) + expect(dbChainMockFns.orderBy).toHaveBeenCalledWith(desc(credential.createdAt)) + expect(dbChainMockFns.limit).toHaveBeenCalledWith(1000) + }) + + it.each([null, '', ' \t\n '])( + 'does not invent grants when account scopes are %j', + async (scope) => { + mocks.catalog.mockResolvedValue([ + { type: 'oauth', available: true, authorizationOptions: [{ providerId: 'google-drive' }] }, + ]) + queueTableRows(credential, [ + { ...row, type: 'oauth', providerId: 'google-drive', accountScope: scope }, + ]) + + const result = await listOrganizationCredentials.execute({ + principal, + input: { organizationId: 'org-1', type: 'oauth' }, + }) + + expect(result.credentials).toEqual([expect.objectContaining({ scopes: [] })]) + } + ) + + it('keeps service accounts in the general list and excludes unavailable providers', async () => { + mocks.catalog.mockResolvedValue([ + { type: 'service_account', available: true, providerId: 'google-service-account' }, + { type: 'oauth', available: false, authorizationOptions: [{ providerId: 'google-drive' }] }, + ]) + queueTableRows(credential, [ + { ...row, accountScope: null }, + { ...row, id: 'hidden', type: 'oauth', providerId: 'google-drive', accountScope: 'openid' }, + { ...row, id: 'unknown', providerId: null, accountScope: null }, + ]) + + const result = await listOrganizationCredentials.execute({ + principal, + input: { organizationId: 'org-1' }, + }) + + expect(result.credentials).toEqual([{ ...row, scopes: [] }]) + }) + + it('refuses an unauthorized organization list before reading accounts or provider availability', async () => { + mocks.authorize.mockRejectedValue( + new OrchestrationError('forbidden', 'Organization administrator access is required') + ) + + await expect( + listOrganizationCredentials.execute({ principal, input: { organizationId: 'org-1' } }) + ).rejects.toThrow('administrator') + + expect(dbChainMockFns.select).not.toHaveBeenCalled() + expect(mocks.catalog).not.toHaveBeenCalled() + }) it('creates a verified organization service account without a workspace identity', async () => { const input = { organizationId: 'org-1', diff --git a/apps/sim/lib/credentials/application/organization-credentials.ts b/apps/sim/lib/credentials/application/organization-credentials.ts index e92f3de32ad..599ada36385 100644 --- a/apps/sim/lib/credentials/application/organization-credentials.ts +++ b/apps/sim/lib/credentials/application/organization-credentials.ts @@ -1,8 +1,8 @@ import { AuditAction, AuditResourceType, recordAudit } from '@sim/audit' import type { Principal } from '@sim/auth/principal' import { db } from '@sim/db' -import { credential } from '@sim/db/schema' -import { and, desc, eq, or } from 'drizzle-orm' +import { account, credential } from '@sim/db/schema' +import { and, desc, eq, getTableColumns, or } from 'drizzle-orm' import type { CreateOrganizationCredentialBody, CreateOrganizationCredentialDraftBody, @@ -79,7 +79,7 @@ export const organizationCredentialOperations = { export const listOrganizationCredentials: OperationUseCase< typeof organizationCredentialOperations.list, OrganizationCredentialsQuery, - { credentials: CredentialRow[] } + { credentials: (CredentialRow & { scopes: string[] })[] } > = { operation: organizationCredentialOperations.list, async execute({ principal, input }) { @@ -90,8 +90,9 @@ export const listOrganizationCredentials: OperationUseCase< ) const catalog = await listCredentialProviderCatalog(principal, input) const rows = await db - .select() + .select({ ...getTableColumns(credential), accountScope: account.scope }) .from(credential) + .leftJoin(account, eq(credential.accountId, account.id)) .where( and( resourceScopeCondition(credential, { @@ -109,16 +110,21 @@ export const listOrganizationCredentials: OperationUseCase< .orderBy(desc(credential.createdAt)) .limit(1000) return { - credentials: rows.filter((row) => { - if (!row.providerId) return false - return catalog.some( - (entry) => - entry.available && - (entry.type === 'service_account' - ? entry.providerId === row.providerId - : entry.authorizationOptions.some((option) => option.providerId === row.providerId)) - ) - }), + credentials: rows + .filter((row) => { + if (!row.providerId) return false + return catalog.some( + (entry) => + entry.available && + (entry.type === 'service_account' + ? entry.providerId === row.providerId + : entry.authorizationOptions.some((option) => option.providerId === row.providerId)) + ) + }) + .map(({ accountScope, ...row }) => ({ + ...row, + scopes: row.type === 'oauth' ? (accountScope?.split(/[\s,]+/).filter(Boolean) ?? []) : [], + })), } }, } diff --git a/apps/sim/lib/knowledge/orchestration/connector-access.test.ts b/apps/sim/lib/knowledge/orchestration/connector-access.test.ts index 494ec6b48a9..8e8f3e82c40 100644 --- a/apps/sim/lib/knowledge/orchestration/connector-access.test.ts +++ b/apps/sim/lib/knowledge/orchestration/connector-access.test.ts @@ -557,6 +557,138 @@ describe('performUpdateKnowledgeConnectorAccess', () => { expect(mocks.dispatchSync).not.toHaveBeenCalled() }) + it.each([ + { accessMode: 'admin' as const, credentialId: 'revoked-credential' }, + { accessMode: 'admin' as const, credentialId: null }, + { accessMode: 'workspace' as const, credentialId: 'revoked-credential' }, + { accessMode: 'workspace' as const, credentialId: null }, + ])( + 'replaces a disabled $accessMode credential ($credentialId) without resuming the source', + async ({ accessMode, credentialId }) => { + const disabled = { + ...WORKSPACE_CONNECTOR, + accessMode, + credentialId, + status: 'disabled', + consecutiveFailures: 10, + lastSyncError: 'Auto-disabled after repeated authentication failures', + lastSyncAt: new Date('2026-08-01T00:00:00Z'), + listingCheckpoint: { pageToken: 'old-listing' }, + directoryCheckpoint: { pageToken: 'old-directory' }, + } + queueTableRows(schemaMock.knowledgeConnector, [disabled]) + dbChainMockFns.returning.mockResolvedValueOnce([ + { ...disabled, credentialId: 'cred-2', lastSyncAt: null }, + ]) + + const outcome = await switchTo({ accessMode, credentialId: 'cred-2' }) + + expect(outcome).toMatchObject({ + success: true, + changed: true, + connector: { + credentialId: 'cred-2', + status: 'disabled', + consecutiveFailures: 10, + lastSyncError: disabled.lastSyncError, + }, + }) + expect(dbChainMockFns.update).toHaveBeenCalledOnce() + expect(dbChainMockFns.set).toHaveBeenCalledWith({ + credentialId: 'cred-2', + lastSyncAt: null, + listingCheckpoint: null, + directoryCheckpoint: null, + nextSyncAt: expect.any(Date), + updatedAt: expect.any(Date), + }) + const condition = dbChainMockFns.where.mock.calls.at(-1)?.[0] + expect( + hasMockCondition( + condition, + (node: MockCondition) => + node.type === 'inArray' && + node.column === schemaMock.knowledgeConnector.status && + Array.isArray(node.values) && + node.values.includes('disabled') + ) + ).toBe(true) + for (const [column, value] of [ + [schemaMock.knowledgeConnector.id, 'c-1'], + [schemaMock.knowledgeConnector.knowledgeBaseId, 'kb-1'], + [schemaMock.knowledgeConnector.status, 'disabled'], + ]) { + expect( + hasMockCondition( + condition, + (node: MockCondition) => + node.type === 'eq' && node.left === column && node.right === value + ) + ).toBe(true) + } + for (const column of [ + schemaMock.knowledgeConnector.syncLockToken, + schemaMock.knowledgeConnector.archivedAt, + schemaMock.knowledgeConnector.deletedAt, + ]) { + expect( + hasMockCondition( + condition, + (node: MockCondition) => node.type === 'isNull' && node.column === column + ) + ).toBe(true) + } + expect(resolveBillingAttribution).not.toHaveBeenCalled() + expect(mocks.dispatchSync).not.toHaveBeenCalled() + expect(mocks.dispatchMemberSync).not.toHaveBeenCalled() + expect(mocks.rewriteAcls).not.toHaveBeenCalled() + expect(mocks.grant).not.toHaveBeenCalled() + expect(mocks.revoke).not.toHaveBeenCalled() + } + ) + + it('refuses a disabled credential replacement when Resume acquires the row first', async () => { + const disabled = { ...WORKSPACE_CONNECTOR, accessMode: 'admin', status: 'disabled' } + queueTableRows(schemaMock.knowledgeConnector, [disabled]) + queueTableRows(schemaMock.knowledgeConnector, [ + { ...disabled, status: 'syncing', syncLockToken: 'run-1' }, + ]) + dbChainMockFns.returning.mockResolvedValueOnce([]) + + const outcome = await switchTo({ accessMode: 'admin', credentialId: 'cred-2' }) + + expect(outcome).toEqual({ + success: false, + error: 'Sync already in progress', + errorCode: 'conflict', + }) + expect(dbChainMockFns.update).toHaveBeenCalledOnce() + expect(mocks.dispatchSync).not.toHaveBeenCalled() + expect(mocks.dispatchMemberSync).not.toHaveBeenCalled() + }) + + it('still refuses access-mode switches while a source is disabled', async () => { + queueTableRows(schemaMock.knowledgeConnector, [{ ...WORKSPACE_CONNECTOR, status: 'disabled' }]) + dbChainMockFns.returning.mockResolvedValueOnce([]) + + const outcome = await switchTo({ accessMode: 'admin', credentialId: 'cred-2' }) + + expect(outcome).toMatchObject({ success: false, errorCode: 'conflict' }) + expect( + hasMockCondition( + dbChainMockFns.where.mock.calls.at(-1)?.[0], + (node: MockCondition) => + node.type === 'inArray' && + node.column === schemaMock.knowledgeConnector.status && + Array.isArray(node.values) && + !node.values.includes('disabled') + ) + ).toBe(true) + expect(mocks.rewriteAcls).not.toHaveBeenCalled() + expect(mocks.dispatchSync).not.toHaveBeenCalled() + expect(mocks.dispatchMemberSync).not.toHaveBeenCalled() + }) + it('leaves a paused connector paused and queues nothing', async () => { queueTableRows(schemaMock.knowledgeConnector, [{ ...WORKSPACE_CONNECTOR, status: 'paused' }]) queueGroupRow('option-1') diff --git a/apps/sim/lib/knowledge/orchestration/connector-access.ts b/apps/sim/lib/knowledge/orchestration/connector-access.ts index c267dbeb11f..0612398729d 100644 --- a/apps/sim/lib/knowledge/orchestration/connector-access.ts +++ b/apps/sim/lib/knowledge/orchestration/connector-access.ts @@ -280,8 +280,9 @@ export async function performUpdateKnowledgeConnectorAccess( * moves no document's visibility, so the lease is not taken. It does change * what the source shows: the new credential may see a different corpus, and * only a full listing reconciles that, so the incremental watermark is - * dropped and a sync queued. The write refuses while a sync owns the row, - * whose terminal write would otherwise put the watermark straight back. + * dropped and a sync queued unless the source is paused or disabled. The + * write refuses while a sync owns the row, whose terminal write would + * otherwise put the watermark straight back. */ if (target.accessMode !== 'members' && target.accessMode === existing.accessMode) { const now = new Date() @@ -299,7 +300,7 @@ export async function performUpdateKnowledgeConnectorAccess( and( eq(knowledgeConnector.id, connectorId), eq(knowledgeConnector.knowledgeBaseId, kb.id), - inArray(knowledgeConnector.status, SWITCHABLE_CONNECTOR_STATUSES), + inArray(knowledgeConnector.status, [...SWITCHABLE_CONNECTOR_STATUSES, 'disabled']), eq(knowledgeConnector.status, existing.status), isNull(knowledgeConnector.syncLockToken), isNull(knowledgeConnector.archivedAt), @@ -315,7 +316,7 @@ export async function performUpdateKnowledgeConnectorAccess( } logger.info(`[${requestId}] Changed the credential of connector ${connectorId}`) const { encryptedApiKey: _secret, ...connector } = updated - if (existing.status !== 'paused') { + if (existing.status !== 'paused' && existing.status !== 'disabled') { await dispatchContentSyncBestEffort(connectorId, params, requestId, now) } return { success: true, connector, changed: true } From 63d1b166bced4e828281fd7f7a48991b1682ee31 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 15:50:30 -0700 Subject: [PATCH 08/14] fix(settings): gate organization view with search rollout --- .../app/o/[organizationId]/home/page.test.tsx | 6 +- .../app/o/[organizationId]/layout.test.tsx | 20 ++ apps/sim/app/o/[organizationId]/layout.tsx | 9 +- apps/sim/app/o/[organizationId]/page.tsx | 4 +- .../settings/[section]/page.test.tsx | 70 ++++- .../[workspaceId]/settings/[section]/page.tsx | 2 +- .../settings-sidebar.test.tsx | 268 ++++++++++++++++++ .../settings-sidebar/settings-sidebar.tsx | 73 ++--- .../sidebar-footer/sidebar-footer.test.tsx | 27 ++ .../sidebar-footer/sidebar-footer.tsx | 4 +- apps/sim/lib/api/contracts/workspaces.ts | 2 + apps/sim/lib/workspaces/host-context.test.ts | 64 +++++ apps/sim/lib/workspaces/host-context.ts | 11 +- 13 files changed, 510 insertions(+), 50 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.test.tsx diff --git a/apps/sim/app/o/[organizationId]/home/page.test.tsx b/apps/sim/app/o/[organizationId]/home/page.test.tsx index 4bbd38322b6..a7bd68be0cc 100644 --- a/apps/sim/app/o/[organizationId]/home/page.test.tsx +++ b/apps/sim/app/o/[organizationId]/home/page.test.tsx @@ -99,9 +99,11 @@ describe('organization Search page gates', () => { expect(mocks.context).not.toHaveBeenCalled() }) - it('keeps the organization entry in organization settings when Search is disabled', async () => { + it('returns the organization entry to workspace settings when Search is disabled', async () => { mocks.context.mockResolvedValue({ searchAccess: { memberScoped: false } }) - await expect(OrganizationPage({ params })).rejects.toThrow('redirect:/o/org-1/settings/members') + await expect(OrganizationPage({ params })).rejects.toThrow( + 'redirect:/workspace?redirect=settings' + ) expect(mocks.context).toHaveBeenCalledWith('org-1', 'viewer') }) diff --git a/apps/sim/app/o/[organizationId]/layout.test.tsx b/apps/sim/app/o/[organizationId]/layout.test.tsx index 928ea29c200..b2df2bfe028 100644 --- a/apps/sim/app/o/[organizationId]/layout.test.tsx +++ b/apps/sim/app/o/[organizationId]/layout.test.tsx @@ -60,6 +60,7 @@ const mockGetSession = authMockFns.mockGetSession const SURFACE_CONTEXT = { organization: { id: 'org-1', name: 'Acme', slug: 'acme', logo: null, memberCount: 1 }, viewer: { role: 'member', isAdmin: false }, + searchAccess: { memberScoped: true, sourceMirrored: true }, } describe('OrganizationLayout', () => { @@ -111,4 +112,23 @@ describe('OrganizationLayout', () => { expect(html).not.toContain('Secret organization child') expect(mockWorkspaceChrome).not.toHaveBeenCalled() }) + + it.each(['owner', 'admin', 'member'])( + 'returns %s viewers outside the rollout to workspace settings before rendering org chrome', + async (role) => { + mockGetOrganizationSurfaceContext.mockResolvedValue({ + ...SURFACE_CONTEXT, + viewer: { role, isAdmin: role !== 'member' }, + searchAccess: { memberScoped: false, sourceMirrored: true }, + }) + + await expect( + OrganizationLayout({ + children:
    Organization settings
    , + params: Promise.resolve({ organizationId: 'org-1' }), + }) + ).rejects.toThrow('redirect:/workspace?redirect=settings') + expect(mockWorkspaceChrome).not.toHaveBeenCalled() + } + ) }) diff --git a/apps/sim/app/o/[organizationId]/layout.tsx b/apps/sim/app/o/[organizationId]/layout.tsx index afca4d4025f..a95608759ae 100644 --- a/apps/sim/app/o/[organizationId]/layout.tsx +++ b/apps/sim/app/o/[organizationId]/layout.tsx @@ -2,7 +2,7 @@ import { dehydrate, HydrationBoundary } from '@tanstack/react-query' import { cookies } from 'next/headers' import { redirect } from 'next/navigation' import { getSession } from '@/lib/auth' -import { organizationRoutes } from '@/lib/navigation/paths' +import { organizationRoutes, WORKSPACE_SETTINGS_PATH } from '@/lib/navigation/paths' import { getOrganizationSurfaceContext } from '@/lib/organizations/surface' import { prefetchUserProfile } from '@/lib/users/prefetch-user-profile' import { getQueryClient } from '@/app/_shell/providers/get-query-client' @@ -15,9 +15,9 @@ import { GlobalCommandsProvider } from '@/app/workspace/[workspaceId]/providers/ /** * The organization surface: the viewer's own view of one organization, outside - * any workspace. Membership in the routed organization is the whole gate — a - * non-member gets an explicit denial rather than a redirect, so a stale link - * never bounces someone into a different organization. + * any workspace. Requires membership and the organization's Search rollout. + * Non-members get an explicit denial; members outside the rollout retain + * workspace settings, including when following a saved organization link. */ export default async function OrganizationLayout({ children, @@ -49,6 +49,7 @@ export default async function OrganizationLayout({ if (!context) { return } + if (!context.searchAccess.memberScoped) redirect(WORKSPACE_SETTINGS_PATH) const initialSidebarCollapsed = cookieStore.get('sidebar_collapsed')?.value === '1' diff --git a/apps/sim/app/o/[organizationId]/page.tsx b/apps/sim/app/o/[organizationId]/page.tsx index cc544bd0371..fd6726efd4f 100644 --- a/apps/sim/app/o/[organizationId]/page.tsx +++ b/apps/sim/app/o/[organizationId]/page.tsx @@ -1,6 +1,6 @@ import { notFound, redirect } from 'next/navigation' import { getSession } from '@/lib/auth' -import { organizationRoutes } from '@/lib/navigation/paths' +import { organizationRoutes, WORKSPACE_SETTINGS_PATH } from '@/lib/navigation/paths' import { getOrganizationSurfaceContext } from '@/lib/organizations/surface' import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect' @@ -17,5 +17,5 @@ export default async function OrganizationPage({ } const context = await getOrganizationSurfaceContext(organizationId, session.user.id) if (!context) notFound() - redirect(context.searchAccess.memberScoped ? routes.home : routes.settingsSection('members')) + redirect(context.searchAccess.memberScoped ? routes.home : WORKSPACE_SETTINGS_PATH) } diff --git a/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.test.tsx b/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.test.tsx index 16b97e2c87d..2a5498831fb 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.test.tsx @@ -41,7 +41,22 @@ vi.mock('@/app/workspace/[workspaceId]/settings/navigation', () => ({ resolveSettingsSection: vi.fn((section: string) => { const aliases: Record = { subscription: 'billing' } const id = aliases[section] ?? section - return ['general', 'billing', 'secrets'].includes(id) ? { id, meta: { title: id } } : null + return [ + 'general', + 'billing', + 'secrets', + 'organization', + 'usage', + 'access-control', + 'audit-logs', + 'sso', + 'sessions', + 'data-retention', + 'data-drains', + 'whitelabeling', + ].includes(id) + ? { id, meta: { title: id } } + : null }), })) vi.mock('@/app/workspace/[workspaceId]/settings/[section]/prefetch', () => ({ @@ -51,6 +66,7 @@ vi.mock('@/app/workspace/[workspaceId]/settings/[section]/settings', () => ({ SettingsPage: vi.fn(() => null), })) +import { UNIFIED_TO_ORGANIZATION_SECTION } from '@/components/settings/navigation' import WorkspaceSettingsSectionPage from '@/app/workspace/[workspaceId]/settings/[section]/page' function pageProps(section: string) { @@ -79,7 +95,10 @@ describe('WorkspaceSettingsSectionPage', () => { }) it('preserves legacy organization settings query state on the canonical org destination', async () => { - mockGetHostContext.mockResolvedValue({ hostOrganizationId: 'org-target' }) + mockGetHostContext.mockResolvedValue({ + hostOrganizationId: 'org-target', + features: { organizationSearch: true }, + }) await expect( WorkspaceSettingsSectionPage({ ...pageProps('subscription'), @@ -91,6 +110,53 @@ describe('WorkspaceSettingsSectionPage', () => { expect(mockSectionPrefetch).not.toHaveBeenCalled() }) + it.each(Object.entries(UNIFIED_TO_ORGANIZATION_SECTION))( + 'keeps %s in the workspace outside the organization rollout', + async (section) => { + mockGetHostContext.mockResolvedValue({ + hostOrganizationId: 'org-target', + features: { organizationSearch: false, knowledgeMemberAccess: true }, + }) + + const element = await WorkspaceSettingsSectionPage(pageProps(section)) + + expect(element).toBeTruthy() + expect(mockRedirect).not.toHaveBeenCalled() + expect(mockAuthorizeSection).toHaveBeenCalledWith({ + workspaceId: 'workspace-b', + userId: 'viewer-a', + section, + }) + } + ) + + it.each([undefined, { credentialGroups: true, knowledgeMemberAccess: true }])( + 'keeps settings in the workspace when older host context omits the org rollout', + async (features) => { + mockGetHostContext.mockResolvedValue({ hostOrganizationId: 'org-target', features }) + + await WorkspaceSettingsSectionPage(pageProps('billing')) + + expect(mockRedirect).not.toHaveBeenCalled() + expect(mockSectionPrefetch).toHaveBeenCalledTimes(1) + } + ) + + it.each(Object.entries(UNIFIED_TO_ORGANIZATION_SECTION))( + 'routes %s to organization %s only within the organization rollout', + async (section, organizationSection) => { + mockGetHostContext.mockResolvedValue({ + hostOrganizationId: 'org-target', + features: { organizationSearch: true, knowledgeMemberAccess: false }, + }) + + await expect(WorkspaceSettingsSectionPage(pageProps(section))).rejects.toThrow( + `NEXT_REDIRECT:/o/org-target/settings/${organizationSection}` + ) + expect(mockSectionPrefetch).not.toHaveBeenCalled() + } + ) + it('conceals inaccessible workspaces and platform-only sections', async () => { mockAuthorizeSection.mockResolvedValue({ allowed: false, disposition: 'not-found' }) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.tsx b/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.tsx index 34ce91bc3e3..04ba51f88e6 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/[section]/page.tsx @@ -60,7 +60,7 @@ export default async function WorkspaceSettingsSectionPage({ const organizationSection = UNIFIED_TO_ORGANIZATION_SECTION[parsed] if (organizationSection) { const hostContext = await getWorkspaceHostContextForViewer(workspaceId, session.user.id) - if (hostContext?.hostOrganizationId) { + if (hostContext?.hostOrganizationId && hostContext.features?.organizationSearch) { const query = new URLSearchParams() for (const [key, value] of Object.entries((await searchParams) ?? {})) { for (const entry of Array.isArray(value) ? value : value === undefined ? [] : [value]) { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.test.tsx new file mode 100644 index 00000000000..aa586968481 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.test.tsx @@ -0,0 +1,268 @@ +/** + * @vitest-environment jsdom + */ +import { act, type ComponentProps } from 'react' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { DeploymentShape, WorkspaceHostContext } from '@/lib/api/contracts/workspaces' +import { getSubscriptionAccessState } from '@/lib/billing/client/utils' + +vi.mock('next/navigation', () => ({ + useParams: () => ({ workspaceId: 'workspace-1' }), + usePathname: () => '/workspace/workspace-1/settings/general', + useRouter: () => ({ push: vi.fn(), replace: vi.fn() }), +})) +vi.mock('@/components/settings/settings-intent-link', () => ({ + SettingsIntentLink: ({ + href, + children, + className, + 'aria-current': current, + }: ComponentProps<'a'>) => ( +
    + {children} + + ), +})) +vi.mock('@/lib/auth/auth-client', () => ({ + useSession: () => ({ data: { user: { id: 'viewer-1', role: 'user' } } }), +})) +vi.mock('@/lib/billing/client', () => ({ + getSubscriptionAccessState: (...args: Parameters) => + getSubscriptionAccessState(...args), +})) +vi.mock('@/lib/core/config/deployment-shape', () => ({ + useDeploymentShape: () => deployment, + getDeploymentShape: () => deployment, +})) +vi.mock('@/lib/desktop', () => ({ + hasDesktopSettings: () => false, + hasBrowserAgent: () => false, + hasTerminal: () => false, +})) +vi.mock('@/app/workspace/[workspaceId]/providers/workspace-host-provider', () => ({ + useWorkspaceHostContext: () => hostContext, +})) +vi.mock('@/app/workspace/[workspaceId]/providers/workspace-permissions-provider', () => ({ + useUserPermissionsContext: () => ({ canAdmin: true }), +})) +vi.mock('@/ee/sso/hooks/sso', () => ({ + useSSOProviders: () => ({ data: { providers: [] }, isLoading: false }), +})) +vi.mock('@/ee/workspace-forking/hooks/use-forking-available', () => ({ + useForkingAvailable: () => false, +})) +vi.mock('@/hooks/queries/general-settings', () => ({ + useGeneralSettings: () => ({ data: { superUserModeEnabled: false } }), +})) +vi.mock('@/hooks/queries/inbox', () => ({ + useInboxConfig: () => ({ data: { entitled: true } }), +})) +vi.mock('@/hooks/use-permission-config', () => ({ + usePermissionConfig: () => ({ config: {} }), +})) +vi.mock('@/hooks/use-settings-navigation', () => ({ + useSettingsNavigation: () => ({ + popSettingsReturnUrl: (fallback: string) => fallback, + getSettingsHref: ({ section }: { section: string }) => + `/workspace/workspace-1/settings/${section}`, + }), +})) +vi.mock( + '@/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-query-warmers', + () => ({ warmSettingsSectionQuery: vi.fn() }) +) + +import { SettingsSidebar } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar' +import { useSettingsDirtyStore } from '@/stores/settings/dirty/store' + +const deployment: DeploymentShape = { + hosted: true, + billingEnabled: true, + chatEnabled: true, + azureConfigured: false, + cohereConfigured: false, + features: { + accessControl: true, + auditLogs: true, + customBlocks: true, + dataDrains: true, + dataRetention: true, + inbox: true, + sandboxes: true, + scim: true, + sessionPolicies: true, + sso: true, + usageMonitoring: true, + whitelabeling: true, + }, +} + +function makeHostContext( + role: 'admin' | 'member' | 'external', + organizationSearch?: boolean +): WorkspaceHostContext { + return { + workspace: { + id: 'workspace-1', + name: 'Team workspace', + workspaceMode: 'organization', + billedAccountUserId: 'owner-1', + }, + hostOrganizationId: 'host-org', + ownerBilling: { + plan: 'enterprise', + status: 'active', + isPaid: true, + isPro: false, + isTeam: false, + isEnterprise: true, + isOrgScoped: true, + organizationId: 'host-org', + billingInterval: 'month', + billingBlocked: false, + billingBlockedReason: null, + }, + viewer: { + permission: 'admin', + isHostOrganizationAdmin: role === 'admin', + isHostOrganizationMember: role !== 'external', + organizationRole: role === 'external' ? null : role, + }, + features: { + credentialGroups: true, + organizationSearch, + knowledgeMemberAccess: true, + knowledgeSourceMirroredAccess: true, + }, + deployment, + } +} + +let hostContext: WorkspaceHostContext +let queryClient: QueryClient +let root: Root +let container: HTMLDivElement + +beforeEach(() => { + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + vi.clearAllMocks() + hostContext = makeHostContext('admin', false) + queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + useSettingsDirtyStore.getState().reset() + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) +}) + +afterEach(() => { + act(() => root.unmount()) + container.remove() + queryClient.clear() + useSettingsDirtyStore.getState().reset() +}) + +function renderSidebar() { + act(() => { + root.render( + + + + ) + }) +} + +function workspaceLink(section: string) { + return container.querySelector( + `a[href="/workspace/workspace-1/settings/${section}"]` + ) +} + +function expectWorkspaceLinks() { + expect(workspaceLink('general')).toHaveTextContent('General') + expect(workspaceLink('teammates')).toHaveTextContent('Teammates') + expect(workspaceLink('secrets')).toHaveTextContent('Secrets') +} + +describe('workspace SettingsSidebar organization rollout', () => { + it.each([false, undefined])( + 'keeps organization settings in the workspace for an admin when rollout is %s', + (enabled) => { + hostContext = makeHostContext('admin', enabled) + renderSidebar() + + expect(workspaceLink('organization')).toHaveTextContent('Members') + expect(workspaceLink('billing')).toHaveTextContent('Subscription') + expect(workspaceLink('usage')).toHaveTextContent('Usage tracking') + expect(workspaceLink('sso')).toHaveTextContent('Single sign-on') + expect(container.querySelector('a[href^="/o/"]')).toBeNull() + expectWorkspaceLinks() + } + ) + + it('keeps existing settings when an older host context has no features object', () => { + hostContext.features = undefined + renderSidebar() + + expect(workspaceLink('organization')).toHaveTextContent('Members') + expect(workspaceLink('billing')).toHaveTextContent('Subscription') + expect(container.querySelector('a[href^="/o/"]')).toBeNull() + expectWorkspaceLinks() + }) + + it.each(['admin', 'member'] as const)( + 'replaces organization entries with one host organization link for a %s when enabled', + (role) => { + hostContext = makeHostContext(role, true) + renderSidebar() + + const links = container.querySelectorAll('a[href^="/o/"]') + expect(links).toHaveLength(1) + expect(links[0]).toHaveAttribute('href', '/o/host-org/settings/members') + expect(links[0]).toHaveTextContent('Organization') + for (const section of ['organization', 'billing', 'usage', 'sso']) { + expect(workspaceLink(section)).toBeNull() + } + expectWorkspaceLinks() + } + ) + + it('keeps the member roster while preserving admin-only settings restrictions when disabled', () => { + hostContext = makeHostContext('member', false) + renderSidebar() + + expect(workspaceLink('organization')).toHaveTextContent('Members') + for (const section of ['billing', 'usage', 'sso']) { + expect(workspaceLink(section)).toBeNull() + } + expect(container.querySelector('a[href^="/o/"]')).toBeNull() + expectWorkspaceLinks() + }) + + it('preserves plan restrictions without hiding the billing recovery link when disabled', () => { + hostContext.ownerBilling.billingBlocked = true + hostContext.ownerBilling.billingBlockedReason = 'payment_failed' + renderSidebar() + + expect(workspaceLink('billing')).toHaveTextContent('Subscription') + for (const section of ['organization', 'usage', 'sso']) { + expect(workspaceLink(section)).toBeNull() + } + expectWorkspaceLinks() + }) + + it.each([false, true])( + 'keeps external workspace admins out of organization settings when rollout is %s', + (enabled) => { + hostContext = makeHostContext('external', enabled) + renderSidebar() + + expect(container.querySelector('a[href^="/o/"]')).toBeNull() + for (const section of ['organization', 'billing', 'usage', 'sso']) { + expect(workspaceLink(section)).toBeNull() + } + expectWorkspaceLinks() + } + ) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx index e30ead93cb6..5a4012ca158 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-sidebar/settings-sidebar.tsx @@ -130,6 +130,10 @@ export function SettingsSidebar({ const userId = session?.user?.id const isOrgAdminOrOwner = hostContext.viewer.isHostOrganizationAdmin + const organizationSettingsId = + hostContext.features?.organizationSearch && hostContext.viewer.isHostOrganizationMember + ? hostContext.hostOrganizationId + : null const subscriptionAccess = getSubscriptionAccessState(hostContext.ownerBilling) const inboxEntitled = inboxConfig?.entitled ?? false const hasTeamPlan = subscriptionAccess.hasUsableTeamAccess @@ -145,7 +149,11 @@ export function SettingsSidebar({ const navigationItems = useMemo(() => { return allNavigationItems.filter((item) => { - if (hostContext.hostOrganizationId && ORGANIZATION_PLANE_UNIFIED_SECTIONS.has(item.id)) { + if ( + hostContext.hostOrganizationId && + ORGANIZATION_PLANE_UNIFIED_SECTIONS.has(item.id) && + (organizationSettingsId || !hostContext.viewer.isHostOrganizationMember) + ) { return false } if (item.requiresSelfHosted && hosted) { @@ -255,6 +263,7 @@ export function SettingsSidebar({ hostContext, userId, isOrgAdminOrOwner, + organizationSettingsId, isSSOProviderOwner, ssoProvidersData?.providers?.length, permissionConfig, @@ -352,10 +361,7 @@ export function SettingsSidebar({ })) .filter( ({ key, items }) => - items.length > 0 || - (key === 'organization' && - hostContext.hostOrganizationId && - hostContext.viewer.isHostOrganizationMember) + items.length > 0 || (key === 'organization' && organizationSettingsId) ) .map(({ key, title, items: sectionItems }, index) => ( 0 && SIDEBAR_SECTION_GAP_CLASS, 'shrink-0')} >
    - {key === 'organization' && - hostContext.hostOrganizationId && - hostContext.viewer.isHostOrganizationMember && ( - - { - if (!useSettingsDirtyStore.getState().isDirty) return - event.preventDefault() - const organizationId = hostContext.hostOrganizationId - if (organizationId) - requestLeave(() => - router.push(getOrganizationSettingsHref(organizationId, 'members')) - ) - }} - > - - - - - - )} + {key === 'organization' && organizationSettingsId && ( + + { + if (!useSettingsDirtyStore.getState().isDirty) return + event.preventDefault() + requestLeave(() => + router.push( + getOrganizationSettingsHref(organizationSettingsId, 'members') + ) + ) + }} + > + + + + + + )} {sectionItems.map((item) => { const Icon = item.icon const active = activeSection === item.id diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx index 9b4719d1d13..226d06b2986 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx @@ -19,6 +19,10 @@ const { hostContext } = vi.hoisted(() => ({ hostContext: { hostOrganizationId: null as string | null, viewer: { isHostOrganizationMember: false }, + features: { + organizationSearch: undefined as boolean | undefined, + knowledgeMemberAccess: false, + }, }, })) @@ -127,6 +131,8 @@ beforeEach(() => { vi.clearAllMocks() hostContext.hostOrganizationId = null hostContext.viewer.isHostOrganizationMember = false + hostContext.features.organizationSearch = undefined + hostContext.features.knowledgeMemberAccess = false desktopMocks.listener = null desktopMocks.onState.mockImplementation((listener) => { desktopMocks.listener = listener @@ -147,6 +153,7 @@ describe('SidebarFooter', () => { it('links members back to the organization hosting the current workspace', async () => { hostContext.hostOrganizationId = 'host-org' hostContext.viewer.isHostOrganizationMember = true + hostContext.features.organizationSearch = true await renderFooter({ status: 'idle' }) openProfileMenu() @@ -154,8 +161,28 @@ describe('SidebarFooter', () => { expect(menuItem('Organization')).toHaveAttribute('href', '/o/host-org') }) + it.each([false, undefined])( + 'keeps the workspace profile menu when org rollout is %s', + async (enabled) => { + hostContext.hostOrganizationId = 'host-org' + hostContext.viewer.isHostOrganizationMember = true + hostContext.features.organizationSearch = enabled + hostContext.features.knowledgeMemberAccess = true + await renderFooter({ status: 'idle' }) + + openProfileMenu() + + expect(document.querySelector('[role="menu"]')).not.toHaveTextContent('Organization') + expect(menuItem('Settings')).toHaveAttribute( + 'href', + '/workspace/workspace-1/settings/general' + ) + } + ) + it.each([null, 'host-org'])('hides Organization without host membership (%s)', async (orgId) => { hostContext.hostOrganizationId = orgId + hostContext.features.organizationSearch = true await renderFooter({ status: 'idle' }) openProfileMenu() diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx index d012e7f4cd3..ea28df62789 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx @@ -157,7 +157,9 @@ export function SidebarFooter({ const name = profile ? profile.name?.trim() || profile.email : '' const updateAvailable = hasAvailableDesktopUpdate(updateState) const organizationHref = - hostContext.hostOrganizationId && hostContext.viewer.isHostOrganizationMember + hostContext.hostOrganizationId && + hostContext.viewer.isHostOrganizationMember && + hostContext.features?.organizationSearch ? organizationRoutes(hostContext.hostOrganizationId).root : null diff --git a/apps/sim/lib/api/contracts/workspaces.ts b/apps/sim/lib/api/contracts/workspaces.ts index 58fefdd96ed..017c276c6fa 100644 --- a/apps/sim/lib/api/contracts/workspaces.ts +++ b/apps/sim/lib/api/contracts/workspaces.ts @@ -294,6 +294,8 @@ export const workspaceHostContextSchema = z.object({ features: z .object({ credentialGroups: z.boolean(), + /** Optional for rolling compatibility; absent keeps settings in the workspace. */ + organizationSearch: z.boolean().optional(), /** Optional for rolling compatibility with app versions that predate the flag. */ knowledgeMemberAccess: z.boolean().optional(), /** Optional for rolling compatibility with app versions that predate administrator mode. */ diff --git a/apps/sim/lib/workspaces/host-context.test.ts b/apps/sim/lib/workspaces/host-context.test.ts index c118a73b33c..48267466563 100644 --- a/apps/sim/lib/workspaces/host-context.test.ts +++ b/apps/sim/lib/workspaces/host-context.test.ts @@ -7,10 +7,14 @@ const { mockCheckWorkspaceAccess, mockGetWorkspaceOwnerSubscriptionAccess, mockGetOrganizationSettingsAccess, + mockResolveKnowledgeAccessAvailability, + mockIsKnowledgeMemberAccessAvailable, } = vi.hoisted(() => ({ mockCheckWorkspaceAccess: vi.fn(), mockGetWorkspaceOwnerSubscriptionAccess: vi.fn(), mockGetOrganizationSettingsAccess: vi.fn(), + mockResolveKnowledgeAccessAvailability: vi.fn(), + mockIsKnowledgeMemberAccessAvailable: vi.fn(), })) vi.mock('@/lib/credential-groups/scoped-availability', () => ({ @@ -29,6 +33,11 @@ vi.mock('@/lib/billing/core/workspace-access', () => ({ getWorkspaceOwnerSubscriptionAccess: mockGetWorkspaceOwnerSubscriptionAccess, })) +vi.mock('@/lib/knowledge/access/availability', () => ({ + resolveKnowledgeAccessAvailability: mockResolveKnowledgeAccessAvailability, + isKnowledgeMemberAccessAvailable: mockIsKnowledgeMemberAccessAvailable, +})) + import { resolveDeploymentShape } from '@/lib/core/config/deployment-shape' import { getWorkspaceHostContextForViewer } from '@/lib/workspaces/host-context' @@ -72,6 +81,11 @@ describe('getWorkspaceHostContextForViewer', () => { beforeEach(() => { vi.clearAllMocks() mockGetWorkspaceOwnerSubscriptionAccess.mockResolvedValue(OWNER_BILLING) + mockResolveKnowledgeAccessAvailability.mockResolvedValue({ + memberScoped: true, + sourceMirrored: true, + }) + mockIsKnowledgeMemberAccessAvailable.mockResolvedValue(true) }) it('returns host membership and route permission for an internal member', async () => { @@ -97,8 +111,52 @@ describe('getWorkspaceHostContextForViewer', () => { }) ) expect(context?.deployment).toEqual(resolveDeploymentShape()) + expect(context?.features?.organizationSearch).toBe(true) + expect(mockIsKnowledgeMemberAccessAvailable).toHaveBeenCalledExactlyOnceWith({ + organizationId: 'org-host', + }) + expect(mockResolveKnowledgeAccessAvailability).toHaveBeenCalledExactlyOnceWith({ + workspaceId: 'workspace-1', + ownerBilling: OWNER_BILLING, + }) }) + it.each([ + { organizationSearch: true, workspaceKnowledge: false }, + { organizationSearch: false, workspaceKnowledge: true }, + ])( + 'uses organization rollout $organizationSearch independently of workspace knowledge $workspaceKnowledge', + async ({ organizationSearch, workspaceKnowledge }) => { + mockCheckWorkspaceAccess.mockResolvedValue(accessibleWorkspace('admin', 'org-host')) + mockGetOrganizationSettingsAccess.mockResolvedValue({ + role: 'admin', + isMember: true, + isAdmin: true, + }) + mockResolveKnowledgeAccessAvailability.mockResolvedValue({ + memberScoped: workspaceKnowledge, + sourceMirrored: workspaceKnowledge, + }) + mockIsKnowledgeMemberAccessAvailable.mockResolvedValue(organizationSearch) + + const context = await getWorkspaceHostContextForViewer('workspace-1', 'admin-1') + + expect(context?.features).toEqual({ + credentialGroups: true, + organizationSearch, + knowledgeMemberAccess: workspaceKnowledge, + knowledgeSourceMirroredAccess: workspaceKnowledge, + }) + expect(mockIsKnowledgeMemberAccessAvailable).toHaveBeenCalledExactlyOnceWith({ + organizationId: 'org-host', + }) + expect(mockResolveKnowledgeAccessAvailability).toHaveBeenCalledExactlyOnceWith({ + workspaceId: 'workspace-1', + ownerBilling: OWNER_BILLING, + }) + } + ) + it('keeps an external collaborator authorized only by their workspace grant', async () => { mockCheckWorkspaceAccess.mockResolvedValue(accessibleWorkspace('read', 'org-host')) mockGetOrganizationSettingsAccess.mockResolvedValue({ @@ -116,6 +174,8 @@ describe('getWorkspaceHostContextForViewer', () => { organizationRole: null, }) expect(context?.hostOrganizationId).toBe('org-host') + expect(context?.features?.organizationSearch).toBe(false) + expect(mockIsKnowledgeMemberAccessAvailable).not.toHaveBeenCalled() }) it('returns null organization context for a personal workspace', async () => { @@ -140,6 +200,8 @@ describe('getWorkspaceHostContextForViewer', () => { }) ) expect(mockGetOrganizationSettingsAccess).not.toHaveBeenCalled() + expect(context?.features?.organizationSearch).toBe(false) + expect(mockIsKnowledgeMemberAccessAvailable).not.toHaveBeenCalled() }) it('returns null before loading entitlements when the viewer has no access', async () => { @@ -156,5 +218,7 @@ describe('getWorkspaceHostContextForViewer', () => { expect(context).toBeNull() expect(mockGetWorkspaceOwnerSubscriptionAccess).not.toHaveBeenCalled() + expect(mockIsKnowledgeMemberAccessAvailable).not.toHaveBeenCalled() + expect(mockResolveKnowledgeAccessAvailability).not.toHaveBeenCalled() }) }) diff --git a/apps/sim/lib/workspaces/host-context.ts b/apps/sim/lib/workspaces/host-context.ts index e60716ca9ef..df82e3d4829 100644 --- a/apps/sim/lib/workspaces/host-context.ts +++ b/apps/sim/lib/workspaces/host-context.ts @@ -3,7 +3,10 @@ import type { WorkspaceHostContext } from '@/lib/api/contracts/workspaces' import { getWorkspaceOwnerSubscriptionAccess } from '@/lib/billing/core/workspace-access' import { resolveDeploymentShape } from '@/lib/core/config/deployment-shape' import { isScopedCredentialGroupsAvailable } from '@/lib/credential-groups/scoped-availability' -import { resolveKnowledgeAccessAvailability } from '@/lib/knowledge/access/availability' +import { + isKnowledgeMemberAccessAvailable, + resolveKnowledgeAccessAvailability, +} from '@/lib/knowledge/access/availability' import { getOrganizationSettingsAccess } from '@/lib/organizations/settings-access' import { checkWorkspaceAccess } from '@/lib/workspaces/permissions/utils' @@ -30,7 +33,7 @@ async function resolveWorkspaceHostContextForViewer( ? getOrganizationSettingsAccess(hostOrganizationId, userId) : Promise.resolve({ role: null, isMember: false, isAdmin: false }), ]) - const [credentialGroupsAvailable, knowledgeAccess] = await Promise.all([ + const [credentialGroupsAvailable, knowledgeAccess, organizationSearch] = await Promise.all([ hostOrganizationId ? isScopedCredentialGroupsAvailable({ kind: 'organization', @@ -38,6 +41,9 @@ async function resolveWorkspaceHostContextForViewer( }) : Promise.resolve(false), resolveKnowledgeAccessAvailability({ workspaceId, ownerBilling }), + hostOrganizationId && hostOrganizationAccess.isMember + ? isKnowledgeMemberAccessAvailable({ organizationId: hostOrganizationId }) + : Promise.resolve(false), ]) return { @@ -58,6 +64,7 @@ async function resolveWorkspaceHostContextForViewer( }, features: { credentialGroups: credentialGroupsAvailable, + organizationSearch, knowledgeMemberAccess: knowledgeAccess.memberScoped, knowledgeSourceMirroredAccess: knowledgeAccess.sourceMirrored, }, From 96530d669929d3126231bbd85395f4ac00216654 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 18:49:17 -0700 Subject: [PATCH 09/14] improvement(search): organize integration management around providers and sources --- .../[token]/oauth/[optionId]/route.test.ts | 29 +- .../credential-groups/enrollment-redirect.ts | 1 + .../api/credential-groups/oauth-callback.ts | 19 +- .../oauth/[provider]/callback/route.test.ts | 16 +- .../sim-search/integrations/overview/route.ts | 23 + .../sim-search/sources/route.test.ts | 107 +++- .../people/[enrollmentId]/resend/route.ts | 6 +- .../app/credential-groups/complete/page.tsx | 16 +- .../enroll/[token]/page.test.tsx | 66 ++- .../credential-groups/enroll/[token]/page.tsx | 85 ++- .../integrations/integrations.test.tsx | 36 +- .../integrations/integrations.tsx | 52 +- .../organization-integration-catalog.tsx | 130 ++++ ...rganization-integrations-settings.test.tsx | 8 +- .../organization-integrations-settings.tsx | 6 +- .../organization-integrations-setup.test.tsx | 164 ++++++ .../organization-integrations-setup.tsx | 289 ++------- .../organization-search-status.ts | 15 + .../components/integrations/search-params.ts | 5 + .../providers/[connectorType]/layout.tsx | 14 + .../providers/[connectorType]/page.test.tsx | 105 ++++ .../providers/[connectorType]/page.tsx | 48 ++ .../[connectorType]/provider-detail.test.tsx | 370 ++++++++++++ .../[connectorType]/provider-detail.tsx | 362 ++++++++++++ .../[connectorId]/source-detail.test.tsx | 74 ++- .../sources/[connectorId]/source-detail.tsx | 69 ++- .../connect-oauth-modal.test.tsx | 2 + .../connect-oauth-modal.tsx | 2 + .../add-connector-modal.test.tsx | 555 +++++++++++++++++- .../add-connector-modal.tsx | 356 ++++++----- .../connector-access-field.test.tsx | 20 +- .../connector-access-field.tsx | 37 +- .../connector-documents.tsx | 5 + .../knowledge/[id]/components/consts.ts | 3 - .../connector-documents-tab.test.tsx | 23 + .../connector-settings-fields.tsx | 3 +- .../search/components/search-source-row.tsx | 3 + .../components/search-source-setup.test.tsx | 195 +++++- .../search/components/search-source-setup.tsx | 80 ++- .../[workspaceId]/search/search-params.ts | 6 + .../credential-group-invitation-email.tsx | 24 +- .../emails/credential-groups/render.ts | 1 + apps/sim/connectors/confluence/meta.ts | 4 + apps/sim/connectors/github/meta.ts | 6 +- apps/sim/connectors/gitlab/meta.ts | 7 + apps/sim/connectors/gmail/meta.ts | 5 +- apps/sim/connectors/google-calendar/meta.ts | 5 +- apps/sim/connectors/google-drive/meta.ts | 3 + apps/sim/connectors/jira/meta.ts | 4 +- apps/sim/connectors/slack/meta.ts | 3 + apps/sim/connectors/types.ts | 4 +- ...organization-account-invite-modal.test.tsx | 27 +- .../organization-account-invite-modal.tsx | 18 +- .../organization-account-people.test.tsx | 51 ++ .../organization-account-people.tsx | 100 ++-- .../personal-organization-accounts.tsx | 7 +- apps/sim/hooks/queries/kb/connectors.ts | 35 +- .../kb/organization-search-overview.test.tsx | 127 ++++ .../queries/organization-accounts.test.tsx | 46 +- .../hooks/queries/organization-accounts.ts | 27 +- .../sim/hooks/use-oauth-return-hooks.test.tsx | 28 + apps/sim/hooks/use-oauth-return.test.ts | 15 + apps/sim/hooks/use-oauth-return.ts | 20 +- .../use-organization-account-people-search.ts | 17 + .../lib/api/contracts/credential-groups.ts | 2 +- .../lib/api/contracts/knowledge/connectors.ts | 43 ++ .../api/contracts/organization-accounts.ts | 11 +- .../organization-account-management.test.ts | 67 ++- .../organization-account-management.ts | 41 +- .../personal-organization-accounts.test.ts | 11 + .../personal-organization-accounts.ts | 5 +- .../application/public-enrollment.test.ts | 30 + .../application/public-enrollment.ts | 12 +- .../lib/credential-groups/enrollments.test.ts | 34 +- apps/sim/lib/credential-groups/enrollments.ts | 59 +- .../lib/credential-groups/oauth-state.test.ts | 57 +- apps/sim/lib/credential-groups/oauth-state.ts | 10 +- apps/sim/lib/credential-groups/oauth.ts | 2 +- apps/sim/lib/credentials/client-state.ts | 1 + ...rganization-search-overview.integration.ts | 311 ++++++++++ .../search-source-pagination.integration.ts | 8 + .../lib/knowledge/application/operations.ts | 9 + .../organization-search-overview.test.ts | 148 +++++ .../organization-search-overview.ts | 268 +++++++++ .../application/search-source-progress.ts | 2 + .../application/search-sources.test.ts | 27 +- .../knowledge/application/search-sources.ts | 6 + apps/sim/lib/navigation/paths.ts | 2 + 88 files changed, 4424 insertions(+), 731 deletions(-) create mode 100644 apps/sim/app/api/knowledge/sim-search/integrations/overview/route.ts create mode 100644 apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integration-catalog.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/components/integrations/organization-search-status.ts create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/layout.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.test.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx create mode 100644 apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx create mode 100644 apps/sim/hooks/queries/kb/organization-search-overview.test.tsx create mode 100644 apps/sim/hooks/use-organization-account-people-search.ts create mode 100644 apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts create mode 100644 apps/sim/lib/knowledge/application/organization-search-overview.test.ts create mode 100644 apps/sim/lib/knowledge/application/organization-search-overview.ts diff --git a/apps/sim/app/api/credential-groups/enroll/[token]/oauth/[optionId]/route.test.ts b/apps/sim/app/api/credential-groups/enroll/[token]/oauth/[optionId]/route.test.ts index 621463df095..10802871989 100644 --- a/apps/sim/app/api/credential-groups/enroll/[token]/oauth/[optionId]/route.test.ts +++ b/apps/sim/app/api/credential-groups/enroll/[token]/oauth/[optionId]/route.test.ts @@ -69,19 +69,22 @@ describe('credential group OAuth start route', () => { }) }) - it('forwards only the closed Search return context to the authorized operation', async () => { - await GET(request('?returnTo=search'), context) - expect(mocks.startOAuth).toHaveBeenCalledWith( - expect.objectContaining({ - principal, - input: { invitationToken: 'invitation-token', optionId: 'option-1', returnTo: 'search' }, - }) - ) - mocks.startOAuth.mockClear() - const response = await GET(request('?returnTo=https://external.test'), context) - expect(response.status).toBe(400) - expect(mocks.startOAuth).not.toHaveBeenCalled() - }) + it.each(['search', 'accounts'] as const)( + 'forwards only a closed return context to the authorized operation: %s', + async (returnTo) => { + await GET(request(`?returnTo=${returnTo}`), context) + expect(mocks.startOAuth).toHaveBeenCalledWith( + expect.objectContaining({ + principal, + input: { invitationToken: 'invitation-token', optionId: 'option-1', returnTo }, + }) + ) + mocks.startOAuth.mockClear() + const response = await GET(request('?returnTo=https://external.test'), context) + expect(response.status).toBe(400) + expect(mocks.startOAuth).not.toHaveBeenCalled() + } + ) it.each(['ip', 'enrollment', 'unavailable', 'configuration'])( 'preserves exact Search focus after %s failure', diff --git a/apps/sim/app/api/credential-groups/enrollment-redirect.ts b/apps/sim/app/api/credential-groups/enrollment-redirect.ts index 3ac896cdf46..d2768f19ee7 100644 --- a/apps/sim/app/api/credential-groups/enrollment-redirect.ts +++ b/apps/sim/app/api/credential-groups/enrollment-redirect.ts @@ -21,6 +21,7 @@ export function createCredentialGroupEnrollmentRedirect( } export type CredentialGroupOAuthFailure = + | 'expired' | 'denied' | 'account_mismatch' | 'permissions_required' diff --git a/apps/sim/app/api/credential-groups/oauth-callback.ts b/apps/sim/app/api/credential-groups/oauth-callback.ts index 67d998aa631..399eb222982 100644 --- a/apps/sim/app/api/credential-groups/oauth-callback.ts +++ b/apps/sim/app/api/credential-groups/oauth-callback.ts @@ -1,7 +1,6 @@ import { createLogger } from '@sim/logger' import { getErrorMessage } from '@sim/utils/errors' -import type { NextRequest } from 'next/server' -import { NextResponse } from 'next/server' +import type { NextRequest, NextResponse } from 'next/server' import type { CredentialGroupOAuthCallbackQuery } from '@/lib/api/contracts/credential-groups' import { credentialGroupOAuthAttemptPrincipal } from '@/lib/credential-groups/application/enrollment-auth' import { completePublicCredentialGroupOAuth } from '@/lib/credential-groups/application/public-enrollment' @@ -40,25 +39,15 @@ export async function handleCredentialGroupOAuthCallback({ attempt = await consumeCredentialGroupOAuthAttempt(state) } catch (error) { if (error instanceof CredentialGroupOAuthStateVersionError) { - return NextResponse.json( - { error: error.message }, - { status: 400, headers: { 'Cache-Control': 'no-store' } } - ) + return createCredentialGroupCompletionRedirect('expired') } logger.error('Failed to consume credential group OAuth state', { error: getErrorMessage(error), }) - return NextResponse.json( - { error: 'Authorization state is unavailable. Please try again.' }, - { status: 503, headers: { 'Cache-Control': 'no-store' } } - ) + return createCredentialGroupCompletionRedirect('unavailable') } if (!attempt || attempt.provider !== provider) { - if (limited) return limited - return NextResponse.json( - { error: 'Authorization state is invalid or expired.' }, - { status: 400, headers: { 'Cache-Control': 'no-store' } } - ) + return createCredentialGroupCompletionRedirect(limited ? 'rate_limited' : 'expired') } const focus: Record = attempt.returnTo ? { optionId: attempt.optionId, returnTo: attempt.returnTo } diff --git a/apps/sim/app/api/credential-groups/oauth/[provider]/callback/route.test.ts b/apps/sim/app/api/credential-groups/oauth/[provider]/callback/route.test.ts index 7056e109ba9..7c2b4a9edb9 100644 --- a/apps/sim/app/api/credential-groups/oauth/[provider]/callback/route.test.ts +++ b/apps/sim/app/api/credential-groups/oauth/[provider]/callback/route.test.ts @@ -159,11 +159,17 @@ describe('credential group OAuth callback', () => { mocks.consumeAttempt.mockResolvedValue(null) const replayedResponse = await GET(request('state=state-1&code=code-1'), context) - expect(replayedResponse.status).toBe(400) + expect(replayedResponse.status).toBe(303) + expect(replayedResponse.headers.get('location')).toBe( + '/credential-groups/complete?oauth=expired' + ) mocks.consumeAttempt.mockResolvedValue({ ...attempt, provider: 'gmail' }) const mismatchedResponse = await GET(request('state=state-2&code=code-2'), context) - expect(mismatchedResponse.status).toBe(400) + expect(mismatchedResponse.status).toBe(303) + expect(mismatchedResponse.headers.get('location')).toBe( + '/credential-groups/complete?oauth=expired' + ) expect(mocks.completeOAuth).not.toHaveBeenCalled() }) @@ -253,10 +259,8 @@ describe('credential group OAuth callback', () => { it('reports a state protocol change as an explicit restart without exchanging a code', async () => { mocks.consumeAttempt.mockRejectedValue(new CredentialGroupOAuthStateVersionError()) const response = await GET(request('state=state-1&code=code-1'), context) - expect(response.status).toBe(400) - expect(await response.json()).toEqual({ - error: expect.stringContaining('Reopen your invitation and connect again'), - }) + expect(response.status).toBe(303) + expect(response.headers.get('location')).toBe('/credential-groups/complete?oauth=expired') expect(mocks.authenticate).not.toHaveBeenCalled() expect(mocks.completeOAuth).not.toHaveBeenCalled() }) diff --git a/apps/sim/app/api/knowledge/sim-search/integrations/overview/route.ts b/apps/sim/app/api/knowledge/sim-search/integrations/overview/route.ts new file mode 100644 index 00000000000..325f40ea7c8 --- /dev/null +++ b/apps/sim/app/api/knowledge/sim-search/integrations/overview/route.ts @@ -0,0 +1,23 @@ +import { readOrganizationSearchOverviewContract } from '@/lib/api/contracts/knowledge/connectors' +import { + defineInternalJsonRoute, + internalRateLimits, + internalSessionAuth, +} from '@/lib/api/server/routes' +import { internalKnowledgeErrorPolicies } from '@/lib/knowledge/api/route-policies' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { readOrganizationSearchOverview } from '@/lib/knowledge/application/organization-search-overview' + +export const GET = defineInternalJsonRoute({ + contract: readOrganizationSearchOverviewContract, + auth: internalSessionAuth, + operation: knowledgeOperations.readOrganizationSearchOverview, + rateLimit: internalRateLimits.none({ + reason: 'Bounded provider operational aggregates for organization integration settings', + }), + errorPolicy: internalKnowledgeErrorPolicies.connectors, + mapInput: ({ query }) => query, + useCase: readOrganizationSearchOverview, + present: (overview) => ({ success: true as const, data: overview }), + staticResponseHeaders: { 'Cache-Control': 'private, no-store' }, +}) diff --git a/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts b/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts index 22d2f5eb374..81e3ad62df3 100644 --- a/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts +++ b/apps/sim/app/api/knowledge/sim-search/sources/route.test.ts @@ -2,7 +2,18 @@ import { authMockFns, createMockRequest } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const mocks = vi.hoisted(() => ({ execute: vi.fn(), connect: vi.fn(), overview: vi.fn() })) +const mocks = vi.hoisted(() => ({ + execute: vi.fn(), + connect: vi.fn(), + overview: vi.fn(), + adminOverview: vi.fn(), +})) +vi.mock('@/lib/knowledge/application/organization-search-overview', () => ({ + readOrganizationSearchOverview: { + operation: { id: 'knowledge.search.integrations.overview' }, + execute: mocks.adminOverview, + }, +})) vi.mock('@/lib/knowledge/application/sim-search', () => ({ connectSimSearchConnector: { operation: { id: 'knowledge.simSearch.connect' }, @@ -26,7 +37,9 @@ vi.mock('@/lib/knowledge/application/upload-sessions', () => ({ })) import { NoWorkspaceAccessError } from '@/lib/core/application/workspace-authorization' +import { OrchestrationError } from '@/lib/core/orchestration/types' import { POST as connectSource } from '@/app/api/knowledge/sim-search/connect/route' +import { GET as getAdminOverview } from '@/app/api/knowledge/sim-search/integrations/overview/route' import { GET as getOverview } from '@/app/api/knowledge/sim-search/sources/overview/route' import { GET } from '@/app/api/knowledge/sim-search/sources/route' @@ -170,31 +183,39 @@ describe('Search pagination boundary', () => { 'GET', undefined, {}, - `http://localhost/api/knowledge/sim-search/sources?workspaceId=${WORKSPACE_ID}&search=Handbook&mine=true&cursor=opaque` + `http://localhost/api/knowledge/sim-search/sources?workspaceId=${WORKSPACE_ID}&search=Handbook&mine=true&cursor=opaque&connectorType=google_drive` ) ) expect(response.status).toBe(200) expect(mocks.execute).toHaveBeenCalledWith( expect.objectContaining({ - input: { workspaceId: WORKSPACE_ID, search: 'Handbook', mine: true, cursor: 'opaque' }, + input: { + workspaceId: WORKSPACE_ID, + search: 'Handbook', + mine: true, + cursor: 'opaque', + connectorType: 'google_drive', + }, }) ) }) - it.each([`search=${'x'.repeat(201)}`, `cursor=${'x'.repeat(1025)}`])( - 'rejects an oversized filter or cursor before source reads', - async (filter) => { - const response = await GET( - createMockRequest( - 'GET', - undefined, - {}, - `http://localhost/api/knowledge/sim-search/sources?workspaceId=${WORKSPACE_ID}&${filter}` - ) + it.each([ + `search=${'x'.repeat(201)}`, + `cursor=${'x'.repeat(1025)}`, + `connectorType=${'x'.repeat(101)}`, + 'connectorType=%20', + ])('rejects an oversized filter or cursor before source reads', async (filter) => { + const response = await GET( + createMockRequest( + 'GET', + undefined, + {}, + `http://localhost/api/knowledge/sim-search/sources?workspaceId=${WORKSPACE_ID}&${filter}` ) - expect(response.status).toBe(400) - expect(mocks.execute).not.toHaveBeenCalled() - } - ) + ) + expect(response.status).toBe(400) + expect(mocks.execute).not.toHaveBeenCalled() + }) it('serves only the bounded provider overview through the registered operation', async () => { mocks.overview.mockResolvedValue({ providers: [{ connectorType: 'google_drive', isSyncing: true }], @@ -232,3 +253,55 @@ describe('Search pagination boundary', () => { expect(mocks.overview).not.toHaveBeenCalled() }) }) + +describe('organization administration overview boundary', () => { + it('authenticates before parsing the organization', async () => { + authMockFns.mockGetSession.mockResolvedValue(null) + expect((await getAdminOverview(createMockRequest('GET'))).status).toBe(401) + expect(mocks.adminOverview).not.toHaveBeenCalled() + }) + it('projects only the bounded operational contract and forwards the current session', async () => { + const provider = { + connectorType: 'gmail', + sourceCount: 1, + approved: true, + status: 'waiting_for_connections', + } + mocks.adminOverview.mockResolvedValue({ + providers: [{ ...provider, privateAccount: 'private' }], + documentNames: ['private'], + }) + const response = await getAdminOverview( + createMockRequest( + 'GET', + undefined, + {}, + `http://localhost/api/knowledge/sim-search/integrations/overview?organizationId=${WORKSPACE_ID}` + ) + ) + expect(response.status).toBe(200) + expect(response.headers.get('Cache-Control')).toBe('private, no-store') + expect(await response.json()).toEqual({ success: true, data: { providers: [provider] } }) + expect(mocks.adminOverview).toHaveBeenCalledWith( + expect.objectContaining({ + principal: { kind: 'session', userId: 'reader', sessionId: 'session' }, + input: { organizationId: WORKSPACE_ID }, + }) + ) + }) + it('preserves a role refusal without exposing health data', async () => { + mocks.adminOverview.mockRejectedValue( + new OrchestrationError('forbidden', 'Organization administrator access is required') + ) + const response = await getAdminOverview( + createMockRequest( + 'GET', + undefined, + {}, + `http://localhost/api/knowledge/sim-search/integrations/overview?organizationId=${WORKSPACE_ID}` + ) + ) + expect(response.status).toBe(403) + expect(await response.json()).not.toHaveProperty('data') + }) +}) diff --git a/apps/sim/app/api/organizations/[id]/connected-accounts/people/[enrollmentId]/resend/route.ts b/apps/sim/app/api/organizations/[id]/connected-accounts/people/[enrollmentId]/resend/route.ts index 838defa8935..2991c2d8b65 100644 --- a/apps/sim/app/api/organizations/[id]/connected-accounts/people/[enrollmentId]/resend/route.ts +++ b/apps/sim/app/api/organizations/[id]/connected-accounts/people/[enrollmentId]/resend/route.ts @@ -16,7 +16,11 @@ export const POST = defineInternalJsonRoute({ operation: organizationAccountManagementOperations.resend, rateLimit: internalRateLimits.user({ bucketName: 'organization-connected-accounts' }), errorPolicy: internalOrchestrationErrorPolicy, - mapInput: ({ params }) => ({ organizationId: params.id, enrollmentId: params.enrollmentId }), + mapInput: ({ params, query }) => ({ + organizationId: params.id, + enrollmentId: params.enrollmentId, + ...query, + }), useCase: resendOrganizationAccountInvitation, present: ({ credentialGroupEnrollment }) => ({ credentialGroupEnrollment }), }) diff --git a/apps/sim/app/credential-groups/complete/page.tsx b/apps/sim/app/credential-groups/complete/page.tsx index 6191d134b6c..86dbcae5ee3 100644 --- a/apps/sim/app/credential-groups/complete/page.tsx +++ b/apps/sim/app/credential-groups/complete/page.tsx @@ -1,4 +1,6 @@ +import { ChipLink } from '@sim/emcn' import type { Metadata } from 'next' +import { APP_ENTRY_PATH } from '@/lib/navigation/paths' import { AuthHeader, AuthShell } from '@/app/(auth)/components' export const metadata: Metadata = { @@ -7,13 +9,14 @@ export const metadata: Metadata = { } const OAUTH_FAILURE_MESSAGES = { - denied: 'Authorization was canceled. Return to the chat to try again.', + expired: 'This connection attempt expired. Open Sim and start connecting your account again.', + denied: 'Authorization was canceled. Open Sim to try again.', account_mismatch: 'Choose the account matching your Sim email address.', permissions_required: 'All requested permissions are required to connect this account.', - configuration_changed: 'The connection settings changed. Return to the chat to try again.', + configuration_changed: 'The connection settings changed. Open Sim to try again.', rate_limited: 'Too many authorization attempts. Wait a few minutes and try again.', - unavailable: 'This connection is unavailable. Return to the chat to try again.', - failed: 'Account authorization did not complete. Return to the chat to try again.', + unavailable: 'This connection is unavailable. Open Sim to try again.', + failed: 'Account authorization did not complete. Open Sim to try again.', } as const export default async function CredentialGroupCompletePage({ @@ -32,6 +35,11 @@ export default async function CredentialGroupCompletePage({ title={error ? 'Account not connected' : 'Accounts connected'} description={error ?? 'Your accounts are ready to use — you can close this tab.'} /> + {error && ( +
    + Open Sim +
    + )} ) } diff --git a/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx b/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx index b655fb0e30a..8923276aab2 100644 --- a/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx +++ b/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx @@ -148,6 +148,66 @@ describe('focused Search enrollment', () => { expect(mocks.read).toHaveBeenCalledWith({ principal, input: {} }) }) + it('keeps account-settings reconnect focused and returns to account settings', async () => { + await render({ returnTo: 'accounts', optionId: 'site-two' }) + expect(oauthLinks().map((link) => link.getAttribute('href'))).toEqual([ + '/api/credential-groups/enroll/invitation/oauth/site-two?returnTo=accounts', + ]) + expect(document.querySelector('form')).toBeNull() + expect( + Array.from(document.querySelectorAll('a')) + .find((link) => link.textContent === 'Your connected accounts') + ?.getAttribute('href') + ).toBe('/account/settings/connected-accounts') + }) + + it('lets an account owner deliberately reconnect an active grant before reporting completion', async () => { + enrollment.options[1]!.connections = [ + { + email: 'member@example.test', + displayName: null, + avatarUrl: null, + status: 'connected', + grantedAt: new Date().toISOString(), + }, + ] + await render({ returnTo: 'accounts', optionId: 'site-two' }) + expect(oauthLinks()).toHaveLength(1) + expect(oauthLinks()[0].textContent).toContain('Reconnect') + await render({ returnTo: 'accounts', optionId: 'site-two', connected: 'site-two' }) + expect(oauthLinks()).toHaveLength(0) + expect(document.querySelector('h1')?.textContent).toBe('Confluence connected') + }) + + it.each([true, false])( + 'uses current Search eligibility for organization return links: %s', + async (canSearch) => { + mocks.authenticate.mockResolvedValue({ + ...principal, + workspaceId: undefined, + organizationId: 'canonical-org', + }) + mocks.read.mockResolvedValue({ enrollment, canSearch }) + await render({ returnTo: 'search', optionId: 'site-two' }) + const label = canSearch ? 'Return to Search' : 'Your connected accounts' + expect( + Array.from(document.querySelectorAll('a')) + .find((link) => link.textContent === label) + ?.getAttribute('href') + ).toBe(canSearch ? '/o/canonical-org/search' : '/account/settings/connected-accounts') + } + ) + + it('gives an unverified person a verification action before resolving enrollment', async () => { + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'member', emailVerified: false }, + session: { id: 'session-1' }, + }) + await render({ returnTo: 'search', optionId: 'site-two' }) + expect(document.querySelector('a')?.getAttribute('href')).toBe('/verify') + expect(mocks.read).not.toHaveBeenCalled() + }) + it('shows only the exact requested option and derives the return workspace from the principal', async () => { await render({ returnTo: 'search', optionId: 'site-two', workspaceId: 'other-workspace' }) expect(document.querySelector('h1')?.textContent).toBe('Connect your Confluence account') @@ -181,7 +241,7 @@ describe('focused Search enrollment', () => { returnTo: 'search', optionId: Array.isArray(optionId) ? [...optionId] : optionId, }) - expect(document.body.textContent).toContain('Ask a workspace admin') + expect(document.body.textContent).toContain('Ask an admin') expect(oauthLinks()).toHaveLength(0) expect(document.querySelector('form')).toBeNull() expect(document.body.textContent).toContain('Return to Search') @@ -194,7 +254,7 @@ describe('focused Search enrollment', () => { ) await render({ returnTo: 'search', optionId: 'slack' }) expect(document.body.textContent).toContain('Connection unavailable') - expect(document.body.textContent).toContain('Ask a workspace admin') + expect(document.body.textContent).toContain('Ask an admin') expect(document.querySelector('a')?.getAttribute('href')).toBe( '/workspace/canonical-workspace/search' ) @@ -252,6 +312,6 @@ describe('focused Search enrollment', () => { await render({ returnTo: 'search', optionId: 'site-two', workspaceId: 'other-workspace' }) expect(document.body.textContent).toContain('Invitation unavailable') expect(mocks.read).not.toHaveBeenCalled() - expect(document.querySelector('a')).toBeNull() + expect(document.querySelector('a')?.getAttribute('href')).toBe('/home') }) }) diff --git a/apps/sim/app/credential-groups/enroll/[token]/page.tsx b/apps/sim/app/credential-groups/enroll/[token]/page.tsx index 2345b80c44f..ba4afb0d942 100644 --- a/apps/sim/app/credential-groups/enroll/[token]/page.tsx +++ b/apps/sim/app/credential-groups/enroll/[token]/page.tsx @@ -3,6 +3,7 @@ import { Chip, ChipLink } from '@sim/emcn' import type { Metadata } from 'next' import { headers } from 'next/headers' import { redirect } from 'next/navigation' +import { getAccountSettingsHref } from '@/components/settings/navigation' import { getSession } from '@/lib/auth' import { asOrchestrationError } from '@/lib/core/orchestration/types' import type { ResourceOwner } from '@/lib/core/resource-scope' @@ -14,7 +15,7 @@ import { getManagedMcpConnectorIcon } from '@/lib/credential-groups/managed-mcp- import { CredentialGroupProviderConfigurationError } from '@/lib/credential-groups/provider-adapter' import { getCredentialGroupProviderService } from '@/lib/credential-groups/providers' import { enforcePublicCredentialGroupIpRateLimit } from '@/lib/credential-groups/rate-limit' -import { organizationRoutes } from '@/lib/navigation/paths' +import { APP_ENTRY_PATH, organizationRoutes } from '@/lib/navigation/paths' import { SEARCH_CONNECTORS } from '@/lib/sim-search/connectors' import { AuthHeader, SupportFooter } from '@/app/(auth)/components' import { LogoShell } from '@/app/(landing)/components/logo-shell' @@ -55,9 +56,16 @@ function PageShell({ children }: PageShellProps) { interface UnavailableInvitationProps { rateLimited?: boolean message?: string + recoveryHref?: string + recoveryLabel?: string } -function UnavailableInvitation({ rateLimited = false, message }: UnavailableInvitationProps) { +function UnavailableInvitation({ + rateLimited = false, + message, + recoveryHref = APP_ENTRY_PATH, + recoveryLabel = 'Open Sim', +}: UnavailableInvitationProps) { return (
    @@ -70,24 +78,31 @@ function UnavailableInvitation({ rateLimited = false, message }: UnavailableInvi : 'Sign in with the account this invitation was sent to. If the link has expired, ask an organization admin for a new invitation.') } /> +
    + {recoveryLabel} +
    ) } interface UnavailableSearchConnectionProps { - owner: ResourceOwner + returnHref: string + returnLabel: string } -function UnavailableSearchConnection({ owner }: UnavailableSearchConnectionProps) { +function UnavailableSearchConnection({ + returnHref, + returnLabel, +}: UnavailableSearchConnectionProps) { return (
    - Return to Search + {returnLabel}
    ) @@ -137,23 +152,29 @@ export default async function CredentialGroupEnrollmentPage({ } if (!session.user.emailVerified) return ( - + ) const principal = await authenticateCredentialGroupEnrollment(token) if (!principal) return const returnToSearch = resolvedSearchParams.returnTo === 'search' + const returnToAccounts = resolvedSearchParams.returnTo === 'accounts' + const focused = returnToSearch || returnToAccounts const requestedOptionId = resolvedSearchParams.optionId const focusedOptionId = typeof requestedOptionId === 'string' && requestedOptionId.length <= 128 ? requestedOptionId : '' const enrollmentResult = await readPublicCredentialGroupEnrollment - .execute({ principal, input: returnToSearch ? { optionId: focusedOptionId } : {} }) + .execute({ principal, input: focused ? { optionId: focusedOptionId } : {} }) .catch((error: unknown) => { if (error instanceof CredentialGroupEnrollmentError) return { enrollment: null, enrollmentError: error.message } if (asOrchestrationError(error)?.code === 'not_found') return null - if (returnToSearch && error instanceof CredentialGroupProviderConfigurationError) + if (focused && error instanceof CredentialGroupProviderConfigurationError) return { enrollment: null } throw error }) @@ -161,7 +182,15 @@ export default async function CredentialGroupEnrollmentPage({ if ('enrollmentError' in enrollmentResult) return const { enrollment } = enrollmentResult - if (!enrollment) return + const canReturnToSearch = + returnToSearch && + ('canSearch' in enrollmentResult ? enrollmentResult.canSearch : !principal.organizationId) + const returnHref = canReturnToSearch + ? searchReturnPath(principal) + : getAccountSettingsHref('connected-accounts') + const returnLabel = canReturnToSearch ? 'Return to Search' : 'Your connected accounts' + if (!enrollment) + return const oauthStatus = getSearchParam(resolvedSearchParams, 'oauth') const connectedOptionId = getSearchParam(resolvedSearchParams, 'connected') @@ -174,12 +203,15 @@ export default async function CredentialGroupEnrollmentPage({ ? OAUTH_MESSAGES[oauthStatus as keyof typeof OAUTH_MESSAGES] : null const activeOptions = enrollment.options.filter((option) => option.status === 'active') - const focusedOption = returnToSearch + const focusedOption = focused ? activeOptions.find((option) => option.id === focusedOptionId) : undefined - if (returnToSearch && !focusedOption) return + if (focused && !focusedOption) + return const visibleOptions = focusedOption ? [focusedOption] : activeOptions - const focusedConnected = focusedOption?.connections[0]?.status === 'connected' + const focusedConnected = + focusedOption?.connections[0]?.status === 'connected' && + (returnToSearch || connectedOptionId === focusedOption.id) const focusedProviderId = focusedOption ? getCredentialGroupProviderService(focusedOption.provider).providerId : undefined @@ -194,13 +226,13 @@ export default async function CredentialGroupEnrollmentPage({ ? enrollment.mcpServers.find((server) => server.id === connectedMcpServerId) : undefined const notification = - !returnToSearch && connectedMcpServerId + !focused && connectedMcpServerId ? { message: `${connectedMcpServer?.name ?? 'MCP server'} connected successfully.`, variant: 'success' as const, } : connectedOptionId && - (!returnToSearch || (connectedOptionId === focusedOption?.id && focusedConnected)) + (!focused || (connectedOptionId === focusedOption?.id && focusedConnected)) ? { message: `${connectedOption ? getCredentialGroupProviderService(connectedOption.provider).name : 'Account'} connected successfully.`, variant: 'success' as const, @@ -224,7 +256,7 @@ export default async function CredentialGroupEnrollmentPage({ : 'Connect your accounts' } description={ - returnToSearch + focused ? `${focusedConnected ? 'Your account is connected for' : 'Connect your account for'} ${enrollment.workspaceName}.` : `${enrollment.inviterName ? `${enrollment.inviterName} invited you` : 'You have been invited'} to connect accounts for ${enrollment.workspaceName}.` } @@ -242,23 +274,23 @@ export default async function CredentialGroupEnrollmentPage({ icon={} title={option.label} description={ - returnToSearch && connection?.status === 'connected' + focused && connection?.status === 'connected' ? `${connection.email} · Connected` : (connection?.email ?? 'Not connected') } trailing={ - returnToSearch && connection?.status === 'connected' ? undefined : ( + focusedConnected ? undefined : ( ) } /> ) })} - {!returnToSearch && + {!focused && enrollment.mcpServers.map((server) => { const ConnectorIcon = getManagedMcpConnectorIcon(server.managedConnectorId) return ( @@ -284,18 +316,15 @@ export default async function CredentialGroupEnrollmentPage({ })}
    - {returnToSearch ? ( + {focused ? (
    {docsUrl && ( Setup guide )} - - Return to Search + + {returnLabel}
    ) : ( @@ -318,5 +347,5 @@ function searchReturnPath(owner: ResourceOwner): string { const scope = resourceScopeFromOwner(owner) return scope.kind === 'workspace' ? `/workspace/${encodeURIComponent(scope.workspaceId)}/search` - : organizationRoutes(scope.organizationId).integrations + : organizationRoutes(scope.organizationId).search } diff --git a/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx b/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx index 1c5126ff0ae..7f119589368 100644 --- a/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx @@ -182,6 +182,34 @@ describe('organization integrations role and source paths', () => { undefined ) }) + it('allows a second approved content scope after another source is configured', async () => { + mocks.sources.mockReturnValue({ + data: [{ ...memberSource, connectorType: 'confluence', sourceDescription: 'ENG' }], + isPending: false, + }) + mocks.overview.mockReturnValue({ + data: { providers: [{ connectorType: 'confluence' }] }, + isPending: false, + }) + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'confluence', approved: true }], + isPending: false, + }) + mocks.availability.mockReturnValue({ + integrationAvailability: new Map(), + oauthServiceAvailability: new Map([['confluence', true]]), + isIntegrationAvailabilityReady: true, + }) + await render() + expect(buttons('Add source')).toHaveLength(1) + await act(async () => buttons('Add source')[0].click()) + expect(mocks.connect).toHaveBeenCalledWith( + scope, + expect.objectContaining({ type: 'confluence' }), + undefined + ) + }) + it('withholds connection when an integration is deactivated', async () => { mocks.sources.mockReturnValue({ data: [{ ...memberSource, approved: false }], @@ -245,13 +273,19 @@ describe('organization integrations role and source paths', () => { expect(buttons('Connect account')).toHaveLength(0) expect(document.body.textContent).toContain('An admin needs to finish source setup') }) - it('shows an organization admin exactly what a member sees, with no setup or management', async () => { + it('keeps personal connection actions and gives organization admins source management links', async () => { mocks.context.mockReturnValue({ organization: { id: scope.organizationId }, viewer: { isAdmin: true }, searchAccess: { memberScoped: true, sourceMirrored: true }, }) await render() + expect( + document.querySelector( + 'a[href="/o/organization-a/settings/integrations/sources/member-source"]' + ) + ).not.toBeNull() + expect(document.querySelector('a[href="/account/settings/connected-accounts"]')).not.toBeNull() expect(buttons('Add source')).toHaveLength(0) expect(buttons('Manage')).toHaveLength(0) expect(document.querySelector('[aria-label$="source actions"]')).toBeNull() diff --git a/apps/sim/app/o/[organizationId]/integrations/integrations.tsx b/apps/sim/app/o/[organizationId]/integrations/integrations.tsx index 8f5cdfa6634..ab0782ab38c 100644 --- a/apps/sim/app/o/[organizationId]/integrations/integrations.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/integrations.tsx @@ -1,8 +1,10 @@ 'use client' import { useMemo } from 'react' -import { Chip } from '@sim/emcn' +import { Chip, ChipLink } from '@sim/emcn' +import { getAccountSettingsHref } from '@/components/settings/navigation' import type { ResourceScope } from '@/lib/core/resource-scope' +import { organizationRoutes } from '@/lib/navigation/paths' import { getConnectorAccessAvailability, SEARCH_CONNECTORS, @@ -40,14 +42,14 @@ const TABS = [ ] as const /** - * The organization's sources as every member sees them — the same list and the - * same actions whatever the viewer's role. Setting sources up and managing them - * is an organization admin's job, done in the organization's settings. + * Personal connections and approved source scopes available to the organization. + * Administrators can open source management without leaving this journey. */ export function OrganizationIntegrations() { useOAuthReturnRouter() useDesktopOAuthConnectListener() - const { organization, searchAccess } = useOrganizationContext() + const { organization, searchAccess, viewer } = useOrganizationContext() + const routes = organizationRoutes(organization.id) const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } const { tab, search } = useOrganizationPageFilters() const sources = useSearchSources(scope, { search, mine: tab === 'mine' }) @@ -80,12 +82,15 @@ export function OrganizationIntegrations() { const configuredTypes = new Set( overview.data?.providers.map((provider) => provider.connectorType) ) - const unconfigured = mineOnly + const sourceChoices = mineOnly ? [] : SEARCH_SOURCE_TYPES.filter( ([type, meta]) => approvedTypes.has(type) && - !configuredTypes.has(type) && + (!configuredTypes.has(type) || + SEARCH_CONNECTORS.some( + (connector) => connector.type === type && connector.setupFields.length > 0 + )) && meta.name.toLowerCase().includes(query) ) const failedQuery = @@ -102,6 +107,14 @@ export function OrganizationIntegrations() { title='Integrations' description='Connect your tools for Sim Search' tabs={TABS} + action={ +
    + Your accounts + {viewer.isAdmin && ( + Manage integrations + )} +
    + } >
    {failedQuery ? ( @@ -125,9 +138,9 @@ export function OrganizationIntegrations() { integrations.isPending || !availability.isIntegrationAvailabilityReady ? ( Loading sources… - ) : visibleSources.length > 0 || unconfigured.length > 0 || sources.hasNextPage ? ( + ) : visibleSources.length > 0 || sourceChoices.length > 0 || sources.hasNextPage ? ( <> - {unconfigured.map(([type, meta]) => { + {sourceChoices.map(([type, meta]) => { const connector = SEARCH_CONNECTORS.find((item) => item.type === type) const access = getConnectorAccessAvailability( meta, @@ -140,16 +153,20 @@ export function OrganizationIntegrations() { } ) const canConnect = connector && type !== 'slack' && access.members + const hasSources = configuredTypes.has(type) + if (hasSources && !canConnect) return null return ( } - title={meta.name} + title={hasSources ? `Add another ${meta.name} source` : meta.name} description={ - canConnect - ? 'Approved · Connect your account to search this source' - : 'Approved · An admin needs to finish source setup' + hasSources + ? 'Connect a different site or content scope' + : canConnect + ? 'Approved · Connect your account to search this source' + : 'Approved · An admin needs to finish source setup' } trailing={ canConnect ? ( @@ -158,7 +175,7 @@ export function OrganizationIntegrations() { disabled={enrollment.isPending} onClick={() => enrollment.connectSearchSource(scope, connector, undefined)} > - Connect account + {hasSources ? 'Add source' : 'Connect account'} ) : undefined } @@ -170,7 +187,8 @@ export function OrganizationIntegrations() { key={source.connectorId} source={source} scope={scope} - canAdmin={false} + canAdmin={viewer.isAdmin} + manageHref={viewer.isAdmin ? routes.searchSource(source.connectorId) : undefined} available={ source.accessMode === 'members' ? searchAccess.memberScoped @@ -190,7 +208,9 @@ export function OrganizationIntegrations() { ? 'No matching sources.' : mineOnly ? 'You haven’t connected any sources yet.' - : 'Your organization hasn’t added any sources yet. Ask an organization admin to get started.'} + : viewer.isAdmin + ? 'Your organization hasn’t added any sources yet. Open Manage integrations to get started.' + : 'Your organization hasn’t added any sources yet. Ask an organization admin to get started.'} )} {enrollment.error && ( diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integration-catalog.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integration-catalog.tsx new file mode 100644 index 00000000000..fc04b50c57b --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integration-catalog.tsx @@ -0,0 +1,130 @@ +'use client' + +import { useState } from 'react' +import { + ChipInput, + ChipModal, + ChipModalBody, + ChipModalError, + ChipModalField, + ChipModalFooter, + ChipModalHeader, +} from '@sim/emcn' +import { Search } from '@sim/emcn/icons' +import type { OrganizationSearchProviderSummary } from '@/lib/api/contracts/knowledge/connectors' +import { getConnectorAccessAvailability, SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' +import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { + RESOURCE_LIST_STACK, + SettingsResourceRow, +} from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { useUpdateSearchIntegration } from '@/hooks/queries/search-integrations' +import { usePermissionConfig } from '@/hooks/use-permission-config' + +interface OrganizationIntegrationCatalogProps { + organizationId: string + providers: OrganizationSearchProviderSummary[] + memberAccessAvailable: boolean + mirroredAccessAvailable: boolean + onClose: () => void + onAdded: (connectorType: string) => void +} + +export function OrganizationIntegrationCatalog({ + organizationId, + providers, + memberAccessAvailable, + mirroredAccessAvailable, + onClose, + onAdded, +}: OrganizationIntegrationCatalogProps) { + const [search, setSearch] = useState('') + const availability = usePermissionConfig() + const add = useUpdateSearchIntegration() + const existing = new Set(providers.map((provider) => provider.connectorType)) + const visible = SEARCH_SOURCE_TYPES.filter( + ([type, meta]) => + !existing.has(type) && meta.name.toLowerCase().includes(search.trim().toLowerCase()) + ) + return ( + { + if (!open && !add.isPending) onClose() + }} + > + + Add integration + + + + setSearch(event.target.value)} + placeholder='Search integrations...' + autoComplete='off' + /> + + + {availability.integrationAvailabilityError ? ( + void availability.refetchIntegrationAvailability()} + variant='inline' + /> + ) : !availability.isIntegrationAvailabilityReady ? ( + Loading integrations… + ) : visible.length === 0 ? ( + + {search ? 'No matching integrations' : 'All integrations have been added.'} + + ) : ( +
    + {visible.map(([type, meta]) => { + const access = getConnectorAccessAvailability( + meta, + availability.integrationAvailability, + { + memberAccessAvailable, + mirroredAccessAvailable, + oauthServiceAvailability: availability.oauthServiceAvailability, + isIntegrationAvailabilityReady: availability.isIntegrationAvailabilityReady, + } + ) + const available = access.admin || access.members + return ( + } + title={meta.name} + description={!available ? 'Unavailable in this deployment' : undefined} + disabled={add.isPending || !available} + onClick={() => + add.mutate( + { organizationId, connectorType: type, approved: true }, + { onSuccess: () => onAdded(type) } + ) + } + clickLabel={`Add ${meta.name}`} + /> + ) + })} +
    + )} +
    + {add.error?.message} +
    + +
    + ) +} diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx index c4a3e799713..fb9e717edca 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx @@ -156,7 +156,7 @@ describe('organization integration invitations', () => { mocks.accounts.mockReturnValue({ data: { credentialGroup: null }, error: null }) await render('?tab=people') expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) - expect(container.textContent).toContain('before inviting people') + expect(container.textContent).toContain('before requesting connections') expect(container.textContent).not.toContain('Organization accounts not configured') expect(findButton('Request connections')).toBeDisabled() }) @@ -164,10 +164,10 @@ describe('organization integration invitations', () => { it('sends an org without a credential group back to provider setup before invitations', async () => { mocks.accounts.mockReturnValue({ data: { credentialGroup: null }, error: null }) await render('?tab=people') - expect(container.textContent).toContain('before inviting people') + expect(container.textContent).toContain('before requesting connections') expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) expect(findButton('Request connections')).toBeDisabled() - await click('Set up providers') + await click('View integrations') expect(container.textContent).toContain('Provider setup') expect(mocks.invite).not.toHaveBeenCalled() }) @@ -179,7 +179,7 @@ describe('organization integration invitations', () => { }) await render('?tab=people') expect(container.textContent).toContain('Account access denied') - expect(container.textContent).not.toContain('Set up providers') + expect(container.textContent).not.toContain('View integrations') expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) expect(findButton('Request connections')).toBeDisabled() await click('Try again') diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx index 6fb43d013cd..da5415ebcb0 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx @@ -31,7 +31,7 @@ export function OrganizationIntegrationsSettings() { value={tab} onChange={(value) => void setTab(value)} options={[ - { value: 'providers', label: 'Providers' }, + { value: 'providers', label: 'Integrations' }, { value: 'people', label: 'People' }, ]} /> @@ -56,9 +56,9 @@ export function OrganizationIntegrationsSettings() { ) : !accounts.data.credentialGroup ? (
    - Set up a provider for personal account connections before inviting people. + Add a source that uses member accounts before requesting connections. - void setTab('providers')}>Set up providers + void setTab('providers')}>View integrations
    ) : undefined } diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx new file mode 100644 index 00000000000..a49bd664ca4 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx @@ -0,0 +1,164 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { NuqsTestingAdapter } from 'nuqs/adapters/testing' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { OrganizationSearchProviderSummary } from '@/lib/api/contracts/knowledge/connectors' + +const mocks = vi.hoisted(() => ({ + admin: true, + overview: vi.fn(), + push: vi.fn(), + add: vi.fn(), + refetch: vi.fn(), +})) +vi.mock('next/navigation', () => ({ + useRouter: () => ({ push: mocks.push }), + usePathname: () => '/o/org-one/settings/integrations', +})) +vi.mock('@/app/o/[organizationId]/providers/organization-provider', () => ({ + useOrganizationContext: () => ({ + organization: { id: 'org-one' }, + viewer: { isAdmin: mocks.admin }, + searchAccess: { memberScoped: true, sourceMirrored: true }, + }), +})) +vi.mock('@/hooks/queries/kb/connectors', () => ({ useOrganizationSearchOverview: mocks.overview })) +vi.mock('@/hooks/queries/search-integrations', () => ({ + useUpdateSearchIntegration: () => ({ mutate: mocks.add, isPending: false }), +})) +vi.mock('@/hooks/use-permission-config', () => ({ + usePermissionConfig: () => ({ + integrationAvailability: new Map(), + oauthServiceAvailability: new Map([ + ['confluence', true], + ['google-drive', true], + ]), + isIntegrationAvailabilityReady: true, + }), +})) +vi.mock('@/app/workspace/[workspaceId]/search/components/search-source-setup', () => ({ + SearchSourceSetup: () => null, +})) +vi.mock('@/app/o/[organizationId]/settings/components/integrations/slack-account-setup', () => ({ + OrganizationSlackAccountSetup: () => null, +})) + +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' +import { OrganizationIntegrationsSetup } from '@/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup' + +const providers: OrganizationSearchProviderSummary[] = [ + { connectorType: 'gmail', approved: true, sourceCount: 0, status: 'waiting_for_connections' }, + { connectorType: 'google_drive', approved: false, sourceCount: 2, status: 'paused' }, +] +let root: Root +let container: HTMLDivElement +beforeEach(() => { + vi.clearAllMocks() + mocks.admin = true + mocks.overview.mockReturnValue({ data: { providers }, isPending: false, refetch: mocks.refetch }) + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + vi.stubGlobal( + 'ResizeObserver', + class { + observe() {} + unobserve() {} + disconnect() {} + } + ) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) +}) +afterEach(async () => { + await act(async () => root.unmount()) + container.remove() + vi.unstubAllGlobals() +}) +async function render(searchParams = '') { + await act(async () => + root.render( + + + + + + + + ) + ) +} +async function click(label: string) { + const button = Array.from(document.querySelectorAll('button')).find( + (item) => item.textContent?.trim() === label || item.getAttribute('aria-label') === label + ) + expect(button, `Missing ${label}`).toBeTruthy() + await act(async () => button!.click()) +} + +describe('organization integration management entry', () => { + it('lists added integrations with stable detail links including deactivated providers', async () => { + await render() + expect(document.querySelector('a[aria-label="Manage Gmail"]')).toHaveAttribute( + 'href', + '/o/org-one/settings/integrations/providers/gmail' + ) + expect(document.querySelector('a[aria-label="Manage Google Drive"]')).toHaveAttribute( + 'href', + '/o/org-one/settings/integrations/providers/google_drive' + ) + expect(container.textContent).toContain('Waiting for account connections') + expect(container.textContent).toContain('Deactivated') + expect(container.textContent).not.toContain('Confluence') + expect(document.querySelector('[role="switch"]')).toBeNull() + }) + it('shows an intentional empty state and an Add integration header action', async () => { + mocks.overview.mockReturnValue({ data: { providers: [] }, isPending: false }) + await render() + expect(container.textContent).toContain('Add an integration to get started.') + await click('Add integration') + expect(document.querySelector('[role="dialog"]')).not.toBeNull() + }) + it('adds a provider once and goes to its management page', async () => { + mocks.add.mockImplementation((_input, options) => options.onSuccess()) + await render() + await click('Add integration') + expect(document.querySelector('button[aria-label="Add Gmail"]')).toBeNull() + await click('Add Confluence') + expect(mocks.add).toHaveBeenCalledWith( + { organizationId: 'org-one', connectorType: 'confluence', approved: true }, + expect.any(Object) + ) + expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations/providers/confluence') + }) + it('does not turn a failed summary into an empty setup state', async () => { + mocks.overview.mockReturnValue({ + error: new Error('Could not load integrations'), + isError: true, + refetch: mocks.refetch, + }) + await render() + expect(container.textContent).not.toContain('Add an integration to get started.') + expect(document.querySelector('a[aria-label="Manage Gmail"]')).toBeNull() + await click('Try again') + expect(mocks.refetch).toHaveBeenCalledOnce() + }) + it('keeps loading distinct from empty and disables creation', async () => { + mocks.overview.mockReturnValue({ isPending: true }) + await render() + expect(container.textContent).toContain('Loading integrations') + await click('Add integration') + expect(document.querySelector('[role="dialog"]')).toBeNull() + }) + it('does not expose admin controls or load admin data for members', async () => { + mocks.admin = false + await render() + expect(mocks.overview).toHaveBeenLastCalledWith('org-one', { enabled: false }) + expect(container.textContent).toBe('') + }) + it('filters added integration names without dropping server summary context', async () => { + await render('?search=gmail') + expect(document.querySelector('a[aria-label="Manage Gmail"]')).not.toBeNull() + expect(document.querySelector('a[aria-label="Manage Google Drive"]')).toBeNull() + }) +}) diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx index 714e33fbf9f..01bcd635e9e 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx @@ -1,20 +1,16 @@ 'use client' -import { useMemo, useState } from 'react' -import { Chip, ChipConfirmModal, ChipModalError, Switch } from '@sim/emcn' -import { useQueryState } from 'nuqs' +import { useState } from 'react' +import { Plus } from '@sim/emcn/icons' +import { useRouter } from 'next/navigation' import { SettingsPanel } from '@/components/settings/settings-panel' -import type { ResourceScope } from '@/lib/core/resource-scope' import { organizationRoutes } from '@/lib/navigation/paths' -import { getConnectorAccessAvailability, SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' -import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' +import { OrganizationIntegrationCatalog } from '@/app/o/[organizationId]/settings/components/integrations/organization-integration-catalog' +import { organizationSearchStatusLabel } from '@/app/o/[organizationId]/settings/components/integrations/organization-search-status' import { OrganizationSlackAccountSetup } from '@/app/o/[organizationId]/settings/components/integrations/slack-account-setup' import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' -import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' -import { SearchSourceRow } from '@/app/workspace/[workspaceId]/search/components/search-source-row' import { SearchSourceSetup } from '@/app/workspace/[workspaceId]/search/components/search-source-setup' -import { searchSetupParam } from '@/app/workspace/[workspaceId]/search/search-params' import { SettingsEmptyState, SettingsQueryErrorState, @@ -24,254 +20,91 @@ import { SettingsResourceRow, } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' import { useSettingsSearch } from '@/app/workspace/[workspaceId]/settings/components/use-settings-search' -import { searchSourceKeys, useSearchSources } from '@/hooks/queries/kb/connectors' -import { - useSearchIntegrations, - useUpdateSearchIntegration, -} from '@/hooks/queries/search-integrations' -import { useDebounce } from '@/hooks/use-debounce' -import { useMemberEnrollment } from '@/hooks/use-member-enrollment' -import { usePermissionConfig } from '@/hooks/use-permission-config' - -/** A change of approval the admin has asked for but not yet confirmed. */ -interface PendingApproval { - type: string - name: string - approve: boolean -} +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' +import { useOrganizationSearchOverview } from '@/hooks/queries/kb/connectors' -/** - * Organization approval is independent of source setup. Each integration lists - * all of its configured sources using the same rows members see, with management - * actions for admins. Setup and OAuth returns stay within this settings section. - */ export function OrganizationIntegrationsSetup() { const { organization, viewer, searchAccess } = useOrganizationContext() - const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } + const router = useRouter() const [search, setSearch] = useSettingsSearch() - const sourceSearch = useDebounce(search.trim(), SEARCH_DEBOUNCE_MS) - const sources = useSearchSources(scope, { search: sourceSearch }) - const integrations = useSearchIntegrations(organization.id) - const updateApproval = useUpdateSearchIntegration() - const { - integrationAvailability, - oauthServiceAvailability, - isIntegrationAvailabilityReady, - isIntegrationAvailabilityFetching, - integrationAvailabilityError, - refetchIntegrationAvailability, - } = usePermissionConfig() - const [, setSelectedType] = useQueryState( - searchSetupParam.key, - searchSetupParam.parser.withOptions({ history: 'replace' }) - ) - const membershipQueryKeys = useMemo( - () => [searchSourceKeys.list({ kind: 'organization', organizationId: organization.id })], - [organization.id] - ) - const connectedConnectorIds = useMemo( - () => - new Set( - sources.data - ?.filter((source) => source.viewerMembership === 'connected') - .map((source) => source.connectorId) - ), - [sources.data] + const [catalogOpen, setCatalogOpen] = useState(false) + const overview = useOrganizationSearchOverview(organization.id, { enabled: viewer.isAdmin }) + const providers = overview.data?.providers ?? [] + const query = search.trim().toLowerCase() + const visible = providers.filter((provider) => + CONNECTOR_META_REGISTRY[provider.connectorType]?.name.toLowerCase().includes(query) ) - const enrollment = useMemberEnrollment({ membershipQueryKeys, connectedConnectorIds }) - const enabled = searchAccess.memberScoped || searchAccess.sourceMirrored - const [pendingApproval, setPendingApproval] = useState(null) - const approvals = new Map( - integrations.data?.map((integration) => [integration.connectorType, integration.approved]) - ) - const failedQuery = - sources.isError && !sources.isFetchNextPageError - ? sources - : integrations.isError - ? integrations - : null - - const visibleProviders = SEARCH_SOURCE_TYPES.filter( - ([type, meta]) => - !sourceSearch || - meta.name.toLowerCase().includes(sourceSearch.toLowerCase()) || - sources.data?.some((source) => source.connectorType === type) - ) - - const confirmApproval = () => { - if (!pendingApproval) return - updateApproval.mutate( - { - organizationId: organization.id, - connectorType: pendingApproval.type, - approved: pendingApproval.approve, - }, - { - onSuccess: () => setPendingApproval(null), - } - ) - } - - if (!enabled) { + if (!viewer.isAdmin) return null + if (!searchAccess.memberScoped && !searchAccess.sourceMirrored) return ( Search sources are not enabled for this organization. ) - } return ( setCatalogOpen(true), + }, + ]} >
    - {failedQuery ? ( - void failedQuery.refetch()} - variant='inline' - /> - ) : integrationAvailabilityError ? ( + {overview.isError ? ( void refetchIntegrationAvailability()} + error={overview.error} + fallback='Could not load integrations' + isRetrying={overview.isFetching} + onRetry={() => void overview.refetch()} variant='inline' /> + ) : overview.isPending ? ( + Loading integrations… + ) : visible.length === 0 ? ( + + {query ? 'No matching integrations' : 'Add an integration to get started.'} + ) : ( - visibleProviders.map(([type, meta]) => { - const configured = sources.data?.filter((source) => source.connectorType === type) ?? [] - const { admin: central, members } = getConnectorAccessAvailability( - meta, - integrationAvailability, - { - memberAccessAvailable: searchAccess.memberScoped, - mirroredAccessAvailable: searchAccess.sourceMirrored, - oauthServiceAvailability, - isIntegrationAvailabilityReady, - } - ) - const available = central || members - const approved = approvals.get(type) ?? false - const loading = sources.isPending || integrations.isPending + visible.map((provider) => { + const meta = CONNECTOR_META_REGISTRY[provider.connectorType] return ( -
    - } - title={meta.name} - description={ - !loading && !available ? 'Connection setup is unavailable' : undefined - } - trailing={ -
    - {available && ( - void setSelectedType(searchSetupParam.parser.parse(type))} - > - Set up - - )} - { - updateApproval.reset() - setPendingApproval({ type, name: meta.name, approve }) - }} - /> -
    - } - /> - {configured.map((source) => ( - enrollment.connect(source.knowledgeBaseId, source.connectorId)} - manageHref={organizationRoutes(organization.id).searchSource( - source.connectorId - )} - /> - ))} -
    + } + title={meta.name} + description={organizationSearchStatusLabel(provider)} + href={organizationRoutes(organization.id).searchProvider(provider.connectorType)} + clickLabel={`Manage ${meta.name}`} + navigable + /> ) }) )} - {!failedQuery && !integrationAvailabilityError && ( - <> - {!sources.isPending && !sources.hasNextPage && visibleProviders.length === 0 && ( - - No providers or sources match your search - - )} - - - )} - {enrollment.error && ( -

    {enrollment.error}

    - )}
    + {catalogOpen && ( + setCatalogOpen(false)} + onAdded={(type) => router.push(organizationRoutes(organization.id).searchProvider(type))} + /> + )} - - { - if (!open && !updateApproval.isPending) setPendingApproval(null) - }} - title={ - pendingApproval?.approve - ? `Approve ${pendingApproval.name}?` - : `Deactivate ${pendingApproval?.name}?` - } - text={ - pendingApproval?.approve - ? [ - 'You are approving ', - { text: pendingApproval.name, bold: true }, - ' for your organization in Sim Search. Members can connect their own accounts when supported. Sources that need a service account or custom app still require setup.', - ] - : [ - 'Are you sure you want to deactivate ', - { text: pendingApproval?.name ?? '', bold: true }, - ' for your organization? Its indexed content will be unavailable in Search, Assistant, and MCP until approved again. Source setup and connected accounts are preserved.', - ] - } - confirm={{ - label: pendingApproval?.approve ? 'Approve' : 'Deactivate', - variant: pendingApproval?.approve ? 'primary' : 'destructive', - onClick: confirmApproval, - pending: updateApproval.isPending, - pendingLabel: 'Saving…', - }} - > - {updateApproval.error && {updateApproval.error.message}} - +
    ) } diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-search-status.ts b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-search-status.ts new file mode 100644 index 00000000000..85a329f0467 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-search-status.ts @@ -0,0 +1,15 @@ +import type { OrganizationSearchProviderSummary } from '@/lib/api/contracts/knowledge/connectors' + +const STATUS_LABELS: Record = { + needs_setup: 'Needs setup', + waiting_for_connections: 'Waiting for account connections', + indexing: 'Indexing', + needs_attention: 'Needs attention', + paused: 'Paused', + active: 'Syncing enabled', +} + +export function organizationSearchStatusLabel(provider: OrganizationSearchProviderSummary): string { + if (!provider.approved) return 'Deactivated' + return STATUS_LABELS[provider.status] +} diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/search-params.ts b/apps/sim/app/o/[organizationId]/settings/components/integrations/search-params.ts index f0eda4192ce..30d5f4c5561 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/search-params.ts +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/search-params.ts @@ -9,3 +9,8 @@ export const connectedAccountsParam = { key: 'connectedAccounts', parser: parseAsStringLiteral(['slack']), } as const + +export const organizationProviderTabParam = { + key: 'view', + parser: parseAsStringLiteral(['sources', 'accounts']).withDefault('sources'), +} as const diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/layout.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/layout.tsx new file mode 100644 index 00000000000..c0b0209571b --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/layout.tsx @@ -0,0 +1,14 @@ +import type { ReactNode } from 'react' +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' + +interface OrganizationProviderLayoutProps { + children: ReactNode +} + +export default function OrganizationProviderLayout({ children }: OrganizationProviderLayoutProps) { + return ( + + {children} + + ) +} diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.test.tsx new file mode 100644 index 00000000000..25ff75fb3e8 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.test.tsx @@ -0,0 +1,105 @@ +/** @vitest-environment node */ +import { Suspense } from 'react' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ + session: vi.fn(), + authorize: vi.fn(), + redirect: vi.fn(), + notFound: vi.fn(), +})) +vi.mock('@/lib/auth', () => ({ getSession: mocks.session })) +vi.mock('@/lib/settings/application/organization-section-access', () => ({ + authorizeOrganizationSettingsSection: mocks.authorize, +})) +vi.mock('@/lib/sim-search/connectors', () => ({ + SEARCH_SOURCE_TYPES: [['google_drive', { name: 'Google Drive' }]], +})) +vi.mock('next/navigation', () => ({ redirect: mocks.redirect, notFound: mocks.notFound })) +vi.mock('@/components/settings/settings-header', () => ({ + SettingsHeaderProvider: 'header-provider', + SettingsHeaderShell: 'header-shell', +})) +vi.mock( + '@/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail', + () => ({ OrganizationProviderDetail: 'provider-detail' }) +) + +import OrganizationProviderLayout from '@/app/o/[organizationId]/settings/integrations/providers/[connectorType]/layout' +import OrganizationProviderPage, { + generateMetadata, +} from '@/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page' + +const props = { + params: Promise.resolve({ organizationId: 'org-one', connectorType: 'google_drive' }), +} + +describe('organization provider page authorization', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.session.mockResolvedValue({ user: { id: 'admin-one' } }) + mocks.authorize.mockResolvedValue(true) + mocks.redirect.mockImplementation(() => { + throw new Error('redirect') + }) + mocks.notFound.mockImplementation(() => { + throw new Error('not found') + }) + }) + + it('checks the target organization integration policy before rendering provider management', async () => { + const page = await OrganizationProviderPage(props) + expect(mocks.authorize).toHaveBeenCalledWith({ + organizationId: 'org-one', + userId: 'admin-one', + section: 'integrations', + }) + expect(page.type).toBe(Suspense) + expect(page.props.children).toMatchObject({ + type: 'provider-detail', + props: { connectorType: 'google_drive' }, + }) + }) + + it('rejects unknown or unsupported providers before loading protected organization state', async () => { + await expect( + OrganizationProviderPage({ + params: Promise.resolve({ organizationId: 'org-one', connectorType: 'unknown-provider' }), + }) + ).rejects.toThrow('not found') + expect(mocks.session).not.toHaveBeenCalled() + expect(mocks.authorize).not.toHaveBeenCalled() + }) + + it('does not render when the admin or feature gate denies access', async () => { + mocks.authorize.mockResolvedValue(false) + await expect(OrganizationProviderPage(props)).rejects.toThrow('not found') + }) + + it('returns signed-out users to the requested provider after login', async () => { + mocks.session.mockResolvedValue(null) + await expect(OrganizationProviderPage(props)).rejects.toThrow('redirect') + const url = new URL(mocks.redirect.mock.calls[0][0], 'https://example.com') + expect(url.pathname).toBe('/login') + expect(url.searchParams.get('callbackUrl')).toBe( + '/o/org-one/settings/integrations/providers/google_drive' + ) + expect(mocks.authorize).not.toHaveBeenCalled() + }) + + it('keeps the settings header mounted independently of provider authorization', () => { + const layout = OrganizationProviderLayout({ children: Loading integration }) + expect(layout.type).toBe('header-provider') + expect(layout.props.children).toMatchObject({ + type: 'header-shell', + props: { meta: { title: 'Integration' } }, + }) + expect(mocks.authorize).not.toHaveBeenCalled() + }) + + it('uses the supported provider name as page metadata', async () => { + expect(await generateMetadata(props)).toEqual({ title: 'Google Drive' }) + expect(mocks.session).not.toHaveBeenCalled() + expect(mocks.authorize).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx new file mode 100644 index 00000000000..56b847554c3 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx @@ -0,0 +1,48 @@ +import { Suspense } from 'react' +import type { Metadata } from 'next' +import { notFound, redirect } from 'next/navigation' +import { getSession } from '@/lib/auth' +import { organizationRoutes } from '@/lib/navigation/paths' +import { authorizeOrganizationSettingsSection } from '@/lib/settings/application/organization-section-access' +import { SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' +import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect' +import { OrganizationProviderDetail } from '@/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail' + +interface OrganizationProviderPageProps { + params: Promise<{ organizationId: string; connectorType: string }> +} + +export async function generateMetadata({ + params, +}: OrganizationProviderPageProps): Promise { + const { connectorType } = await params + return { + title: SEARCH_SOURCE_TYPES.find(([type]) => type === connectorType)?.[1].name ?? 'Integration', + } +} + +export default async function OrganizationProviderPage({ params }: OrganizationProviderPageProps) { + const { organizationId, connectorType } = await params + if (!SEARCH_SOURCE_TYPES.some(([type]) => type === connectorType)) notFound() + const session = await getSession() + if (!session?.user) + redirect( + buildAuthCrossLink('/login', { + callbackUrl: organizationRoutes(organizationId).searchProvider(connectorType), + isInviteFlow: false, + }) + ) + if ( + !(await authorizeOrganizationSettingsSection({ + organizationId, + userId: session.user.id, + section: 'integrations', + })) + ) + notFound() + return ( + + + + ) +} diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx new file mode 100644 index 00000000000..f923fd4a9b9 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx @@ -0,0 +1,370 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { NuqsTestingAdapter } from 'nuqs/adapters/testing' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { ApiClientError } from '@/lib/api/client/errors' + +const mocks = vi.hoisted(() => ({ + admin: true, + personal: true, + access: { admin: true, members: true }, + overview: vi.fn(), + sources: vi.fn(), + accounts: vi.fn(), + people: vi.fn(), + setup: vi.fn(), + push: vi.fn(), + updateUrl: vi.fn(), + activate: vi.fn(), + resetApproval: vi.fn(), + approvalError: null as Error | null, + availabilityError: null as Error | null, + retryAvailability: vi.fn(), +})) + +vi.mock('next/navigation', () => ({ + useRouter: () => ({ push: mocks.push }), + usePathname: () => '/o/org-one/settings/integrations/providers/google_drive', +})) +vi.mock('@/app/o/[organizationId]/providers/organization-provider', () => ({ + useOrganizationContext: () => ({ + organization: { id: 'org-one' }, + viewer: { isAdmin: mocks.admin }, + searchAccess: { memberScoped: true, sourceMirrored: true }, + }), +})) +vi.mock('@/lib/sim-search/connectors', () => ({ + canConnectPersonally: () => mocks.personal, + getConnectorAccessAvailability: () => mocks.access, +})) +vi.mock('@/lib/oauth', () => ({ + getServiceConfigByServiceId: (providerId: string) => ({ providerId }), + getServiceConfigByProviderId: (providerId: string) => ({ providerId }), +})) +vi.mock('@/lib/credential-groups/providers', () => ({ + findCredentialGroupProviderFromProviderId: (providerId: string) => + providerId.startsWith('google-') ? 'google' : providerId, +})) +vi.mock('@/connectors/registry', () => ({ + CONNECTOR_META_REGISTRY: { + google_drive: { name: 'Google Drive', auth: { mode: 'oauth', provider: 'google-drive' } }, + gmail: { name: 'Gmail', auth: { mode: 'oauth', provider: 'google-email' } }, + slack: { name: 'Slack', auth: { mode: 'oauth', provider: 'slack' } }, + gitlab: { name: 'GitLab', auth: { mode: 'apiKey' } }, + }, +})) +vi.mock('@/hooks/queries/kb/connectors', () => ({ + useOrganizationSearchOverview: mocks.overview, + useSearchSources: mocks.sources, +})) +vi.mock('@/hooks/queries/organization-accounts', () => ({ + useOrganizationAccounts: mocks.accounts, +})) +vi.mock('@/hooks/queries/search-integrations', () => ({ + useUpdateSearchIntegration: () => ({ + mutate: mocks.activate, + reset: mocks.resetApproval, + error: mocks.approvalError, + isPending: false, + }), +})) +vi.mock('@/hooks/use-permission-config', () => ({ + usePermissionConfig: () => ({ + integrationAvailability: new Map(), + oauthServiceAvailability: new Map(), + isIntegrationAvailabilityReady: true, + integrationAvailabilityError: mocks.availabilityError, + refetchIntegrationAvailability: mocks.retryAvailability, + }), +})) +vi.mock('@/ee/credential-groups/components/organization-account-people', () => ({ + OrganizationAccountPeople: (props: unknown) => { + mocks.people(props) + return

    Provider account connections

    + }, +})) +vi.mock('@/app/workspace/[workspaceId]/search/components/search-source-setup', () => ({ + SearchSourceSetup: (props: unknown) => { + mocks.setup(props) + return null + }, +})) +vi.mock('@/app/o/[organizationId]/settings/components/integrations/slack-account-setup', () => ({ + OrganizationSlackAccountSetup: () => null, +})) + +import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settings/settings-header' +import { OrganizationProviderDetail } from '@/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail' + +const provider = { connectorType: 'google_drive', approved: true, status: 'active' } +const source = { + connectorId: 'source-one', + connectorType: 'google_drive', + sourceDescription: 'Engineering handbook', + enabled: true, + hasSyncError: false, + isSyncing: false, + lastSyncAt: '2026-09-08T12:00:00.000Z', + connectionRequired: true, + viewerMembership: 'needs_reauth', + viewerDocumentCount: 0, +} +const credentialGroup = { + id: 'accounts-one', + options: [{ id: 'google-option', provider: 'google', status: 'active' }], +} + +describe('organization provider management', () => { + let root: Root + let container: HTMLDivElement + beforeEach(() => { + vi.clearAllMocks() + vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) + mocks.admin = true + mocks.personal = true + mocks.access = { admin: true, members: true } + mocks.approvalError = null + mocks.availabilityError = null + mocks.overview.mockReturnValue({ data: { providers: [provider] }, isPending: false }) + mocks.sources.mockReturnValue({ + data: [source], + isPending: false, + isError: false, + hasNextPage: false, + isFetchingNextPage: false, + isFetchNextPageError: false, + error: null, + fetchNextPage: vi.fn(), + }) + mocks.accounts.mockReturnValue({ data: { credentialGroup }, isPending: false }) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + }) + afterEach(async () => { + await act(async () => root.unmount()) + container.remove() + vi.unstubAllGlobals() + }) + async function render(connectorType = 'google_drive', searchParams = '') { + await act(async () => + root.render( + + + + + + + + ) + ) + } + async function click(label: string) { + const button = Array.from(document.querySelectorAll('button')).find( + (item) => item.textContent?.trim() === label + ) + expect(button, `Missing ${label}`).toBeTruthy() + await act(async () => button!.click()) + } + + it('uses named source links even when the admin has not reconnected their own account', async () => { + await render() + expect(mocks.sources).toHaveBeenCalledWith( + { kind: 'organization', organizationId: 'org-one' }, + { connectorType: 'google_drive', search: '', enabled: true } + ) + expect(container.querySelector('a[aria-label="Open Engineering handbook"]')).toHaveAttribute( + 'href', + '/o/org-one/settings/integrations/sources/source-one' + ) + expect(container.textContent).not.toContain('Connect account') + expect(container.textContent).not.toContain('Reconnect') + expect(container.textContent).not.toContain('0 searchable documents') + }) + + it('loads sources for a nonpersonal provider even when an accounts view URL is supplied', async () => { + mocks.personal = false + mocks.overview.mockReturnValue({ + data: { providers: [{ ...provider, connectorType: 'gitlab' }] }, + }) + await render('gitlab', '?view=accounts') + expect(mocks.sources).toHaveBeenCalledWith( + expect.any(Object), + expect.objectContaining({ connectorType: 'gitlab', enabled: true }) + ) + expect(mocks.accounts).toHaveBeenCalledWith(undefined) + expect(mocks.people).not.toHaveBeenCalled() + expect(container.textContent).toContain('Engineering handbook') + }) + + it('does not claim a provider is empty before paginated source discovery finishes', async () => { + const fetchNextPage = vi.fn() + mocks.sources.mockReturnValue({ data: [], isPending: false, hasNextPage: true, fetchNextPage }) + await render() + expect(container.textContent).not.toContain('No sources yet') + await click('Load more') + expect(fetchNextPage).toHaveBeenCalledOnce() + }) + + it('keeps source links visible and retries a failed next page', async () => { + const fetchNextPage = vi.fn() + mocks.sources.mockReturnValue({ + data: [source], + isError: true, + isFetchNextPageError: true, + error: new Error('More sources unavailable'), + hasNextPage: true, + fetchNextPage, + }) + await render() + expect(container.textContent).toContain('Engineering handbook') + expect(container.textContent).toContain('More sources unavailable') + await click('Try again') + expect(fetchNextPage).toHaveBeenCalledOnce() + }) + + it.each(['', '?view=accounts'])( + 'renders overview loading without presenting missing configuration at %s', + async (params) => { + mocks.overview.mockReturnValue({ isPending: true }) + await render('google_drive', params) + expect(container.textContent).toContain('Loading integration') + expect(container.textContent).not.toContain('Activate this integration') + expect(mocks.people).not.toHaveBeenCalled() + } + ) + + it('hides cached account content and retries when overview access is revoked', async () => { + const refetch = vi.fn() + mocks.overview.mockReturnValue({ + data: { providers: [provider] }, + isError: true, + error: new ApiClientError({ status: 403, message: 'Access denied', body: null }), + refetch, + }) + await render('google_drive', '?view=accounts') + expect(container.textContent).toContain('Access denied') + expect(mocks.people).not.toHaveBeenCalled() + await click('Try again') + expect(refetch).toHaveBeenCalledOnce() + }) + + it('offers activation from the accounts tab when an existing provider is deactivated', async () => { + mocks.overview.mockReturnValue({ data: { providers: [{ ...provider, approved: false }] } }) + await render('google_drive', '?view=accounts') + expect(mocks.people).not.toHaveBeenCalled() + await click('Activate') + expect(mocks.activate).toHaveBeenCalledWith({ + organizationId: 'org-one', + connectorType: 'google_drive', + approved: true, + }) + }) + + it('shows activation failures on Accounts and keeps activation available for retry', async () => { + mocks.overview.mockReturnValue({ data: { providers: [{ ...provider, approved: false }] } }) + mocks.approvalError = new Error('Activation could not be saved') + await render('google_drive', '?view=accounts') + expect(container.textContent).toContain('Activation could not be saved') + expect(mocks.people).not.toHaveBeenCalled() + await click('Activate') + expect(mocks.activate).toHaveBeenCalledWith({ + organizationId: 'org-one', + connectorType: 'google_drive', + approved: true, + }) + }) + + it('preserves source navigation and retries connection availability failures', async () => { + mocks.availabilityError = new Error('Connection availability could not be loaded') + await render() + expect(container.textContent).toContain('Connection availability could not be loaded') + expect(container.querySelector('a[aria-label="Open Engineering handbook"]')).toHaveAttribute( + 'href', + '/o/org-one/settings/integrations/sources/source-one' + ) + await click('Try again') + expect(mocks.retryAvailability).toHaveBeenCalledOnce() + }) + + it('explains and retries Slack account lookup failures without hiding its sources', async () => { + const refetch = vi.fn() + mocks.access = { admin: false, members: true } + mocks.overview.mockReturnValue({ + data: { providers: [{ ...provider, connectorType: 'slack' }] }, + }) + mocks.accounts.mockReturnValue({ + isError: true, + error: new Error('Slack accounts could not be loaded'), + refetch, + }) + await render('slack') + expect(container.textContent).toContain('Slack accounts could not be loaded') + expect(container.textContent).toContain('Engineering handbook') + const setupButton = Array.from(container.querySelectorAll('button')).find( + (item) => item.textContent?.trim() === 'Set up Slack app' + ) + expect(setupButton).toBeDisabled() + await click('Try again') + expect(refetch).toHaveBeenCalledOnce() + }) + + it('scopes account management and connection requests to the current provider option', async () => { + await render('google_drive', '?view=accounts') + expect(mocks.sources).toHaveBeenCalledWith( + expect.any(Object), + expect.objectContaining({ enabled: false }) + ) + expect(mocks.people).toHaveBeenCalledWith( + expect.objectContaining({ + organizationId: 'org-one', + searchConnection: { optionId: 'google-option', providerName: 'Google Drive' }, + }) + ) + }) + + it.each([ + { type: 'google_drive', access: { admin: true, members: true }, memberParam: false }, + { type: 'gmail', access: { admin: false, members: true }, memberParam: true }, + ])( + 'opens $type setup with its supported connection mode', + async ({ type, access, memberParam }) => { + mocks.access = access + mocks.overview.mockReturnValue({ + data: { providers: [{ ...provider, connectorType: type }] }, + }) + await render(type) + await click('Add source') + const query = new URLSearchParams(mocks.updateUrl.mock.calls.at(-1)![0].queryString) + expect(query.get('addConnector')).toBe(type) + expect(query.get('source-access')).toBe(memberParam ? 'members' : null) + } + ) + + it('opens Slack app setup before adding a source when its bot is missing', async () => { + mocks.access = { admin: false, members: true } + mocks.overview.mockReturnValue({ + data: { providers: [{ ...provider, connectorType: 'slack' }] }, + }) + mocks.accounts.mockReturnValue({ data: { credentialGroup: null }, isPending: false }) + await render('slack') + await click('Set up Slack app') + const query = new URLSearchParams(mocks.updateUrl.mock.calls.at(-1)![0].queryString) + expect(query.get('connectedAccounts')).toBe('slack') + expect(query.has('addConnector')).toBe(false) + }) + + it('does not load admin queries or render setup controls for nonadmins', async () => { + mocks.admin = false + await render() + expect(mocks.overview).toHaveBeenCalledWith('org-one', { enabled: false }) + expect(mocks.sources).toHaveBeenCalledWith( + expect.any(Object), + expect.objectContaining({ enabled: false }) + ) + expect(mocks.accounts).toHaveBeenCalledWith(undefined) + expect(mocks.setup).not.toHaveBeenCalled() + expect(mocks.people).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx new file mode 100644 index 00000000000..ff75bfb22e5 --- /dev/null +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx @@ -0,0 +1,362 @@ +'use client' + +import { useState } from 'react' +import { ChipConfirmModal, ChipModalError, ChipSwitch } from '@sim/emcn' +import { ArrowLeft, Plus } from '@sim/emcn/icons' +import { format } from 'date-fns' +import { useRouter } from 'next/navigation' +import { useQueryState, useQueryStates } from 'nuqs' +import type { SettingsAction } from '@/components/settings/settings-header' +import { SettingsPanel } from '@/components/settings/settings-panel' +import { findCredentialGroupProviderFromProviderId } from '@/lib/credential-groups/providers' +import { organizationRoutes } from '@/lib/navigation/paths' +import { getServiceConfigByProviderId, getServiceConfigByServiceId } from '@/lib/oauth' +import { canConnectPersonally, getConnectorAccessAvailability } from '@/lib/sim-search/connectors' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' +import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' +import { organizationSearchStatusLabel } from '@/app/o/[organizationId]/settings/components/integrations/organization-search-status' +import { + connectedAccountsParam, + organizationProviderTabParam, +} from '@/app/o/[organizationId]/settings/components/integrations/search-params' +import { OrganizationSlackAccountSetup } from '@/app/o/[organizationId]/settings/components/integrations/slack-account-setup' +import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' +import { SearchSourceSetup } from '@/app/workspace/[workspaceId]/search/components/search-source-setup' +import { + searchSetupAccessParam, + searchSetupParam, +} from '@/app/workspace/[workspaceId]/search/search-params' +import { + SettingsEmptyState, + SettingsQueryErrorState, +} from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' +import { + RESOURCE_LIST_STACK, + SettingsResourceRow, +} from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' +import { useSettingsSearch } from '@/app/workspace/[workspaceId]/settings/components/use-settings-search' +import { CONNECTOR_META_REGISTRY } from '@/connectors/registry' +import { OrganizationAccountPeople } from '@/ee/credential-groups/components/organization-account-people' +import { useOrganizationSearchOverview, useSearchSources } from '@/hooks/queries/kb/connectors' +import { useOrganizationAccounts } from '@/hooks/queries/organization-accounts' +import { useUpdateSearchIntegration } from '@/hooks/queries/search-integrations' +import { useDebounce } from '@/hooks/use-debounce' +import { useOrganizationAccountPeopleSearch } from '@/hooks/use-organization-account-people-search' +import { usePermissionConfig } from '@/hooks/use-permission-config' + +interface OrganizationProviderDetailProps { + connectorType: string +} + +export function OrganizationProviderDetail({ connectorType }: OrganizationProviderDetailProps) { + const { organization, viewer, searchAccess } = useOrganizationContext() + const router = useRouter() + const [view, setView] = useQueryState( + organizationProviderTabParam.key, + organizationProviderTabParam.parser + ) + const [search, setSearch] = useSettingsSearch() + const [peopleSearch, setPeopleSearch] = useOrganizationAccountPeopleSearch() + const sourceSearch = useDebounce(search.trim(), SEARCH_DEBOUNCE_MS) + const [deactivating, setDeactivating] = useState(false) + const scope = { kind: 'organization', organizationId: organization.id } as const + const meta = CONNECTOR_META_REGISTRY[connectorType] + const personal = Boolean(meta && canConnectPersonally(meta) && searchAccess.memberScoped) + const showAccounts = view === 'accounts' && personal + const overview = useOrganizationSearchOverview(organization.id, { enabled: viewer.isAdmin }) + const sources = useSearchSources(scope, { + connectorType, + search: sourceSearch, + enabled: viewer.isAdmin && !showAccounts, + }) + const availability = usePermissionConfig() + const approval = useUpdateSearchIntegration() + const accounts = useOrganizationAccounts( + viewer.isAdmin && personal && (showAccounts || connectorType === 'slack') + ? organization.id + : undefined + ) + const [, setSetup] = useQueryStates( + { + [searchSetupParam.key]: searchSetupParam.parser, + [searchSetupAccessParam.key]: searchSetupAccessParam.parser, + }, + { history: 'replace' } + ) + const [, setConnectedAccounts] = useQueryState( + connectedAccountsParam.key, + connectedAccountsParam.parser + ) + const provider = overview.data?.providers.find((item) => item.connectorType === connectorType) + const approved = provider?.approved === true + const back = { + text: 'Integrations', + icon: ArrowLeft, + onSelect: () => + router.push(organizationRoutes(organization.id).settingsSection('integrations')), + } + if (!viewer.isAdmin || !meta) return null + const searchField = showAccounts + ? { value: peopleSearch, onChange: setPeopleSearch, placeholder: 'Search people...' } + : { value: search, onChange: setSearch, placeholder: 'Search sources...' } + const panel = { + back, + title: meta.name, + description: provider ? organizationSearchStatusLabel(provider) : undefined, + docsLink: meta.searchDocsUrl, + search: searchField, + } + const access = getConnectorAccessAvailability(meta, availability.integrationAvailability, { + memberAccessAvailable: searchAccess.memberScoped, + mirroredAccessAvailable: searchAccess.sourceMirrored, + oauthServiceAvailability: availability.oauthServiceAvailability, + isIntegrationAvailabilityReady: availability.isIntegrationAvailabilityReady, + }) + const service = + meta.auth.mode === 'oauth' + ? (getServiceConfigByServiceId(meta.auth.provider) ?? + getServiceConfigByProviderId(meta.auth.provider)) + : undefined + const credentialProvider = service + ? findCredentialGroupProviderFromProviderId(service.providerId) + : undefined + const option = accounts.data?.credentialGroup?.options.find( + (item) => item.provider === credentialProvider && item.status === 'active' + ) + const needsSlackSetup = + connectorType === 'slack' && + (option?.provider !== 'slack' || + !option.slackBotCredentialId || + option.configurationStatus !== 'ready') + const pending = + overview.isPending || + overview.isError || + approval.isPending || + !availability.isIntegrationAvailabilityReady + const startSource = () => + void setSetup({ + addConnector: searchSetupParam.parser.parse(connectorType), + 'source-access': access.admin ? null : 'members', + }) + const activate = () => + approval.mutate({ organizationId: organization.id, connectorType, approved: true }) + const actions: SettingsAction[] = approved + ? [ + ...(access.admin || access.members + ? [ + { + text: needsSlackSetup ? 'Set up Slack app' : 'Add source', + icon: Plus, + variant: 'primary' as const, + disabled: + pending || + (connectorType === 'slack' && (accounts.isPending || accounts.isError)), + onSelect: needsSlackSetup ? () => void setConnectedAccounts('slack') : startSource, + }, + ] + : []), + { + text: 'Deactivate', + disabled: pending, + onSelect: () => { + approval.reset() + setDeactivating(true) + }, + }, + ] + : [ + { + text: provider ? 'Activate' : 'Add integration', + variant: 'primary', + disabled: pending || (!access.admin && !access.members), + onSelect: activate, + }, + ] + if (overview.isError) + return ( + + void overview.refetch()} + variant='inline' + /> + + ) + if (overview.isPending) + return ( + + Loading integration… + + ) + + const renderSources = () => ( + + {approval.error && ( + + {approval.error.message} + + )} + {availability.integrationAvailabilityError && ( + void availability.refetchIntegrationAvailability()} + variant='inline' + /> + )} + {connectorType === 'slack' && accounts.isError && ( + void accounts.refetch()} + variant='inline' + /> + )} + {sources.isError && !sources.isFetchNextPageError ? ( + void sources.refetch()} + variant='inline' + /> + ) : sources.isPending ? ( + Loading sources… + ) : ( +
    + {sources.data?.map((source) => ( + + ))} + {!sources.data?.length && !sources.hasNextPage && ( + + {sourceSearch + ? 'No matching sources' + : !approved + ? 'Activate this integration to set up sources.' + : 'No sources yet.'} + + )} + +
    + )} +
    + ) + return ( + <> +
    + {personal && ( +
    + void setView(value)} + options={[ + { value: 'sources', label: 'Sources' }, + { value: 'accounts', label: 'Accounts' }, + ]} + /> +
    + )} + {showAccounts ? ( + accounts.isError ? ( + + void accounts.refetch()} + variant='inline' + /> + + ) : accounts.isPending ? ( + + Loading accounts… + + ) : option && approved && !needsSlackSetup ? ( + + ) : ( + + {approval.error && ( + + {approval.error.message} + + )} + {availability.integrationAvailabilityError && ( + void availability.refetchIntegrationAvailability()} + variant='inline' + /> + )} + + {approved + ? needsSlackSetup + ? 'Set up the Slack app to connect accounts.' + : 'Add a source to set up account connections.' + : 'Activate this integration to set up account connections.'} + + + ) + ) : ( + renderSources() + )} +
    + + + { + if (!approval.isPending) setDeactivating(open) + }} + title={`Deactivate ${meta.name}?`} + text='Its content will be unavailable in Search, Assistant, and MCP. Sources and connected accounts are preserved.' + confirm={{ + label: 'Deactivate', + variant: 'destructive', + pending: approval.isPending, + onClick: () => + approval.mutate( + { organizationId: organization.id, connectorType, approved: false }, + { onSuccess: () => setDeactivating(false) } + ), + }} + > + {approval.error?.message} + + + ) +} diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx index 24d0f6bd54b..5384f18605a 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx @@ -11,6 +11,7 @@ const mocks = vi.hoisted(() => ({ admin: true, index: vi.fn(), detail: vi.fn(), + integrations: vi.fn(), push: vi.fn(), documents: vi.fn(), actions: vi.fn(), @@ -37,6 +38,9 @@ vi.mock('@/hooks/queries/kb/connectors', () => ({ useConnectorDetail: mocks.detail, isConnectorSyncingOrPending: () => false, })) +vi.mock('@/hooks/queries/search-integrations', () => ({ + useSearchIntegrations: mocks.integrations, +})) vi.mock('@/connectors/registry', () => ({ CONNECTOR_META_REGISTRY: { google_drive: { @@ -128,6 +132,9 @@ describe('organization source detail navigation', () => { mocks.saving = false mocks.index.mockReturnValue({ data: { knowledgeBaseId: 'index-one' }, isPending: false }) mocks.detail.mockReturnValue({ data: connector }) + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'google_drive', approved: true }], + }) mocks.actions.mockImplementation((options: ConnectorActionsOptions) => ({ actions: [ { @@ -186,13 +193,16 @@ describe('organization source detail navigation', () => { knowledgeBaseId: 'index-one', connectorId: 'source-one', filter: 'active', + isSearchIndex: true, }) ) expect(document.querySelector('[role="dialog"]')).toBeNull() await click('Sync history') expect(mocks.history).toHaveBeenCalled() - await click('Integrations') - expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') + await click('Google Drive') + expect(mocks.push).toHaveBeenCalledWith( + '/o/org-one/settings/integrations/providers/google_drive' + ) }) it('restores document search and status from the shared URL', async () => { await render('?search=notes&document-filter=excluded') @@ -225,6 +235,42 @@ describe('organization source detail navigation', () => { expect(container.textContent).not.toContain('Review the source settings and try syncing again.') }) + it.each(['', '?view=settings', '?view=history'])( + 'shows integration deactivation independently of source sync state at %s', + async (searchParams) => { + mocks.detail.mockReturnValue({ data: { ...connector, status: 'paused' } }) + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'google_drive', approved: false }], + }) + await render(searchParams) + expect(mocks.integrations).toHaveBeenCalledWith('org-one') + expect(container.textContent).toContain('Google Drive is deactivated') + expect(container.textContent).toContain( + 'Its content is unavailable in Search, Assistant, and MCP.' + ) + expect(container.textContent).toContain('Sync paused') + } + ) + + it('keeps source settings and their guard when integration status cannot refresh', async () => { + mocks.dirty = true + const refetch = vi.fn() + mocks.integrations.mockReturnValue({ + isError: true, + error: new Error('Integration status unavailable'), + refetch, + }) + await render('?view=settings') + expect(container.textContent).toContain('Source configuration') + expect(container.textContent).toContain('Integration status unavailable') + expect(container.textContent).not.toContain('is deactivated') + await click('Try again') + expect(refetch).toHaveBeenCalledOnce() + await click('Google Drive') + expect(mocks.push).not.toHaveBeenCalled() + expect(document.querySelector('[role="dialog"]')?.textContent).toContain('Unsaved Changes') + }) + it.each(['pending', 'syncing', 'paused', 'error', 'disabled'] as const)( 'does not duplicate recovery feedback for a %s source', async (status) => { @@ -299,6 +345,7 @@ describe('organization source detail navigation', () => { ) expect(mocks.detail).toHaveBeenLastCalledWith(undefined, 'source-one') expect(mocks.actions).not.toHaveBeenCalled() + expect(mocks.integrations).not.toHaveBeenCalled() }) it('shows a missing source when there is no search index', async () => { mocks.index.mockReturnValue({ data: { knowledgeBaseId: null }, isPending: false }) @@ -306,6 +353,8 @@ describe('organization source detail navigation', () => { await render() expect(container.textContent).toContain('This source is no longer available') expect(mocks.actions).not.toHaveBeenCalled() + await click('Integrations') + expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') }) it('requires discard confirmation before leaving dirty settings', async () => { mocks.dirty = true @@ -323,10 +372,12 @@ describe('organization source detail navigation', () => { expect(document.querySelector('[role="dialog"]')?.textContent).toContain('Unsaved Changes') expect(mocks.documents).not.toHaveBeenCalled() await click('Keep editing') - await click('Integrations') + await click('Google Drive') expect(mocks.push).not.toHaveBeenCalled() await click('Discard Changes') - expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') + expect(mocks.push).toHaveBeenCalledWith( + '/o/org-one/settings/integrations/providers/google_drive' + ) }) it('places source actions in the resource header before the view tabs', async () => { @@ -382,6 +433,19 @@ describe('organization source detail navigation', () => { expect(container.textContent).not.toContain('Source configuration') }) + it('hides cached source settings when integration status reports revoked access', async () => { + await render('?view=settings') + mocks.integrations.mockReturnValue({ + data: [{ connectorType: 'google_drive', approved: true }], + isError: true, + error: new ApiClientError({ status: 403, message: 'Access denied', body: null }), + refetch: vi.fn(), + }) + await render('?view=settings') + expect(container.textContent).toContain('Access denied') + expect(container.textContent).not.toContain('Source configuration') + }) + it('preserves the editable baseline across background connector updates', async () => { await render('?view=settings') mocks.detail.mockReturnValue({ @@ -444,7 +508,7 @@ describe('organization source detail navigation', () => { await click('Documents') await click('Sync history') - await click('Integrations') + await click('Google Drive') expect(mocks.documents).not.toHaveBeenCalled() expect(mocks.history).not.toHaveBeenCalled() expect(mocks.push).not.toHaveBeenCalled() diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx index 6ef15f75fe7..56f7177958d 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx @@ -44,6 +44,7 @@ import { useConnectorDetail, useSearchIndex, } from '@/hooks/queries/kb/connectors' +import { useSearchIntegrations } from '@/hooks/queries/search-integrations' import { useDebounce } from '@/hooks/use-debounce' import { useOAuthReturnForKBConnectors } from '@/hooks/use-oauth-return' @@ -128,7 +129,8 @@ export function OrganizationSourceDetail({ connectorId }: OrganizationSourceDeta key={`${organization.id}:${connectorId}`} connector={detail.data} scope={scope} - backHref={backHref} + backHref={organizationRoutes(organization.id).searchProvider(detail.data.connectorType)} + backText={CONNECTOR_META_REGISTRY[detail.data.connectorType]?.name ?? 'Integration'} queryError={ failedQuery ? ( + void integrations.refetch()} + fallback='Could not load integration status' + variant='inline' + /> + + ) + const integrationFeedback = ( + <> + {queryError} + {integrations.isError ? ( + void integrations.refetch()} + fallback='Could not load integration status' + variant='inline' + /> + ) : integrations.isPending ? ( + Loading integration status… + ) : null} + {integrations.data?.find((item) => item.connectorType === connector.connectorType) + ?.approved === false && ( + + )} + + ) if (view === 'settings') return ( @@ -206,13 +260,13 @@ function SourceDetailContent({ connector, scope, backHref, queryError }: SourceD return ( - {queryError} + {integrationFeedback} {effectiveStatus === 'active' && lastSyncError && ( void setFilter(next)} progressScope={scope} + isSearchIndex syncing={isConnectorSyncingOrPending(connector)} /> ) : ( @@ -310,6 +365,7 @@ interface SourceSettingsEditorProps { title: string description?: string queryError?: ReactNode + backText: string onBack: () => void onViewChange: (view: string) => void } @@ -342,6 +398,7 @@ function SourceSettingsForm({ title, description, queryError, + backText, onBack, onViewChange, onSaved, @@ -358,7 +415,7 @@ function SourceSettingsForm({ return ( guard.guardBack(onBack) }} + back={{ text: backText, icon: ArrowLeft, onSelect: () => guard.guardBack(onBack) }} title={title} description={description} docsLink={form.docsUrl} diff --git a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx index 4cbb2e49ab0..b94535be58c 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.test.tsx @@ -386,6 +386,7 @@ describe('ConnectOAuthModal reauthorization', () => { knowledgeBaseId='kb-search' connectorType='slack' connectorId={connectorId} + sourceAccess='members' requiredScopes={[]} /> ) @@ -400,6 +401,7 @@ describe('ConnectOAuthModal reauthorization', () => { knowledgeBaseId: 'kb-search', connectorType: 'slack', connectorId, + sourceAccess: 'members', }) ) expect(mocks.connectOAuthService).toHaveBeenCalledWith({ diff --git a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx index 6e97ed4bf44..4ec62347415 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/connect-oauth-modal/connect-oauth-modal.tsx @@ -134,6 +134,7 @@ type ConnectOAuthModalConnectProps = ConnectOAuthModalBaseProps & { knowledgeBaseId: string connectorType?: string connectorId?: string + sourceAccess?: 'members' } | { origin: 'integrations' } ) @@ -396,6 +397,7 @@ export function ConnectOAuthModal(props: ConnectOAuthModalProps) { knowledgeBaseId: props.knowledgeBaseId, connectorType: props.connectorType, connectorId: props.connectorId, + sourceAccess: props.sourceAccess, } } else if (props.origin === 'workflow') { returnContext = { diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx index 3ea14b0499c..925e601b84a 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.test.tsx @@ -5,14 +5,26 @@ import { act, type ComponentProps } from 'react' import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { Credential } from '@/lib/oauth' +import type { SourceSelectionLabels } from '@/lib/sim-search/source-identity' +import type { ServiceAccountConnectTarget } from '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal' import type { ConnectorConfigFieldsProps } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields' +import type { ConfigFieldMap } from '@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields' const mocks = vi.hoisted(() => ({ create: vi.fn(), accountsQuery: vi.fn(), configFields: vi.fn(), resolveSourceConfig: vi.fn((): Record => ({})), + sourceConfig: {} as ConfigFieldMap, + selectionLabels: undefined as SourceSelectionLabels | undefined, + canonicalModes: {} as Record, + isFieldPopulated: vi.fn(() => true), credentials: [] as Pick[], + credentialsState: 'ready' as 'ready' | 'loading' | 'error', + refetchCredentials: vi.fn(), + oauthModal: vi.fn(), + serviceAccountModal: vi.fn(), + serviceAccountTarget: null as ServiceAccountConnectTarget | null, memberAccess: true, mirroredAccess: true, accountState: 'missing' as @@ -58,6 +70,8 @@ vi.mock('@/hooks/use-permission-config', () => ({ integrationAvailability: new Map([ ['slack', { oauthAvailable: true, state: 'ready' }], ['slack_v2', { oauthAvailable: true, state: 'ready' }], + ['google_drive', { oauthAvailable: true, state: 'ready' }], + ['confluence_v2', { oauthAvailable: true, state: 'ready' }], ]), oauthServiceAvailability: new Map( [ @@ -115,8 +129,11 @@ vi.mock('@/hooks/queries/source-accounts', () => ({ vi.mock('@/hooks/queries/oauth/oauth-credentials', () => ({ useOAuthCredentials: () => ({ data: mocks.credentials, - isLoading: false, - refetch: vi.fn(), + isLoading: mocks.credentialsState === 'loading', + isSuccess: mocks.credentialsState === 'ready', + isFetching: mocks.credentialsState === 'loading', + error: mocks.credentialsState === 'error' ? new Error('Could not load accounts') : null, + refetch: mocks.refetchCredentials, }), })) vi.mock('@/hooks/use-oauth-return', () => ({ useOAuthReturnForKBConnectors: vi.fn() })) @@ -124,13 +141,30 @@ vi.mock('@/hooks/use-credential-refresh-triggers', () => ({ useCredentialRefreshTriggers: vi.fn(), })) vi.mock('@/app/workspace/[workspaceId]/components/connect-oauth-modal', () => ({ - ConnectOAuthModal: () => null, + ConnectOAuthModal: (props: { open: boolean }) => { + mocks.oauthModal(props) + return props.open ?
    Connect account
    : null + }, })) vi.mock( '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal', () => ({ - ConnectServiceAccountModal: () => null, - useServiceAccountConnectTarget: () => null, + ConnectServiceAccountModal: (props: { open: boolean; onCreated: (id: string) => void }) => { + mocks.serviceAccountModal(props) + return props.open ? ( + + ) : null + }, + useServiceAccountConnectTarget: () => mocks.serviceAccountTarget, }) ) vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields', () => ({ @@ -141,13 +175,14 @@ vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-confi })) vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config-fields', () => ({ useConnectorConfigFields: () => ({ - sourceConfig: {}, + sourceConfig: mocks.sourceConfig, + selectionLabels: mocks.selectionLabels, setSourceConfig: vi.fn(), - canonicalModes: {}, + canonicalModes: mocks.canonicalModes, setCanonicalModes: vi.fn(), canonicalGroups: [], isFieldVisible: () => true, - isFieldPopulated: () => true, + isFieldPopulated: mocks.isFieldPopulated, handleFieldChange: vi.fn(), toggleCanonicalMode: vi.fn(), resolveSourceConfig: mocks.resolveSourceConfig, @@ -155,6 +190,7 @@ vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/hooks/use-connector-config })) import { AddConnectorModal } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal' +import { confluenceConnectorMeta } from '@/connectors/confluence/meta' import { googleDriveConnectorMeta } from '@/connectors/google-drive/meta' import { useConnectorSetupStore } from '@/stores/connector-setup/store' @@ -185,12 +221,27 @@ function button(label: string): HTMLButtonElement { return match } +function combobox(label: string): HTMLElement { + const match = Array.from(document.querySelectorAll('[role="combobox"]')).find( + (node) => node.textContent?.trim() === label + ) + if (!match) throw new Error(`Missing combobox: ${label}`) + return match +} + beforeEach(() => { vi.clearAllMocks() mocks.memberAccess = true mocks.mirroredAccess = true mocks.accountState = 'missing' mocks.credentials = [{ id: 'credential-1', name: 'Source account', type: 'oauth' }] + mocks.credentialsState = 'ready' + mocks.serviceAccountTarget = null + mocks.sourceConfig = {} + mocks.selectionLabels = undefined + mocks.canonicalModes = {} + mocks.resolveSourceConfig.mockReset().mockReturnValue({}) + mocks.isFieldPopulated.mockReset().mockReturnValue(true) useConnectorSetupStore.getState().reset() ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true vi.stubGlobal( @@ -213,6 +264,33 @@ afterEach(async () => { }) describe('Slack member setup readiness', () => { + it('reports the created source while preserving the connector type callback argument', async () => { + mocks.accountState = 'ready' + const onCreated = vi.fn() + const onOpenChange = vi.fn() + await render({ onCreated, onOpenChange }) + await act(async () => button('Create & Invite').click()) + expect(onCreated).not.toHaveBeenCalled() + const created = { id: 'created-source', connectorType: 'slack', knowledgeBaseId: 'kb-search' } + await act(async () => mocks.create.mock.calls[0][1].onSuccess(created)) + expect(onOpenChange).toHaveBeenCalledWith(false) + expect(onCreated).toHaveBeenCalledWith('slack', created) + }) + + it('keeps setup open after a creation failure without reporting a created source', async () => { + mocks.accountState = 'ready' + const onCreated = vi.fn() + const onOpenChange = vi.fn() + await render({ onCreated, onOpenChange }) + await act(async () => button('Create & Invite').click()) + await act(async () => + mocks.create.mock.calls[0][1].onError(new Error('Source could not be created')) + ) + expect(document.body.textContent).toContain('Source could not be created') + expect(onCreated).not.toHaveBeenCalled() + expect(onOpenChange).not.toHaveBeenCalled() + }) + it('persists selector display metadata alongside the unchanged provider selection', async () => { mocks.accountState = 'ready' const sourceConfig = { @@ -248,10 +326,11 @@ describe('Slack member setup readiness', () => { mocks.accountState = state await render() expect(document.body.textContent).not.toContain('Create & Invite') - expect(document.body.textContent).toContain('Connection method') - expect(document.body.textContent).not.toContain('Browse with') + expect(document.body.textContent).toContain('Sync using') + expect(document.body.textContent).not.toContain('Account for browsing') expect(document.body.textContent).not.toContain('Sync documents with') expect(document.body.textContent).not.toContain('Document details (optional)') + expect(document.body.textContent).not.toContain('More options') expect(button('Cancel')).toBeEnabled() expect(mocks.create).not.toHaveBeenCalled() expect(mocks.accountsQuery).toHaveBeenCalledWith('workspace-1') @@ -268,9 +347,15 @@ describe('Slack member setup readiness', () => { async (isSearchIndex) => { mocks.accountState = 'ready' await render({ isSearchIndex }) - expect(document.body.textContent).toContain('Browse with') + expect(document.body.textContent).toContain('Account for browsing') + if (isSearchIndex) { + expect(document.body.textContent).not.toContain('Sync documents with') + await act(async () => button('More options').click()) + } expect(document.body.textContent).toContain('Sync documents with') - expect(document.body.textContent).toContain('Document details (optional)') + expect(document.body.textContent).toContain( + isSearchIndex ? 'More options' : 'Document details (optional)' + ) expect(button('Create & Invite')).toBeEnabled() await act(async () => button('Create & Invite').click()) expect(mocks.create).toHaveBeenCalledWith( @@ -289,11 +374,11 @@ describe('Slack member setup readiness', () => { it('reveals the configuration once Slack setup becomes ready', async () => { await render() expect(document.body.textContent).toContain('Set up Slack') - expect(document.body.textContent).not.toContain('Browse with') + expect(document.body.textContent).not.toContain('Account for browsing') mocks.accountState = 'ready' await render() expect(document.body.textContent).not.toContain('Set up Slack') - expect(document.body.textContent).toContain('Browse with') + expect(document.body.textContent).toContain('Account for browsing') expect(button('Create & Invite')).toBeEnabled() }) @@ -305,14 +390,58 @@ describe('Slack member setup readiness', () => { }) describe('Search methods requiring member identity', () => { + it.each(['members', 'admin'] as const)( + 'honors the locked %s entry point over a draft for the other access mode', + async (accessMode) => { + const setupDraftKey = `confluence:${accessMode}` + useConnectorSetupStore.getState().saveDraft(setupDraftKey, { + sourceConfig: {}, + canonicalModes: {}, + accessMode: accessMode === 'admin' ? 'members' : 'admin', + credentialId: 'credential-1', + contentCredentialId: null, + disabledTagIds: [], + savedAt: Date.now(), + }) + await render({ + scope: { kind: 'organization', organizationId: 'org-1' }, + initialConnectorType: 'confluence', + lockedAccessMode: accessMode, + setupDraftKey, + }) + + expect(document.body.textContent).not.toContain('Sync using') + expect(document.querySelector('button[aria-label="Choose another source"]')).toBeNull() + await act(async () => + button(accessMode === 'admin' ? 'Connect & Sync' : 'Add source').click() + ) + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ connectorType: 'confluence', accessMode }), + expect.any(Object) + ) + } + ) + + it('retains the Slack prerequisite for locked member setup and hides it once ready', async () => { + await render({ lockedAccessMode: 'members' }) + expect(document.body.textContent).toContain('Set up Slack') + expect(document.body.textContent).toContain('Slack app') + expect(document.body.textContent).not.toContain('Member accounts') + expect(document.body.textContent).not.toContain('Create & Invite') + mocks.accountState = 'ready' + await render({ lockedAccessMode: 'members' }) + expect(document.body.textContent).not.toContain('Sync using') + expect(button('Create & Invite')).toBeEnabled() + }) + it('keeps organization connected-account setup in members mode', async () => { await render({ scope: { kind: 'organization', organizationId: 'org-1' }, initialConnectorType: 'confluence', initialAccessMode: 'admin', - membersOnly: true, + lockedAccessMode: 'members', }) - expect(document.body.textContent).not.toContain('Connection method') + expect(document.body.textContent).not.toContain('Sync using') expect(document.body.textContent).not.toContain('Choose another source') await act(async () => button('Add source').click()) expect(mocks.create).toHaveBeenCalledWith( @@ -439,3 +568,397 @@ describe('Service-account source fields', () => { } ) }) + +interface SearchSetupFieldsCase { + connectorType: string + primary: string[] + optional: string[] + cap: string + capHidden?: boolean +} + +const SEARCH_SETUP_FIELDS: SearchSetupFieldsCase[] = [ + { + connectorType: 'confluence', + primary: ['domain', 'spaceSelector', 'spaceKey'], + optional: ['contentType', 'labelFilter'], + cap: 'maxPages', + }, + { + connectorType: 'github', + primary: ['repository'], + optional: ['branch', 'pathPrefix', 'extensions'], + cap: 'maxFiles', + }, + { + connectorType: 'gitlab', + primary: ['host', 'project', 'contentTypes'], + optional: [ + 'ref', + 'pathPrefix', + 'fileExtensions', + 'issueState', + 'issueLabels', + 'issueMilestone', + ], + cap: 'maxItems', + capHidden: false, + }, + { + connectorType: 'gmail', + primary: ['labelSelector', 'label', 'dateRange'], + optional: ['excludePromotions', 'excludeSocial', 'query'], + cap: 'maxThreads', + }, + { + connectorType: 'google_calendar', + primary: ['calendarSelector', 'calendarId', 'dateRange'], + optional: ['searchQuery', 'includeAttendees'], + cap: 'maxEvents', + }, + { + connectorType: 'google_drive', + primary: ['folderSelector', 'folderId'], + optional: ['fileType'], + cap: 'maxFiles', + }, + { + connectorType: 'jira', + primary: ['domain', 'projectSelector', 'projectKey'], + optional: ['jql'], + cap: 'maxIssues', + }, + { + connectorType: 'slack', + primary: ['channelSelector', 'channel', 'startDate'], + optional: ['excludeChannels', 'includeArchived'], + cap: 'maxMessages', + }, +] + +function configFieldsProps(): ConnectorConfigFieldsProps { + const props = mocks.configFields.mock.lastCall?.[0] + if (!props) throw new Error('Connector fields were not rendered') + return props +} + +function fieldVisible(props: ConnectorConfigFieldsProps, fieldId: string) { + const field = props.connectorConfig.configFields.find((entry) => entry.id === fieldId) + if (!field) throw new Error(`Missing ${props.connectorConfig.id} field ${fieldId}`) + return props.isFieldVisible(field) +} + +describe('Search setup options', () => { + it.each(SEARCH_SETUP_FIELDS)( + 'keeps $connectorType primary fields outside More options and preserves its listing-cap policy', + async ({ connectorType, primary, optional, cap, capHidden = true }) => { + mocks.accountState = 'ready' + await render({ + initialConnectorType: connectorType, + initialAccessMode: connectorType === 'gitlab' ? 'admin' : 'members', + }) + + const primaryFields = configFieldsProps() + for (const fieldId of primary) expect(fieldVisible(primaryFields, fieldId)).toBe(true) + for (const fieldId of optional) expect(fieldVisible(primaryFields, fieldId)).toBe(false) + expect(fieldVisible(primaryFields, cap)).toBe(false) + expect(button('More options')).toHaveAttribute('aria-expanded', 'false') + expect(document.body.textContent).not.toContain('Sync Frequency') + + await act(async () => button('More options').click()) + + const optionalFields = configFieldsProps() + for (const fieldId of optional) expect(fieldVisible(optionalFields, fieldId)).toBe(true) + for (const fieldId of primary) expect(fieldVisible(optionalFields, fieldId)).toBe(false) + expect(fieldVisible(optionalFields, cap)).toBe(!capHidden) + expect(button('More options')).toHaveAttribute('aria-expanded', 'true') + expect(document.body.textContent).toContain('Metadata tags') + + await act(async () => button('More options').click()) + + expect(button('More options')).toHaveAttribute('aria-expanded', 'false') + for (const fieldId of primary) expect(fieldVisible(configFieldsProps(), fieldId)).toBe(true) + expect(document.body.textContent).not.toContain('Metadata tags') + } + ) + + it.each(SEARCH_SETUP_FIELDS)( + 'keeps $connectorType general knowledge-base fields and sync frequency outside document details', + async ({ connectorType, primary, optional, cap }) => { + await render({ + initialConnectorType: connectorType, + initialAccessMode: 'workspace', + isSearchIndex: false, + }) + + const fields = configFieldsProps() + for (const fieldId of [...primary, ...optional, cap]) { + expect(fieldVisible(fields, fieldId)).toBe(true) + } + expect(document.body.textContent).toContain('Sync Frequency') + expect(document.body.textContent).not.toContain('More options') + expect(button('Document details (optional)')).toHaveAttribute('aria-expanded', 'false') + expect(document.body.textContent).not.toContain('Metadata tags') + } + ) + + it('keeps administrator-required fields in the primary form even if metadata marks them optional', async () => { + mocks.credentials = [{ id: 'service', name: 'Indexing account', type: 'service_account' }] + await render({ initialConnectorType: 'google_drive', initialAccessMode: 'admin' }) + + const fields = configFieldsProps() + const subject = googleDriveConnectorMeta.configFields.find( + (field) => field.id === 'adminEmail' + )! + expect(fields.isFieldVisible({ ...subject, setupGroup: 'options' })).toBe(true) + expect(fieldVisible(fields, 'openSharing')).toBe(true) + expect(fieldVisible(fields, 'folderSelector')).toBe(true) + expect(fieldVisible(fields, 'folderId')).toBe(true) + }) + + it('keeps optional values and disabled metadata tags in the request after collapsing More options', async () => { + const sourceConfig = { + domain: 'team.atlassian.net', + spaceKey: ['ENG'], + contentType: 'blogpost', + labelFilter: 'approved', + maxPages: '25', + } + mocks.resolveSourceConfig.mockReturnValue(sourceConfig) + await render({ initialConnectorType: 'confluence' }) + await act(async () => button('More options').click()) + const version = Array.from(document.querySelectorAll('label')).find( + (label) => label.textContent?.trim() === 'Version' + ) + const checkbox = version?.querySelector('[role="checkbox"]') + if (!checkbox) throw new Error('Missing Version metadata checkbox') + await act(async () => checkbox.click()) + await act(async () => button('More options').click()) + await act(async () => button('Create & Invite').click()) + + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ + connectorType: 'confluence', + accessMode: 'members', + sourceConfig: { + domain: 'team.atlassian.net', + spaceKey: ['ENG'], + contentType: 'blogpost', + labelFilter: 'approved', + disabledTagIds: ['version'], + }, + }), + expect.any(Object) + ) + }) +}) + +describe('Account connection dropdown', () => { + it('keeps GitHub browsing credentials out of the primary form while preserving optional indexing-account connection', async () => { + mocks.credentials = [] + await render({ + initialConnectorType: 'github', + lockedAccessMode: 'members', + scope: { kind: 'organization', organizationId: 'org-1' }, + setupDraftKey: 'github-members', + }) + expect(document.body.textContent).not.toContain('Account for browsing') + expect(document.body.textContent).not.toContain('Sync documents with') + expect(document.querySelector('[role="combobox"]')).toBeNull() + await act(async () => button('More options').click()) + await act(async () => combobox('Connected members').click()) + const option = Array.from(document.querySelectorAll('[role="option"]')).find( + (node) => node.textContent?.trim() === 'Connect GitHub account' + ) + expect(option).toBeDefined() + await act(async () => { + option?.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })) + }) + expect(mocks.oauthModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + open: true, + organizationId: 'org-1', + connectorType: 'github', + sourceAccess: 'members', + }) + ) + expect(useConnectorSetupStore.getState().getDraft('github-members')?.accessMode).toBe('members') + }) + + it('offers account-query recovery in GitHub options without adding a primary account field', async () => { + mocks.credentials = [] + mocks.credentialsState = 'error' + await render({ initialConnectorType: 'github', lockedAccessMode: 'members' }) + expect(document.body.textContent).not.toContain('Account for browsing') + expect(document.body.textContent).not.toContain('Could not load accounts') + await act(async () => button('More options').click()) + expect(document.body.textContent).toContain('Could not load accounts') + await act(async () => button('Try again').click()) + expect(mocks.refetchCredentials).toHaveBeenCalledOnce() + }) + + it('offers both connection methods in the empty dropdown and preserves the OAuth setup draft', async () => { + mocks.credentials = [] + mocks.serviceAccountTarget = { + serviceAccountProviderId: 'atlassian-service-account', + serviceName: 'Atlassian', + serviceIcon: confluenceConnectorMeta.icon, + label: 'Add service account', + hidden: false, + } + mocks.sourceConfig = { + domain: 'team.atlassian.net', + spaceKey: ['ENG'], + labelFilter: 'approved', + } + mocks.canonicalModes = { spaceKey: 'advanced' } + mocks.selectionLabels = { spaceKey: [{ id: 'ENG', label: 'Engineering' }] } + await render({ + initialConnectorType: 'confluence', + initialAccessMode: 'admin', + scope: { kind: 'organization', organizationId: 'org-1' }, + setupDraftKey: 'confluence-direct', + }) + + expect(document.body.textContent).toContain('Indexing account') + expect(button('Connect & Sync')).toBeDisabled() + await act(async () => combobox('Select Confluence account').click()) + const options = Array.from(document.querySelectorAll('[role="option"]')) + expect(options.map((option) => option.textContent?.trim())).toEqual([ + 'Connect Confluence account', + 'Add service account', + ]) + await act(async () => options[0]!.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }))) + + expect(useConnectorSetupStore.getState().getDraft('confluence-direct')).toEqual({ + sourceConfig: mocks.sourceConfig, + canonicalModes: mocks.canonicalModes, + selectionLabels: mocks.selectionLabels, + accessMode: 'admin', + credentialId: null, + contentCredentialId: null, + disabledTagIds: [], + savedAt: expect.any(Number), + }) + expect(mocks.oauthModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + open: true, + origin: 'kb-connectors', + provider: 'confluence', + organizationId: 'org-1', + knowledgeBaseId: 'kb-search', + connectorType: 'confluence', + }) + ) + expect(mocks.create).not.toHaveBeenCalled() + }) + + it('does not mistake an unavailable account list for an empty list, then uses the retried account', async () => { + mocks.credentials = [] + mocks.credentialsState = 'error' + await render({ initialConnectorType: 'confluence', initialAccessMode: 'admin' }) + + expect(document.body.textContent).toContain('Could not load accounts') + expect(document.body.textContent).not.toContain('Connect Confluence') + expect(button('Connect & Sync')).toBeDisabled() + await act(async () => button('Try again').click()) + expect(mocks.refetchCredentials).toHaveBeenCalledOnce() + + mocks.credentialsState = 'ready' + mocks.credentials = [{ id: 'recovered-account', name: 'Recovered account', type: 'oauth' }] + await render({ initialConnectorType: 'confluence', initialAccessMode: 'admin' }) + + expect(document.body.textContent).not.toContain('Could not load accounts') + expect(combobox('Recovered account')).toHaveAttribute('aria-disabled', 'false') + expect(button('Connect & Sync')).toBeEnabled() + await act(async () => button('Connect & Sync').click()) + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ credentialId: 'recovered-account', accessMode: 'admin' }), + expect.any(Object) + ) + expect(mocks.oauthModal).not.toHaveBeenCalled() + }) + + it('keeps cached accounts usable after a background account-list error', async () => { + mocks.credentialsState = 'error' + await render({ initialConnectorType: 'confluence', initialAccessMode: 'admin' }) + expect(combobox('Source account')).toHaveAttribute('aria-disabled', 'false') + expect(button('Connect & Sync')).toBeEnabled() + expect(document.body.textContent).not.toContain('Could not load accounts') + }) + + it('keeps existing-account selection and the connect-another action', async () => { + await render({ + initialConnectorType: 'confluence', + initialAccessMode: 'admin', + setupDraftKey: 'another-account', + }) + await act(async () => combobox('Source account').click()) + const option = Array.from(document.querySelectorAll('[role="option"]')).find( + (node) => node.textContent?.trim() === 'Connect another Confluence account' + ) + if (!option) throw new Error('Missing connect-another option') + await act(async () => option.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }))) + + expect(mocks.oauthModal).toHaveBeenCalledWith(expect.objectContaining({ open: true })) + expect(useConnectorSetupStore.getState().getDraft('another-account')?.credentialId).toBe( + 'credential-1' + ) + }) + + it.each(['members', 'admin'] as const)( + 'opens service-account setup from the %s account dropdown', + async (accessMode) => { + mocks.credentials = [] + mocks.serviceAccountTarget = { + serviceAccountProviderId: 'google-service-account', + serviceName: 'Google', + serviceIcon: googleDriveConnectorMeta.icon, + label: 'Add service account', + hidden: false, + } + await render({ + initialConnectorType: 'google_drive', + initialAccessMode: accessMode, + scope: { kind: 'organization', organizationId: 'org-1' }, + }) + await act(async () => + combobox( + accessMode === 'members' ? 'Select Google Drive account' : 'Select a service account' + ).click() + ) + const options = Array.from(document.querySelectorAll('[role="option"]')) + expect(options.map((option) => option.textContent?.trim())).toEqual( + accessMode === 'members' + ? ['Connect Google Drive account', 'Add service account'] + : ['Add service account'] + ) + const serviceAccountOption = options.find( + (option) => option.textContent?.trim() === 'Add service account' + ) + expect(serviceAccountOption).toBeDefined() + await act(async () => + serviceAccountOption!.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })) + ) + + expect(mocks.serviceAccountModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + open: true, + organizationId: 'org-1', + serviceAccountProviderId: 'google-service-account', + }) + ) + expect(mocks.oauthModal).not.toHaveBeenCalled() + await act(async () => button('Finish service account setup').click()) + expect(combobox('New service account')).toHaveAttribute('aria-disabled', 'false') + expect(configFieldsProps().credentialId).toBe('new-service-account') + if (accessMode === 'admin') { + await act(async () => button('Connect & Sync').click()) + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ credentialId: 'new-service-account', accessMode: 'admin' }), + expect.any(Object) + ) + } + } + ) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx index a1cf0802f76..f2a6d0cd486 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx @@ -18,6 +18,7 @@ import { OverflowText, } from '@sim/emcn' import { ArrowLeft, ChevronDown, ChevronRight, Plus, Search } from '@sim/emcn/icons' +import type { ConnectorData } from '@/lib/api/contracts/knowledge/connectors' import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' import { getIntegrationsForCredentialProvider } from '@/lib/integrations/credential-display' import { @@ -44,8 +45,8 @@ import { ConnectorContentCredentialField, } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field' import { ConnectorConfigFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields' +import type { ConnectorConfigFieldsProps } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields/connector-config-fields' import { - BROWSE_WITH_HINT, connectorSyncFrequencyHint, SYNC_INTERVALS, } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/consts' @@ -82,9 +83,10 @@ interface AddConnectorModalProps { isSearchIndex?: boolean initialConnectorType?: string | null initialAccessMode?: ConnectorAccessSelection['accessMode'] - membersOnly?: boolean + /** The entry point has already chosen how this source connects. */ + lockedAccessMode?: 'members' | 'admin' initialSyncIntervalMinutes?: number - onCreated?: (connectorType: string) => void + onCreated?: (connectorType: string, connector: ConnectorData) => void setupDraftKey?: string } @@ -98,7 +100,7 @@ export function AddConnectorModal({ isSearchIndex = false, initialConnectorType, initialAccessMode = 'workspace', - membersOnly = false, + lockedAccessMode, initialSyncIntervalMinutes = 1440, onCreated, setupDraftKey, @@ -129,7 +131,8 @@ export function AddConnectorModal({ ) const [access, setAccess] = useState(() => ({ accessMode: - (membersOnly ? 'members' : draft?.accessMode) ?? + lockedAccessMode ?? + draft?.accessMode ?? (isSearchIndex && initialAccessMode === 'workspace' ? initialType && CONNECTOR_META_REGISTRY[initialType]?.auth.mode === 'apiKey' ? 'admin' @@ -241,6 +244,8 @@ export function AddConnectorModal({ const { data: rawCredentials = [], isLoading: credentialsLoading, + isFetching: credentialsFetching, + error: credentialsError, refetch: refetchCredentials, } = useOAuthCredentials(connectorProviderId ?? undefined, { enabled: Boolean(connectorConfig) && !isApiKeyMode, @@ -300,7 +305,6 @@ export function AddConnectorModal({ const showCredentialPicker = !isMembersMode || - connectorConfig?.supportsSeparateContentCredential || connectorConfig?.configFields.some( (field) => field.type === 'selector' && isFieldVisible(field) ) @@ -319,6 +323,83 @@ export function AddConnectorModal({ }) } + const connectOAuth = () => { + saveSetup() + setShowOAuthModal(true) + } + + const isOptionalSetupField = (field: ConnectorConfigField) => + isSearchIndex && + field.setupGroup === 'options' && + Boolean(connectorConfig && !isConnectorFieldRequired(field, connectorConfig, access.accessMode)) + const hasOptionalSetupFields = connectorConfig?.configFields.some( + (field) => + isOptionalSetupField(field) && isFieldVisible(field) && !hiddenCapFieldIds.has(field.id) + ) + const configFieldsProps: Omit | null = + connectorConfig + ? { + scope, + accessMode: access.accessMode, + connectorConfig, + sourceConfig, + selectionLabels, + credentialId: effectiveCredentialId, + canonicalGroups, + canonicalModes, + onFieldChange: handleFieldChange, + onToggleCanonicalMode: toggleCanonicalMode, + disabled: isCreating, + } + : null + + const contentCredentialField = + isMembersMode && connectorConfig?.supportsSeparateContentCredential ? ( + <> + ({ + value: credential.id, + label: credential.name || credential.provider, + })), + ...(canConnectOAuth + ? [ + { + value: '__connect_new__', + label: `Connect ${connectorConfig.name} account`, + icon: Plus, + onSelect: connectOAuth, + }, + ] + : []), + ...(canConnectServiceAccount + ? [ + { + value: '__service_account__', + label: serviceAccountTarget.label, + icon: Plus, + onSelect: () => setShowServiceAccountModal(true), + }, + ] + : []), + ]} + isLoading={credentialsLoading} + disabled={isCreating} + /> + {!showCredentialPicker && credentialsError && rawCredentials.length === 0 && ( + void refetchCredentials()} + variant='inline' + /> + )} + + ) : null + const closeSetup = (nextOpen: boolean) => { if (!nextOpen && setupDraftKey) useConnectorSetupStore.getState().clearDraft(setupDraftKey) onOpenChange(nextOpen) @@ -419,9 +500,9 @@ export function AddConnectorModal({ syncIntervalMinutes: syncInterval, }, { - onSuccess: () => { + onSuccess: (connector) => { closeSetup(false) - onCreated?.(selectedType) + onCreated?.(selectedType, connector) }, onError: (err) => { setError(err.message) @@ -454,7 +535,7 @@ export function AddConnectorModal({ closeSetup(false)}> {step === 'configure' ? ( - {!membersOnly && ( + {!lockedAccessMode && ( {step === 'select-type' ? ( @@ -522,7 +603,7 @@ export function AddConnectorModal({ /> )} - {!membersOnly && + {(!lockedAccessMode || slackSetupRequired) && (memberAccessAvailable || mirroredAccessAvailable || slackSetupRequired) && ( )} @@ -577,95 +659,89 @@ export function AddConnectorModal({ type='custom' title={ isMembersMode - ? 'Browse with' - : canConnectOAuth - ? 'Account' - : 'Service account' + ? 'Account for browsing' + : isSearchIndex + ? 'Indexing account' + : canConnectOAuth + ? 'Account' + : 'Service account' } - hint={isMembersMode ? BROWSE_WITH_HINT : undefined} > - ({ - label: cred.name || cred.provider, - value: cred.id, - icon: withBrandIcon(connectorConfig.icon), - }) - ), - ...(canConnectOAuth - ? [ - { - label: - credentials.length > 0 - ? `Connect another ${connectorConfig.name} account` - : `Connect ${connectorConfig.name} account`, - value: '__connect_new__', - icon: Plus, - onSelect: () => { - saveSetup() - setShowOAuthModal(true) + {credentialsError && rawCredentials.length === 0 ? ( + void refetchCredentials()} + variant='inline' + /> + ) : ( + ({ + label: cred.name || cred.provider, + value: cred.id, + icon: withBrandIcon(connectorConfig.icon), + }) + ), + ...(canConnectOAuth + ? [ + { + label: + credentials.length > 0 + ? `Connect another ${connectorConfig.name} account` + : `Connect ${connectorConfig.name} account`, + value: '__connect_new__', + icon: Plus, + onSelect: connectOAuth, }, - }, - ] - : []), - ...(canConnectServiceAccount - ? [ - { - label: serviceAccountTarget.label, - value: '__service_account__', - icon: Plus, - onSelect: () => setShowServiceAccountModal(true), - }, - ] - : []), - ]} - value={effectiveCredentialId ?? undefined} - onChange={(value) => setSelectedCredentialId(value)} - onOpenChange={(isOpen) => { - if (isOpen) void refetchCredentials() - }} - placeholder={ - canConnectOAuth - ? `Select ${connectorConfig.name} account` - : 'Select a service account' - } - isLoading={credentialsLoading || isIntegrationAvailabilityLoading} - disabled={!isIntegrationAvailabilityReady} - /> + ] + : []), + ...(canConnectServiceAccount + ? [ + { + label: serviceAccountTarget.label, + value: '__service_account__', + icon: Plus, + onSelect: () => setShowServiceAccountModal(true), + }, + ] + : []), + ]} + value={effectiveCredentialId ?? undefined} + onChange={(value) => setSelectedCredentialId(value)} + onOpenChange={(isOpen) => { + if (isOpen) void refetchCredentials() + }} + placeholder={ + canConnectOAuth + ? `Select ${connectorConfig.name} account` + : 'Select a service account' + } + isLoading={credentialsLoading || isIntegrationAvailabilityLoading} + disabled={isCreating || !isIntegrationAvailabilityReady} + /> + )} ) : null} - {isMembersMode && connectorConfig.supportsSeparateContentCredential && ( - ({ - value: credential.id, - label: credential.name || credential.provider, - }))} - isLoading={credentialsLoading} - disabled={isCreating} + {!isSearchIndex && contentCredentialField} + + {configFieldsProps && ( + + isFieldVisible(field) && + !hiddenCapFieldIds.has(field.id) && + !isOptionalSetupField(field) + } /> )} - - isFieldVisible(field) && !hiddenCapFieldIds.has(field.id) - } - onFieldChange={handleFieldChange} - onToggleCanonicalMode={toggleCanonicalMode} - disabled={isCreating} - /> - - {connectorConfig.tagDefinitions && connectorConfig.tagDefinitions.length > 0 && ( + {(hasOptionalSetupFields || + contentCredentialField || + Boolean(connectorConfig.tagDefinitions?.length)) && ( <>
    setShowMetadata((visible) => !visible)} > - Document details (optional) + {isSearchIndex ? 'More options' : 'Document details (optional)'}
    {showMetadata && ( - -
    - {connectorConfig.tagDefinitions.map((tagDef) => ( - - ))} -
    -
    + <> + {isSearchIndex && contentCredentialField} + {configFieldsProps && hasOptionalSetupFields && ( + + isFieldVisible(field) && + !hiddenCapFieldIds.has(field.id) && + isOptionalSetupField(field) + } + /> + )} + {Boolean(connectorConfig.tagDefinitions?.length) && ( + +
    + {connectorConfig.tagDefinitions?.map((tagDef) => ( + + ))} +
    +
    + )} + )} )} @@ -748,7 +833,15 @@ export function AddConnectorModal({ )} - {error} + + {error ?? + (lockedAccessMode && + isIntegrationAvailabilityReady && + !integrationAvailabilityError && + !(lockedAccessMode === 'admin' ? allowAdmin : allowMembers) + ? `This connection method is not available in this ${scope.kind}.` + : null)} + )} @@ -815,6 +908,7 @@ export function AddConnectorModal({ {...owner} knowledgeBaseId={knowledgeBaseId} connectorType={selectedType ?? undefined} + sourceAccess={lockedAccessMode === 'members' ? 'members' : undefined} /> )} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.test.tsx index a8340126da1..88d114193ce 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.test.tsx @@ -91,7 +91,7 @@ afterEach(async () => { describe('connection method selection', () => { it('offers supported methods to admins without changing their contract values', async () => { await render() - expect(container.textContent).toContain('Connection method') + expect(container.textContent).toContain('Sync using') expect(radio('Member accounts')).toHaveAttribute('aria-checked', 'true') expect(container.querySelectorAll('[role="radio"]')).toHaveLength(2) await act(async () => radio('Admin or service account').click()) @@ -102,27 +102,12 @@ describe('connection method selection', () => { await render({ connectorConfig: gitlabConnectorMeta, value: { accessMode: 'admin' } }) expect(container.querySelector('[role="radiogroup"]')).toBeNull() expect(container.textContent).toContain('Admin or service account') - expect(container.textContent).toContain( - 'Each person sees only documents they can open in GitLab.' - ) - }) - - it('explains the Confluence identity connection even with central syncing', async () => { - await render({ value: { accessMode: 'admin' }, allowMembers: false }) - expect(container.querySelector('[role="radiogroup"]')).toBeNull() - expect(container.textContent).toContain( - 'Teammates still connect their Confluence accounts to confirm their identity.' - ) - expect(container.textContent).toContain( - 'Each person sees only documents they can open in Confluence.' - ) }) it('shows ordinary members a summary without editable or disabled choices', async () => { await render({ canAdmin: false, footer: }) expect(container.querySelector('[role="radiogroup"]')).toBeNull() expect(container.textContent).toContain('Member accounts') - expect(container.textContent).toContain('Each teammate connects their Confluence account.') expect(container.querySelector('button')).toBeNull() expect(mocks.accounts).toHaveBeenLastCalledWith(undefined) }) @@ -187,10 +172,13 @@ describe('Slack setup continuity', () => { connectorConfig: slackConnectorMeta, allowAdmin: false, searchSetupSource: 'slack', + slackSetupOnly: true, onSetupNavigate: onNavigate, footer: , }) expect(container.querySelector('[role="radiogroup"]')).toBeNull() + expect(container.textContent).toContain('Slack app') + expect(container.textContent).not.toContain('Member accounts') const link = container.querySelector('a') const target = new URL(link?.getAttribute('href') ?? '', 'http://localhost') expect(target.pathname).toBe('/workspace/workspace-1/settings/credential-groups') diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx index 2525dd6fed0..3892f413abf 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field.tsx @@ -42,15 +42,7 @@ export function ConnectorContentCredentialField({ disabled, }: ConnectorContentCredentialFieldProps) { return ( - + void } -function accessHint(mode: ConnectorAccessMode, connectorConfig: ConnectorMeta): string { - const sourceName = connectorConfig.name - if (mode === 'members') { - return ( - connectorConfig.memberSetupHint ?? - `Each teammate connects their ${sourceName} account. They see only documents they can open there.` - ) - } - if (mode === 'admin') { - const identityHint = connectorConfig.requiresMemberIdentity - ? ` Teammates still connect their ${sourceName} accounts to confirm their identity.` - : '' - return `${connectorConfig.adminSetupHint ?? 'An admin or service account syncs documents and permissions.'}${identityHint} Each person sees only documents they can open in ${sourceName}.` - } - return 'Everyone in this workspace can search these documents.' -} - /** Chooses how a source connects while preserving its document permissions. */ export function ConnectorAccessField({ workspaceId, @@ -114,6 +90,7 @@ export function ConnectorAccessField({ allowWorkspace = true, footer, searchSetupSource, + slackSetupOnly = false, onSetupNavigate, }: ConnectorAccessFieldProps) { const scope = explicitScope ?? resourceScopeFromOwner({ workspaceId }) @@ -161,16 +138,18 @@ export function ConnectorAccessField({ return ( entry.mode === value.accessMode)?.allowed ? `This connection method is not available in this ${scope.kind}.` - : accessHint(value.accessMode, connectorConfig) + : value.accessMode === 'workspace' + ? 'Everyone in this workspace can search these documents.' + : undefined } >
    - {showModeSelector ? ( + {slackSetupOnly ? null : showModeSelector ? ( void } progressScope?: ResourceScope + isSearchIndex?: boolean syncing?: boolean filter: ConnectorDocumentFilter onFilterChange: (filter: ConnectorDocumentFilter) => void @@ -37,6 +38,7 @@ export function ConnectorDocuments({ search, searchControl, progressScope, + isSearchIndex = false, syncing, onFilterChange, }: ConnectorDocumentsProps) { @@ -72,6 +74,9 @@ export function ConnectorDocuments({ return ( <>
    + {isSearchIndex && ( +

    Documents you can access

    + )}
    {searchControl && ( ({ useUpdateDocument: () => ({ ...mocks.retryState, mutate: mocks.retry }), })) +import { ConnectorDocuments } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-documents/connector-documents' import { ConnectorDocumentsTab } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-documents-tab' let root: Root @@ -95,6 +96,28 @@ afterEach(() => { }) describe('connector document recovery', () => { + it('labels Search documents by the current viewer access without changing general knowledge bases', () => { + render() + expect(document.body.textContent).not.toContain('Documents you can access') + act(() => + root.render( + + + + + + ) + ) + expect(document.body.textContent).toContain('Documents you can access') + expect(document.body.textContent).toContain('Handbook.txt') + }) + it('shows the failed file and retries through the existing scoped document mutation', () => { render() expect(document.body.textContent).toContain('Indexing failed') diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx index 2b8843ce17d..9f0bc153dc0 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx @@ -30,7 +30,6 @@ import { } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field' import { ConnectorConfigFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields' import { - BROWSE_WITH_HINT, connectorSyncFrequencyHint, SYNC_INTERVALS, } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/consts' @@ -329,7 +328,7 @@ export function ConnectorSettingsFields({ connectorConfig.configFields.some( (field) => field.type === 'selector' && isFieldVisible(field) ) && ( - + ) : (
    + {usable && supported && !source.viewerEmailVerified && ( + Verify email + )} {connectable && ( {waiting diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx index 27911a1735a..8dc2b768cc2 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.test.tsx @@ -9,6 +9,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ canAdmin: true, replace: vi.fn(), + push: vi.fn(), availabilityReady: true, availabilityLoading: false, availabilityError: null as Error | null, @@ -102,7 +103,7 @@ vi.mock('@/app/workspace/[workspaceId]/search/components/search-source-status', }, })) vi.mock('next/navigation', () => ({ - useRouter: () => ({ replace: mocks.replace }), + useRouter: () => ({ replace: mocks.replace, push: mocks.push }), useParams: () => ({ workspaceId: 'workspace-1' }), usePathname: () => '/workspace/workspace-1/search', })) @@ -170,6 +171,9 @@ vi.mock('@/hooks/queries/oauth/oauth-credentials', () => ({ useOAuthCredentials: () => ({ data: mocks.credentials, isLoading: false, + isSuccess: true, + isFetching: false, + error: null, refetch: vi.fn(), }), })) @@ -241,12 +245,16 @@ async function fill(placeholder: string, value: string) { }) } -async function chooseCombo(currentLabel: string, nextLabel: string) { +async function openCombo(currentLabel: string) { const combo = Array.from(document.querySelectorAll('[role="combobox"]')).find( (node) => node.textContent?.includes(currentLabel) ) expect(combo, `Combobox ${currentLabel}`).toBeDefined() await click(combo!) +} + +async function chooseCombo(currentLabel: string, nextLabel: string) { + await openCombo(currentLabel) const option = Array.from(document.querySelectorAll('[role="option"]')).find( (node) => node.textContent?.trim() === nextLabel ) @@ -354,6 +362,145 @@ function setup() { ) } +function organizationSetup() { + return ( + + ) +} + +describe('organization setup entry points', () => { + it('uses central mode and its own draft even when the saved draft contains member mode', async () => { + useConnectorSetupStore + .getState() + .saveDraft('user-1:organization:org-1:kb-search:confluence:admin', { + sourceConfig: { domain: 'team.atlassian.net', spaceKey: ['ENG'] }, + canonicalModes: { spaceKey: 'advanced' }, + accessMode: 'members', + credentialId: 'cred-source', + contentCredentialId: null, + disabledTagIds: [], + savedAt: Date.now(), + }) + await render(organizationSetup(), '?addConnector=confluence') + + expect(document.body.textContent).not.toContain('Sync using') + expect(document.querySelector('button[aria-label="Choose another source"]')).toBeNull() + expect( + document.querySelector('input[placeholder="yoursite.atlassian.net"]')?.value + ).toBe('team.atlassian.net') + await click(button('Connect & Sync')) + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ + connectorType: 'confluence', + accessMode: 'admin', + credentialId: 'cred-source', + }), + expect.any(Object) + ) + expect(mocks.push).not.toHaveBeenCalled() + const created = connector({ + id: 'new-source', + connectorType: 'confluence', + accessMode: 'admin', + }) + await act(async () => mocks.create.mock.calls[0][1].onSuccess(created)) + expect(mocks.urlUpdate).toHaveBeenLastCalledWith(expect.objectContaining({ queryString: '' })) + expect(mocks.push).toHaveBeenCalledWith('/o/org-1/settings/integrations/sources/new-source') + }) + + it('honors explicit member-source URLs and clears both setup parameters on close', async () => { + useConnectorSetupStore + .getState() + .saveDraft('user-1:organization:org-1:kb-search:github:members', { + sourceConfig: { repository: 'acme/docs' }, + canonicalModes: {}, + accessMode: 'members', + credentialId: 'cred-source', + contentCredentialId: null, + disabledTagIds: [], + savedAt: Date.now(), + }) + await render(organizationSetup(), '?addConnector=github&source-access=members&search=keep') + + expect(mocks.replace).not.toHaveBeenCalled() + expect(document.querySelector('button[aria-label="Choose another source"]')).toBeNull() + expect(document.body.textContent).not.toContain('Sync using') + expect(document.body.textContent).not.toContain('Sync documents with') + expect(button('Add source')).toBeEnabled() + await click(button('Add source')) + expect(mocks.create).toHaveBeenCalledWith( + expect.objectContaining({ + connectorType: 'github', + accessMode: 'members', + sourceConfig: { repository: 'acme/docs' }, + }), + expect.any(Object) + ) + await click(button('Cancel')) + expect(mocks.urlUpdate).toHaveBeenLastCalledWith( + expect.objectContaining({ queryString: '?search=keep' }) + ) + expect(document.querySelector('[role="dialog"]')).toBeNull() + expect(mocks.push).not.toHaveBeenCalled() + expect( + useConnectorSetupStore + .getState() + .getDraft('user-1:organization:org-1:kb-search:github:members') + ).toBeUndefined() + }) + + it.each(['github', 'gmail', 'google_calendar', 'jira'])( + 'returns old %s organization setup links to personal integrations without loading the index', + async (type) => { + await render(organizationSetup(), `?addConnector=${type}`) + expect(mocks.replace).toHaveBeenCalledWith('/o/org-1/integrations') + expect(mocks.basesQuery).toHaveBeenLastCalledWith('org-1', { enabled: false }) + expect(mocks.connectorsQuery).toHaveBeenLastCalledWith(undefined) + expect(document.querySelector('[role="dialog"]')).toBeNull() + expect(mocks.prepare).not.toHaveBeenCalled() + } + ) + + it('prepares explicit member sources under the organization without switching them to central mode', async () => { + mocks.bases = [] + await render(organizationSetup(), '?addConnector=confluence&source-access=members') + await click(button('Continue setup')) + expect(mocks.prepare).toHaveBeenCalledWith( + { organizationId: 'org-1', connectorType: 'confluence', accessMode: 'members' }, + expect.any(Object) + ) + }) + + it.each([ + { query: '?addConnector=confluence', member: true, mirrored: false }, + { query: '?addConnector=confluence&source-access=members', member: false, mirrored: true }, + ])( + 'does not substitute the other connection mode when its selected feature is denied: $query', + async ({ query, member, mirrored }) => { + mocks.bases = [] + mocks.features = { knowledgeMemberAccess: member, knowledgeSourceMirroredAccess: mirrored } + await render(organizationSetup(), query) + expect(document.body.textContent).toContain('Not available in this organization') + expect(document.body.textContent).not.toContain('Continue setup') + expect(mocks.prepare).not.toHaveBeenCalled() + } + ) + + it('remounts the locked form when the same provider URL changes connection mode', async () => { + await render(organizationSetup(), '?addConnector=confluence&source-access=members') + expect(button('Add source')).toBeDisabled() + await render(organizationSetup(), '?addConnector=confluence') + expect(button('Connect & Sync')).toBeDisabled() + expect(document.body.textContent).not.toContain('Add source') + expect(document.body.textContent).not.toContain('Sync using') + }) +}) + describe('Search source setup with real connector dialogs', () => { it.each([ ['source-one', '/o/org-1/settings/integrations/sources/source-one'], @@ -553,7 +700,6 @@ describe('Search source setup with real connector dialogs', () => { canAdmin memberAccessAvailable mirroredAccessAvailable - membersOnly />, '?addConnector=slack' ) @@ -752,7 +898,8 @@ describe('member content credentials in real add and edit dialogs', () => { initialAccessMode='members' /> ) - expect(document.body.textContent).toContain('Each teammate connects their Slack account.') + expect(document.body.textContent).toContain('Member accounts') + expect(document.body.textContent).toContain('Set up Slack') expect( Array.from(document.querySelectorAll('a')).map((node) => node.getAttribute('href')) ).toEqual(['/workspace/workspace-1/settings/credential-groups']) @@ -1020,14 +1167,14 @@ describe('administrator source prerequisites in real connector dialogs', () => { initialAccessMode='admin' /> ) - const picker = Array.from(document.querySelectorAll('[role="combobox"]')).find( - (node) => node.textContent?.includes('Select Confluence account') + await openCombo('Select Confluence account') + const options = Array.from(document.querySelectorAll('[role="option"]')) + expect( + options.some((node) => node.textContent?.trim() === 'Connect Confluence account') + ).toBe(true) + const serviceAccountOption = options.find( + (node) => node.textContent?.trim() === 'Add service account' ) - expect(picker).toBeDefined() - await click(picker!) - const serviceAccountOption = Array.from( - document.querySelectorAll('[role="option"]') - ).find((node) => node.textContent?.trim() === 'Add service account') expect(Boolean(serviceAccountOption)).toBe(state === 'ready' || state === 'limited') } @@ -1047,16 +1194,11 @@ describe('administrator source prerequisites in real connector dialogs', () => { initialAccessMode={accessMode} /> ) - const picker = Array.from(document.querySelectorAll('[role="combobox"]')).find( - (node) => - node.textContent?.includes( - accessMode === 'admin' ? 'Select a service account' : 'Select Google Drive account' - ) + await openCombo( + accessMode === 'admin' ? 'Select a service account' : 'Select Google Drive account' ) - expect(picker).toBeDefined() - await click(picker!) - const options = Array.from(document.querySelectorAll('[role="option"]')).map( - (node) => node.textContent?.trim() + const options = Array.from(document.querySelectorAll('[role="option"]')).map((node) => + node.textContent?.trim() ) expect(options.includes('Add service account')).toBe(accessMode === 'admin') @@ -1415,6 +1557,7 @@ describe('administrator source prerequisites in real connector dialogs', () => { ) expect(document.querySelector(`input[placeholder="${adminEmailPlaceholder}"]`)).toBeDisabled() expect(button('Switch Folders to manual input')).toBeDisabled() + if (phase === 'creating') await click(button('More options')) const dropdown = Array.from(document.querySelectorAll('[role="combobox"]')).find((node) => node.textContent?.includes('Select file type') ) @@ -1527,7 +1670,7 @@ describe('canonical Search connector safety', () => { }) describe('resuming Search source setup', () => { - const key = 'user-1:workspace-1:kb-search:slack' + const key = 'user-1:workspace-1:kb-search:slack:choose' it('reopens the source from the URL even when the source filter hides its row', async () => { await render(setup(), '?search=nothing-matches&addConnector=gitlab&credentialDraftId=draft-1') @@ -1564,6 +1707,7 @@ describe('resuming Search source setup', () => { /> ) await render(form) + await click(button('More options')) await chooseCombo('Connected members', 'Indexing account') await fill('e.g. hr, legal, C01ABC23DEF', 'legal') mocks.credentialGroup = null @@ -1598,6 +1742,7 @@ describe('resuming Search source setup', () => { ], } await render(form) + await click(button('More options')) expect( document.querySelector('input[placeholder="e.g. hr, legal, C01ABC23DEF"]') ?.value @@ -1609,8 +1754,10 @@ describe('resuming Search source setup', () => { credentialId: 'cred-source', sourceConfig: { excludeChannels: 'legal' }, }) - await act(async () => mocks.create.mock.calls[0][1].onSuccess()) - expect(onCreated).toHaveBeenCalledWith('slack') + const created = connector() + await act(async () => mocks.create.mock.calls[0][1].onSuccess(created)) + expect(onCreated).toHaveBeenCalledWith('slack', created) + expect(mocks.push).not.toHaveBeenCalled() expect(useConnectorSetupStore.getState().getDraft(key)).toBeUndefined() }) @@ -1658,7 +1805,7 @@ describe('resuming Search source setup', () => { /> ) expect(document.body.textContent).not.toContain('Sync Frequency') - expect(button('Document details (optional)')).toHaveAttribute('aria-expanded', 'false') + expect(button('More options')).toHaveAttribute('aria-expanded', 'false') }) }) diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx index 592446038be..1e6838ec7c0 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/components/search-source-setup.tsx @@ -13,7 +13,7 @@ import { import { Search } from '@sim/emcn/icons' import dynamic from 'next/dynamic' import { useRouter } from 'next/navigation' -import { useQueryState } from 'nuqs' +import { useQueryState, useQueryStates } from 'nuqs' import { useSession } from '@/lib/auth/auth-client' import { type ResourceScope, @@ -26,6 +26,7 @@ import { getConnectorAccessAvailability, SEARCH_SOURCE_TYPES } from '@/lib/sim-s import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase' import { managedSourceParam, + searchSetupAccessParam, searchSetupParam, } from '@/app/workspace/[workspaceId]/search/search-params' import { @@ -65,7 +66,6 @@ interface SearchSourceSetupProps { canAdmin: boolean memberAccessAvailable: boolean mirroredAccessAvailable: boolean - membersOnly?: boolean } /** Owns admin setup and existing source management, including bookmarked OAuth return URLs. */ @@ -75,7 +75,6 @@ export function SearchSourceSetup({ canAdmin, memberAccessAvailable, mirroredAccessAvailable, - membersOnly = false, }: SearchSourceSetupProps) { const scope = explicitScope ?? resourceScopeFromOwner({ workspaceId }) const { data: session } = useSession() @@ -88,10 +87,16 @@ export function SearchSourceSetup({ integrationAvailabilityError, refetchIntegrationAvailability, } = usePermissionConfig() - const [selectedType, setSelectedType] = useQueryState( - searchSetupParam.key, - searchSetupParam.parser.withOptions({ history: 'replace' }) + const [setup, setSetup] = useQueryStates( + { + [searchSetupParam.key]: searchSetupParam.parser, + [searchSetupAccessParam.key]: searchSetupAccessParam.parser, + }, + { history: 'replace' } ) + const selectedType = setup.addConnector + const setSelectedType = (type: typeof selectedType) => + setSetup({ addConnector: type, ...(type === null ? { 'source-access': null } : {}) }) const [managedSource, setManagedSource] = useQueryState( managedSourceParam.key, managedSourceParam.parser.withOptions({ history: 'replace' }) @@ -99,9 +104,23 @@ export function SearchSourceSetup({ const [search, setSearch] = useState('') const router = useRouter() const prepare = usePrepareSearchSource() + const selectedMeta = selectedType ? CONNECTOR_META_REGISTRY[selectedType] : undefined + const redirectPersonalSetup = Boolean( + scope.kind === 'organization' && + canAdmin && + selectedMeta && + setup['source-access'] !== 'members' && + !selectedMeta.mirrorsSourceAcls && + selectedType !== 'slack' + ) const redirectManagement = scope.kind === 'organization' && canAdmin && managedSource !== null && selectedType === null const organizationId = scope.kind === 'organization' ? scope.organizationId : undefined + useEffect(() => { + if (redirectPersonalSetup && organizationId) { + router.replace(organizationRoutes(organizationId).integrations) + } + }, [redirectPersonalSetup, organizationId, router]) useEffect(() => { if (!redirectManagement || !organizationId || managedSource === null) return const routes = organizationRoutes(organizationId) @@ -112,13 +131,15 @@ export function SearchSourceSetup({ } }, [redirectManagement, organizationId, managedSource, router, setManagedSource]) const open = selectedType !== null || managedSource !== null - const index = useSearchIndex(scope, { enabled: canAdmin && open && !redirectManagement }) + const index = useSearchIndex(scope, { + enabled: canAdmin && open && !redirectManagement && !redirectPersonalSetup, + }) const knowledgeBaseId = index.data?.knowledgeBaseId ?? undefined const connectors = useConnectorList( canAdmin && managedSource && !redirectManagement ? knowledgeBaseId : undefined ) - if (!canAdmin || !open || redirectManagement) return null + if (!canAdmin || !open || redirectManagement || redirectPersonalSetup) return null const close = () => { if (prepare.isPending) return @@ -130,7 +151,6 @@ export function SearchSourceSetup({ : managedSource && connectors.isError ? connectors : null - const selectedMeta = selectedType ? CONNECTOR_META_REGISTRY[selectedType] : undefined const managedConnectors = connectors.data?.filter( (connector) => connector.id === managedSource || connector.connectorType === managedSource @@ -139,7 +159,10 @@ export function SearchSourceSetup({ managedConnectors[0]?.connectorType ?? (managedSource && CONNECTOR_META_REGISTRY[managedSource] ? managedSource : undefined) const initialMode = (type: string) => { - if (membersOnly) return 'members' as const + if (scope.kind === 'organization') + return setup['source-access'] === 'members' || type === 'slack' + ? ('members' as const) + : ('admin' as const) const meta = CONNECTOR_META_REGISTRY[type] if ( meta && @@ -161,9 +184,11 @@ export function SearchSourceSetup({ (isIntegrationAvailabilityReady || integrationAvailability.size > 0) ) { if (selectedType && session?.user?.id) { + const accessMode = initialMode(selectedType) + const setupMode = scope.kind === 'organization' ? accessMode : 'choose' return ( { if (!nextOpen) void setSelectedType(null) @@ -172,12 +197,17 @@ export function SearchSourceSetup({ scope={scope} isSearchIndex initialConnectorType={selectedType} - initialAccessMode={initialMode(selectedType)} - membersOnly={membersOnly} - setupDraftKey={`${session.user.id}:${resourceScopeKey(scope)}:${knowledgeBaseId}:${selectedType}`} + initialAccessMode={accessMode} + lockedAccessMode={scope.kind === 'organization' ? accessMode : undefined} + setupDraftKey={`${session.user.id}:${resourceScopeKey(scope)}:${knowledgeBaseId}:${selectedType}:${setupMode}`} onConnectorTypeChange={(type) => void setSelectedType(type !== null ? searchSetupParam.parser.parse(type) : null) } + onCreated={async (_type, connector) => { + if (scope.kind !== 'organization') return + await setSelectedType(null) + router.push(organizationRoutes(scope.organizationId).searchSource(connector.id)) + }} /> ) } @@ -196,10 +226,15 @@ export function SearchSourceSetup({ } const normalizedSearch = search.trim().toLowerCase() - const visibleTypes = SEARCH_SOURCE_TYPES.filter(([type, meta]) => - selectedType - ? type === selectedType - : `${meta.name} ${meta.description}`.toLowerCase().includes(normalizedSearch) + const visibleTypes = SEARCH_SOURCE_TYPES.filter( + ([type, meta]) => + (scope.kind !== 'organization' || + setup['source-access'] === 'members' || + meta.mirrorsSourceAcls || + type === 'slack') && + (selectedType + ? type === selectedType + : `${meta.name} ${meta.description}`.toLowerCase().includes(normalizedSearch)) ) return ( @@ -270,7 +305,12 @@ export function SearchSourceSetup({ isIntegrationAvailabilityReady, } ) - const available = membersOnly ? members : central || members + const available = + scope.kind === 'organization' + ? setup['source-access'] === 'members' || type === 'slack' + ? members + : central + : central || members return ( diff --git a/apps/sim/app/workspace/[workspaceId]/search/search-params.ts b/apps/sim/app/workspace/[workspaceId]/search/search-params.ts index 0312ee7c95c..a20092ce98a 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/search-params.ts +++ b/apps/sim/app/workspace/[workspaceId]/search/search-params.ts @@ -17,6 +17,12 @@ export const searchSetupParam = { parser: parseAsStringLiteral(['', ...SEARCH_SETUP_SOURCES]), } as const +/** An explicit member-source action survives OAuth; ordinary organization setup is central. */ +export const searchSetupAccessParam = { + key: 'source-access', + parser: parseAsStringLiteral(['members']), +} as const + /** Null closes the source management panel. */ export const managedSourceParam = { key: 'manage-source', diff --git a/apps/sim/components/emails/credential-groups/credential-group-invitation-email.tsx b/apps/sim/components/emails/credential-groups/credential-group-invitation-email.tsx index 0b0e4f04650..9cf4927a70f 100644 --- a/apps/sim/components/emails/credential-groups/credential-group-invitation-email.tsx +++ b/apps/sim/components/emails/credential-groups/credential-group-invitation-email.tsx @@ -10,6 +10,7 @@ interface CredentialGroupInvitationEmailProps { workspaceName: string credentialGroupName: string invitationLink: string + searchProviderName?: string } export function CredentialGroupInvitationEmail({ @@ -18,6 +19,7 @@ export function CredentialGroupInvitationEmail({ workspaceName, credentialGroupName, invitationLink, + searchProviderName, }: CredentialGroupInvitationEmailProps) { const brand = getBrandConfig() @@ -41,12 +43,28 @@ export function CredentialGroupInvitationEmail({ {recipientEmail} has been invited )}{' '} - to connect accounts for {credentialGroupName} in the{' '} - {workspaceName} workspace on {brand.name}. + {searchProviderName ? ( + <> + to connect your {searchProviderName} account for Search in{' '} + {workspaceName}. + + ) : ( + <> + to connect accounts for {credentialGroupName} in the{' '} + {workspaceName} workspace on {brand.name}. + + )} + {searchProviderName && ( + + This requests an account connection. It does not add you as an organization member. + + )} - Connect Accounts + + {searchProviderName ? `Connect ${searchProviderName}` : 'Connect Accounts'} +
    diff --git a/apps/sim/components/emails/credential-groups/render.ts b/apps/sim/components/emails/credential-groups/render.ts index f5bc8188fb0..b4f13f238bd 100644 --- a/apps/sim/components/emails/credential-groups/render.ts +++ b/apps/sim/components/emails/credential-groups/render.ts @@ -7,6 +7,7 @@ export async function renderCredentialGroupInvitationEmail(params: { workspaceName: string credentialGroupName: string invitationLink: string + searchProviderName?: string }): Promise { return await render(CredentialGroupInvitationEmail(params)) } diff --git a/apps/sim/connectors/confluence/meta.ts b/apps/sim/connectors/confluence/meta.ts index 63f683648d1..634467ae9b4 100644 --- a/apps/sim/connectors/confluence/meta.ts +++ b/apps/sim/connectors/confluence/meta.ts @@ -92,7 +92,9 @@ export const confluenceConnectorMeta: ConnectorMeta = { }, { id: 'contentType', + setupGroup: 'options', title: 'Content Type', + placeholder: 'Pages only', type: 'dropdown', required: false, options: [ @@ -103,6 +105,7 @@ export const confluenceConnectorMeta: ConnectorMeta = { }, { id: 'labelFilter', + setupGroup: 'options', title: 'Filter by Label', type: 'short-input', required: false, @@ -110,6 +113,7 @@ export const confluenceConnectorMeta: ConnectorMeta = { }, { id: 'maxPages', + setupGroup: 'options', title: 'Max Pages', type: 'short-input', required: false, diff --git a/apps/sim/connectors/github/meta.ts b/apps/sim/connectors/github/meta.ts index 64c65f9b5d2..0db13fb2e2f 100644 --- a/apps/sim/connectors/github/meta.ts +++ b/apps/sim/connectors/github/meta.ts @@ -11,8 +11,6 @@ export const githubConnectorMeta: ConnectorMeta = { searchDocsUrl: 'https://docs.sim.ai/search/github', permissionScopedListing: { capFieldIds: ['maxFiles'] }, supportsSeparateContentCredential: true, - memberSetupHint: - 'Install the GitHub App on the repositories you want to search. Each person connects their own GitHub account with a verified email matching their Sim account.', auth: { mode: 'oauth', @@ -33,6 +31,7 @@ export const githubConnectorMeta: ConnectorMeta = { }, { id: 'branch', + setupGroup: 'options', title: 'Branch', type: 'short-input', placeholder: 'e.g. main', @@ -42,6 +41,7 @@ export const githubConnectorMeta: ConnectorMeta = { }, { id: 'pathPrefix', + setupGroup: 'options', title: 'Path Filter', type: 'short-input', placeholder: 'e.g. docs/, src/components/', @@ -49,6 +49,7 @@ export const githubConnectorMeta: ConnectorMeta = { }, { id: 'extensions', + setupGroup: 'options', title: 'File Extensions', type: 'short-input', placeholder: 'e.g. .md, .txt, .mdx', @@ -56,6 +57,7 @@ export const githubConnectorMeta: ConnectorMeta = { }, { id: 'maxFiles', + setupGroup: 'options', title: 'Max Files', type: 'short-input', required: false, diff --git a/apps/sim/connectors/gitlab/meta.ts b/apps/sim/connectors/gitlab/meta.ts index ec6e79704b8..9734c76d449 100644 --- a/apps/sim/connectors/gitlab/meta.ts +++ b/apps/sim/connectors/gitlab/meta.ts @@ -65,6 +65,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'ref', + setupGroup: 'options', title: 'Branch', type: 'short-input', required: false, @@ -74,6 +75,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'pathPrefix', + setupGroup: 'options', title: 'Path Filter', type: 'short-input', required: false, @@ -84,6 +86,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'fileExtensions', + setupGroup: 'options', title: 'File Extensions', type: 'short-input', required: false, @@ -94,6 +97,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'issueState', + setupGroup: 'options', title: 'Issue State', type: 'dropdown', required: false, @@ -107,6 +111,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'issueLabels', + setupGroup: 'options', title: 'Issue Labels', type: 'short-input', required: false, @@ -117,6 +122,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'issueMilestone', + setupGroup: 'options', title: 'Issue Milestone', type: 'short-input', required: false, @@ -127,6 +133,7 @@ export const gitlabConnectorMeta: ConnectorMeta = { }, { id: 'maxItems', + setupGroup: 'options', title: 'Max Items', type: 'short-input', required: false, diff --git a/apps/sim/connectors/gmail/meta.ts b/apps/sim/connectors/gmail/meta.ts index c26838b4d91..f95d0c41534 100644 --- a/apps/sim/connectors/gmail/meta.ts +++ b/apps/sim/connectors/gmail/meta.ts @@ -6,7 +6,6 @@ export const DEFAULT_MAX_THREADS = 500 export const gmailConnectorMeta: ConnectorMeta = { search: true, searchDocsUrl: 'https://docs.sim.ai/search/gmail', - memberSetupHint: 'Each teammate connects their Gmail account. Only they can search their email.', id: 'gmail', name: 'Gmail', description: 'Sync email threads from Gmail', @@ -62,6 +61,7 @@ export const gmailConnectorMeta: ConnectorMeta = { }, { id: 'excludePromotions', + setupGroup: 'options', title: 'Exclude Promotions', type: 'dropdown', required: false, @@ -73,6 +73,7 @@ export const gmailConnectorMeta: ConnectorMeta = { }, { id: 'excludeSocial', + setupGroup: 'options', title: 'Exclude Social', type: 'dropdown', required: false, @@ -84,6 +85,7 @@ export const gmailConnectorMeta: ConnectorMeta = { }, { id: 'query', + setupGroup: 'options', title: 'Search Filter', type: 'short-input', placeholder: 'e.g. from:boss@company.com subject:report has:attachment', @@ -92,6 +94,7 @@ export const gmailConnectorMeta: ConnectorMeta = { }, { id: 'maxThreads', + setupGroup: 'options', title: 'Max Threads', type: 'short-input', required: false, diff --git a/apps/sim/connectors/google-calendar/meta.ts b/apps/sim/connectors/google-calendar/meta.ts index 82489432732..fdcef422a7a 100644 --- a/apps/sim/connectors/google-calendar/meta.ts +++ b/apps/sim/connectors/google-calendar/meta.ts @@ -11,8 +11,6 @@ export const googleCalendarConnectorMeta: ConnectorMeta = { icon: GoogleCalendarIcon, search: true, searchDocsUrl: 'https://docs.sim.ai/search/google-calendar', - memberSetupHint: - 'Each teammate connects their Google Calendar account. They see only event details available to them.', auth: { mode: 'oauth', @@ -61,6 +59,7 @@ export const googleCalendarConnectorMeta: ConnectorMeta = { }, { id: 'searchQuery', + setupGroup: 'options', title: 'Search Query', type: 'short-input', placeholder: 'e.g. standup, sprint review (optional)', @@ -70,6 +69,7 @@ export const googleCalendarConnectorMeta: ConnectorMeta = { }, { id: 'includeAttendees', + setupGroup: 'options', title: 'Include Attendees', type: 'dropdown', required: false, @@ -83,6 +83,7 @@ export const googleCalendarConnectorMeta: ConnectorMeta = { }, { id: 'maxEvents', + setupGroup: 'options', title: 'Max Events', type: 'short-input', required: false, diff --git a/apps/sim/connectors/google-drive/meta.ts b/apps/sim/connectors/google-drive/meta.ts index 6af8865c881..93e3b95a3cc 100644 --- a/apps/sim/connectors/google-drive/meta.ts +++ b/apps/sim/connectors/google-drive/meta.ts @@ -56,6 +56,7 @@ export const googleDriveConnectorMeta: ConnectorMeta = { { id: GOOGLE_DRIVE_OPEN_SHARING_FIELD_ID, title: 'Openly shared files', + placeholder: 'Keep out of search', type: 'dropdown', required: false, hideInMemberMode: true, @@ -93,6 +94,7 @@ export const googleDriveConnectorMeta: ConnectorMeta = { }, { id: 'fileType', + setupGroup: 'options', title: 'File Type', type: 'dropdown', required: false, @@ -106,6 +108,7 @@ export const googleDriveConnectorMeta: ConnectorMeta = { }, { id: 'maxFiles', + setupGroup: 'options', title: 'Max Files', type: 'short-input', required: false, diff --git a/apps/sim/connectors/jira/meta.ts b/apps/sim/connectors/jira/meta.ts index ad3cabb6a3b..6cf85dc1cb8 100644 --- a/apps/sim/connectors/jira/meta.ts +++ b/apps/sim/connectors/jira/meta.ts @@ -4,8 +4,6 @@ import type { ConnectorMeta } from '@/connectors/types' export const jiraConnectorMeta: ConnectorMeta = { search: true, searchDocsUrl: 'https://docs.sim.ai/search/jira', - memberSetupHint: - 'Each teammate connects their Jira account to search issue titles, descriptions, and tags they can access.', id: 'jira', name: 'Jira', description: 'Search issue titles and descriptions from Jira projects', @@ -47,6 +45,7 @@ export const jiraConnectorMeta: ConnectorMeta = { }, { id: 'jql', + setupGroup: 'options', title: 'JQL Filter', type: 'short-input', required: false, @@ -54,6 +53,7 @@ export const jiraConnectorMeta: ConnectorMeta = { }, { id: 'maxIssues', + setupGroup: 'options', title: 'Max Issues', type: 'short-input', required: false, diff --git a/apps/sim/connectors/slack/meta.ts b/apps/sim/connectors/slack/meta.ts index 8c2dd8ffd08..308de92f9a3 100644 --- a/apps/sim/connectors/slack/meta.ts +++ b/apps/sim/connectors/slack/meta.ts @@ -65,6 +65,7 @@ export const slackConnectorMeta: ConnectorMeta = { }, { id: 'excludeChannels', + setupGroup: 'options', title: 'Excluded Channels', type: 'short-input', required: false, @@ -74,6 +75,7 @@ export const slackConnectorMeta: ConnectorMeta = { }, { id: 'includeArchived', + setupGroup: 'options', title: 'Archived Channels', type: 'dropdown', required: false, @@ -93,6 +95,7 @@ export const slackConnectorMeta: ConnectorMeta = { }, { id: 'maxMessages', + setupGroup: 'options', title: 'Max Messages', type: 'short-input', required: false, diff --git a/apps/sim/connectors/types.ts b/apps/sim/connectors/types.ts index 6caf76803e7..9e7a5bb9993 100644 --- a/apps/sim/connectors/types.ts +++ b/apps/sim/connectors/types.ts @@ -256,6 +256,8 @@ export interface ConnectorConfigField { required?: boolean /** Required when an administrator account supplies documents and source permissions. */ requiredInAdminMode?: true + /** Secondary Search setup controls, shown in the shared More options disclosure. */ + setupGroup?: 'options' description?: string /** Excludes settings unused by member crawls and account-local selectors that need a manual sibling. */ hideInMemberMode?: true @@ -374,8 +376,6 @@ export interface ConnectorMeta { mirrorsSourceAcls?: true /** Provider prerequisites shown when an administrator configures permission-aware indexing. */ adminSetupHint?: string - /** Provider prerequisites or content scope shown for per-member setup. */ - memberSetupHint?: string /** Mirrored ACLs identify people by their own verified OAuth subject instead of email. */ requiresMemberIdentity?: true } diff --git a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx index 6ad28cae208..d397b00f140 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.test.tsx @@ -34,12 +34,16 @@ describe.each(['organization', 'workspace'] as const)( }) } - async function render() { + async function render(searchConnection?: { optionId: string; providerName: string }) { await act(async () => root.render( {scope === 'organization' ? ( - + ) : ( { + mocks.invite.mockResolvedValue({ + sentCount: 1, + results: [{ email: 'member@example.com', success: true }], + }) + await render({ optionId: 'gmail-option', providerName: 'Gmail' }) + expect(document.body.textContent).toContain( + 'This does not invite them to join the organization' + ) + await paste('member@example.com') + await submit() + expect(mocks.invite.mock.calls[0][0]).toEqual({ + organizationId: 'org-1', + emails: ['member@example.com'], + optionId: 'gmail-option', + }) + }) + it('requires valid recipients and excludes invalid and disposable addresses', async () => { await render() expect(button('Send requests')).toBeDisabled() diff --git a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx index e14e264b5f6..0c8147ed811 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-invite-modal.tsx @@ -16,6 +16,7 @@ import { useInviteOrganizationAccountPeople } from '@/hooks/queries/organization interface OrganizationAccountInviteModalProps { organizationId: string + searchConnection?: { optionId: string; providerName: string } onClose: () => void } @@ -26,6 +27,7 @@ function validateEmail(email: string): string | null { export function OrganizationAccountInviteModal({ organizationId, + searchConnection, onClose, }: OrganizationAccountInviteModalProps) { const invite = useInviteOrganizationAccountPeople() @@ -55,6 +57,7 @@ export function OrganizationAccountInviteModal({ const result = await invite.mutateAsync({ organizationId, emails, + ...(searchConnection ? { optionId: searchConnection.optionId } : {}), }) const failures = result.results.filter((item) => !item.success) if (failures.length === 0) { @@ -82,13 +85,24 @@ export function OrganizationAccountInviteModal({ handleOpenChange(false)}> - Request account connections + {searchConnection + ? `Request ${searchConnection.providerName} connections` + : 'Request account connections'} +

    + {searchConnection + ? `Ask people to connect their ${searchConnection.providerName} account for Search. This does not invite them to join the organization.` + : 'Ask people to connect their accounts. This does not invite them to join the organization.'} +

    { + mocks.people.mockReturnValue({ + data: { + pages: [ + { + enrollments: [ + { + id: 'person-1', + email: 'person@example.com', + status, + connections, + mcpConnections: [], + }, + ], + }, + ], + }, + hasNextPage: false, + }) + await act(async () => + root.render( + + + + + + + + ) + ) + expect(mocks.people).toHaveBeenLastCalledWith('organization-1', '', { + enabled: true, + optionId: 'gmail-option', + }) + expect(container.textContent).toContain('Gmail') + expect(container.textContent).toContain('Organization account contributors') + expect(container.textContent).toContain(label) + expect(container.textContent).not.toContain('No people invited') + } +) diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.tsx index bf64335350c..2023c92bb70 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.tsx @@ -3,12 +3,8 @@ import { type ReactNode, useState } from 'react' import { Chip, ChipConfirmModal, ChipModalError, toast } from '@sim/emcn' import { Plus } from '@sim/emcn/icons' -import { useQueryState } from 'nuqs' +import type { SettingsBackAction } from '@/components/settings/settings-header' import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' -import { - credentialGroupPeopleSearchParam, - credentialGroupPeopleSearchUrlKeys, -} from '@/app/workspace/[workspaceId]/settings/[section]/search-params' import { MemberAvatar } from '@/app/workspace/[workspaceId]/settings/components/member-list' import { RowActionsMenu } from '@/app/workspace/[workspaceId]/settings/components/row-actions-menu' import { @@ -20,7 +16,6 @@ import { RESOURCE_LIST_STACK, SettingsResourceRow, } from '@/app/workspace/[workspaceId]/settings/components/settings-resource-row' -import { SettingsSection } from '@/app/workspace/[workspaceId]/settings/components/settings-section/settings-section' import { EnrollmentConnections } from '@/ee/credential-groups/components/credential-group-enrollment-connections' import { OrganizationAccountInviteModal } from '@/ee/credential-groups/components/organization-account-invite-modal' import { @@ -29,36 +24,39 @@ import { useRevokeOrganizationAccountEnrollment, } from '@/hooks/queries/organization-accounts' import { useDebounce } from '@/hooks/use-debounce' -import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter' +import { useOrganizationAccountPeopleSearch } from '@/hooks/use-organization-account-people-search' interface OrganizationAccountPeopleProps { organizationId: string + searchConnection?: { optionId: string; providerName: string } + panel?: { back: SettingsBackAction; title: string; description?: string; docsLink?: string } enabled?: boolean setupFallback?: ReactNode } export function OrganizationAccountPeople({ organizationId, + searchConnection, + panel, enabled = true, setupFallback, }: OrganizationAccountPeopleProps) { const resend = useResendOrganizationAccountInvitation() const revoke = useRevokeOrganizationAccountEnrollment() - const [peopleSearch, setPeopleSearchParam] = useQueryState(credentialGroupPeopleSearchParam.key, { - ...credentialGroupPeopleSearchParam.parser, - ...credentialGroupPeopleSearchUrlKeys, - }) - const setPeopleSearch = useDebouncedSearchSetter(setPeopleSearchParam) + const [peopleSearch, setPeopleSearch] = useOrganizationAccountPeopleSearch() const search = useDebounce(peopleSearch.trim(), SEARCH_DEBOUNCE_MS) - const people = useOrganizationAccountPeople(organizationId, search, { enabled }) + const people = useOrganizationAccountPeople(organizationId, search, { + enabled, + ...(searchConnection ? { optionId: searchConnection.optionId } : {}), + }) const [inviteOpen, setInviteOpen] = useState(false) const [revokingPerson, setRevokingPerson] = useState<{ id: string; email: string } | null>(null) const error = resend.error ?? revoke.error const pending = resend.isPending || revoke.isPending const enrollments = people.data?.pages.flatMap((page) => page.enrollments) ?? [] - const peopleLabel = `People (${enrollments.length}${people.hasNextPage ? '+' : ''})` const awaitingSetup = setupFallback !== undefined return ( + {searchConnection && ( +

    + Organization account contributors and their {searchConnection.providerName} connection + status. +

    + )} {people.error && !people.isFetchNextPageError && ( )} {!people.isPending && (!people.error || people.isFetchNextPageError) && ( - void people.fetchNextPage()} - > - {people.isFetchingNextPage ? 'Loading...' : 'Load more'} - - ) : undefined - } - > + <> {enrollments.length === 0 ? ( {search ? 'No people match your search' : 'No people invited yet'} @@ -115,10 +107,29 @@ export function OrganizationAccountPeople({ iconVariant='custom' title={person.email} description={ - + searchConnection && person.status === 'revoked' ? ( + 'Access revoked' + ) : searchConnection && + !person.connections.some( + (connection) => connection.status === 'active' + ) ? ( + person.connections.some( + (connection) => connection.status === 'needs_reauth' + ) ? ( + 'Reconnect required' + ) : person.connections.some( + (connection) => connection.status === 'revoked' + ) ? ( + 'Disconnected' + ) : ( + 'Not connected' + ) + ) : ( + + ) } trailing={ resend.mutate( - { organizationId, enrollmentId: person.id }, + { + organizationId, + enrollmentId: person.id, + ...(searchConnection + ? { optionId: searchConnection.optionId } + : {}), + }, { onSuccess: () => toast.success('Invitation sent') } ), }, { - label: 'Revoke', + label: searchConnection ? 'Revoke all account access' : 'Revoke', destructive: true, disabled: pending || person.status === 'revoked', onSelect: () => { @@ -149,7 +166,15 @@ export function OrganizationAccountPeople({ ))}
    )} - + {people.hasNextPage && !people.isFetchNextPageError && ( + void people.fetchNextPage()} + > + {people.isFetchingNextPage ? 'Loading...' : 'Load more'} + + )} + )} {people.isFetchNextPageError && ( setInviteOpen(false)} /> )} @@ -173,10 +199,10 @@ export function OrganizationAccountPeople({ if (!open && !revoke.isPending) setRevokingPerson(null) }} title={`Revoke ${revokingPerson.email}`} - text='Organization workflows will no longer be able to use accounts contributed by this person.' + text='This removes all accounts contributed by this person from organization workflows and Search. It does not remove their organization membership.' defaultAction='none' confirm={{ - label: 'Revoke', + label: searchConnection ? 'Revoke all account access' : 'Revoke', pendingLabel: 'Revoking…', pending: revoke.isPending, variant: 'destructive', diff --git a/apps/sim/ee/credential-groups/components/personal-organization-accounts.tsx b/apps/sim/ee/credential-groups/components/personal-organization-accounts.tsx index 0d21c7c54b1..1d19d8885de 100644 --- a/apps/sim/ee/credential-groups/components/personal-organization-accounts.tsx +++ b/apps/sim/ee/credential-groups/components/personal-organization-accounts.tsx @@ -25,9 +25,8 @@ export function PersonalOrganizationAccounts() {

    - These are accounts you contributed to organizations. Disconnecting stops their workflows - from using that account. Organization admins control which workspaces can use the shared - pool. + Manage accounts you connected to organizations. Disconnecting stops new indexing and + workflows that use the account, and removes Search access that depends on it.

    {error && (

    @@ -108,7 +107,7 @@ export function PersonalOrganizationAccounts() { if (!open && !disconnect.isPending) setDisconnectingId(null) }} title={`Disconnect ${disconnectingAccount.displayName}`} - text={`${disconnectingAccount.organizationName} workflows will no longer be able to use this account.`} + text={`${disconnectingAccount.organizationName} will stop indexing and running workflows with this account. You will lose Search access that depends on this connection.`} defaultAction='none' confirm={{ label: 'Disconnect', diff --git a/apps/sim/hooks/queries/kb/connectors.ts b/apps/sim/hooks/queries/kb/connectors.ts index 012053d3312..d4a39a2a08f 100644 --- a/apps/sim/hooks/queries/kb/connectors.ts +++ b/apps/sim/hooks/queries/kb/connectors.ts @@ -41,6 +41,7 @@ import { type ConnectorDocumentsQuery, type PrepareSearchSourceBody, prepareSearchSourceContract, + readOrganizationSearchOverviewContract, readSearchIndexContract, readSearchSourceOverviewContract, readSearchSourceProgressContract, @@ -442,10 +443,14 @@ export const searchSourceKeys = { scope ? resourceScopeKey(scope) : '', connectorIds, ] as const, - pages: (scope: string | ResourceScope | undefined, filters: { search: string; mine: boolean }) => - [...searchSourceKeys.list(scope), 'pages', filters] as const, + pages: ( + scope: string | ResourceScope | undefined, + filters: { search: string; mine: boolean; connectorType?: string } + ) => [...searchSourceKeys.list(scope), 'pages', filters] as const, overview: (scope?: string | ResourceScope) => [...searchSourceKeys.list(scope), 'overview'] as const, + organizationOverview: (organizationId: string) => + [...searchSourceKeys.list({ kind: 'organization', organizationId }), 'admin-overview'] as const, list: (scope?: string | ResourceScope) => [ ...searchSourceKeys.lists(), @@ -499,9 +504,32 @@ export function useSearchSourceOverview(scope: ResourceScope, options?: { enable }) } +/** Administrative health is independent of the viewer's account and document permissions. */ +export function useOrganizationSearchOverview( + organizationId: string, + options?: { enabled?: boolean } +) { + return useQuery({ + queryKey: searchSourceKeys.organizationOverview(organizationId), + queryFn: async ({ signal }) => + ( + await requestJson(readOrganizationSearchOverviewContract, { + query: { organizationId }, + signal, + }) + ).data, + enabled: Boolean(organizationId) && (options?.enabled ?? true), + staleTime: CONNECTOR_LIST_STALE_TIME, + refetchInterval: (query) => + query.state.data?.providers.some((provider) => provider.status === 'indexing') + ? SEARCH_SOURCE_SUMMARY_POLL_MS + : false, + }) +} + export function useSearchSources( owner?: string | ResourceScope, - options?: { enabled?: boolean; search?: string; mine?: boolean } + options?: { enabled?: boolean; search?: string; mine?: boolean; connectorType?: string } ) { const queryClient = useQueryClient() const scope = @@ -516,6 +544,7 @@ export function useSearchSources( const filters = { search: options?.search?.trim().toLowerCase() ?? '', mine: options?.mine ?? false, + ...(options?.connectorType?.trim() ? { connectorType: options.connectorType.trim() } : {}), } const summary = useInfiniteQuery({ queryKey: searchSourceKeys.pages(scope, filters), diff --git a/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx b/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx new file mode 100644 index 00000000000..8a810f4affd --- /dev/null +++ b/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx @@ -0,0 +1,127 @@ +/** @vitest-environment jsdom */ +import { act } from 'react' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ requestJson: vi.fn() })) +vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.requestJson })) + +import { + searchSourceKeys, + useOrganizationSearchOverview, + useSearchSources, +} from '@/hooks/queries/kb/connectors' + +let root: Root +let container: HTMLDivElement +let client: QueryClient +let enabled: boolean +let connectorType: string +const scope = { kind: 'organization', organizationId: 'organization' } as const + +function OverviewProbe() { + const result = useOrganizationSearchOverview(scope.organizationId, { enabled }) + return

    {result.data?.providers[0]?.sourceCount ?? 'loading'}
    +} +function SourcesProbe() { + const result = useSearchSources(scope, { connectorType }) + return
    {result.data?.[0]?.connectorId ?? 'loading'}
    +} +async function render(kind: 'overview' | 'sources') { + await act(async () => { + root.render( + + {kind === 'overview' ? : } + + ) + }) + await act(async () => { + await vi.advanceTimersByTimeAsync(1) + }) +} +beforeEach(() => { + vi.useFakeTimers() + enabled = false + connectorType = 'google_drive' + client = new QueryClient({ + defaultOptions: { queries: { retry: false, gcTime: Number.POSITIVE_INFINITY } }, + }) + container = document.createElement('div') + root = createRoot(container) + mocks.requestJson.mockReset().mockImplementation(async (contract, input) => + contract.path.endsWith('/integrations/overview') + ? { + data: { + providers: [ + { connectorType: 'gmail', sourceCount: 3, approved: true, status: 'active' }, + ], + }, + } + : { + data: { + sources: [{ connectorId: input.query.connectorType, isSyncing: false }], + nextCursor: null, + }, + } + ) +}) +afterEach(() => { + act(() => root.unmount()) + client.clear() + vi.useRealTimers() +}) + +describe('organization Search queries', () => { + it('waits for admin authorization and reconciles through existing source invalidation', async () => { + await render('overview') + expect(mocks.requestJson).not.toHaveBeenCalled() + enabled = true + await render('overview') + expect(container.textContent).toBe('3') + expect(mocks.requestJson).toHaveBeenCalledWith( + expect.objectContaining({ path: '/api/knowledge/sim-search/integrations/overview' }), + { + query: { organizationId: 'organization' }, + signal: expect.any(AbortSignal), + } + ) + await act(async () => { + await client.invalidateQueries({ queryKey: searchSourceKeys.list(scope) }) + }) + expect(mocks.requestJson).toHaveBeenCalledTimes(2) + }) + it('keeps source pages and requests separate when the selected provider changes', async () => { + await render('sources') + expect(container.textContent).toBe('google_drive') + connectorType = 'gmail' + await render('sources') + expect(container.textContent).toBe('gmail') + expect(mocks.requestJson.mock.calls.map(([, input]) => input.query)).toEqual([ + { organizationId: 'organization', connectorType: 'google_drive', search: '', mine: false }, + { organizationId: 'organization', connectorType: 'gmail', search: '', mine: false }, + ]) + expect( + client.getQueryData( + searchSourceKeys.pages(scope, { connectorType: 'google_drive', search: '', mine: false }) + ) + ).toMatchObject({ pages: [{ sources: [{ connectorId: 'google_drive' }] }] }) + }) + + it.each([ + { status: 'waiting_for_connections', requests: 1 }, + { status: 'indexing', requests: 2 }, + ])('polls only pending work when status is $status', async ({ status, requests }) => { + enabled = true + mocks.requestJson.mockResolvedValue({ + data: { + providers: [{ connectorType: 'gmail', sourceCount: 1, approved: true, status }], + }, + }) + await render('overview') + await act(async () => { + await vi.advanceTimersByTimeAsync(30_000) + }) + expect(mocks.requestJson).toHaveBeenCalledTimes(requests) + }) +}) diff --git a/apps/sim/hooks/queries/organization-accounts.test.tsx b/apps/sim/hooks/queries/organization-accounts.test.tsx index cc86097962b..f396c2b3e54 100644 --- a/apps/sim/hooks/queries/organization-accounts.test.tsx +++ b/apps/sim/hooks/queries/organization-accounts.test.tsx @@ -25,12 +25,14 @@ describe('organization people search pagination', () => { search, organizationId, enabled, + optionId, }: { search: string organizationId: string enabled: boolean + optionId?: string }) { - result = useOrganizationAccountPeople(organizationId, search, { enabled }) + result = useOrganizationAccountPeople(organizationId, search, { enabled, optionId }) return ( {result.status}: {result.data?.pages.length} @@ -44,11 +46,21 @@ describe('organization people search pagination', () => { }) } - async function render(search: string, organizationId = 'org-1', enabled = true) { + async function render( + search: string, + organizationId = 'org-1', + enabled = true, + optionId?: string + ) { await act(async () => root.render( - + ) ) @@ -72,6 +84,34 @@ describe('organization people search pagination', () => { vi.unstubAllGlobals() }) + it('keeps provider projection on every page and isolates another provider’s first page', async () => { + mocks.request + .mockResolvedValueOnce({ enrollments: [], nextCursor: 'next' }) + .mockResolvedValueOnce({ enrollments: [], nextCursor: null }) + .mockResolvedValueOnce({ enrollments: [], nextCursor: null }) + await render('', 'org-1', true, 'gmail-option') + await act(async () => { + await result.fetchNextPage() + }) + await flushQueries() + expect(mocks.request).toHaveBeenNthCalledWith( + 2, + listOrganizationAccountPeopleContract, + expect.objectContaining({ + query: { limit: 50, cursor: 'next', search: undefined, optionId: 'gmail-option' }, + }) + ) + await render('', 'org-1', true, 'confluence-option') + expect(mocks.request).toHaveBeenNthCalledWith( + 3, + listOrganizationAccountPeopleContract, + expect.objectContaining({ + query: { limit: 50, cursor: undefined, search: undefined, optionId: 'confluence-option' }, + }) + ) + expect(result.data?.pages).toHaveLength(1) + }) + it('sends search on every bounded page and starts a new first page when it changes', async () => { mocks.request .mockResolvedValueOnce({ enrollments: [], nextCursor: 'alpha-page-2' }) diff --git a/apps/sim/hooks/queries/organization-accounts.ts b/apps/sim/hooks/queries/organization-accounts.ts index aec90acf84d..21f048e062b 100644 --- a/apps/sim/hooks/queries/organization-accounts.ts +++ b/apps/sim/hooks/queries/organization-accounts.ts @@ -27,6 +27,7 @@ import { listPersonalOrganizationAccountsContract, type OrganizationAccountPeopleQuery, type RemoveOrganizationAccountMcpProviderParams, + type ResendOrganizationAccountInvitationQuery, reconnectPersonalOrganizationAccountContract, removeOrganizationAccountMcpProviderContract, resendOrganizationAccountInvitationContract, @@ -48,8 +49,11 @@ export const organizationAccountsKeys = { [...organizationAccountsKeys.workspaces(), workspaceId ?? ''] as const, access: (id?: string) => [...organizationAccountsKeys.detail(id), 'access'] as const, people: (id?: string) => [...organizationAccountsKeys.detail(id), 'people'] as const, - peopleList: (id: string, search?: string) => - [...organizationAccountsKeys.people(id), { search: search ?? '' }] as const, + peopleList: (id: string, search?: string, optionId?: string) => + [ + ...organizationAccountsKeys.people(id), + { search: search ?? '', optionId: optionId ?? '' }, + ] as const, databricks: (id?: string) => [...organizationAccountsKeys.detail(id), 'databricks'] as const, details: () => [...organizationAccountsKeys.all, 'detail'] as const, detail: (organizationId?: string) => @@ -201,11 +205,15 @@ export function useUpdateOrganizationAccountWorkspaceAccess() { export function useOrganizationAccountPeople( organizationId: string, search?: OrganizationAccountPeopleQuery['search'], - options?: { enabled?: boolean } + options?: { enabled?: boolean; optionId?: OrganizationAccountPeopleQuery['optionId'] } ) { const normalizedSearch = search?.trim() || undefined return useInfiniteQuery({ - queryKey: organizationAccountsKeys.peopleList(organizationId, normalizedSearch), + queryKey: organizationAccountsKeys.peopleList( + organizationId, + normalizedSearch, + options?.optionId + ), enabled: Boolean(organizationId) && (options?.enabled ?? true), staleTime: ORGANIZATION_ACCOUNTS_STALE_TIME, retry: (failureCount, error) => @@ -219,7 +227,12 @@ export function useOrganizationAccountPeople( queryFn: ({ signal, pageParam }) => requestJson(listOrganizationAccountPeopleContract, { params: { id: organizationId }, - query: { limit: 50, cursor: pageParam, search: normalizedSearch }, + query: { + limit: 50, + cursor: pageParam, + search: normalizedSearch, + ...(options?.optionId ? { optionId: options.optionId } : {}), + }, signal, }), getNextPageParam: (page) => page.nextCursor ?? undefined, @@ -246,12 +259,14 @@ export function useResendOrganizationAccountInvitation() { mutationFn: ({ organizationId, enrollmentId, + ...query }: { organizationId: string enrollmentId: string - }) => + } & ResendOrganizationAccountInvitationQuery) => requestJson(resendOrganizationAccountInvitationContract, { params: { id: organizationId, enrollmentId }, + query, }), onSuccess: (_, { organizationId }) => queryClient.invalidateQueries({ queryKey: organizationAccountsKeys.people(organizationId) }), diff --git a/apps/sim/hooks/use-oauth-return-hooks.test.tsx b/apps/sim/hooks/use-oauth-return-hooks.test.tsx index 92643e32914..f227acf17dd 100644 --- a/apps/sim/hooks/use-oauth-return-hooks.test.tsx +++ b/apps/sim/hooks/use-oauth-return-hooks.test.tsx @@ -170,6 +170,34 @@ describe('organization source OAuth return routing', () => { }) } + it.each(['confluence', 'google_drive', 'github', 'jira', 'gmail', 'google_calendar', 'slack'])( + 'preserves the %s member-source form on successful and canceled OAuth returns', + async (connectorType) => { + mocks.params = { organizationId: 'org-1' } + for (const canceled of [false, true]) { + const pending: OAuthReturnContext = { + ...context(), + workspaceId: undefined, + organizationId: 'org-1', + connectorType, + sourceAccess: 'members', + } + writeOAuthReturnContext(pending) + window.history.replaceState( + null, + '', + `/o/org-1/settings/integrations${canceled ? '?error=access_denied' : ''}` + ) + await renderRouter() + expect(mocks.replace).toHaveBeenLastCalledWith( + `/o/org-1/settings/integrations?addConnector=${connectorType}&source-access=members` + ) + expect(readOAuthReturnContext()).toEqual(canceled ? null : pending) + await act(async () => root.render(null)) + } + } + ) + it.each([false, true])( 'returns to source settings after OAuth with canceled=%s', async (canceled) => { diff --git a/apps/sim/hooks/use-oauth-return.test.ts b/apps/sim/hooks/use-oauth-return.test.ts index 7fa611f2b01..5508b4ec3bb 100644 --- a/apps/sim/hooks/use-oauth-return.test.ts +++ b/apps/sim/hooks/use-oauth-return.test.ts @@ -180,6 +180,21 @@ describe('resolveOAuthCallbackError', () => { }) describe('buildKnowledgeBaseOAuthReturnUrl', () => { + it('keeps member setup separate from central setup without changing workspace returns', () => { + expect( + buildKnowledgeBaseOAuthReturnUrl( + { kind: 'organization', organizationId: 'org-1' }, + 'kb-1', + 'google_drive', + undefined, + 'members' + ) + ).toBe('/o/org-1/settings/integrations?addConnector=google_drive&source-access=members') + expect( + buildKnowledgeBaseOAuthReturnUrl('workspace-1', 'kb-1', 'google_drive', undefined, 'members') + ).toBe('/workspace/workspace-1/knowledge/kb-1?addConnector=google_drive') + }) + it('preserves the connector picker on both successful and failed OAuth returns', () => { expect(buildKnowledgeBaseOAuthReturnUrl('workspace-1', 'kb-1', 'google_drive')).toBe( '/workspace/workspace-1/knowledge/kb-1?addConnector=google_drive' diff --git a/apps/sim/hooks/use-oauth-return.ts b/apps/sim/hooks/use-oauth-return.ts index de28bb691d1..a40f88459b8 100644 --- a/apps/sim/hooks/use-oauth-return.ts +++ b/apps/sim/hooks/use-oauth-return.ts @@ -6,6 +6,7 @@ import { sleep } from '@sim/utils/helpers' import { backoffWithJitter } from '@sim/utils/retry' import { type QueryClient, useQueryClient } from '@tanstack/react-query' import { useParams, useRouter } from 'next/navigation' +import { createSerializer, parseAsString } from 'nuqs/server' import { requestJson } from '@/lib/api/client/request' import { listWorkspaceCredentialsContract } from '@/lib/api/contracts' import { listOrganizationCredentialsContract } from '@/lib/api/contracts/organization-credentials' @@ -28,6 +29,7 @@ import { getDesktopBridge } from '@/lib/desktop' import { organizationRoutes } from '@/lib/navigation/paths' import { stripMicrosoftDataverseEnvironmentFromOAuthCallback } from '@/lib/oauth/microsoft-dataverse' import { organizationSearchSetupPath } from '@/lib/sim-search/setup-navigation' +import { searchSetupAccessParam } from '@/app/workspace/[workspaceId]/search/search-params' import { oauthConnectionsKeys } from '@/hooks/queries/oauth/oauth-connections' import { organizationCredentialKeys, @@ -38,6 +40,10 @@ import { SETTINGS_RETURN_URL_KEY } from '@/hooks/use-settings-navigation' const OAUTH_CREDENTIAL_UPDATED_EVENT = 'oauth-credentials-updated' const CONTEXT_MAX_AGE_MS = 15 * 60 * 1000 +const serializeConnectorReturn = createSerializer({ + [ADD_CONNECTOR_SEARCH_PARAM]: parseAsString, + [searchSetupAccessParam.key]: searchSetupAccessParam.parser, +}) export interface OAuthResultMessage { kind: 'success' | 'error' @@ -317,7 +323,8 @@ export function useOAuthReturnRouter() { resourceScopeFromOwner(ctx), ctx.knowledgeBaseId, ctx.connectorType, - ctx.connectorId + ctx.connectorId, + ctx.sourceAccess ) ) } @@ -351,7 +358,8 @@ export function useOAuthReturnRouter() { resourceScopeFromOwner(ctx), ctx.knowledgeBaseId, ctx.connectorType, - ctx.connectorId + ctx.connectorId, + ctx.sourceAccess ) ) return @@ -363,7 +371,8 @@ export function buildKnowledgeBaseOAuthReturnUrl( owner: string | ResourceScope, knowledgeBaseId: string, connectorType?: string, - connectorId?: string + connectorId?: string, + sourceAccess?: Extract['sourceAccess'] ): string { const scope = typeof owner === 'string' ? { kind: 'workspace' as const, workspaceId: owner } : owner @@ -375,7 +384,10 @@ export function buildKnowledgeBaseOAuthReturnUrl( ? organizationSearchSetupPath(scope.organizationId) : `/workspace/${scope.workspaceId}/knowledge/${knowledgeBaseId}` return connectorType - ? `${kbUrl}?${ADD_CONNECTOR_SEARCH_PARAM}=${encodeURIComponent(connectorType)}` + ? serializeConnectorReturn(kbUrl, { + [ADD_CONNECTOR_SEARCH_PARAM]: connectorType, + [searchSetupAccessParam.key]: scope.kind === 'organization' ? sourceAccess : undefined, + }) : kbUrl } diff --git a/apps/sim/hooks/use-organization-account-people-search.ts b/apps/sim/hooks/use-organization-account-people-search.ts new file mode 100644 index 00000000000..5e70ad30de6 --- /dev/null +++ b/apps/sim/hooks/use-organization-account-people-search.ts @@ -0,0 +1,17 @@ +'use client' + +import { useQueryState } from 'nuqs' +import { + credentialGroupPeopleSearchParam, + credentialGroupPeopleSearchUrlKeys, +} from '@/app/workspace/[workspaceId]/settings/[section]/search-params' +import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter' + +/** Keeps account filtering stable across setup, loading, and populated views. */ +export function useOrganizationAccountPeopleSearch(): [string, (value: string) => void] { + const [search, setSearch] = useQueryState(credentialGroupPeopleSearchParam.key, { + ...credentialGroupPeopleSearchParam.parser, + ...credentialGroupPeopleSearchUrlKeys, + }) + return [search, useDebouncedSearchSetter(setSearch)] +} diff --git a/apps/sim/lib/api/contracts/credential-groups.ts b/apps/sim/lib/api/contracts/credential-groups.ts index 7fd305e57f5..444992246ac 100644 --- a/apps/sim/lib/api/contracts/credential-groups.ts +++ b/apps/sim/lib/api/contracts/credential-groups.ts @@ -563,7 +563,7 @@ export const slackCredentialGroupConfigurationCallbackContract = defineRouteCont }) export const startCredentialGroupOAuthQuerySchema = z.object({ - returnTo: z.literal('search').optional(), + returnTo: z.enum(['search', 'accounts']).optional(), }) export type StartCredentialGroupOAuthQuery = z.output diff --git a/apps/sim/lib/api/contracts/knowledge/connectors.ts b/apps/sim/lib/api/contracts/knowledge/connectors.ts index c84fcfcdb32..e920990f615 100644 --- a/apps/sim/lib/api/contracts/knowledge/connectors.ts +++ b/apps/sim/lib/api/contracts/knowledge/connectors.ts @@ -6,6 +6,7 @@ import { } from '@/lib/api/contracts/knowledge/shared' import { booleanQueryFlagSchema, + organizationIdSchema, resourceOwnerSchema, workspaceIdSchema, } from '@/lib/api/contracts/primitives' @@ -365,6 +366,7 @@ export const searchSourceCursorSchema = z.object({ export const listSearchSourcesQuerySchema = resourceOwnerSchema.safeExtend({ cursor: z.string().min(1).max(1024).optional(), + connectorType: z.string().trim().min(1, 'connectorType cannot be empty').max(100).optional(), search: z.string().trim().max(200).optional(), mine: booleanQueryFlagSchema.optional(), }) @@ -403,6 +405,47 @@ export const readSearchSourceOverviewContract = defineRouteContract({ response: { mode: 'json', schema: successResponseSchema(searchSourceOverviewSchema) }, }) +export const organizationSearchProviderStatusSchema = z.enum([ + 'needs_setup', + 'waiting_for_connections', + 'indexing', + 'needs_attention', + 'paused', + 'active', +]) +export type OrganizationSearchProviderStatus = z.output< + typeof organizationSearchProviderStatusSchema +> + +export const organizationSearchProviderSummarySchema = z.object({ + connectorType: z.string().min(1).max(100), + approved: z.boolean(), + sourceCount: z.number().int().nonnegative(), + status: organizationSearchProviderStatusSchema, +}) +export type OrganizationSearchProviderSummary = z.output< + typeof organizationSearchProviderSummarySchema +> + +export const organizationSearchOverviewSchema = z.object({ + providers: z.array(organizationSearchProviderSummarySchema).max(MAX_SEARCH_SOURCE_PROVIDER_TYPES), +}) +export type OrganizationSearchOverview = z.output + +export const readOrganizationSearchOverviewQuerySchema = z.object({ + organizationId: organizationIdSchema, +}) +export type ReadOrganizationSearchOverviewQuery = z.input< + typeof readOrganizationSearchOverviewQuerySchema +> + +export const readOrganizationSearchOverviewContract = defineRouteContract({ + method: 'GET', + path: '/api/knowledge/sim-search/integrations/overview', + query: readOrganizationSearchOverviewQuerySchema, + response: { mode: 'json', schema: successResponseSchema(organizationSearchOverviewSchema) }, +}) + export const searchSourceProgressSchema = z.object({ connectorId: knowledgeConnectorParamsSchema.shape.connectorId, isSyncing: z.boolean(), diff --git a/apps/sim/lib/api/contracts/organization-accounts.ts b/apps/sim/lib/api/contracts/organization-accounts.ts index 1b71874796e..88f82e3fdc2 100644 --- a/apps/sim/lib/api/contracts/organization-accounts.ts +++ b/apps/sim/lib/api/contracts/organization-accounts.ts @@ -150,6 +150,7 @@ export const listOrganizationAccountPeopleContract = defineRouteContract({ cursor: z.string().min(1).max(512).optional(), email: z.string().trim().max(320).optional(), search: z.string().trim().max(320).optional(), + optionId: z.string().min(1, 'Provider option is required').max(128).optional(), }), response: { mode: 'json', @@ -163,7 +164,9 @@ export const inviteOrganizationAccountPeopleContract = defineRouteContract({ method: 'POST', path: '/api/organizations/[id]/connected-accounts/people', params: organizationAccountsParamsSchema, - body: inviteCredentialGroupEnrollmentsBodySchema, + body: inviteCredentialGroupEnrollmentsBodySchema.extend({ + optionId: z.string().min(1, 'Provider option is required').max(128).optional(), + }), response: inviteCredentialGroupEnrollmentsContract.response, }) const organizationAccountEnrollmentParamsSchema = organizationAccountsParamsSchema.extend({ @@ -173,6 +176,9 @@ export const resendOrganizationAccountInvitationContract = defineRouteContract({ method: 'POST', path: '/api/organizations/[id]/connected-accounts/people/[enrollmentId]/resend', params: organizationAccountEnrollmentParamsSchema, + query: z.object({ + optionId: z.string().min(1, 'Provider option is required').max(128).optional(), + }), response: { mode: 'json', schema: z.object({ credentialGroupEnrollment: credentialGroupEnrollmentSchema }), @@ -209,6 +215,9 @@ export type OrganizationAccountPeopleQuery = z.input< export type InviteOrganizationAccountPeopleBody = z.input< NonNullable > +export type ResendOrganizationAccountInvitationQuery = z.input< + NonNullable +> export type AddOrganizationAccountMcpProviderBody = z.input< NonNullable > diff --git a/apps/sim/lib/credential-groups/application/organization-account-management.test.ts b/apps/sim/lib/credential-groups/application/organization-account-management.test.ts index 7dc71157b76..0c51ca10218 100644 --- a/apps/sim/lib/credential-groups/application/organization-account-management.test.ts +++ b/apps/sim/lib/credential-groups/application/organization-account-management.test.ts @@ -8,6 +8,9 @@ const mocks = vi.hoisted(() => ({ group: vi.fn(), setup: vi.fn(), list: vi.fn(), + invite: vi.fn(), + resend: vi.fn(), + inviter: vi.fn(), })) vi.mock('@/lib/core/application/organization-authorization', () => ({ authorizeOrganizationOperation: mocks.authorize, @@ -38,9 +41,9 @@ vi.mock('@/lib/credential-groups/service', () => ({ vi.mock('@/lib/credential-groups/enrollments', () => ({ CredentialGroupEnrollmentError: class extends Error {}, listCredentialGroupEnrollments: mocks.list, - inviteCredentialGroupEnrollments: vi.fn(), - loadCredentialGroupInviterIdentity: vi.fn(), - resendCredentialGroupEnrollment: vi.fn(), + inviteCredentialGroupEnrollments: mocks.invite, + loadCredentialGroupInviterIdentity: mocks.inviter, + resendCredentialGroupEnrollment: mocks.resend, revokeCredentialGroupEnrollment: vi.fn(), })) vi.mock('@/lib/credential-groups/managed-mcp-service', () => ({ @@ -55,8 +58,10 @@ vi.mock('@/lib/mcp/connection-pool', () => ({ evictMcpServerConnections: vi.fn() import { OrchestrationError } from '@/lib/core/orchestration/types' import { + inviteOrganizationAccountPeople, listOrganizationAccountPeople, organizationAccountManagementOperations, + resendOrganizationAccountInvitation, } from '@/lib/credential-groups/application/organization-account-management' const principal: SessionPrincipal = { kind: 'session', userId: 'admin-1', sessionId: 'session-1' } @@ -69,9 +74,65 @@ describe('organization account people search application', () => { mocks.available.mockResolvedValue(true) mocks.group.mockResolvedValue({ credentialGroupId: 'group-1' }) mocks.setup.mockResolvedValue(undefined) + mocks.inviter.mockResolvedValue({ name: 'Admin' }) + mocks.invite.mockResolvedValue({ results: [], sentCount: 0, failedCount: 0 }) mocks.list.mockResolvedValue({ enrollments: [], nextCursor: null }) }) + it('forwards provider projection without removing contributors who have not connected', async () => { + await listOrganizationAccountPeople.execute({ + principal, + input: { ...input, optionId: 'gmail-option' }, + }) + expect(mocks.list).toHaveBeenCalledWith(expect.any(Object), 'group-1', 50, 'cursor-1', { + email: undefined, + search: 'example', + optionId: 'gmail-option', + }) + }) + + it('keeps canonical provider intent on connection requests and resends', async () => { + mocks.group.mockResolvedValue({ + credentialGroupId: 'group-1', + options: [{ id: 'gmail-option', provider: 'gmail', status: 'active' }], + }) + await inviteOrganizationAccountPeople.execute({ + principal, + input: { organizationId: 'org-1', emails: ['person@example.com'], optionId: 'gmail-option' }, + }) + expect(mocks.invite).toHaveBeenCalledWith( + { kind: 'organization', organizationId: 'org-1' }, + 'group-1', + 'admin-1', + 'Admin', + { emails: ['person@example.com'] }, + { optionId: 'gmail-option', providerName: 'Gmail' } + ) + await resendOrganizationAccountInvitation.execute({ + principal, + input: { organizationId: 'org-1', enrollmentId: 'person', optionId: 'gmail-option' }, + }) + expect(mocks.resend).toHaveBeenCalledWith( + { kind: 'organization', organizationId: 'org-1' }, + 'group-1', + 'person', + 'admin-1', + 'Admin', + { optionId: 'gmail-option', providerName: 'Gmail' } + ) + }) + + it('refuses a removed provider before requesting any account connection', async () => { + mocks.group.mockResolvedValue({ credentialGroupId: 'group-1', options: [] }) + await expect( + inviteOrganizationAccountPeople.execute({ + principal, + input: { organizationId: 'org-1', emails: ['person@example.com'], optionId: 'removed' }, + }) + ).rejects.toMatchObject({ code: 'not_found' }) + expect(mocks.invite).not.toHaveBeenCalled() + }) + it('keeps the existing session-only admin operation and forwards search after authorization', async () => { const result = await listOrganizationAccountPeople.execute({ principal, input }) expect(organizationAccountManagementOperations.people).toMatchObject({ diff --git a/apps/sim/lib/credential-groups/application/organization-account-management.ts b/apps/sim/lib/credential-groups/application/organization-account-management.ts index 9cf30250d89..396f084aa33 100644 --- a/apps/sim/lib/credential-groups/application/organization-account-management.ts +++ b/apps/sim/lib/credential-groups/application/organization-account-management.ts @@ -11,6 +11,7 @@ import { resendCredentialGroupEnrollment, revokeCredentialGroupEnrollment, } from '@/lib/credential-groups/enrollments' +import { getCredentialGroupIndexingConnector } from '@/lib/credential-groups/indexing' import type { ManagedMcpConnectorId } from '@/lib/credential-groups/managed-mcp-connectors' import { type CreateManagedMcpConnectorInput, @@ -18,6 +19,7 @@ import { deleteManagedMcpConnector, } from '@/lib/credential-groups/managed-mcp-service' import { clearCredentialGroupMcpOAuthAttempts } from '@/lib/credential-groups/mcp-oauth-state' +import { isCredentialGroupProvider } from '@/lib/credential-groups/providers' import { evictMcpServerConnections } from '@/lib/mcp/connection-pool' export const organizationAccountManagementOperations = { @@ -82,6 +84,21 @@ async function requireInviterName(userId: string) { return name } +function searchConnectionIntent( + group: Awaited>['group'], + optionId?: string +) { + if (!optionId) return undefined + const option = group.options.find((item) => item.id === optionId && item.status === 'active') + const connector = + option && isCredentialGroupProvider(option.provider) + ? getCredentialGroupIndexingConnector(option.provider) + : undefined + if (!connector) + throw new OrchestrationError('not_found', 'Search account provider is no longer available') + return { optionId, providerName: connector.meta.name } +} + function groupAudit(result: { credentialGroupId: string; description: string }) { return { resourceId: result.credentialGroupId, @@ -104,7 +121,13 @@ export const listOrganizationAccountPeople = defineOrganizationAccountsUseCase({ input, context, }: OrganizationExecution< - OrganizationInput & { limit: number; cursor?: string; email?: string; search?: string } + OrganizationInput & { + limit: number + cursor?: string + email?: string + search?: string + optionId?: string + } >) { const { scope, group } = await requireGroup(context.organizationId) return listCredentialGroupEnrollments( @@ -112,7 +135,11 @@ export const listOrganizationAccountPeople = defineOrganizationAccountsUseCase({ group.credentialGroupId, input.limit, input.cursor, - { email: input.email, search: input.search } + { + email: input.email, + search: input.search, + ...(input.optionId ? { optionId: input.optionId } : {}), + } ) }, }) @@ -122,7 +149,7 @@ export const inviteOrganizationAccountPeople = defineOrganizationAccountsUseCase async execute({ input, context, - }: OrganizationExecution) { + }: OrganizationExecution) { const emails = validateCredentialGroupInvitationEmails(input.emails) const { scope, group } = await requireGroup(context.organizationId) const result = await inviteCredentialGroupEnrollments( @@ -130,7 +157,8 @@ export const inviteOrganizationAccountPeople = defineOrganizationAccountsUseCase group.credentialGroupId, context.userId, await requireInviterName(context.userId), - { emails } + { emails }, + searchConnectionIntent(group, input.optionId) ) return { ...result, @@ -146,14 +174,15 @@ export const resendOrganizationAccountInvitation = defineOrganizationAccountsUse async execute({ input, context, - }: OrganizationExecution) { + }: OrganizationExecution) { const { scope, group } = await requireGroup(context.organizationId) const enrollment = await resendCredentialGroupEnrollment( scope, group.credentialGroupId, input.enrollmentId, context.userId, - await requireInviterName(context.userId) + await requireInviterName(context.userId), + searchConnectionIntent(group, input.optionId) ) return { credentialGroupEnrollment: enrollment, diff --git a/apps/sim/lib/credential-groups/application/personal-organization-accounts.test.ts b/apps/sim/lib/credential-groups/application/personal-organization-accounts.test.ts index e4708a87ab4..867ad51c839 100644 --- a/apps/sim/lib/credential-groups/application/personal-organization-accounts.test.ts +++ b/apps/sim/lib/credential-groups/application/personal-organization-accounts.test.ts @@ -71,6 +71,17 @@ describe('personal organization contributions', () => { expect(dbChainMockFns.from).not.toHaveBeenCalledWith(schemaMock.member) }) + it('returns OAuth contributors to the exact account in account settings', async () => { + queueTableRows(schemaMock.credential, [ + { ...row, type: 'managed_oauth', optionId: 'gmail-option' }, + ]) + const result = await reconnectPersonalOrganizationAccount.execute({ principal, input }) + const url = new URL(result.invitationLink) + expect(url.searchParams.get('optionId')).toBe('gmail-option') + expect(url.searchParams.get('returnTo')).toBe('accounts') + expect(dbChainMockFns.from).not.toHaveBeenCalledWith(schemaMock.member) + }) + it('refuses disconnect of another contributor’s account', async () => { queueTableRows(schemaMock.credential, []) await expect( diff --git a/apps/sim/lib/credential-groups/application/personal-organization-accounts.ts b/apps/sim/lib/credential-groups/application/personal-organization-accounts.ts index 243643c45d6..ab7af64f16a 100644 --- a/apps/sim/lib/credential-groups/application/personal-organization-accounts.ts +++ b/apps/sim/lib/credential-groups/application/personal-organization-accounts.ts @@ -148,7 +148,10 @@ export const reconnectPersonalOrganizationAccount = defineAuthorizedCredentialUs userId: principal.userId, }) const url = new URL(invitationLink) - if (account.optionId) url.searchParams.set('optionId', account.optionId) + if (account.optionId) { + url.searchParams.set('optionId', account.optionId) + url.searchParams.set('returnTo', 'accounts') + } return { invitationLink: url.toString() } }, }) diff --git a/apps/sim/lib/credential-groups/application/public-enrollment.test.ts b/apps/sim/lib/credential-groups/application/public-enrollment.test.ts index 97b50175865..2a979fcd80a 100644 --- a/apps/sim/lib/credential-groups/application/public-enrollment.test.ts +++ b/apps/sim/lib/credential-groups/application/public-enrollment.test.ts @@ -7,6 +7,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ bind: vi.fn(), + memberAccess: vi.fn(), + searchAvailable: vi.fn(), completeEnrollment: vi.fn(), completeOAuth: vi.fn(), fireTrigger: vi.fn(), @@ -20,6 +22,13 @@ const mocks = vi.hoisted(() => ({ startOAuth: vi.fn(), })) +vi.mock('@/lib/organizations/settings-access', () => ({ + getOrganizationSettingsAccess: mocks.memberAccess, +})) +vi.mock('@/lib/knowledge/access/availability', () => ({ + isKnowledgeMemberAccessAvailable: mocks.searchAvailable, +})) + vi.mock('@/lib/credential-groups/enrollments', () => ({ bindCredentialGroupEnrollmentUser: mocks.bind, completeAuthorizedCredentialGroupEnrollment: mocks.completeEnrollment, @@ -93,6 +102,8 @@ describe('public Credential Group enrollment application operations', () => { beforeEach(() => { vi.clearAllMocks() mocks.bind.mockResolvedValue(undefined) + mocks.memberAccess.mockResolvedValue({ isMember: false }) + mocks.searchAvailable.mockResolvedValue(true) mocks.getEnrollment.mockResolvedValue({ status: 'invited', credentialGroupName: 'Credential Group', @@ -146,6 +157,7 @@ describe('public Credential Group enrollment application operations', () => { expect(mocks.getEnrollment).toHaveBeenCalledWith(identity, undefined) expect(result).toEqual({ + canSearch: false, enrollment: { status: 'invited', credentialGroupName: 'Credential Group', @@ -154,6 +166,24 @@ describe('public Credential Group enrollment application operations', () => { }) }) + it.each([ + [true, true, true], + [false, true, false], + [true, false, false], + ])( + 'returns to organization Search only for current members with Search enabled', + async (isMember, available, expected) => { + mocks.memberAccess.mockResolvedValue({ isMember }) + mocks.searchAvailable.mockResolvedValue(available) + const result = await readPublicCredentialGroupEnrollment.execute({ + principal, + input: { optionId: 'option-1' }, + }) + expect(result.canSearch).toBe(expected) + expect(mocks.memberAccess).toHaveBeenCalledWith('org-1', 'user-1') + } + ) + it('fails closed when the current invitation no longer resolves', async () => { mocks.getEnrollment.mockResolvedValue(null) diff --git a/apps/sim/lib/credential-groups/application/public-enrollment.ts b/apps/sim/lib/credential-groups/application/public-enrollment.ts index a132e443115..0c0f388e82b 100644 --- a/apps/sim/lib/credential-groups/application/public-enrollment.ts +++ b/apps/sim/lib/credential-groups/application/public-enrollment.ts @@ -31,6 +31,8 @@ import { import type { CredentialGroupOAuthAttempt } from '@/lib/credential-groups/oauth-state' import { CredentialGroupInvitationUnavailableError } from '@/lib/credential-groups/provider-adapter' import { fireCredentialGroupTrigger } from '@/lib/credential-groups/trigger' +import { isKnowledgeMemberAccessAvailable } from '@/lib/knowledge/access/availability' +import { getOrganizationSettingsAccess } from '@/lib/organizations/settings-access' interface AuthorizedCredentialGroupEnrollmentUseCaseDefinition { operation: O @@ -143,8 +145,12 @@ export const readPublicCredentialGroupEnrollment = defineAuthorizedCredentialGro principal: CredentialGroupEnrollmentPrincipal input: { optionId?: string } }) => resolvePublicEnrollmentContext(principal, input.optionId), - async execute({ context }) { - return { enrollment: context.enrollment } + async execute({ context, principal }) { + const canSearch = + !context.organizationId || + ((await getOrganizationSettingsAccess(context.organizationId, principal.userId)).isMember && + (await isKnowledgeMemberAccessAvailable({ organizationId: context.organizationId }))) + return { enrollment: context.enrollment, canSearch } }, } ) @@ -173,7 +179,7 @@ export const completePublicCredentialGroupEnrollment = interface PublicCredentialGroupOAuthInput { invitationToken: string optionId: string - returnTo?: 'search' + returnTo?: 'search' | 'accounts' } interface PublicCredentialGroupOAuthContext extends PublicCredentialGroupEnrollmentIdentity { diff --git a/apps/sim/lib/credential-groups/enrollments.test.ts b/apps/sim/lib/credential-groups/enrollments.test.ts index fcb80c12d81..33580fa9637 100644 --- a/apps/sim/lib/credential-groups/enrollments.test.ts +++ b/apps/sim/lib/credential-groups/enrollments.test.ts @@ -12,7 +12,7 @@ const { adapter } = vi.hoisted(() => ({ }, })) -vi.mock('@/components/emails/render', () => ({ +vi.mock('@/components/emails/credential-groups/render', () => ({ renderCredentialGroupInvitationEmail: vi.fn(), })) @@ -37,6 +37,7 @@ vi.mock('@/lib/credential-groups/provider-registry', () => ({ getCredentialGroupProviderAdapter: () => adapter, })) +import { renderCredentialGroupInvitationEmail } from '@/components/emails/credential-groups/render' import { getOrganizationSubscriptionUsable } from '@/lib/billing/core/subscription' import { isFeatureEnabled } from '@/lib/core/config/feature-flags' import { @@ -247,6 +248,28 @@ describe('listCredentialGroupEnrollments', () => { ) }) + it('projects an exact provider in SQL while retaining contributors with no account', async () => { + dbChainMockFns.limit + .mockResolvedValueOnce([ + { + options: [ + { id: 'first', status: 'active' }, + { id: 'second', status: 'active' }, + ], + }, + ]) + .mockResolvedValueOnce([{ enrollment: ENROLLMENT }]) + .mockResolvedValueOnce([]) + const result = await listCredentialGroupEnrollments('workspace-1', 'group-1', 50, undefined, { + optionId: 'second', + }) + expect(inArray).toHaveBeenCalledWith(schemaMock.credential.credentialGroupOptionId, ['second']) + expect(dbChainMockFns.from).not.toHaveBeenCalledWith(schemaMock.mcpServers) + expect(result.enrollments).toEqual([ + expect.objectContaining({ id: ENROLLMENT.id, connections: [], mcpConnections: [] }), + ]) + }) + it('rejects an unbounded enrollment page request', async () => { await expect(listCredentialGroupEnrollments('workspace-1', 'group-1', 101)).rejects.toThrow( 'Credential group enrollment limit must be between 1 and 100' @@ -503,9 +526,16 @@ describe('resendCredentialGroupEnrollment', () => { 'group-1', ENROLLMENT.id, 'user-1', - 'Inviter' + 'Inviter', + { optionId: 'option-1', providerName: 'Gmail' } ) + expect(renderCredentialGroupInvitationEmail).toHaveBeenCalledWith( + expect.objectContaining({ + searchProviderName: 'Gmail', + invitationLink: expect.stringMatching(/\?optionId=option-1&returnTo=search$/), + }) + ) expect(result.status).toBe('completed') expect(dbChainMockFns.set).toHaveBeenNthCalledWith( 1, diff --git a/apps/sim/lib/credential-groups/enrollments.ts b/apps/sim/lib/credential-groups/enrollments.ts index fca86c98464..dce3439294c 100644 --- a/apps/sim/lib/credential-groups/enrollments.ts +++ b/apps/sim/lib/credential-groups/enrollments.ts @@ -58,6 +58,7 @@ type EnrollmentRow = typeof credentialGroupEnrollment.$inferSelect export type CredentialGroupEnrollmentStatus = EnrollmentRow['status'] export interface ListCredentialGroupEnrollmentFilters { + optionId?: string email?: string search?: string statuses?: CredentialGroupEnrollmentStatus[] @@ -82,6 +83,7 @@ export type RevokedEnrollmentPolicy = 'reactivate' | 'reject' interface SendInvitationOptions { expectedEnrollmentId?: string revokedEnrollment: RevokedEnrollmentPolicy + searchConnection?: { optionId: string; providerName: string } } interface IssuedInvitation { @@ -610,12 +612,20 @@ async function sendInvitation( invitationLink, tokenHash, } = await issueInvitation(context, userId, email, options) + const focusedLink = new URL(invitationLink) + if (options.searchConnection) { + focusedLink.searchParams.set('optionId', options.searchConnection.optionId) + focusedLink.searchParams.set('returnTo', 'search') + } const html = await renderCredentialGroupInvitationEmail({ recipientEmail: email, inviterName, workspaceName: context.workspaceName, credentialGroupName: context.groupName, - invitationLink, + invitationLink: focusedLink.toString(), + ...(options.searchConnection + ? { searchProviderName: options.searchConnection.providerName } + : {}), }) const result = await sendEmail({ to: email, @@ -693,21 +703,32 @@ export async function listCredentialGroupEnrollments( .where(and(eq(credentialGroup.id, groupId), resourceScopeCondition(credentialGroup, scope))) .limit(1) if (!group) throw new CredentialGroupEnrollmentError('Credential group not found', 404) + if ( + filters.optionId && + !group.options.some((option) => option.id === filters.optionId && option.status === 'active') + ) { + throw new CredentialGroupEnrollmentError('Account provider is no longer available', 404) + } const activeOptionIds = group.options - .filter((option) => option.status === 'active') - .map((option) => option.id) - const activeMcpServers = await db - .select({ id: mcpServers.id, name: mcpServers.name }) - .from(mcpServers) - .where( - and( - resourceScopeCondition(mcpServers, scope), - eq(mcpServers.credentialGroupId, groupId), - eq(mcpServers.authType, 'oauth'), - eq(mcpServers.enabled, true), - isNull(mcpServers.deletedAt) - ) + .filter( + (option) => + option.status === 'active' && (!filters.optionId || option.id === filters.optionId) ) + .map((option) => option.id) + const activeMcpServers = filters.optionId + ? [] + : await db + .select({ id: mcpServers.id, name: mcpServers.name }) + .from(mcpServers) + .where( + and( + resourceScopeCondition(mcpServers, scope), + eq(mcpServers.credentialGroupId, groupId), + eq(mcpServers.authType, 'oauth'), + eq(mcpServers.enabled, true), + isNull(mcpServers.deletedAt) + ) + ) const activeMcpServerById = new Map(activeMcpServers.map((server) => [server.id, server])) const cursorPosition = cursor ? decodeCredentialGroupEnrollmentCursor(cursor) : undefined @@ -768,7 +789,7 @@ export async function listCredentialGroupEnrollments( eq(credential.type, 'managed_oauth'), inArray(credential.credentialGroupOptionId, activeOptionIds) ), - eq(credential.type, 'personal_token') + filters.optionId ? undefined : eq(credential.type, 'personal_token') ) ) ) @@ -853,7 +874,8 @@ export async function inviteCredentialGroupEnrollments( groupId: string, userId: string, inviterName: string, - body: InviteCredentialGroupEnrollmentsInput + body: InviteCredentialGroupEnrollmentsInput, + searchConnection?: { optionId: string; providerName: string } ) { const scope = credentialGroupScope(scopeInput) const context = await getInvitationContext(scope, groupId) @@ -870,6 +892,7 @@ export async function inviteCredentialGroupEnrollments( try { const enrollment = await sendInvitation(context, userId, inviterName, email, { revokedEnrollment: 'reactivate', + ...(searchConnection ? { searchConnection } : {}), }) return { email, success: true as const, enrollment } } catch (error) { @@ -964,7 +987,8 @@ export async function resendCredentialGroupEnrollment( groupId: string, enrollmentId: string, userId: string, - inviterName: string + inviterName: string, + searchConnection?: { optionId: string; providerName: string } ): Promise { const scope = credentialGroupScope(scopeInput) const context = await getInvitationContext(scope, groupId) @@ -984,6 +1008,7 @@ export async function resendCredentialGroupEnrollment( return sendInvitation(context, userId, inviterName, row.enrollment.email, { expectedEnrollmentId: enrollmentId, revokedEnrollment: 'reject', + ...(searchConnection ? { searchConnection } : {}), }) } diff --git a/apps/sim/lib/credential-groups/oauth-state.test.ts b/apps/sim/lib/credential-groups/oauth-state.test.ts index 43367d7a768..31b7ab7ae03 100644 --- a/apps/sim/lib/credential-groups/oauth-state.test.ts +++ b/apps/sim/lib/credential-groups/oauth-state.test.ts @@ -118,34 +118,37 @@ describe('credential group OAuth state', () => { ).rejects.toThrow('Credential group OAuth requires Redis') }) - it('round-trips a scopeless GitHub App attempt with PKCE and one-time state', async () => { - const created = await createCredentialGroupOAuthAttempt({ - provider: 'github-repositories', - workspaceId: 'workspace-1', - userId: 'user-1', - email: 'person@example.com', - enrollmentId: 'enrollment-1', - credentialGroupId: 'group-1', - optionId: 'option-1', - authorizationAppId: 'github-app:fixture', - scopeVersion: 1, - requiredScopes: [], - redirectUri: 'https://sim.example.com/api/auth/oauth2/callback/github-repositories', - codeVerifier: 'github-code-verifier', - invitationToken: 'invitation-token', - returnTo: 'search', - }) + it.each(['search', 'accounts'] as const)( + 'round-trips a scopeless GitHub App attempt with PKCE and one-time state', + async (returnTo) => { + const created = await createCredentialGroupOAuthAttempt({ + provider: 'github-repositories', + workspaceId: 'workspace-1', + userId: 'user-1', + email: 'person@example.com', + enrollmentId: 'enrollment-1', + credentialGroupId: 'group-1', + optionId: 'option-1', + authorizationAppId: 'github-app:fixture', + scopeVersion: 1, + requiredScopes: [], + redirectUri: 'https://sim.example.com/api/auth/oauth2/callback/github-repositories', + codeVerifier: 'github-code-verifier', + invitationToken: 'invitation-token', + returnTo, + }) - const consumed = await consumeCredentialGroupOAuthAttempt(created.state) - expect(consumed).toMatchObject({ - provider: 'github-repositories', - requiredScopes: [], - codeVerifier: 'github-code-verifier', - returnTo: 'search', - }) - expect(credentialGroupOAuthNonceMatches(created.nonce, consumed!.nonceHash)).toBe(true) - await expect(consumeCredentialGroupOAuthAttempt(created.state)).resolves.toBeNull() - }) + const consumed = await consumeCredentialGroupOAuthAttempt(created.state) + expect(consumed).toMatchObject({ + provider: 'github-repositories', + requiredScopes: [], + codeVerifier: 'github-code-verifier', + returnTo, + }) + expect(credentialGroupOAuthNonceMatches(created.nonce, consumed!.nonceHash)).toBe(true) + await expect(consumeCredentialGroupOAuthAttempt(created.state)).resolves.toBeNull() + } + ) it('supports providers without PKCE while preserving one-time state', async () => { const created = await createCredentialGroupOAuthAttempt({ diff --git a/apps/sim/lib/credential-groups/oauth-state.ts b/apps/sim/lib/credential-groups/oauth-state.ts index e832e82ebca..53bd32c0c47 100644 --- a/apps/sim/lib/credential-groups/oauth-state.ts +++ b/apps/sim/lib/credential-groups/oauth-state.ts @@ -38,7 +38,7 @@ interface StoredCredentialGroupOAuthAttempt { requiredScopes: string[] redirectUri: string completionRedirect?: boolean - returnTo?: 'search' + returnTo?: 'search' | 'accounts' nonceHash: string encryptedCodeVerifier?: string encryptedInvitationToken: string @@ -61,7 +61,7 @@ export interface CredentialGroupOAuthAttempt { requiredScopes: string[] redirectUri: string completionRedirect?: boolean - returnTo?: 'search' + returnTo?: 'search' | 'accounts' codeVerifier?: string invitationToken: string createdAt: number @@ -81,7 +81,7 @@ interface CreateCredentialGroupOAuthAttemptParams { requiredScopes: string[] redirectUri: string completionRedirect?: boolean - returnTo?: 'search' + returnTo?: 'search' | 'accounts' codeVerifier?: string invitationToken: string } @@ -129,7 +129,9 @@ function isStoredAttempt(value: unknown): value is StoredCredentialGroupOAuthAtt typeof candidate.redirectUri === 'string' && (candidate.completionRedirect === undefined || typeof candidate.completionRedirect === 'boolean') && - (candidate.returnTo === undefined || candidate.returnTo === 'search') && + (candidate.returnTo === undefined || + candidate.returnTo === 'search' || + candidate.returnTo === 'accounts') && typeof candidate.nonceHash === 'string' && (candidate.encryptedCodeVerifier === undefined || typeof candidate.encryptedCodeVerifier === 'string') && diff --git a/apps/sim/lib/credential-groups/oauth.ts b/apps/sim/lib/credential-groups/oauth.ts index 8bb3afb9494..5bf8431d5d4 100644 --- a/apps/sim/lib/credential-groups/oauth.ts +++ b/apps/sim/lib/credential-groups/oauth.ts @@ -110,7 +110,7 @@ const logger = createLogger('CredentialGroupOAuth') export async function startCredentialGroupOAuth( context: CredentialGroupOAuthContext, invitationToken: string, - options: { completionRedirect?: boolean; returnTo?: 'search' } = {} + options: { completionRedirect?: boolean; returnTo?: 'search' | 'accounts' } = {} ): Promise { if (!context.credentialOwnerId) throw new CredentialGroupInvitationUnavailableError() const adapter = getOptionAdapter(context) diff --git a/apps/sim/lib/credentials/client-state.ts b/apps/sim/lib/credentials/client-state.ts index 4e18b74cc01..c9bdb56a07f 100644 --- a/apps/sim/lib/credentials/client-state.ts +++ b/apps/sim/lib/credentials/client-state.ts @@ -79,6 +79,7 @@ interface OAuthReturnKBConnectors extends OAuthReturnBase { knowledgeBaseId: string connectorType?: string connectorId?: string + sourceAccess?: 'members' } export type OAuthReturnContext = diff --git a/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts b/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts new file mode 100644 index 00000000000..85f36ea1596 --- /dev/null +++ b/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts @@ -0,0 +1,311 @@ +import { db } from '@sim/db' +import { + account, + credential, + document, + knowledgeBase, + knowledgeConnector, + knowledgeConnectorMember, + knowledgeConnectorMemberSyncLog, + knowledgeConnectorSyncLog, + member, + organization, + organizationSearchIntegration, + user, + workspace, +} from '@sim/db/schema' +import { generateId } from '@sim/utils/id' +import { eq, inArray } from 'drizzle-orm' +import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest' +import { + createKnowledgeAclFixtureIds, + seedKnowledgeAclFixture, +} from '@/lib/knowledge/__integration__/seed-source-access-fixture' +import { readOrganizationSearchOverview } from '@/lib/knowledge/application/organization-search-overview' +import { listSearchSources } from '@/lib/knowledge/application/search-sources' + +const ids = createKnowledgeAclFixtureIds() +const indexId = generateId() +const driveId = generateId() +const pausedDriveId = generateId() +const gmailId = generateId() +const credentialId = generateId() +const accountId = generateId() +const memberId = generateId() +const documentId = generateId() +const sourceIds = [driveId, pausedDriveId, gmailId] +const principal = { kind: 'session', userId: ids.aliceId, sessionId: 'overview-admin' } as const +const input = { organizationId: ids.organizationId } + +beforeAll(async () => { + await seedKnowledgeAclFixture(ids) + await db.insert(member).values([ + { id: generateId(), organizationId: ids.organizationId, userId: ids.aliceId, role: 'admin' }, + { id: generateId(), organizationId: ids.organizationId, userId: ids.bobId, role: 'member' }, + ]) + await db.insert(knowledgeBase).values({ + id: indexId, + userId: ids.aliceId, + organizationId: ids.organizationId, + name: 'Overview fixture', + isSearchIndex: true, + }) + await db.insert(knowledgeConnector).values([ + { + id: driveId, + knowledgeBaseId: indexId, + connectorType: 'google_drive', + accessMode: 'admin', + sourceConfig: {}, + }, + { + id: pausedDriveId, + knowledgeBaseId: indexId, + connectorType: 'google_drive', + accessMode: 'admin', + sourceConfig: {}, + }, + { + id: gmailId, + knowledgeBaseId: indexId, + connectorType: 'gmail', + accessMode: 'members', + sourceConfig: {}, + }, + ]) + await db.insert(account).values({ + id: accountId, + accountId: ids.bobId, + userId: ids.bobId, + providerId: 'google-email', + createdAt: new Date(), + updatedAt: new Date(), + }) + await db.insert(credential).values({ + id: credentialId, + organizationId: ids.organizationId, + type: 'oauth', + displayName: 'Fixture connection', + providerId: 'google-email', + accountId, + createdBy: ids.bobId, + }) + await db.insert(knowledgeConnectorMember).values({ + id: memberId, + organizationId: ids.organizationId, + connectorId: gmailId, + credentialId, + subjectToken: `s:google-email:fixture:${ids.bobId}`, + }) + await db.insert(document).values({ + id: documentId, + knowledgeBaseId: indexId, + connectorId: driveId, + externalId: 'private-fixture', + filename: 'private-title.txt', + fileUrl: 'https://fixture.test/private', + fileSize: 5, + mimeType: 'text/plain', + processingStatus: 'completed', + acl: ['u:someone-else@fixture.test'], + aclVerifiedAt: new Date(), + }) +}) + +beforeEach(async () => { + await db + .delete(organizationSearchIntegration) + .where(eq(organizationSearchIntegration.organizationId, ids.organizationId)) + await db + .delete(knowledgeConnectorMemberSyncLog) + .where(inArray(knowledgeConnectorMemberSyncLog.connectorId, sourceIds)) + await db + .delete(knowledgeConnectorSyncLog) + .where(inArray(knowledgeConnectorSyncLog.connectorId, sourceIds)) + await db + .update(knowledgeConnector) + .set({ + status: 'active', + memberSyncStatus: 'idle', + lastSyncAt: new Date(), + lastMemberSyncAt: new Date(), + lastSyncError: null, + lastMemberSyncError: null, + listingCheckpoint: null, + directoryCheckpoint: null, + nextMemberSyncAt: null, + }) + .where(inArray(knowledgeConnector.id, sourceIds)) + await db + .update(knowledgeConnector) + .set({ status: 'paused' }) + .where(eq(knowledgeConnector.id, pausedDriveId)) + await db + .update(knowledgeConnectorMember) + .set({ + status: 'active', + lastCompleteListingAt: new Date(), + memberSyncedThrough: new Date(), + lastError: null, + consecutiveFailures: 0, + listingCheckpoint: null, + }) + .where(eq(knowledgeConnectorMember.id, memberId)) + await db + .update(document) + .set({ processingStatus: 'completed', enabled: true, userExcluded: false }) + .where(eq(document.id, documentId)) +}) + +afterAll(async () => { + await db.delete(workspace).where(eq(workspace.id, ids.workspaceId)) + await db.delete(organization).where(eq(organization.id, ids.organizationId)) + await db.delete(user).where(inArray(user.id, [ids.aliceId, ids.bobId])) +}) + +async function provider(connectorType: string) { + return (await readOrganizationSearchOverview.execute({ principal, input })).providers.find( + (item) => item.connectorType === connectorType + ) +} + +describe('organization operational overview with real SQL', () => { + it('counts configured sources independently of viewer ACLs, and excludes workspace and untouched providers', async () => { + const result = await readOrganizationSearchOverview.execute({ principal, input }) + expect(result.providers).toEqual( + expect.arrayContaining([ + { connectorType: 'google_drive', sourceCount: 2, approved: true, status: 'active' }, + { connectorType: 'gmail', sourceCount: 1, approved: true, status: 'active' }, + ]) + ) + expect(result.providers).toHaveLength(2) + expect(JSON.stringify(result)).not.toMatch(/private-title|someone-else|fixture connection/i) + const visible = await listSearchSources.execute({ + principal, + input: { ...input, connectorType: 'google_drive' }, + }) + expect(visible.sources).toHaveLength(2) + expect(visible.sources.every((source) => source.viewerDocumentCount === 0)).toBe(true) + }) + it('keeps explicit approvals and deactivations visible before source creation', async () => { + await db.insert(organizationSearchIntegration).values([ + { organizationId: ids.organizationId, connectorType: 'github', approved: true }, + { organizationId: ids.organizationId, connectorType: 'confluence', approved: false }, + { organizationId: ids.organizationId, connectorType: 'notion', approved: true }, + ]) + expect(await provider('github')).toMatchObject({ + sourceCount: 0, + approved: true, + status: 'waiting_for_connections', + }) + expect(await provider('confluence')).toMatchObject({ + sourceCount: 0, + approved: false, + status: 'paused', + }) + expect(await provider('notion')).toBeUndefined() + }) + it('reports waiting accounts despite an empty member run having a completion timestamp', async () => { + await db + .update(knowledgeConnectorMember) + .set({ status: 'disabled' }) + .where(eq(knowledgeConnectorMember.id, memberId)) + await db + .update(knowledgeConnector) + .set({ memberSyncStatus: 'pending' }) + .where(eq(knowledgeConnector.id, gmailId)) + expect(await provider('gmail')).toMatchObject({ status: 'waiting_for_connections' }) + }) + it('distinguishes normal member continuation from partial failure without treating idle as success', async () => { + await db + .update(knowledgeConnectorMember) + .set({ listingCheckpoint: { cursor: 'fixture' } }) + .where(eq(knowledgeConnectorMember.id, memberId)) + const logId = generateId() + await db.insert(knowledgeConnectorMemberSyncLog).values({ + id: logId, + connectorId: gmailId, + status: 'partial', + membersIncomplete: 1, + completedAt: new Date(), + }) + expect(await provider('gmail')).toMatchObject({ status: 'indexing' }) + await db + .update(knowledgeConnectorMemberSyncLog) + .set({ membersFailed: 1 }) + .where(eq(knowledgeConnectorMemberSyncLog.id, logId)) + expect(await provider('gmail')).toMatchObject({ status: 'needs_attention' }) + await db + .update(knowledgeConnectorMemberSyncLog) + .set({ membersFailed: 0 }) + .where(eq(knowledgeConnectorMemberSyncLog.id, logId)) + await db + .update(knowledgeConnectorMember) + .set({ listingCheckpoint: null }) + .where(eq(knowledgeConnectorMember.id, memberId)) + expect(await provider('gmail')).toMatchObject({ status: 'needs_attention' }) + await db + .update(knowledgeConnector) + .set({ nextMemberSyncAt: new Date() }) + .where(eq(knowledgeConnector.id, gmailId)) + expect(await provider('gmail')).toMatchObject({ status: 'indexing' }) + await db + .update(knowledgeConnector) + .set({ nextMemberSyncAt: null }) + .where(eq(knowledgeConnector.id, gmailId)) + await db.insert(knowledgeConnectorMemberSyncLog).values({ + id: generateId(), + connectorId: gmailId, + status: 'completed', + startedAt: new Date(Date.now() + 1000), + completedAt: new Date(), + }) + expect(await provider('gmail')).toMatchObject({ status: 'active' }) + }) + it('reports inaccessible processing failures without exposing documents, and ignores excluded failures', async () => { + await db.update(document).set({ processingStatus: 'failed' }).where(eq(document.id, documentId)) + expect(await provider('google_drive')).toMatchObject({ status: 'needs_attention' }) + await db.update(document).set({ userExcluded: true }).where(eq(document.id, documentId)) + expect(await provider('google_drive')).toMatchObject({ status: 'active' }) + await db + .update(document) + .set({ userExcluded: false, processingStatus: 'processing' }) + .where(eq(document.id, documentId)) + expect(await provider('google_drive')).toMatchObject({ status: 'indexing' }) + }) + it('surfaces retained source errors and stale member permissions, while pause and deactivation take precedence', async () => { + await db + .update(knowledgeConnector) + .set({ lastSyncError: 'private-provider-error' }) + .where(eq(knowledgeConnector.id, driveId)) + expect(await provider('google_drive')).toMatchObject({ status: 'needs_attention' }) + await db + .update(knowledgeConnectorMember) + .set({ + memberSyncedThrough: new Date(Date.now() - 3 * 86_400_000), + lastCompleteListingAt: new Date(Date.now() - 3 * 86_400_000), + }) + .where(eq(knowledgeConnectorMember.id, memberId)) + expect(await provider('gmail')).toMatchObject({ status: 'needs_attention' }) + await db + .update(knowledgeConnector) + .set({ status: 'paused' }) + .where(eq(knowledgeConnector.id, driveId)) + expect(await provider('google_drive')).toMatchObject({ status: 'paused' }) + await db + .insert(organizationSearchIntegration) + .values({ organizationId: ids.organizationId, connectorType: 'gmail', approved: false }) + expect(await provider('gmail')).toMatchObject({ approved: false, status: 'paused' }) + }) + it('requires a current organization admin even for a workspace administrator', async () => { + await expect( + readOrganizationSearchOverview.execute({ + principal: { ...principal, userId: ids.bobId }, + input, + }) + ).rejects.toMatchObject({ code: 'forbidden' }) + await expect( + readOrganizationSearchOverview.execute({ principal, input: { organizationId: generateId() } }) + ).rejects.toMatchObject({ code: 'not_found' }) + }) +}) diff --git a/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts b/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts index 04be1114507..4bc7a62c3f6 100644 --- a/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/search-source-pagination.integration.ts @@ -102,6 +102,14 @@ afterAll(async () => { }) describe('bounded source pagination and provider overview', () => { + it('finds a provider beyond the unfiltered candidate bound on its first filtered page', async () => { + const result = await listSearchSources.execute({ + principal: alice, + input: { ...input, connectorType: 'google_drive' }, + }) + expect(result.sources.map((source) => source.connectorId)).toEqual([olderSourceId]) + expect(result.nextCursor).toBeNull() + }) it('walks tied microsecond timestamps without duplicating or skipping sources', async () => { const found: string[] = [] let cursor: string | undefined diff --git a/apps/sim/lib/knowledge/application/operations.ts b/apps/sim/lib/knowledge/application/operations.ts index 3a25611eb8a..390c8d7963b 100644 --- a/apps/sim/lib/knowledge/application/operations.ts +++ b/apps/sim/lib/knowledge/application/operations.ts @@ -654,6 +654,15 @@ export const knowledgeOperations = { principalKinds: ['session'], }) ), + readOrganizationSearchOverview: defineKnowledgeOperation( + defineWorkspaceOperation({ + id: 'knowledge.search.integrations.overview', + minimumRole: 'admin', + workspaceApiKey: 'deny', + capability: 'knowledge.use', + principalKinds: ['session'], + }) + ), approveSearchIntegration: defineKnowledgeOperation( defineWorkspaceOperation({ id: 'knowledge.search.integrations.approve', diff --git a/apps/sim/lib/knowledge/application/organization-search-overview.test.ts b/apps/sim/lib/knowledge/application/organization-search-overview.test.ts new file mode 100644 index 00000000000..14ee8417927 --- /dev/null +++ b/apps/sim/lib/knowledge/application/organization-search-overview.test.ts @@ -0,0 +1,148 @@ +/** @vitest-environment node */ +import { knowledgeConnector, member, organizationSearchIntegration } from '@sim/db/schema' +import { dbChainMockFns, queueTableRows, resetDbChainMock } from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ context: vi.fn(), policy: vi.fn(), availability: vi.fn() })) +vi.mock('@/lib/knowledge/application/contexts', () => ({ + resolveKnowledgeOwnerContext: mocks.context, +})) +vi.mock('@/lib/permission-groups/resolve.server', () => ({ + getUserPermissionConfigForOrganization: mocks.policy, +})) +vi.mock('@sim/platform-authz/workspace', () => ({ + isOrgAdminRole: (role: string) => role === 'owner' || role === 'admin', +})) +vi.mock('@/lib/knowledge/access/availability', () => ({ + resolveKnowledgeAccessAvailability: mocks.availability, +})) +vi.mock('@/lib/sim-search/connectors', () => ({ + SEARCH_SOURCE_TYPES: [ + ['google_drive', { mirrorsSourceAcls: true }], + ['gmail', { permissionScopedListing: {} }], + ['github', { permissionScopedListing: {} }], + ], +})) + +import { organizationSearchOverviewSchema } from '@/lib/api/contracts/knowledge/connectors' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { readOrganizationSearchOverview } from '@/lib/knowledge/application/organization-search-overview' + +const principal = { kind: 'session', userId: 'admin', sessionId: 'session' } as const +const input = { organizationId: 'organization' } +const health = { + connectorType: 'google_drive', + sourceCount: 4, + pausedCount: 0, + hasError: false, + hasIndexing: false, + hasWaiting: false, + hasUnstarted: false, +} + +beforeEach(() => { + vi.clearAllMocks() + resetDbChainMock() + mocks.context.mockResolvedValue(input) + mocks.policy.mockResolvedValue(null) + mocks.availability.mockResolvedValue({ memberScoped: true, sourceMirrored: true }) +}) + +describe('organization Search administration overview', () => { + it.each(['admin', 'owner'])( + 'allows a current %s and returns only operational facts', + async (role) => { + queueTableRows(member, [{ role }]) + queueTableRows(knowledgeConnector, [ + { ...health, rawError: 'private', sourceConfig: { token: 'secret' } }, + ]) + queueTableRows(organizationSearchIntegration, [ + { connectorType: 'gmail', approved: true }, + { connectorType: 'github', approved: false }, + ]) + const result = await readOrganizationSearchOverview.execute({ principal, input }) + expect(result).toEqual({ + providers: [ + { connectorType: 'google_drive', sourceCount: 4, approved: true, status: 'active' }, + { + connectorType: 'gmail', + sourceCount: 0, + approved: true, + status: 'waiting_for_connections', + }, + { connectorType: 'github', sourceCount: 0, approved: false, status: 'paused' }, + ], + }) + expect(organizationSearchOverviewSchema.parse(result)).toEqual(result) + expect(JSON.stringify(result)).not.toMatch(/private|secret|DocumentCount|sourceConfig/) + expect(dbChainMockFns.insert).not.toHaveBeenCalled() + expect(dbChainMockFns.limit).toHaveBeenCalledWith(100) + } + ) + it.each([ + { rows: [{ role: 'member' }], code: 'forbidden' }, + { rows: [], code: 'not_found' }, + ])('refuses unauthorized reads with $code before health queries', async ({ rows, code }) => { + queueTableRows(member, rows) + await expect( + readOrganizationSearchOverview.execute({ principal, input }) + ).rejects.toMatchObject({ code }) + expect(dbChainMockFns.from).not.toHaveBeenCalledWith(knowledgeConnector) + expect(dbChainMockFns.from).not.toHaveBeenCalledWith(organizationSearchIntegration) + }) + it('rejects a workspace key before canonical loading', async () => { + await expect( + readOrganizationSearchOverview.execute({ + principal: { kind: 'workspace_api_key', keyId: 'key', workspaceId: 'workspace' }, + input, + }) + ).rejects.toThrow() + expect(mocks.context).not.toHaveBeenCalled() + }) + it('declares administrative session authority without delegation', () => { + expect(knowledgeOperations.readOrganizationSearchOverview).toMatchObject({ + minimumRole: 'admin', + workspaceApiKey: 'deny', + principalKinds: ['session'], + organizationOperation: { minimumRole: 'admin' }, + }) + }) + it('preserves explicit deactivation despite existing sources and hides untouched catalog entries', async () => { + queueTableRows(member, [{ role: 'admin' }]) + queueTableRows(knowledgeConnector, [{ ...health, hasIndexing: true }]) + queueTableRows(organizationSearchIntegration, [ + { connectorType: 'google_drive', approved: false }, + ]) + const result = await readOrganizationSearchOverview.execute({ principal, input }) + expect(result.providers).toEqual([ + { connectorType: 'google_drive', sourceCount: 4, approved: false, status: 'paused' }, + ]) + }) + it('does not mistake infrastructure failure for an empty integration list', async () => { + queueTableRows(member, [{ role: 'admin' }]) + mocks.policy.mockRejectedValue(new Error('Database unavailable')) + await expect(readOrganizationSearchOverview.execute({ principal, input })).rejects.toThrow( + 'Database unavailable' + ) + }) + it('omits general knowledge-base connectors outside the supported Search catalog', async () => { + queueTableRows(member, [{ role: 'admin' }]) + queueTableRows(knowledgeConnector, [{ ...health, connectorType: 'notion' }]) + queueTableRows(organizationSearchIntegration, [{ connectorType: 'notion', approved: true }]) + expect(await readOrganizationSearchOverview.execute({ principal, input })).toEqual({ + providers: [], + }) + }) + it('does not report indexing when the owner-scoped Search gate is disabled', async () => { + queueTableRows(member, [{ role: 'admin' }]) + queueTableRows(knowledgeConnector, [{ ...health, hasIndexing: true }]) + queueTableRows(organizationSearchIntegration, [{ connectorType: 'gmail', approved: true }]) + mocks.availability.mockResolvedValue({ memberScoped: false, sourceMirrored: false }) + const result = await readOrganizationSearchOverview.execute({ principal, input }) + expect(mocks.availability).toHaveBeenCalledWith(input) + expect(result.providers).toEqual([ + { connectorType: 'google_drive', sourceCount: 4, approved: true, status: 'paused' }, + { connectorType: 'gmail', sourceCount: 0, approved: true, status: 'paused' }, + ]) + }) +}) diff --git a/apps/sim/lib/knowledge/application/organization-search-overview.ts b/apps/sim/lib/knowledge/application/organization-search-overview.ts new file mode 100644 index 00000000000..67a0a7923f3 --- /dev/null +++ b/apps/sim/lib/knowledge/application/organization-search-overview.ts @@ -0,0 +1,268 @@ +import { db } from '@sim/db' +import { + document, + knowledgeBase, + knowledgeConnector, + knowledgeConnectorMember, + knowledgeConnectorMemberSyncLog, + knowledgeConnectorSyncLog, + organizationSearchIntegration, +} from '@sim/db/schema' +import { and, eq, exists, inArray, isNotNull, isNull, sql } from 'drizzle-orm' +import { OrchestrationError } from '@/lib/core/orchestration/types' +import { resolveKnowledgeAccessAvailability } from '@/lib/knowledge/access/availability' +import { SOURCE_ACL_MAX_AGE_MS } from '@/lib/knowledge/access/freshness' +import { defineAuthorizedKnowledgeUseCase } from '@/lib/knowledge/application/authorized-knowledge-use-case' +import { resolveKnowledgeOwnerContext } from '@/lib/knowledge/application/contexts' +import { knowledgeOperations } from '@/lib/knowledge/application/operations' +import { MAX_SEARCH_SOURCE_PROVIDER_TYPES } from '@/lib/knowledge/constants' +import { SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' + +interface OrganizationSearchOverviewInput { + organizationId: string +} + +interface ProviderHealth { + sourceCount: number + pausedCount: number + hasError: boolean + hasIndexing: boolean + hasWaiting: boolean + hasUnstarted: boolean +} + +/** A successful empty crawl is active; neither this state nor its count describes readable documents. */ +function organizationSearchProviderStatus( + health: ProviderHealth | undefined, + approved: boolean, + mirrorsSourceAcls: boolean, + available: boolean +) { + if (!approved || !available) return 'paused' as const + if (!health?.sourceCount) + return mirrorsSourceAcls ? ('needs_setup' as const) : ('waiting_for_connections' as const) + if (health.pausedCount === health.sourceCount) return 'paused' as const + if (health.hasError) return 'needs_attention' as const + if (health.hasIndexing) return 'indexing' as const + if (health.hasWaiting) return 'waiting_for_connections' as const + if (health.hasUnstarted) return 'needs_setup' as const + return 'active' as const +} + +/** Organization admins receive aggregate operational facts, never documents, account identities or raw errors. */ +export const readOrganizationSearchOverview = defineAuthorizedKnowledgeUseCase({ + operation: knowledgeOperations.readOrganizationSearchOverview, + resolveContext: ({ input }: { input: OrganizationSearchOverviewInput }) => + resolveKnowledgeOwnerContext({ organizationId: input.organizationId }), + async execute({ context }) { + if (!context.organizationId) + throw new OrchestrationError('validation', 'Organization is required') + const providerTypes = SEARCH_SOURCE_TYPES.map(([connectorType]) => connectorType) + if (providerTypes.length > MAX_SEARCH_SOURCE_PROVIDER_TYPES) { + throw new Error('Search provider catalog exceeds the overview bound') + } + const availability = await resolveKnowledgeAccessAvailability(context) + const identityRequiredTypes = SEARCH_SOURCE_TYPES.filter( + ([, meta]) => meta.requiresMemberIdentity + ).map(([connectorType]) => connectorType) + + const hasActiveMembers = exists( + db + .select({ id: knowledgeConnectorMember.id }) + .from(knowledgeConnectorMember) + .where( + and( + eq(knowledgeConnectorMember.connectorId, knowledgeConnector.id), + eq(knowledgeConnectorMember.status, 'active') + ) + ) + ) + const hasMemberContinuation = exists( + db + .select({ id: knowledgeConnectorMember.id }) + .from(knowledgeConnectorMember) + .where( + and( + eq(knowledgeConnectorMember.connectorId, knowledgeConnector.id), + eq(knowledgeConnectorMember.status, 'active'), + isNotNull(knowledgeConnectorMember.listingCheckpoint) + ) + ) + ) + const continuing = sql`( + ${knowledgeConnector.listingCheckpoint} IS NOT NULL + OR (${knowledgeConnector.accessMode} = 'members' AND ( + ${knowledgeConnector.directoryCheckpoint} IS NOT NULL + OR ${hasMemberContinuation} + OR coalesce(${knowledgeConnector.nextMemberSyncAt} <= statement_timestamp(), false) + )) + )` + const cutoff = sql`statement_timestamp() - (${SOURCE_ACL_MAX_AGE_MS} * interval '1 millisecond')` + const hasMemberError = exists( + db + .select({ id: knowledgeConnectorMember.id }) + .from(knowledgeConnectorMember) + .where( + and( + eq(knowledgeConnectorMember.connectorId, knowledgeConnector.id), + sql`( + ${knowledgeConnectorMember.status} = 'suspended' + OR (${knowledgeConnectorMember.status} = 'active' AND ( + ${knowledgeConnectorMember.lastError} IS NOT NULL + OR ${knowledgeConnectorMember.consecutiveFailures} > 0 + OR coalesce(${knowledgeConnectorMember.memberSyncedThrough}, ${knowledgeConnectorMember.lastCompleteListingAt}, ${knowledgeConnectorMember.createdAt}) < ${cutoff} + )) + )` + ) + ) + ) + const hasMemberFirstListing = exists( + db + .select({ id: knowledgeConnectorMember.id }) + .from(knowledgeConnectorMember) + .where( + and( + eq(knowledgeConnectorMember.connectorId, knowledgeConnector.id), + eq(knowledgeConnectorMember.status, 'active'), + isNull(knowledgeConnectorMember.lastCompleteListingAt) + ) + ) + ) + const hasDocumentsInState = (statuses: string[]) => + exists( + db + .select({ id: document.id }) + .from(document) + .where( + and( + eq(document.connectorId, knowledgeConnector.id), + eq(document.knowledgeBaseId, knowledgeConnector.knowledgeBaseId), + eq(document.enabled, true), + eq(document.userExcluded, false), + isNull(document.archivedAt), + isNull(document.deletedAt), + inArray(document.processingStatus, statuses) + ) + ) + ) + /** Partial runs can be normal continuations; completed timestamps alone do not prove a complete crawl. */ + const latestMemberRunHasError = sql`coalesce(( + SELECT ${knowledgeConnectorMemberSyncLog.status} = 'failed' + OR (${knowledgeConnectorMemberSyncLog.status} = 'partial' AND ( + ${knowledgeConnectorMemberSyncLog.membersFailed} > 0 OR NOT ${continuing} + )) + FROM ${knowledgeConnectorMemberSyncLog} + WHERE ${knowledgeConnectorMemberSyncLog.connectorId} = ${knowledgeConnector.id} + AND ${knowledgeConnectorMemberSyncLog.status} <> 'started' + ORDER BY ${knowledgeConnectorMemberSyncLog.startedAt} DESC, ${knowledgeConnectorMemberSyncLog.id} DESC + LIMIT 1 + ), false)` + const latestCentralRunHasError = sql`coalesce(( + SELECT ${knowledgeConnectorSyncLog.status} = 'failed' + OR (${knowledgeConnectorSyncLog.status} = 'partial' AND ( + ${knowledgeConnectorSyncLog.docsFailed} > 0 OR NOT ${continuing} + )) + FROM ${knowledgeConnectorSyncLog} + WHERE ${knowledgeConnectorSyncLog.connectorId} = ${knowledgeConnector.id} + AND ${knowledgeConnectorSyncLog.status} <> 'started' + ORDER BY ${knowledgeConnectorSyncLog.startedAt} DESC, ${knowledgeConnectorSyncLog.id} DESC + LIMIT 1 + ), false)` + const paused = sql`( + ${knowledgeConnector.status} IN ('paused', 'disabled') + OR (${knowledgeConnector.accessMode} = 'members' AND ${knowledgeConnector.memberSyncStatus} = 'disabled') + OR (${knowledgeConnector.accessMode} = 'members' AND ${!availability.memberScoped}) + OR (${knowledgeConnector.accessMode} = 'admin' AND ( + ${!availability.sourceMirrored} + OR (${!availability.memberScoped} AND ${inArray(knowledgeConnector.connectorType, identityRequiredTypes)}) + )) + )` + const [health, decisions] = await Promise.all([ + db + .select({ + connectorType: knowledgeConnector.connectorType, + sourceCount: sql`count(*)::int`, + pausedCount: sql`count(*) FILTER (WHERE ${paused})::int`, + hasError: sql`bool_or(NOT ${paused} AND ( + ${knowledgeConnector.status} = 'error' + OR ${knowledgeConnector.lastSyncError} IS NOT NULL + OR ${hasDocumentsInState(['failed'])} + OR (${knowledgeConnector.accessMode} = 'admin' AND ${latestCentralRunHasError}) + OR (${knowledgeConnector.accessMode} = 'members' AND ( + ${knowledgeConnector.memberSyncStatus} = 'error' + OR ${knowledgeConnector.lastMemberSyncError} IS NOT NULL + OR ${hasMemberError} OR ${latestMemberRunHasError} + )) + ))`, + hasIndexing: sql`bool_or(NOT ${paused} + AND (${knowledgeConnector.accessMode} <> 'members' OR ${hasActiveMembers} OR ${knowledgeConnector.credentialId} IS NOT NULL) + AND ( + ${knowledgeConnector.status} IN ('pending', 'syncing') + OR ${continuing} OR ${hasDocumentsInState(['pending', 'processing'])} + OR (${knowledgeConnector.accessMode} = 'members' AND ( + ${knowledgeConnector.memberSyncStatus} IN ('pending', 'running') OR ${hasMemberFirstListing} + )) + ))`, + hasWaiting: sql`bool_or(NOT ${paused} AND ${knowledgeConnector.accessMode} = 'members' AND NOT ${hasActiveMembers})`, + hasUnstarted: sql`bool_or(NOT ${paused} AND ${knowledgeConnector.accessMode} = 'admin' AND ${knowledgeConnector.lastSyncAt} IS NULL)`, + }) + .from(knowledgeConnector) + .innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId)) + .where( + and( + eq(knowledgeBase.organizationId, context.organizationId), + eq(knowledgeBase.isSearchIndex, true), + isNull(knowledgeBase.deletedAt), + inArray(knowledgeConnector.connectorType, providerTypes), + inArray(knowledgeConnector.accessMode, ['admin', 'members']), + isNull(knowledgeConnector.archivedAt), + isNull(knowledgeConnector.deletedAt) + ) + ) + .groupBy(knowledgeConnector.connectorType) + .limit(MAX_SEARCH_SOURCE_PROVIDER_TYPES), + db + .select({ + connectorType: organizationSearchIntegration.connectorType, + approved: organizationSearchIntegration.approved, + }) + .from(organizationSearchIntegration) + .where( + and( + eq(organizationSearchIntegration.organizationId, context.organizationId), + inArray(organizationSearchIntegration.connectorType, providerTypes) + ) + ) + .limit(MAX_SEARCH_SOURCE_PROVIDER_TYPES), + ]) + const healthByType = new Map(health.map((provider) => [provider.connectorType, provider])) + const approvals = new Map( + decisions.map((decision) => [decision.connectorType, decision.approved]) + ) + return { + providers: SEARCH_SOURCE_TYPES.flatMap(([connectorType, meta]) => { + const state = healthByType.get(connectorType) + if (!state && !approvals.has(connectorType)) return [] + const approved = approvals.get(connectorType) ?? Boolean(state?.sourceCount) + return [ + { + connectorType, + approved, + sourceCount: state?.sourceCount ?? 0, + status: organizationSearchProviderStatus( + state, + approved, + meta.mirrorsSourceAcls === true, + Boolean( + (meta.permissionScopedListing && availability.memberScoped) || + (meta.mirrorsSourceAcls && + availability.sourceMirrored && + (!meta.requiresMemberIdentity || availability.memberScoped)) + ) + ), + }, + ] + }), + } + }, +}) diff --git a/apps/sim/lib/knowledge/application/search-source-progress.ts b/apps/sim/lib/knowledge/application/search-source-progress.ts index 1a3d5bd4e1d..dbabc0f8b00 100644 --- a/apps/sim/lib/knowledge/application/search-source-progress.ts +++ b/apps/sim/lib/knowledge/application/search-source-progress.ts @@ -56,6 +56,7 @@ export const readSearchSourceProgress = defineAuthorizedKnowledgeUseCase({ status: knowledgeConnector.status, accessMode: knowledgeConnector.accessMode, memberSyncStatus: knowledgeConnector.memberSyncStatus, + hasRetainedSyncError: sql`${knowledgeConnector.lastSyncError} IS NOT NULL`, approved: sql`${searchIntegrationAccessCondition()}`, isIndexing: hasDocumentsInState(['pending', 'processing']), hasIndexingError: hasDocumentsInState(['failed']), @@ -89,6 +90,7 @@ export const readSearchSourceProgress = defineAuthorizedKnowledgeUseCase({ row.isIndexing), hasSyncError: row.status === 'error' || + row.hasRetainedSyncError === true || (row.accessMode === 'members' && row.memberSyncStatus === 'error'), hasIndexingError: row.hasIndexingError, })), diff --git a/apps/sim/lib/knowledge/application/search-sources.test.ts b/apps/sim/lib/knowledge/application/search-sources.test.ts index 5b94657ad66..036aed5ce73 100644 --- a/apps/sim/lib/knowledge/application/search-sources.test.ts +++ b/apps/sim/lib/knowledge/application/search-sources.test.ts @@ -90,6 +90,7 @@ function source(id: string, connectorType = 'google_drive', accessMode = 'admin' status: 'active', memberSyncStatus: 'idle', lastSyncAt: LAST_SYNC as Date | null, + hasRetainedSyncError: false, lastMemberSyncAt: null as Date | null, credentialGroupId: 'group-secret', credentialGroupOptionId: 'option-secret', @@ -259,6 +260,13 @@ describe('Search source summaries', () => { expect(sources.every((row) => row.viewerEmailVerified === false)).toBe(true) }) + it('surfaces retained partial sync errors without returning the private error message', async () => { + seed([{ ...source('drive'), hasRetainedSyncError: true }]) + const result = await listSearchSources.execute({ principal, input }) + expect(result.sources[0].hasSyncError).toBe(true) + expect(result.sources[0]).not.toHaveProperty('lastSyncError') + }) + it('preserves legacy configured sources even when they are no longer offered for new Search setup', async () => { seed([source('legacy', 'legacy', 'members'), source('unknown', 'unregistered', 'admin')]) const { sources } = await listSearchSources.execute({ principal, input }) @@ -583,7 +591,23 @@ describe('bounded Search source pagination', () => { expect(result.nextCursor).toBeNull() }) - it.each(['filter', 'viewer', 'scope'] as const)( + it('filters the candidate query by provider before applying pagination', async () => { + seed([source('drive')]) + await listSearchSources.execute({ + principal, + input: { ...input, connectorType: 'google_drive' }, + }) + expect(dbChainMockFns.where.mock.calls).toContainEqual([ + expect.objectContaining({ + type: 'and', + conditions: expect.arrayContaining([ + { type: 'eq', left: knowledgeConnector.connectorType, right: 'google_drive' }, + ]), + }), + ]) + }) + + it.each(['filter', 'provider', 'viewer', 'scope'] as const)( 'rejects a cursor replayed under a different %s before reading sources', async (change) => { seed(rows(26)) @@ -602,6 +626,7 @@ describe('bounded Search source pagination', () => { ...input, cursor: first.nextCursor!, ...(change === 'filter' ? { mine: true } : {}), + ...(change === 'provider' ? { connectorType: 'gmail' } : {}), }, }) ).rejects.toMatchObject({ code: 'validation' }) diff --git a/apps/sim/lib/knowledge/application/search-sources.ts b/apps/sim/lib/knowledge/application/search-sources.ts index 32f9cb642ac..8e1599057be 100644 --- a/apps/sim/lib/knowledge/application/search-sources.ts +++ b/apps/sim/lib/knowledge/application/search-sources.ts @@ -26,6 +26,7 @@ import { getConnectorMeta } from '@/connectors/registry' export interface ListSearchSourcesInput extends ResourceOwner { cursor?: string + connectorType?: string search?: string mine?: boolean } @@ -37,11 +38,13 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ resolveKnowledgeOwnerContext(input), async execute({ principal, input, context }) { const search = input.search?.trim().toLowerCase() ?? '' + const connectorType = input.connectorType?.trim() const cursorScope = cursorScopeKey(cursorRoute(listSearchSourcesContract), { workspaceId: context.workspaceId, organizationId: context.organizationId, userId: principal.userId, search, + connectorType: connectorType ?? '', mine: input.mine === true, order: 'newest', }) @@ -71,6 +74,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ status: knowledgeConnector.status, memberSyncStatus: knowledgeConnector.memberSyncStatus, lastSyncAt: knowledgeConnector.lastSyncAt, + hasRetainedSyncError: sql`${knowledgeConnector.lastSyncError} IS NOT NULL`, lastMemberSyncAt: knowledgeConnector.lastMemberSyncAt, credentialGroupId: knowledgeConnector.credentialGroupId, credentialGroupOptionId: knowledgeConnector.credentialGroupOptionId, @@ -85,6 +89,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ inArray(knowledgeConnector.accessMode, ['admin', 'members']), isNull(knowledgeConnector.archivedAt), isNull(knowledgeConnector.deletedAt), + connectorType ? eq(knowledgeConnector.connectorType, connectorType) : undefined, cursor ? or( sql`${knowledgeConnector.createdAt} < ${cursor.createdAt}::timestamp`, @@ -212,6 +217,7 @@ export const listSearchSources = defineAuthorizedKnowledgeUseCase({ null, hasSyncError: row.status === 'error' || + row.hasRetainedSyncError === true || (row.accessMode === 'members' && row.memberSyncStatus === 'error'), viewerDocumentCount: available ? (state?.count ?? 0) : 0, viewerFailedDocumentCount: available ? (state?.failedCount ?? 0) : 0, diff --git a/apps/sim/lib/navigation/paths.ts b/apps/sim/lib/navigation/paths.ts index 75fe8260894..b788834eb40 100644 --- a/apps/sim/lib/navigation/paths.ts +++ b/apps/sim/lib/navigation/paths.ts @@ -38,6 +38,8 @@ export function organizationRoutes(organizationId: string) { integrations: `${root}/integrations`, skills: `${root}/skills`, settings: `${root}/settings`, + searchProvider: (connectorType: string) => + `${root}/settings/integrations/providers/${encodeURIComponent(connectorType)}`, searchSource: (connectorId: string) => `${root}/settings/integrations/sources/${encodeURIComponent(connectorId)}`, settingsSection: (section: string) => `${root}/settings/${section}`, From 35f8d7df2cb2ec274067f63445d53a00b9101f0e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 18:51:32 -0700 Subject: [PATCH 10/14] chore(search): preserve staging indexing implementation after rebase --- .github/workflows/test-build.yml | 3 +- .../platform/self-hosting/background-jobs.mdx | 15 +- .../document-dispatch.integration.ts | 538 ------------------ 3 files changed, 2 insertions(+), 554 deletions(-) delete mode 100644 apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 6c0ddd9d5b8..a2c32f5f25e 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -153,13 +153,12 @@ jobs: lib/table/rows/secret-provenance.postgres.test.ts lib/memory/message-provenance.postgres.test.ts - - name: Verify Search dispatch, progress, and pagination in PostgreSQL + - name: Verify Search progress and pagination in PostgreSQL working-directory: apps/sim env: KNOWLEDGE_ACL_TEST_DATABASE_URL: postgresql://postgres:postgres@127.0.0.1:5432/sim_auth_scim run: >- bunx vitest run --mode integration - lib/knowledge/__integration__/document-dispatch.integration.ts lib/knowledge/__integration__/search-source-progress.integration.ts lib/knowledge/__integration__/search-source-pagination.integration.ts diff --git a/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx b/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx index b3c2aace756..385ad1175e4 100644 --- a/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx +++ b/apps/docs/content/docs/platform/self-hosting/background-jobs.mdx @@ -5,7 +5,7 @@ description: Scheduled workflows, polling triggers, and the cron endpoints that import { Callout } from 'fumadocs-ui/components/callout' -A large part of Sim runs on a schedule rather than in response to a user request: scheduled workflows, every polling trigger, connector syncs, the outbox, data drains, and retention. The default self-hosted scheduler calls **HTTP endpoints on a timer**. Deployments using Trigger.dev also run the document-indexing tasks described below. +A large part of Sim runs on a schedule rather than in response to a user request: scheduled workflows, every polling trigger, connector syncs, the outbox, data drains, and retention. All of it is driven by **HTTP endpoints that something external must call on a timer**. Both deployments ship a scheduler and enable it by default: Kubernetes as CronJobs, Docker Compose as a `cron` service. Both authenticate with `CRON_SECRET`, and both use the same schedules. @@ -147,16 +147,3 @@ Scheduled execution volume is bounded per app instance by: Raise the schedule limit only alongside memory headroom: concurrent executions run in the app process, so throughput is bounded by the pod's memory before it is bounded by this number. - -## Trigger.dev document indexing - -If Trigger.dev is enabled, document indexing uses a durable dispatch queue. Large imports wait in the database, and organizations share the existing worker budget. Temporary provider-capacity waits retry later without keeping a worker occupied. Default self-hosted installs continue to process documents in the app. - -When upgrading a deployment that uses Trigger.dev: - -1. Apply the database migrations before starting the new workers or application. -2. Deploy the Trigger tasks from the same revision before deploying the application. New workers accept existing queued jobs as well as the new compact document references. -3. Confirm the application and workers use the same database and Trigger environment. Verify that the `knowledge-document-dispatch-schedule` task is enabled; it runs every minute to resume delayed work and recover missed dispatch notifications. -4. Sync a small source and confirm its documents become searchable. A successful sync only confirms the source was fetched; indexing can still be running. - -Enqueue and completion notifications normally start the next work promptly. The minute schedule provides recovery when a notification is missed; it does not repeatedly download documents. Keep the updated workers running until their durable queue has drained before rolling them back. diff --git a/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts b/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts deleted file mode 100644 index 24abc1f43a2..00000000000 --- a/apps/sim/lib/knowledge/__integration__/document-dispatch.integration.ts +++ /dev/null @@ -1,538 +0,0 @@ -import { db } from '@sim/db' -import { - document, - knowledgeBase, - knowledgeDocumentDispatch, - knowledgeDocumentDispatchOwner, - organization, - user, - workspace, -} from '@sim/db/schema' -import { generateId } from '@sim/utils/id' -import { and, eq, inArray, isNotNull, sql } from 'drizzle-orm' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const transport = vi.hoisted(() => ({ trigger: vi.fn(), retrieve: vi.fn() })) -vi.mock('@trigger.dev/sdk', () => ({ - tasks: { trigger: transport.trigger }, - runs: { retrieve: transport.retrieve }, -})) -vi.mock('@/lib/core/async-jobs/region', () => ({ resolveTriggerRegion: async () => 'us-east-1' })) - -import { - claimDocumentProcessingDispatches, - completeDocumentProcessingDispatch, - DOCUMENT_DISPATCH_MAX_OUTSTANDING, - DOCUMENT_DISPATCH_OWNER_OUTSTANDING, - dispatchQueuedDocumentProcessing, - documentDispatchIdempotencyKey, - documentDispatchOwnerKey, - enqueueDocumentProcessingContinuation, - enqueueDocumentProcessingDispatch, -} from '@/lib/knowledge/documents/processing-dispatch-queue' -import { - createCanonicalDocumentProcessingPayload, - createDocumentProcessingPayload, - type DocumentProcessingBillingContext, - type DocumentProcessingPayload, -} from '@/lib/knowledge/documents/processing-payload' - -describe('durable fair document admission', () => { - const fixtureUsers: string[] = [] - const fixtureOrganizations: string[] = [] - const fixtureWorkspaces: string[] = [] - const fixtureBases: string[] = [] - const fixtureOwners: string[] = [] - - beforeEach(() => { - vi.clearAllMocks() - transport.trigger.mockImplementation(async () => ({ id: `run_${generateId()}` })) - transport.retrieve.mockResolvedValue({ isCompleted: false }) - }) - - afterEach(async () => { - if (fixtureBases.length) { - await db - .delete(knowledgeDocumentDispatch) - .where(inArray(knowledgeDocumentDispatch.knowledgeBaseId, fixtureBases)) - await db.delete(knowledgeBase).where(inArray(knowledgeBase.id, fixtureBases)) - } - if (fixtureOwners.length) - await db - .delete(knowledgeDocumentDispatchOwner) - .where(inArray(knowledgeDocumentDispatchOwner.ownerKey, fixtureOwners)) - if (fixtureWorkspaces.length) - await db.delete(workspace).where(inArray(workspace.id, fixtureWorkspaces)) - if (fixtureOrganizations.length) - await db.delete(organization).where(inArray(organization.id, fixtureOrganizations)) - if (fixtureUsers.length) await db.delete(user).where(inArray(user.id, fixtureUsers)) - fixtureUsers.length = - fixtureOrganizations.length = - fixtureWorkspaces.length = - fixtureBases.length = - fixtureOwners.length = - 0 - }) - - async function createSource(kind: 'organization' | 'workspace' | 'personal' = 'organization') { - const actorUserId = generateId() - const organizationId = kind === 'organization' ? generateId() : null - const workspaceId = kind === 'workspace' ? generateId() : null - const knowledgeBaseId = generateId() - fixtureUsers.push(actorUserId) - fixtureBases.push(knowledgeBaseId) - await db.insert(user).values({ - id: actorUserId, - name: 'Dispatch fixture', - email: `${actorUserId}@fixture.test`, - emailVerified: true, - createdAt: new Date(), - updatedAt: new Date(), - }) - if (organizationId) { - fixtureOrganizations.push(organizationId) - await db - .insert(organization) - .values({ id: organizationId, name: 'Dispatch fixture', slug: organizationId }) - } - if (workspaceId) { - fixtureWorkspaces.push(workspaceId) - await db.insert(workspace).values({ - id: workspaceId, - name: 'Dispatch fixture', - ownerId: actorUserId, - billedAccountUserId: actorUserId, - }) - } - await db.insert(knowledgeBase).values({ - id: knowledgeBaseId, - userId: actorUserId, - organizationId, - workspaceId, - name: 'Dispatch fixture', - }) - const billingAttribution = { - actorUserId, - organizationId, - workspaceId, - billedAccountUserId: actorUserId, - billingEntity: organizationId - ? { type: 'organization' as const, id: organizationId } - : { type: 'user' as const, id: actorUserId }, - billingPeriod: { start: '2026-09-01T00:00:00.000Z', end: '2026-10-01T00:00:00.000Z' }, - payerSubscription: null, - } - const context: DocumentProcessingBillingContext = organizationId - ? { - billingScope: 'organization', - actorUserId, - organizationId, - workspaceId: null, - billingAttribution, - } - : workspaceId - ? { billingScope: 'workspace', actorUserId, workspaceId, billingAttribution } - : { billingScope: 'non-workspace', actorUserId, workspaceId: null } - const ownerKey = organizationId - ? `organization:${organizationId}` - : workspaceId - ? `workspace:${workspaceId}` - : `user:${actorUserId}` - fixtureOwners.push(ownerKey) - return { knowledgeBaseId, context, ownerKey } - } - - async function createDocuments(source: Awaited>, count: number) { - const payloads: DocumentProcessingPayload[] = [] - const rows: (typeof document.$inferInsert)[] = [] - for (let index = 0; index < count; index++) { - const documentId = generateId() - const requestId = generateId() - const processingQueuedAt = new Date() - const docData = { - filename: `Fixture ${index}.txt`, - fileUrl: '/api/files/serve/kb%2Ffixture', - fileSize: 12, - mimeType: 'text/plain', - } - rows.push({ - id: documentId, - knowledgeBaseId: source.knowledgeBaseId, - ...docData, - processingStatus: 'pending', - processingQueuedAt, - processingQueueToken: requestId, - }) - payloads.push( - createDocumentProcessingPayload( - { - knowledgeBaseId: source.knowledgeBaseId, - documentId, - requestId, - processingQueueToken: requestId, - processingQueuedAt: processingQueuedAt.toISOString(), - chargedAtDispatch: true, - docData, - processingOptions: {}, - }, - source.context - ) - ) - } - for (let offset = 0; offset < rows.length; offset += 500) { - await db.insert(document).values(rows.slice(offset, offset + 500)) - } - return payloads - } - - it('enforces owner and global outstanding budgets under concurrent claimers', async () => { - const sources = await Promise.all([createSource(), createSource(), createSource()]) - for (const source of sources) - await enqueueDocumentProcessingDispatch(await createDocuments(source, 30)) - await Promise.all(Array.from({ length: 6 }, () => claimDocumentProcessingDispatches())) - const active = await db - .select() - .from(knowledgeDocumentDispatch) - .where(isNotNull(knowledgeDocumentDispatch.dispatchedAt)) - expect(active).toHaveLength(DOCUMENT_DISPATCH_MAX_OUTSTANDING) - for (const source of sources) { - const count = active.filter((row) => row.ownerKey === source.ownerKey).length - expect(count).toBeGreaterThan(0) - expect(count).toBeLessThanOrEqual(DOCUMENT_DISPATCH_OWNER_OUTSTANDING) - } - }) - - it('prunes idle owners in bounded batches while retaining delayed and outstanding work', async () => { - const idleOwners = Array.from({ length: 1001 }, () => `organization:${generateId()}`) - fixtureOwners.push(...idleOwners) - await db - .insert(knowledgeDocumentDispatchOwner) - .values(idleOwners.map((ownerKey) => ({ ownerKey }))) - const delayed = await createSource() - const active = await createSource() - const [delayedPayload] = await createDocuments(delayed, 1) - const [activePayload] = await createDocuments(active, 1) - await enqueueDocumentProcessingDispatch([delayedPayload, activePayload]) - await db - .update(knowledgeDocumentDispatch) - .set({ availableAt: new Date(Date.now() + 60_000) }) - .where(eq(knowledgeDocumentDispatch.documentId, delayedPayload.documentId)) - - await claimDocumentProcessingDispatches() - const retained = await db.select().from(knowledgeDocumentDispatchOwner) - expect(retained.filter((owner) => idleOwners.includes(owner.ownerKey))).toHaveLength(1) - expect(retained.map((owner) => owner.ownerKey)).toEqual( - expect.arrayContaining([delayed.ownerKey, active.ownerKey]) - ) - await claimDocumentProcessingDispatches() - expect(await db.select().from(knowledgeDocumentDispatchOwner)).toHaveLength(2) - - await completeDocumentProcessingDispatch(activePayload) - await claimDocumentProcessingDispatches() - expect( - (await db.select().from(knowledgeDocumentDispatchOwner)).map((owner) => owner.ownerKey) - ).toEqual([delayed.ownerKey]) - }) - - it('keeps every persisted intent discoverable when idle pruning races with enqueues', async () => { - const sources = await Promise.all(Array.from({ length: 12 }, () => createSource())) - await db - .insert(knowledgeDocumentDispatchOwner) - .values(sources.map(({ ownerKey }) => ({ ownerKey }))) - const payloads = await Promise.all(sources.map((source) => createDocuments(source, 1))) - const results = await Promise.allSettled([ - ...payloads.map((batch) => enqueueDocumentProcessingDispatch(batch)), - ...Array.from({ length: 6 }, () => claimDocumentProcessingDispatches()), - ]) - expect(results.every((result) => result.status === 'fulfilled')).toBe(true) - const owners = new Set( - (await db.select().from(knowledgeDocumentDispatchOwner)).map((owner) => owner.ownerKey) - ) - const intents = await db.select().from(knowledgeDocumentDispatch) - expect(intents).toHaveLength(sources.length) - expect(intents.every((intent) => owners.has(intent.ownerKey))).toBe(true) - expect(await claimDocumentProcessingDispatches()).toHaveLength(sources.length) - }) - - it('lets one owner use available workers without queuing its entire corpus ahead of a newcomer', async () => { - const large = await createSource() - await enqueueDocumentProcessingDispatch(await createDocuments(large, 10_000)) - await claimDocumentProcessingDispatches() - const newcomer = await createSource() - const [newDocument] = await createDocuments(newcomer, 1) - await enqueueDocumentProcessingDispatch([newDocument]) - await claimDocumentProcessingDispatches() - const active = await db - .select() - .from(knowledgeDocumentDispatch) - .where(isNotNull(knowledgeDocumentDispatch.dispatchedAt)) - expect(active.filter((row) => row.ownerKey === large.ownerKey)).toHaveLength( - DOCUMENT_DISPATCH_OWNER_OUTSTANDING - ) - expect(active.some((row) => row.documentId === newDocument.documentId)).toBe(true) - }) - - it('keeps inline document bytes out of durable intents and Trigger requests', async () => { - const source = await createSource() - const [payload] = await createDocuments(source, 1) - const fileUrl = `data:text/plain;base64,${'a'.repeat(10 * 1024 * 1024 - 64)}` - payload.docData.fileUrl = fileUrl - await db.update(document).set({ fileUrl }).where(eq(document.id, payload.documentId)) - await enqueueDocumentProcessingDispatch([payload]) - const [claimed] = await claimDocumentProcessingDispatches() - expect(claimed.payload).toEqual(createCanonicalDocumentProcessingPayload(payload)) - expect(JSON.stringify(claimed).length).toBeLessThan(3000) - expect(await dispatchQueuedDocumentProcessing()).toEqual({ dispatched: 1 }) - const [, transmitted] = transport.trigger.mock.calls.find( - ([name]) => name === 'knowledge-process-document' - )! - expect(JSON.stringify(transmitted).length).toBeLessThan(2000) - expect(transmitted).not.toHaveProperty('docData') - const [persisted] = await db - .select({ fileUrlLength: sql`length(${document.fileUrl})::int` }) - .from(document) - .where(eq(document.id, payload.documentId)) - expect(persisted.fileUrlLength).toBe(fileUrl.length) - }) - - it('bounds stale pruning per owner and rotates stale-only owners ahead of the next pump', async () => { - const staleOwners = [] - for (let index = 0; index < DOCUMENT_DISPATCH_MAX_OUTSTANDING; index++) { - const source = await createSource() - staleOwners.push(source) - const payloads = await createDocuments(source, DOCUMENT_DISPATCH_OWNER_OUTSTANDING + 5) - await enqueueDocumentProcessingDispatch(payloads) - await db - .update(document) - .set({ deletedAt: new Date() }) - .where(eq(document.knowledgeBaseId, source.knowledgeBaseId)) - } - const newcomer = await createSource() - const [payload] = await createDocuments(newcomer, 1) - await enqueueDocumentProcessingDispatch([payload]) - expect(await claimDocumentProcessingDispatches()).toEqual([]) - const [{ remaining }] = await db - .select({ remaining: sql`count(*)::int` }) - .from(knowledgeDocumentDispatch) - .where( - inArray( - knowledgeDocumentDispatch.ownerKey, - staleOwners.map((owner) => owner.ownerKey) - ) - ) - expect(remaining).toBe(DOCUMENT_DISPATCH_MAX_OUTSTANDING * 5) - const rotated = await db - .select({ at: knowledgeDocumentDispatchOwner.lastDispatchedAt }) - .from(knowledgeDocumentDispatchOwner) - .where( - inArray( - knowledgeDocumentDispatchOwner.ownerKey, - staleOwners.map((owner) => owner.ownerKey) - ) - ) - expect(rotated.every((owner) => owner.at !== null)).toBe(true) - expect( - (await claimDocumentProcessingDispatches()).some( - (intent) => intent.documentId === payload.documentId - ) - ).toBe(true) - }) - - it('records terminal cancellation only for its current generation and preserves a newer continuation', async () => { - const source = await createSource() - const [cancelled, superseded] = await createDocuments(source, 2) - await enqueueDocumentProcessingDispatch([cancelled, superseded]) - const newerAt = new Date(Date.now() + 60_000) - await db - .update(document) - .set({ processingQueuedAt: newerAt }) - .where(eq(document.id, superseded.documentId)) - await completeDocumentProcessingDispatch(cancelled, { failed: true }) - await completeDocumentProcessingDispatch(superseded, { failed: true }) - const rows = await db - .select({ id: document.id, status: document.processingStatus }) - .from(document) - .where(inArray(document.id, [cancelled.documentId, superseded.documentId])) - expect(rows.find((row) => row.id === cancelled.documentId)?.status).toBe('failed') - expect(rows.find((row) => row.id === superseded.documentId)?.status).toBe('pending') - }) - - it.each(['workspace', 'personal'] as const)( - 'keeps canonical %s ownership and payload intact', - async (kind) => { - const source = await createSource(kind) - const [payload] = await createDocuments(source, 1) - expect(await enqueueDocumentProcessingDispatch([payload])).toEqual( - new Set([payload.documentId]) - ) - const [intent] = await db - .select() - .from(knowledgeDocumentDispatch) - .where(eq(knowledgeDocumentDispatch.documentId, payload.documentId)) - expect(intent.ownerKey).toBe(source.ownerKey) - expect(intent.payload).toEqual(createCanonicalDocumentProcessingPayload(payload)) - expect(documentDispatchOwnerKey(payload)).toBe(source.ownerKey) - } - ) - - it('rejects another canonical owner even when the supplied billing snapshot is internally consistent', async () => { - const first = await createSource() - const other = await createSource() - const [payload] = await createDocuments(first, 1) - const wrongOwner = createDocumentProcessingPayload(payload, other.context) - await expect(enqueueDocumentProcessingDispatch([wrongOwner])).rejects.toThrow( - 'owner does not match' - ) - expect(await db.select().from(knowledgeDocumentDispatch)).toEqual([]) - }) - - it('deduplicates a delayed continuation and releases only the prior generation', async () => { - const source = await createSource() - const [payload] = await createDocuments(source, 1) - await enqueueDocumentProcessingDispatch([payload]) - await claimDocumentProcessingDispatches() - await db - .update(document) - .set({ processingStatus: 'processing' }) - .where(eq(document.id, payload.documentId)) - const continuation = { ...payload, admissionRetryCount: 1 } - const firstDate = new Date(Date.now() + 60_000) - const stored = await enqueueDocumentProcessingContinuation(continuation, firstDate) - const duplicate = await enqueueDocumentProcessingContinuation( - continuation, - new Date(firstDate.getTime() + 2000) - ) - expect(duplicate).toEqual(stored) - await db - .update(document) - .set({ - processingStatus: 'pending', - processingQueuedAt: stored, - processingDeferredUntil: stored, - }) - .where(eq(document.id, payload.documentId)) - await completeDocumentProcessingDispatch(payload) - const rows = await db - .select() - .from(knowledgeDocumentDispatch) - .where(eq(knowledgeDocumentDispatch.documentId, payload.documentId)) - expect(rows).toHaveLength(1) - expect(rows[0].idempotencyKey).toBe(documentDispatchIdempotencyKey(continuation)) - expect(await claimDocumentProcessingDispatches()).toEqual([]) - await db - .update(knowledgeDocumentDispatch) - .set({ availableAt: new Date(Date.now() - 1000) }) - .where(eq(knowledgeDocumentDispatch.id, rows[0].id)) - expect(await claimDocumentProcessingDispatches()).toHaveLength(1) - }) - - it('does not admit deleted or superseded queued generations', async () => { - const source = await createSource() - const [superseded, deleted] = await createDocuments(source, 2) - await enqueueDocumentProcessingDispatch([superseded, deleted]) - await db - .update(document) - .set({ processingQueueToken: generateId() }) - .where(eq(document.id, superseded.documentId)) - await db - .update(document) - .set({ deletedAt: new Date() }) - .where(eq(document.id, deleted.documentId)) - expect(await claimDocumentProcessingDispatches()).toEqual([]) - expect(await enqueueDocumentProcessingDispatch([superseded])).toEqual(new Set()) - }) - - it('retains reservations when Trigger acceptance is unknown and retries the identical key', async () => { - const source = await createSource() - const [payload] = await createDocuments(source, 1) - await enqueueDocumentProcessingDispatch([payload]) - transport.trigger.mockRejectedValueOnce(new Error('fixture connection reset after acceptance')) - expect(await dispatchQueuedDocumentProcessing()).toEqual({ dispatched: 0 }) - const [reserved] = await db - .select() - .from(knowledgeDocumentDispatch) - .where(eq(knowledgeDocumentDispatch.documentId, payload.documentId)) - expect(reserved.dispatchedAt).not.toBeNull() - expect(reserved.triggerRunId).toBeNull() - expect(await dispatchQueuedDocumentProcessing()).toEqual({ dispatched: 1 }) - const calls = transport.trigger.mock.calls.filter( - ([name]) => name === 'knowledge-process-document' - ) - expect(calls).toHaveLength(2) - expect(calls[0][2].idempotencyKey).toBe(calls[1][2].idempotencyKey) - expect(calls.every(([, , options]) => !options.queue && !options.concurrencyKey)).toBe(true) - }) - - it.each(['live', 'unavailable'] as const)( - 'reconciles newer completed runs when the oldest ten remain %s', - async (oldestState) => { - const source = await createSource() - const payloads = await createDocuments(source, 12) - await enqueueDocumentProcessingDispatch(payloads) - await dispatchQueuedDocumentProcessing() - const oldIds = payloads.slice(0, 10).map((payload) => payload.documentId) - const oldStamp = new Date(Date.now() - 21 * 60_000) - await db - .update(knowledgeDocumentDispatch) - .set({ dispatchedAt: new Date(Date.now() - 20 * 60_000) }) - .where(eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId)) - await db - .update(knowledgeDocumentDispatch) - .set({ dispatchedAt: oldStamp }) - .where(inArray(knowledgeDocumentDispatch.documentId, oldIds)) - const oldest = await db - .select({ runId: knowledgeDocumentDispatch.triggerRunId }) - .from(knowledgeDocumentDispatch) - .where(inArray(knowledgeDocumentDispatch.documentId, oldIds)) - const oldRunIds = new Set(oldest.map((intent) => intent.runId)) - transport.retrieve.mockImplementation(async (runId: string) => { - if (oldRunIds.has(runId)) { - if (oldestState === 'unavailable') - throw new Error('Fixture status temporarily unavailable') - return { isCompleted: false } - } - return { isCompleted: true } - }) - await dispatchQueuedDocumentProcessing() - const retained = await db - .select({ - id: knowledgeDocumentDispatch.documentId, - at: knowledgeDocumentDispatch.dispatchedAt, - }) - .from(knowledgeDocumentDispatch) - .where(eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId)) - expect(retained).toHaveLength(10) - expect( - retained.every( - (intent) => oldIds.includes(intent.id) && intent.at?.getTime() === oldStamp.getTime() - ) - ).toBe(true) - expect(transport.retrieve).toHaveBeenCalledTimes(12) - } - ) - - it('repairs missed terminal hooks but preserves a live retry reservation', async () => { - const source = await createSource() - const payloads = await createDocuments(source, 2) - await enqueueDocumentProcessingDispatch(payloads) - await dispatchQueuedDocumentProcessing() - await db - .update(knowledgeDocumentDispatch) - .set({ dispatchedAt: new Date(Date.now() - 20 * 60_000) }) - .where(eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId)) - transport.retrieve - .mockResolvedValueOnce({ isCompleted: true }) - .mockResolvedValueOnce({ isCompleted: false }) - await dispatchQueuedDocumentProcessing() - const [{ count }] = await db - .select({ count: sql`count(*)::int` }) - .from(knowledgeDocumentDispatch) - .where( - and( - eq(knowledgeDocumentDispatch.knowledgeBaseId, source.knowledgeBaseId), - isNotNull(knowledgeDocumentDispatch.dispatchedAt) - ) - ) - expect(count).toBe(1) - }) -}) From df6cc3a04a472e53e54bc65d01dc5440abccb64b Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 19:05:59 -0700 Subject: [PATCH 11/14] fix(search): keep account views consistent and avoid false unsaved edits --- .../[connectorType]/provider-detail.test.tsx | 127 +++++++++++++++++- .../use-connector-settings-form.test.tsx | 73 +++++++++- .../use-connector-settings-form.ts | 4 + .../organization-account-people.test.tsx | 67 ++++++++- .../organization-account-people.tsx | 7 +- .../knowledge/application/operations.test.ts | 1 + 6 files changed, 265 insertions(+), 14 deletions(-) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx index f923fd4a9b9..7f271ae6656 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx @@ -232,6 +232,11 @@ describe('organization provider management', () => { expect(container.textContent).toContain('Loading integration') expect(container.textContent).not.toContain('Activate this integration') expect(mocks.people).not.toHaveBeenCalled() + expect( + container.querySelector( + `input[placeholder="${params ? 'Search people...' : 'Search sources...'}"]` + ) + ).toBeEnabled() } ) @@ -243,17 +248,21 @@ describe('organization provider management', () => { error: new ApiClientError({ status: 403, message: 'Access denied', body: null }), refetch, }) - await render('google_drive', '?view=accounts') + await render('google_drive', '?view=accounts&credential-group-people=alex') expect(container.textContent).toContain('Access denied') expect(mocks.people).not.toHaveBeenCalled() + expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('alex') + expect(container.querySelector('input[placeholder="Search people..."]')).toBeEnabled() await click('Try again') expect(refetch).toHaveBeenCalledOnce() }) it('offers activation from the accounts tab when an existing provider is deactivated', async () => { mocks.overview.mockReturnValue({ data: { providers: [{ ...provider, approved: false }] } }) - await render('google_drive', '?view=accounts') + await render('google_drive', '?view=accounts&credential-group-people=alex') expect(mocks.people).not.toHaveBeenCalled() + expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('alex') + expect(container.querySelector('input[placeholder="Search people..."]')).toBeEnabled() await click('Activate') expect(mocks.activate).toHaveBeenCalledWith({ organizationId: 'org-one', @@ -276,6 +285,46 @@ describe('organization provider management', () => { }) }) + it.each([ + ['loading', 'Loading accounts…'], + ['error', 'Accounts unavailable'], + ['missing group', 'Add a source to set up account connections.'], + ['missing provider option', 'Add a source to set up account connections.'], + ])('preserves Accounts search while %s', async (state, message) => { + const refetch = vi.fn() + mocks.accounts.mockReturnValue( + state === 'loading' + ? { isPending: true } + : state === 'error' + ? { isError: true, error: new Error(message), refetch } + : { + data: { + credentialGroup: + state === 'missing group' ? null : { ...credentialGroup, options: [] }, + }, + isPending: false, + } + ) + await render('google_drive', '?view=accounts&credential-group-people=alex&search=handbook') + + expect(container.textContent).toContain(message) + expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('alex') + expect(container.querySelector('input[placeholder="Search people..."]')).toBeEnabled() + expect(container.querySelector('input[placeholder="Search sources..."]')).toBeNull() + expect(mocks.people).not.toHaveBeenCalled() + if (state === 'error') { + await click('Try again') + expect(refetch).toHaveBeenCalledOnce() + } + + await click('Sources') + expect(container.querySelector('input[placeholder="Search sources..."]')).toHaveValue( + 'handbook' + ) + await click('Accounts') + expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('alex') + }) + it('preserves source navigation and retries connection availability failures', async () => { mocks.availabilityError = new Error('Connection availability could not be loaded') await render() @@ -355,6 +404,80 @@ describe('organization provider management', () => { expect(query.has('addConnector')).toBe(false) }) + it.each([ + { name: 'missing bot', slackBotCredentialId: undefined, configurationStatus: 'ready' }, + { + name: 'outdated app', + slackBotCredentialId: 'slack-bot', + configurationStatus: 'needs_update', + }, + ])('offers Slack Accounts recovery for an active option with $name', async (option) => { + mocks.access = { admin: false, members: true } + mocks.overview.mockReturnValue({ + data: { providers: [{ ...provider, connectorType: 'slack' }] }, + }) + mocks.accounts.mockReturnValue({ + data: { + credentialGroup: { + ...credentialGroup, + options: [ + { + id: 'slack-option', + provider: 'slack', + status: 'active', + slackBotCredentialId: option.slackBotCredentialId, + configurationStatus: option.configurationStatus, + }, + ], + }, + }, + isPending: false, + }) + await render('slack', '?view=accounts&credential-group-people=alex') + + expect(mocks.people).not.toHaveBeenCalled() + expect(container.textContent).toContain('Set up the Slack app to connect accounts.') + expect(container.querySelector('input[placeholder="Search people..."]')).toHaveValue('alex') + await click('Set up Slack app') + const query = new URLSearchParams(mocks.updateUrl.mock.calls.at(-1)![0].queryString) + expect(query.get('connectedAccounts')).toBe('slack') + expect(query.get('view')).toBe('accounts') + expect(query.get('credential-group-people')).toBe('alex') + expect(query.has('addConnector')).toBe(false) + }) + + it('opens focused account management after the Slack app is ready', async () => { + mocks.access = { admin: false, members: true } + mocks.overview.mockReturnValue({ + data: { providers: [{ ...provider, connectorType: 'slack' }] }, + }) + mocks.accounts.mockReturnValue({ + data: { + credentialGroup: { + ...credentialGroup, + options: [ + { + id: 'slack-option', + provider: 'slack', + status: 'active', + slackBotCredentialId: 'slack-bot', + configurationStatus: 'ready', + }, + ], + }, + }, + isPending: false, + }) + await render('slack', '?view=accounts') + + expect(mocks.people).toHaveBeenCalledWith( + expect.objectContaining({ + searchConnection: { optionId: 'slack-option', providerName: 'Slack' }, + }) + ) + expect(container.textContent).not.toContain('Set up the Slack app to connect accounts.') + }) + it('does not load admin queries or render setup controls for nonadmins', async () => { mocks.admin = false await render() diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx index 0cb6f1adb68..2c6ea54bd18 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.test.tsx @@ -80,19 +80,19 @@ describe('shared connector settings form', () => { let onSaved: ReturnType let baseline: ConnectorData - function Probe({ row }: { row: ConnectorData }) { + function Probe({ row, isSearchIndex = true }: { row: ConnectorData; isSearchIndex?: boolean }) { form = useConnectorSettingsForm({ scope: { kind: 'organization', organizationId: 'org-1' }, knowledgeBaseId: 'kb-search', - isSearchIndex: true, + isSearchIndex, connector: row, onSaved, }) return null } - function render(row = baseline, key = 'baseline') { - act(() => root.render()) + function render(row = baseline, key = 'baseline', isSearchIndex = true) { + act(() => root.render()) } beforeEach(() => { @@ -134,6 +134,71 @@ describe('shared connector settings form', () => { expect(form.dirty).toBe(true) }) + it('keeps a new member Gmail source clean and preserves its derived listing cap on save', () => { + const sourceConfig = { + label: ['INBOX'], + dateRange: '7d', + query: 'subject:SIM-SEARCH-QA', + _canonicalModes: { label: 'advanced' }, + maxThreads: 0, + } + render(connector({ connectorType: 'gmail', sourceConfig }), 'gmail-members') + + const capField = form.fieldsProps.connectorConfig?.configFields.find( + (field) => field.id === 'maxThreads' + )! + expect(capField).toBeDefined() + expect(form.fieldsProps.isFieldVisible(capField)).toBe(false) + expect(form.dirty).toBe(false) + expect(form.canSave).toBe(false) + + act(() => form.fieldsProps.onFieldChange('query', 'subject:updated')) + expect(form.dirty).toBe(true) + expect(form.canSave).toBe(true) + act(() => form.save()) + expect(mocks.update).toHaveBeenCalledWith( + { + knowledgeBaseId: 'kb-search', + connectorId: baseline.id, + updates: { sourceConfig: { ...sourceConfig, query: 'subject:updated' } }, + }, + expect.any(Object) + ) + }) + + it('keeps general knowledge-base listing caps editable and includes their changes on save', () => { + const sourceConfig = { + label: ['INBOX'], + _canonicalModes: { label: 'basic' }, + maxThreads: '100', + } + render( + connector({ connectorType: 'gmail', accessMode: 'workspace', sourceConfig }), + 'gmail-workspace', + false + ) + + const capField = form.fieldsProps.connectorConfig?.configFields.find( + (field) => field.id === 'maxThreads' + )! + expect(capField).toBeDefined() + expect(form.fieldsProps.isFieldVisible(capField)).toBe(true) + expect(form.dirty).toBe(false) + + act(() => form.fieldsProps.onFieldChange('maxThreads', '200')) + expect(form.dirty).toBe(true) + expect(form.canSave).toBe(true) + act(() => form.save()) + expect(mocks.update).toHaveBeenCalledWith( + { + knowledgeBaseId: 'kb-search', + connectorId: baseline.id, + updates: { sourceConfig: { ...sourceConfig, maxThreads: '200' } }, + }, + expect.any(Object) + ) + }) + it('guards access drafts separately from a settings save', () => { expect(form.dirty).toBe(false) expect(form.canSave).toBe(false) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts index 49c825a42a5..16194a28406 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts @@ -299,6 +299,7 @@ export function useConnectorSettingsForm({ if (didCanonicalModesChange(canonicalModes, persistedCanonicalModes)) return true const resolved = resolveSourceConfig() for (const [key, value] of Object.entries(resolved)) { + if (hiddenCapFieldIds.has(key)) continue if (!valuesEqual(connector.sourceConfig[key], value)) return true } return false @@ -309,6 +310,7 @@ export function useConnectorSettingsForm({ connector.sourceConfig, canonicalModes, persistedCanonicalModes, + hiddenCapFieldIds, ]) const handleSave = useCallback(() => { @@ -324,6 +326,7 @@ export function useConnectorSettingsForm({ const resolved = resolveSourceConfig() const changedEntries: Record = {} for (const [key, value] of Object.entries(resolved)) { + if (hiddenCapFieldIds.has(key)) continue if (!valuesEqual(connector.sourceConfig[key], value)) changedEntries[key] = value } @@ -364,6 +367,7 @@ export function useConnectorSettingsForm({ resolveSourceConfig, canonicalModes, persistedCanonicalModes, + hiddenCapFieldIds, onSaved, updateConnector, knowledgeBaseId, diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx index a2c5df903a8..8b1cc2321da 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.test.tsx @@ -108,6 +108,7 @@ async function selectPersonAction(label: string) { ) if (!action) throw new Error(`Missing ${label} action`) await act(async () => action.click()) + return action } async function openConfirmation(label: string) { @@ -115,13 +116,16 @@ async function openConfirmation(label: string) { else await act(async () => button(container, label).click()) } -async function renderPeople() { +async function renderPeople(searchConnection?: { optionId: string; providerName: string }) { await act(async () => root.render( - + @@ -144,6 +148,7 @@ it('keeps the compact People rows and resends from the actions menu', async () = expect(container.textContent).toContain('2 accounts connected') expect(container.textContent).not.toContain('Copy new link') expect(container.textContent).not.toContain('gmail: active') + expect(container.textContent).not.toContain('People (1)') await selectPersonAction('Resend') expect(mocks.resend).toHaveBeenCalledExactlyOnceWith( { organizationId: 'organization-1', enrollmentId: 'enrollment-1' }, @@ -308,7 +313,64 @@ it('offers requests from an empty configured pool', async () => { await renderPeople() expect(container.textContent).toContain('No people invited yet') + expect(container.textContent).not.toContain('People (0)') + expect(container.querySelector('input[placeholder="Search people..."]')).toBeEnabled() + expect(button(container, 'Request connections')).toBeEnabled() +}) + +it('loads more people below the ungrouped rows', async () => { + const fetchNextPage = vi.fn() + mocks.people.mockReturnValue({ + ...mocks.people(), + hasNextPage: true, + isFetchingNextPage: false, + fetchNextPage, + }) + await renderPeople() + + expect(container.textContent).toContain('person@example.com') + expect(container.textContent).not.toContain('People (1+)') + const personActions = container.querySelector('[aria-label="person@example.com actions"]') + const loadMore = button(container, 'Load more') + expect(personActions).not.toBeNull() + expect(personActions!.compareDocumentPosition(loadMore) & Node.DOCUMENT_POSITION_FOLLOWING).toBe( + Node.DOCUMENT_POSITION_FOLLOWING + ) + expect(loadMore).toBeEnabled() + await act(async () => loadMore.click()) + expect(fetchNextPage).toHaveBeenCalledOnce() +}) + +it.each([ + { view: 'all people', searchConnection: undefined }, + { + view: 'provider accounts', + searchConnection: { optionId: 'gmail-option', providerName: 'Gmail' }, + }, +])('disables resending revoked invitations in $view', async ({ searchConnection }) => { + mocks.people.mockReturnValue({ + data: { + pages: [ + { + enrollments: [ + { + id: 'enrollment-1', + email: 'person@example.com', + status: 'revoked', + connections: [], + mcpConnections: [], + }, + ], + }, + ], + }, + }) + await renderPeople(searchConnection) + expect(button(container, 'Request connections')).toBeEnabled() + const resend = await selectPersonAction('Resend') + expect(resend).toHaveAttribute('aria-disabled', 'true') + expect(mocks.resend).not.toHaveBeenCalled() }) it('hides cached people after a first-page authorization failure and offers a retry', async () => { @@ -440,7 +502,6 @@ it.each([ optionId: 'gmail-option', }) expect(container.textContent).toContain('Gmail') - expect(container.textContent).toContain('Organization account contributors') expect(container.textContent).toContain(label) expect(container.textContent).not.toContain('No people invited') } diff --git a/apps/sim/ee/credential-groups/components/organization-account-people.tsx b/apps/sim/ee/credential-groups/components/organization-account-people.tsx index 2023c92bb70..06c9a95a9fa 100644 --- a/apps/sim/ee/credential-groups/components/organization-account-people.tsx +++ b/apps/sim/ee/credential-groups/components/organization-account-people.tsx @@ -72,11 +72,8 @@ export function OrganizationAccountPeople({ setupFallback ) : ( <> - {searchConnection && ( -

    - Organization account contributors and their {searchConnection.providerName} connection - status. -

    + {people.isPending && ( + Loading people… )} {people.error && !people.isFetchNextPageError && ( { 'knowledge.search.sources.overview', 'knowledge.search.sources.progress', 'knowledge.search.integrations.list', + 'knowledge.search.integrations.overview', 'knowledge.search.integrations.approve', 'knowledge.connectors.members.list', 'knowledge.connectors.members.enroll', From e41a1c968c5d2cfa4144d447674c6ce713565191 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 20:13:31 -0700 Subject: [PATCH 12/14] improvement(search): clarify member connections and source administration --- apps/docs/content/docs/search/confluence.mdx | 42 ++-- .../docs/search/connect-your-account.mdx | 27 +- apps/docs/content/docs/search/github.mdx | 16 +- apps/docs/content/docs/search/gitlab.mdx | 14 +- apps/docs/content/docs/search/gmail.mdx | 14 +- .../content/docs/search/google-calendar.mdx | 18 +- .../docs/content/docs/search/google-drive.mdx | 34 +-- apps/docs/content/docs/search/index.mdx | 51 +++- apps/docs/content/docs/search/jira.mdx | 26 +- apps/docs/content/docs/search/slack.mdx | 14 +- apps/docs/public/static/search/add-source.jpg | Bin 79992 -> 29305 bytes .../public/static/search/confluence-setup.jpg | Bin 93826 -> 35214 bytes .../public/static/search/connect-account.png | Bin 117806 -> 153886 bytes .../public/static/search/github-setup.jpg | Bin 94476 -> 20863 bytes .../public/static/search/gitlab-options.jpg | Bin 91818 -> 47941 bytes .../public/static/search/gitlab-setup.jpg | Bin 94777 -> 35088 bytes .../docs/public/static/search/gmail-setup.jpg | Bin 92460 -> 30459 bytes .../static/search/google-calendar-setup.jpg | Bin 94711 -> 36478 bytes .../static/search/google-drive-setup.jpg | Bin 103051 -> 36311 bytes .../static/search/google-service-account.jpg | Bin 81494 -> 45360 bytes .../static/search/integration-provider.jpg | Bin 0 -> 14091 bytes apps/docs/public/static/search/jira-setup.jpg | Bin 87866 -> 33178 bytes .../static/search/request-connections.jpg | Bin 0 -> 19534 bytes .../docs/public/static/search/slack-setup.jpg | Bin 83176 -> 46590 bytes .../public/static/search/source-documents.jpg | Bin 69718 -> 27721 bytes .../public/static/search/source-settings.jpg | Bin 0 -> 50434 bytes .../static/search/source-sync-history.jpg | Bin 0 -> 28372 bytes .../enroll/[token]/page.test.tsx | 7 +- .../credential-groups/enroll/[token]/page.tsx | 15 +- .../integrations/integrations.test.tsx | 36 ++- .../integrations/integrations.tsx | 70 ++++-- ...rganization-integrations-settings.test.tsx | 4 +- .../organization-integrations-settings.tsx | 6 +- .../organization-integrations-setup.test.tsx | 4 +- .../organization-integrations-setup.tsx | 8 +- .../providers/[connectorType]/page.tsx | 5 +- .../[connectorType]/provider-detail.test.tsx | 11 +- .../[connectorType]/provider-detail.tsx | 4 +- .../[connectorId]/source-detail.test.tsx | 2 +- .../sources/[connectorId]/source-detail.tsx | 2 +- .../settings/navigation.test.ts | 7 +- .../organization-settings-sidebar.test.tsx | 2 +- .../connector-settings-fields.test.tsx | 235 ++++++++++++++++++ .../connector-settings-fields.tsx | 3 +- .../[workspaceId]/search/search.test.tsx | 19 ++ .../workspace/[workspaceId]/search/search.tsx | 5 +- .../sidebar-footer/sidebar-footer.test.tsx | 6 + .../sidebar-footer/sidebar-footer.tsx | 29 ++- apps/sim/components/settings/navigation.ts | 2 +- ...organization-account-invite-modal.test.tsx | 3 - .../organization-account-invite-modal.tsx | 5 - 51 files changed, 555 insertions(+), 191 deletions(-) create mode 100644 apps/docs/public/static/search/integration-provider.jpg create mode 100644 apps/docs/public/static/search/request-connections.jpg create mode 100644 apps/docs/public/static/search/source-settings.jpg create mode 100644 apps/docs/public/static/search/source-sync-history.jpg create mode 100644 apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.test.tsx diff --git a/apps/docs/content/docs/search/confluence.mdx b/apps/docs/content/docs/search/confluence.mdx index a7b9e5276e7..ff64d3c2f21 100644 --- a/apps/docs/content/docs/search/confluence.mdx +++ b/apps/docs/content/docs/search/confluence.mdx @@ -11,16 +11,16 @@ Search pages and blog posts from selected Confluence Cloud spaces. A Sim organiz Search indexes each page's own text, including supported local callouts and code blocks. It does not expand Include Page, Excerpt Include, or third-party macros into that page. Referenced pages can be indexed separately with their own access rules. -Admin setup uses your organization's **Settings → Integrations** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. +Admin setup uses your organization's **Settings → Sources** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. -## Choose a connection method +## Choose a setup | Method | Who supplies the content? | What teammates do | | --- | --- | --- | -| **Admin or service account** | One account syncs content, space permissions, page restrictions, and group membership. | Connect their own Confluence account so Sim can match their Atlassian identity to those permissions. | +| **Central account** | One account syncs content, space permissions, page restrictions, and group membership. | Connect their own Confluence account so Sim can match their Atlassian identity to those permissions. | | **Member accounts** | Sim syncs content separately through connected members' accounts. | Connect their own Confluence account to establish which pages they can access. | -Use **Admin or service account** when you have a dedicated account that can read the intended spaces and their permissions. Use **Member accounts** when each person should supply their own connection. Available methods depend on your organization's enabled features. +Adding a source from **Settings → Sources → Confluence → Sources** opens central account setup. Use this when one account can read the intended spaces and their permissions. For a member source, start **Connect account** from **Integrations** in the main sidebar after an admin adds Confluence. Available methods depend on your organization's enabled features. **Everyone still connects in both methods.** With a central account, teammates supply their identity; they do not configure another central crawl or choose spaces again. @@ -33,23 +33,21 @@ Use **Admin or service account** when you have a dedicated account that can read On hosted Sim, personal connections authorize the existing Sim app. Teammates do not create OAuth apps or service-account tokens. Self-hosted deployments need the [shared OAuth configuration](#self-hosted-operator-setup) even when a service account supplies the content. -## Set up the source +## Set up a central source ### Choose Confluence -Open **Settings → Integrations → Providers**, approve **Confluence**, then select **Set up**. Select your **Connection method**. +Open **Settings → Sources → Add integration** and choose **Confluence**. On its **Sources** tab, select **Add source**. If Confluence is already listed, open it directly. **Setup guide** opens this guide from the source form. ### Select an account -For **Admin or service account**, open **Account** and select an existing account, choose **Connect Confluence account** for OAuth, or add a service account using the [steps below](#using-a-service-account). - -For **Member accounts**, **Browse with** supplies an account for the space picker only. Select or connect an account, or switch **Spaces** to manual input to enter space keys without a browsing account. Browsing does not connect that account to Search or share its access with teammates. +Under **Indexing account**, select an existing account, choose **Connect Confluence account** for OAuth, or add a service account using the [steps below](#using-a-service-account). The account must be able to read the content and its permissions. @@ -58,13 +56,13 @@ For **Member accounts**, **Browse with** supplies an account for the space picke Enter **Confluence Domain**, then choose one or more **Spaces**. The picker shows spaces accessible to the selected account. Use the switch beside the field to enter comma-separated **Space Keys**, such as `ENG, PRODUCT`. -Keep **Content Type** at its default for pages, or choose blog posts or both. Leave **Filter by Label** empty unless you want a smaller scope. **Document details (optional)** contains metadata tag settings. +Open **More options** to change **Content Type**, **Filter by Label**, or **Metadata tags**. The default includes pages; choose **All content** for pages and blog posts. Leave the label filter empty unless you want a smaller scope. Confluence Search source configuration showing connection method, account, domain, and spaces @@ -72,13 +70,19 @@ Keep **Content Type** at its default for pages, or choose blog posts or both. Le ### Save and connect your identity -Click **Connect & Sync** for a central account, or **Add source** for member accounts. Back in Integrations, click **Connect account** on the Confluence row and finish the connection in the new tab. Sign in using the Atlassian email that matches your verified Sim email, and authorize the configured site. +Click **Connect & Sync**. Then open **Integrations** in the main sidebar, click **Connect account** on the Confluence source, and finish the connection in the new tab. Sign in using the Atlassian email that matches your verified Sim email, and authorize the configured site. Each teammate completes this last step. A previously authorized account may already be connected. Return to Integrations to see indexing status and your searchable document count. +## Connect member accounts + +After an admin adds Confluence, open **Integrations** in the main sidebar and select **Connect account**. If there is no source yet, enter **Confluence Domain** and **Space Keys**, then select **Connect** and authorize your account. For another site or space scope, use **Add source** beside **Add another Confluence source**. + +An admin can open the resulting source under **Settings → Sources → Confluence → Sources** and use **Settings** to adjust its filters. **Account for browsing** helps populate the space picker; it does not connect that account for Search. Manual space keys work without a browsing account. + ## Using a service account Sim's Atlassian service account form accepts a **scoped API token** and **site domain**. @@ -135,12 +139,12 @@ read:group:confluence ### Add the token to Sim -In the Search setup's **Account** menu, choose the service-account option. Paste the **API token** and enter **Site domain**. Optionally add a display name and description, then click **Add service account**. Continue in the original source modal, using the same domain in both forms. +Under **Indexing account**, choose the service-account connection action. Paste the **API token** and enter **Site domain**. Optionally add a display name and description, then click **Add service account**. Continue in the original source modal, using the same domain in both forms. -Scopes do not grant access to spaces or pages by themselves. Keep the account's Confluence permissions and its token scopes aligned. When a token expires or needs different scopes, create a replacement in Atlassian. In Sim, open **Integrations**, select the saved service account, and click **Reconnect** to enter the new token and the same site domain. +Scopes do not grant access to spaces or pages by themselves. Keep the account's Confluence permissions and its token scopes aligned. When a token expires or needs different scopes, create a replacement in Atlassian. Add the replacement service account in the source's **Settings**, then use **Change indexing account** to apply it. Personal OAuth uses Sim's shared Confluence integration and requests a broader set of permissions, including writes. Search reads content and permissions; it does not edit your Confluence pages. Older OAuth connections need to reconnect to grant the group-read permission used by central permission syncing. @@ -154,7 +158,7 @@ Personal OAuth uses Sim's shared Confluence integration and requests a broader s | **Spaces / Space Keys** | Required spaces to index. The picker and manual key input are two ways to set the same scope. | | **Content Type** | **Pages only** by default. **All content** means pages and blog posts; it does not include comments or attachment contents. | | **Filter by Label** | Optional comma-separated labels. Content can match any listed label. | -| **Document details** | Optional labels, version, and last-modified metadata tags. | +| **Metadata tags** | Optional labels, version, and last-modified tags. In the add-source form, these are under **More options**. | Search manages the schedule and hides item limits. Published/current content is indexed; archived and trashed content is excluded. @@ -164,7 +168,7 @@ Existing organization members see the configured Confluence source and their own With a central account, Sim applies space access together with the page's restrictions and inherited ancestor restrictions. Group membership is refreshed in the background. With member accounts, each person's provider listing determines the pages available to them. A Sim organization admin does not automatically receive access to every Confluence document. -New content and permission changes require a sync and processing before Search reflects them. Open the source under **Settings → Integrations → Providers** to inspect errors, edit its configuration, or trigger a sync. If your own account needs authorization again, use **Reconnect** on the source row. +New content and permission changes require a sync and processing before Search reflects them. Open **Settings → Sources → Confluence → Sources → [source]** to inspect **Documents**, edit **Settings**, or review **Sync history**. If your own account needs authorization again, use **Reconnect** in the main Integrations page. Where available, the provider's **Accounts → Request connections** sends account connection requests; these do not invite people to the Sim organization. ## Troubleshooting @@ -180,7 +184,7 @@ New content and permission changes require a sync and processing before Search r ### Check access in Confluence -Open a missing page in Confluence with the affected teammate's account. On the page, **Share → General access** shows whether access comes from the space, a parent, or an explicit restriction. A space admin can inspect restricted pages under **Space settings → Content → Restricted**. Check both the teammate and central crawling account when using **Admin or service account**. See Atlassian's [content access guide](https://support.atlassian.com/confluence-cloud/docs/add-or-remove-page-restrictions/). +Open a missing page in Confluence with the affected teammate's account. On the page, **Share → General access** shows whether access comes from the space, a parent, or an explicit restriction. A space admin can inspect restricted pages under **Space settings → Content → Restricted**. Check both the teammate and central crawling account when using a central source. See Atlassian's [content access guide](https://support.atlassian.com/confluence-cloud/docs/add-or-remove-page-restrictions/). On Confluence Premium, **Inspect permissions** can show where a user's access is denied across the page, its ancestors, the space, and the product. Check **Can view**, resolve the relevant permission, then run a sync in Sim. See [Atlassian's permission inspection guide](https://support.atlassian.com/confluence-cloud/docs/inspect-a-users-permissions/). diff --git a/apps/docs/content/docs/search/connect-your-account.mdx b/apps/docs/content/docs/search/connect-your-account.mdx index 76f90a85d50..f85576bbc82 100644 --- a/apps/docs/content/docs/search/connect-your-account.mdx +++ b/apps/docs/content/docs/search/connect-your-account.mdx @@ -7,7 +7,7 @@ import { Callout } from 'fumadocs-ui/components/callout' import { Step, Steps } from 'fumadocs-ui/components/steps' import { Image } from '@/components/ui/image' -Your admin approves the provider and can configure shared source filters. You connect your own account so Sim can establish what you are allowed to search. +Your admin adds the integration and can configure shared source filters. You connect your own account so Sim can establish what you are allowed to search. Admins connect their own accounts through the same flow. @@ -21,9 +21,11 @@ Accept your Sim organization invitation or sign in through your organization's S ## Open Integrations -Open **Integrations**, find the provider or source, and select **Connect account**. Your first connection may ask for required source settings, such as repository or project names. If the provider is missing, ask an organization admin to approve it. +Open **Integrations** in the main sidebar, find the provider or source, and select **Connect account**. Your first connection may ask for a GitHub repository, Confluence domain and space keys, or Jira domain and project keys. Enter the required fields and select **Connect**. If the provider is missing, ask an organization admin to add it under **Settings → Sources**. -Organization Integrations with an approved Gmail provider and Connect account action +Use **Add source** beside **Add another [provider] source** when you need another supported repository, site, or project scope. Connecting an existing source does not ask you to configure it again. + +Organization Integrations showing approved providers and Connect account actions @@ -33,7 +35,7 @@ Open **Integrations**, find the provider or source, and select **Connect account In the new tab, select **Connect** and complete the provider's authorization. Choose the account associated with your verified Sim email. The provider may require your organization's SSO or app approval. -Return to Integrations when the connection completes. If the popup was blocked or closed, allow popups and select **Connect account** again. While authorization is pending, use **Open again**. +Return to Integrations when the connection completes, or use **Return to Search** on the connection page. If the popup was blocked or closed, allow popups and select **Connect account** again. While authorization is pending, use **Open again**. @@ -58,6 +60,18 @@ For a source configured inside a workspace, join that workspace and use its **Se Connecting one Google service does not connect all of them. Gmail, Calendar, and Drive each have their own Search connection. +## If you received a connection request + +Open the link from your admin and sign in to Sim with the invited email. A provider-specific request opens that provider's connection directly. Verify your Sim email if prompted, then reopen the original link and authorize the account. + +An account connection request does not invite you into the Sim organization. You can contribute an account without organization membership, but you need membership and enabled Search access to search the organization's documents. The connection page offers **Return to Search** when you have that access; otherwise it offers **Your connected accounts**. + +## Manage your connected accounts + +Select **Your accounts** on the main Integrations page to open your personal **Connected accounts** settings. Use **Reconnect** to renew an organization account connection or **Disconnect** to withdraw it. Disconnecting stops that account from being used for organization indexing and workflows, and removes Search access that depends on it. + +Admins can select **Manage sources** to open organization setup, then open an integration's **Sources** and **Accounts** tabs. This does not grant the admin access to every document. + ## If you get stuck | Status | What to do | @@ -66,7 +80,10 @@ Connecting one Google service does not connect all of them. Gmail, Calendar, and | **Reconnect** | Authorize the same source account again. | | **Finish connecting in the other tab** | Finish authorization, or use **Open again**. Allow popups for Sim. | | No results | Check the source's filters and sync status with your admin. Confirm you can open the document at the source. | -| Needs admin attention | Ask your admin to open the source in **Settings → Integrations → Providers** to inspect its error. | +| **Verify email** | Verify your Sim email, then reopen the connection link. | +| Expired or cancelled authorization | Return to the original connection page and start again. If the invitation itself expired, ask the admin for a new request. | +| Access revoked | Ask the organization admin to restore your account contribution access before reconnecting. | +| Needs admin attention | Ask your admin to open **Settings → Sources → [integration] → Sources → [source]** to inspect its error. | Your Sim role does not override document access at the source. Connecting a different account or receiving a Search link does not share someone else's mailbox, private calendar, or restricted documents with you. diff --git a/apps/docs/content/docs/search/github.mdx b/apps/docs/content/docs/search/github.mdx index bcf9cfec4ac..a1ab75a3178 100644 --- a/apps/docs/content/docs/search/github.mdx +++ b/apps/docs/content/docs/search/github.mdx @@ -9,7 +9,7 @@ import { Image } from '@/components/ui/image' GitHub Search indexes text files from a repository on `github.com`. An organization admin chooses the repository, then each person connects their GitHub account. Installing the GitHub App alone does not connect your teammates. -Admin setup uses your organization's **Settings → Integrations** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. +Admin setup uses your organization's **Settings → Sources** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. ## Before you start @@ -102,16 +102,16 @@ In the App's sidebar, choose **Install App**, select the target account, and gra ### Open GitHub setup -As a Sim organization admin, open **Settings → Integrations → Providers**, approve **GitHub**, then select **Set up**. +As a Sim organization admin, open **Settings → Sources → Add integration** and choose **GitHub**. On its **Sources** tab, select **Add source**. If GitHub is already listed, open it directly. ### Choose what to index -Enter the repository and keep **Sync documents with → Connected members** for the usual setup. +Enter **Repository** as `owner/repo`. Open **More options** only if you need a different branch, path or extension filters, metadata tags, or a dedicated indexing account. **Sync documents with** defaults to **Connected members**. -GitHub source configuration with account, repository, branch, and path fields +GitHub source setup with a required Repository field and More options | Field | What to enter | |---|---| @@ -120,7 +120,7 @@ Enter the repository and keep **Sync documents with → Connected members** for | Path Filter | Optional prefix such as `docs/`. | | File Extensions | Optional comma-separated list, such as `.md, .txt, .mdx`. | -**Document details** controls the metadata stored with results. Its defaults are suitable for most sources. Select **Add source** to save the source. +**Metadata tags** controls the metadata stored with results. Its defaults are suitable for most sources. Select **Add source** to save the source. You can instead select an existing account under **Sync documents with** to supply file contents centrally. Teammates still connect their own accounts to establish which files they may find. @@ -129,9 +129,11 @@ You can instead select an existing account under **Sync documents with** to supp ### Connect your account -On the GitHub source row, select **Connect account** and authorize the App. Teammates repeat this step after joining the Sim organization. For private repositories, both the person's account and the App installation must have access. GitHub also permits App user tokens to read public repositories without an installation; see [GitHub's permission rules](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/choosing-permissions-for-a-github-app). +Open **Integrations** in the main sidebar, select **Connect account** on the GitHub source, and authorize the App. Teammates repeat this step after joining the Sim organization. For private repositories, both the person's account and the App installation must have access. GitHub also permits App user tokens to read public repositories without an installation; see [GitHub's permission rules](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/choosing-permissions-for-a-github-app). -With **Connected members**, indexing begins after someone connects. A dedicated indexing account can start syncing immediately; each teammate still connects before searching. Admins can open the source under **Settings → Integrations → Providers** to inspect sync progress and errors. +With **Connected members**, indexing begins after someone connects. A dedicated indexing account can start syncing immediately; each teammate still connects before searching. Open **Settings → Sources → GitHub → Sources → [source]** to inspect **Documents**, edit **Settings**, or review **Sync history**. + +Use **GitHub → Accounts → Request connections** to send provider-specific connection requests. These requests do not grant organization membership. For another repository, add another source; members can also use **Add another GitHub source** in the main Integrations page. diff --git a/apps/docs/content/docs/search/gitlab.mdx b/apps/docs/content/docs/search/gitlab.mdx index eafff4824a7..36915257d21 100644 --- a/apps/docs/content/docs/search/gitlab.mdx +++ b/apps/docs/content/docs/search/gitlab.mdx @@ -9,9 +9,9 @@ import { Image } from '@/components/ui/image' GitLab Search uses an administrator connection to sync a project's content and permissions. Teammates do not connect individual GitLab accounts. They sign in to the Sim organization with a verified email matching their confirmed GitLab email. -GitLab source setup in Sim Search +GitLab source setup in Sim Search -Admin setup uses your organization's **Settings → Integrations** page. Teammates do not need a personal GitLab connection. For workspace Search, use **Search → Add source** instead. +Admin setup uses your organization's **Settings → Sources** page. Teammates do not need a personal GitLab connection. For workspace Search, use **Search → Add source** instead. ## Before you start @@ -49,7 +49,7 @@ The token must read the project, users, inherited project membership, instance s ### Configure the source in Sim -Open **Settings → Integrations → Providers**, approve **GitLab**, then select **Set up**. Paste the token and enter your instance host explicitly. +Open **Settings → Sources → Add integration** and choose **GitLab**. On its source list, select **Add source**. If GitLab is already listed, open it directly. Paste the **Personal Access Token**, enter your **Host** and **Project**, and choose the content to index. | Field | What to enter | |---|---| @@ -61,7 +61,9 @@ Open **Settings → Integrations → Providers**, approve **GitLab**, then selec | Issue State / Labels / Milestone | Optional filters for issues. | | Max Items | Optional positive limit. Leave blank for all matching items. | -GitLab source configuration scrolled to repository and issue filters, item limit, and document details +**More options** contains the repository and issue filters, **Max Items**, and **Metadata tags**. Unlike member-account sources, GitLab retains this optional item limit. + +GitLab source setup with More options expanded for repository and issue filters, item limit, and metadata tags Select **Connect & Sync**. Sim validates the token and source policy, then starts indexing. @@ -72,14 +74,14 @@ Select **Connect & Sync**. Sim validates the token and source policy, then start Invite teammates to the Sim organization using their verified work email. Sim matches that email against the GitLab directory and applies project, feature, and confidential-issue permissions. No GitLab **Connect account** step is required. -Admins can open the source under **Settings → Integrations → Providers** to review sync progress. Permission and membership changes are picked up during background refreshes. +Admins open **Settings → Sources → GitLab → [source]** to inspect **Documents**, edit **Settings**, or review **Sync history**. GitLab has no personal **Accounts** tab. Permission and membership changes are picked up during background refreshes. ## What is indexed -The connector supports text repository files, wiki pages, issues, merge requests, and non-internal issue and merge-request comments. It does not index internal comments, binaries, or epics. **Document details** controls optional result metadata. +The connector supports text repository files, wiki pages, issues, merge requests, and non-internal issue and merge-request comments. It does not index internal comments, binaries, or epics. **Metadata tags** controls optional result metadata. ## Troubleshooting diff --git a/apps/docs/content/docs/search/gmail.mdx b/apps/docs/content/docs/search/gmail.mdx index 3f6b67cb346..40c9b5955b0 100644 --- a/apps/docs/content/docs/search/gmail.mdx +++ b/apps/docs/content/docs/search/gmail.mdx @@ -9,7 +9,7 @@ import { Image } from '@/components/ui/image' Search email threads from your own Gmail account. An organization admin enables the source; each teammate connects their own account. An admin's connection does not make their mailbox available to the team. -Admin setup uses your organization's **Settings → Integrations** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. +Admin setup uses your organization's **Settings → Sources** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. ## Set up the source @@ -20,26 +20,26 @@ These steps require a Sim organization admin. ### Add Gmail -Open **Settings → Integrations → Providers**, approve **Gmail**, then select **Set up**. Gmail uses **Member accounts**; there is no domain-wide or service-account crawl in Search. +Open **Settings → Sources → Add integration** and choose **Gmail**. On its **Sources** tab, select **Add source**. If Gmail is already listed, open it directly. Gmail uses member accounts; there is no domain-wide or service-account crawl in Search. ### Choose what to include -Keep the defaults to search all dates and labels, excluding Promotions, Social, Spam, and Trash. Add filters below if your team needs a narrower source. +Keep the defaults to search all dates and labels, excluding Promotions, Social, Spam, and Trash. **Labels** and **Date Range** are shown first. Open **More options** for category exclusions, **Search Filter**, and **Metadata tags**. ### Create the source -Click **Add source**. Gmail appears in the **Sources** list. Each person, including the admin, then connects their own account. +Click **Add source**. Gmail appears in the provider's **Sources** list. Each person, including the admin, then connects their own account from **Integrations** in the main sidebar. To send a Gmail connection request, open **Gmail → Accounts → Request connections**; this does not invite the recipient to the Sim organization. -Gmail Search source configuration +Gmail Search source configuration ## Connect your account @@ -51,7 +51,7 @@ Teammates follow these same steps after joining the organization. Once an admin ## Source options -An admin can change these in the Gmail source's **Settings** tab. Filters apply separately to each connected mailbox. +An admin opens **Settings → Sources → Gmail → Sources → [source] → Settings** to change these options. Filters apply separately to each connected mailbox. **Documents** shows indexed threads and **Sync history** shows recent runs. | Option | Behavior | | --- | --- | @@ -60,7 +60,7 @@ An admin can change these in the Gmail source's **Settings** tab. Filters apply | 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. | -**Document details** 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** contains optional **Metadata tags**. Sync frequency and the general knowledge-base **Max Threads** setting are hidden in Search. ## What gets indexed diff --git a/apps/docs/content/docs/search/google-calendar.mdx b/apps/docs/content/docs/search/google-calendar.mdx index f32b30af937..1ac04bc23b1 100644 --- a/apps/docs/content/docs/search/google-calendar.mdx +++ b/apps/docs/content/docs/search/google-calendar.mdx @@ -9,7 +9,7 @@ import { Image } from '@/components/ui/image' Search meetings and event details available to your Google account. An organization admin enables the source; every teammate connects their own account. Google controls which calendar and event details each person can read. -Admin setup uses your organization's **Settings → Integrations** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. +Admin setup uses your organization's **Settings → Sources** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. ## Set up the source @@ -20,28 +20,28 @@ These steps require a Sim organization admin. ### Add Google Calendar -Open **Settings → Integrations → Providers**, approve **Google Calendar**, then select **Set up**. Search uses **Member accounts**; an admin or service account cannot connect on behalf of everyone. +Open **Settings → Sources → Add integration** and choose **Google Calendar**. On its **Sources** tab, select **Add source**. If it is already listed, open it directly. Search uses member accounts; an admin or service account cannot connect on behalf of everyone. ### Choose the calendars -Leave **Calendars** empty to search each person's primary calendar. To include specific shared calendars, select them using **Browse with**, or switch to **Calendar IDs** and enter their IDs. +Leave **Calendars** empty to search each person's primary calendar. To include specific shared calendars, select an **Account for browsing** and choose calendars, or switch to **Calendar IDs** and enter their IDs. -**Browse with** only helps you choose calendars. It does not connect your account for Search or grant teammates access. +**Account for browsing** only helps you choose calendars. It does not connect your account for Search or grant teammates access. ### Create the source -Keep the default date range for the previous and next 30 days, then click **Add source**. Each person, including the admin, connects their own account from the **Sources** list. +Keep the default date range for the previous and next 30 days. **More options** contains **Search Query**, **Include Attendees**, and **Metadata tags**. Click **Add source**, then connect your own account from **Integrations** in the main sidebar. -Google Calendar Search source configuration +Google Calendar Search source configuration `primary` means the connected 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 member, and only members with access to it can search its events. @@ -53,11 +53,11 @@ Keep the default date range for the previous and next 30 days, then click **Add 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. Connecting Gmail or Google Drive does not replace the Calendar connection. +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 → Google Calendar → 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 can change these in the source's **Settings** tab. +An admin opens **Settings → Sources → Google Calendar → Sources → [source] → Settings** to change these options. **Documents** shows indexed events and **Sync history** shows recent runs. | Option | Behavior | | --- | --- | @@ -66,7 +66,7 @@ An admin can change these in the source's **Settings** tab. | 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. | -**Document details** contains optional metadata tags. Search hides sync frequency and the general knowledge-base **Max Events** setting. +In the add-source form, **More options** contains optional **Metadata tags**. Search hides sync frequency and the general knowledge-base **Max Events** setting. ## What gets indexed diff --git a/apps/docs/content/docs/search/google-drive.mdx b/apps/docs/content/docs/search/google-drive.mdx index b0b7c2ed052..2e267fbc7f9 100644 --- a/apps/docs/content/docs/search/google-drive.mdx +++ b/apps/docs/content/docs/search/google-drive.mdx @@ -7,9 +7,9 @@ import { Callout } from 'fumadocs-ui/components/callout' import { Step, Steps } from 'fumadocs-ui/components/steps' import { Image } from '@/components/ui/image' -Search Google Docs, Sheets, Slides, and supported files in Drive. A Sim organization admin chooses the folders and connection method once. +Search Google Docs, Sheets, Slides, and supported files in Drive. Members can connect their own accounts after an admin adds Google Drive, or an admin can configure a central service-account crawl. -Admin setup uses your organization's **Settings → Integrations** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. +Admin setup uses your organization's **Settings → Sources** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. ## Choose your setup @@ -22,39 +22,41 @@ Admin setup uses your organization's **Settings → Integrations** page. Teammat A central crawl indexes only files the configured **Crawl as** account can access. Domain-wide delegation does not make this connector crawl every employee's Drive. Share the intended content with the indexing account, or use member accounts for each person's accessible files. -## Set up member accounts +## Connect member accounts ### Add Google Drive -Open **Settings → Integrations → Providers**, approve **Google Drive**, then select **Set up** and choose **Member accounts**. +An organization admin opens **Settings → Sources → Add integration** and chooses **Google Drive**. Adding it allows personal connections; it does not create a source or connect anyone's account. -### Choose the files +### Connect your account -Leave **Folders** empty to include supported files each connected member can access, or select folders to narrow the source. **Browse with** helps you pick folders; you can also switch to **Folder IDs** and enter comma-separated IDs from their Drive URLs. - -Keep **Sync documents with → Connected members** unless you have a dedicated indexing account. Selecting an indexing account does not replace each person's access verification. If that indexing account is a delegated service account, use **Crawl as** to choose the Google Workspace user whose files it should fetch. +Open **Integrations** in the main sidebar and select **Connect account** 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). -### Create and connect +### Adjust filters if needed + +An admin opens **Settings → Sources → Google Drive → Sources → [source] → Settings**. Leave **Folders** empty to include supported files each member can access, or narrow the source to folders. **Account for browsing** helps select folders; manual **Folder IDs** work without it. Browsing does not connect that account to Search. -Select **Add source**, then **Connect account** on the source row. Use the Google account matching your verified Sim email. Teammates follow the same [connection steps](/search/connect-your-account) after joining the organization. +Keep **Sync documents with → Connected members** unless a dedicated account should fetch content. Members still connect to establish access. If the dedicated account is a delegated service account, **Crawl as** selects the Google Workspace user whose files it fetches. Save the source settings when finished. ## Set up a central service account +Open **Settings → Sources → Google Drive → Sources → Add source**. This opens central service-account setup. If Google Drive is not listed yet, add it with **Add integration** first. Teammates do not need a personal Drive connection for this source. + This requires a Google Workspace domain and a Workspace super administrator to authorize domain-wide delegation. Consumer Gmail accounts cannot use this path. -Google Drive service-account setup with Crawl as and manual folder fields +Google Drive central source setup with an indexing account, sharing policy, and folder scope @@ -93,9 +95,9 @@ These are Search's central crawl scopes. The general [Google service account gui ### Add the credential in Sim -In Google Drive's Search setup, choose **Service account**. Open the **Service account** picker, choose its connection action, and paste the JSON key into **Add Google Service Account**. Give it a name and add it. Sim returns you to the source form with that credential selected. +Under **Indexing account**, choose the service-account connection action, or select an existing service account. Paste the JSON key into **Add Google Service Account**, give it a name, and add it. Sim returns you to the source form with that credential selected. -Add Google Service Account credential modal in Sim +Add Google Service Account credential modal in Sim @@ -115,11 +117,11 @@ Set **Crawl as** to a Google Workspace administrator who can read groups, member | File Type | All supported files by default, or only Google Docs, Sheets, Slides, or text formats. **Plain text files only** also includes CSV, HTML, Markdown, JSON, and XML. | | Crawl as | Required for the central service account. In Member accounts, it optionally supplies the impersonated user when a dedicated service account fetches content. It has no effect on ordinary OAuth accounts. | | Openly shared files | Applies only to central crawls; it has no effect in Member accounts. **Keep out of search** by default. You can include discoverable domain shares or discoverable public shares. Link-only sharing does not grant Search access; named user and group permissions still apply. | -| Document details | Optional owner, file type, modification date, and starred metadata. | +| Metadata tags | Optional owner, file type, modification date, and starred metadata. In the add-source form, these and **File Type** are under **More options**. | Sim exports Docs and Slides as text and Sheets as XLSX spreadsheets. Supported uploaded files use the knowledge-base document pipeline, including PDF and Office formats. Unsupported files and oversized exports cannot be indexed; Google limits Workspace exports to 10 MB. See [Drive export formats](https://developers.google.com/workspace/drive/api/guides/ref-export-formats) and [download limits](https://developers.google.com/workspace/drive/api/guides/manage-downloads). -Search schedules syncs hourly. Content, deletions, and permissions refresh in the background; results are not a live read from Drive. Admins can inspect progress and errors by opening the source under **Settings → Integrations → Providers**. +Search schedules syncs hourly. Content, deletions, and permissions refresh in the background; results are not a live read from Drive. Open **Settings → Sources → Google Drive → Sources → [source]** to inspect **Documents**, edit **Settings**, or review **Sync history**. **Accounts** on the provider page shows personal account connections where configured; it does not list the central service-account credential. ## Troubleshooting @@ -134,7 +136,7 @@ Search schedules syncs hourly. Content, deletions, and permissions refresh in th ## Self-hosted OAuth configuration -The deployment operator configures Google OAuth for **Member accounts** and **Browse with**. This is separate from the central service account above. +The deployment operator configures Google OAuth for member accounts and **Account for browsing**. This is separate from the central service account above. 1. In [Google Cloud Console](https://console.cloud.google.com/), select your project and enable **Google Drive API** under **APIs & Services → Library**. 2. Open **Google Auth platform → Branding** and configure the app name and contact details. Under **Audience**, choose **Internal** for your Google Workspace organization only, or **External** for other users, adding test users while testing. Review **Data Access → Add or remove scopes** using the current Sim scopes below. See Google's [consent guidance](https://developers.google.com/workspace/guides/configure-oauth-consent). diff --git a/apps/docs/content/docs/search/index.mdx b/apps/docs/content/docs/search/index.mdx index 78f00ed06ca..91bb8e58d9c 100644 --- a/apps/docs/content/docs/search/index.mdx +++ b/apps/docs/content/docs/search/index.mdx @@ -7,25 +7,25 @@ import { Callout } from 'fumadocs-ui/components/callout' import { Step, Steps } from 'fumadocs-ui/components/steps' import { Image } from '@/components/ui/image' -Search brings your connected sources into one place. An organization admin adds a source and chooses what to include. Teammates then [connect their accounts](/search/connect-your-account) when the source requires it. Each person searches with their own access. +Search brings your connected sources into one place. An organization admin adds an integration and configures its sources. Teammates then [connect their accounts](/search/connect-your-account) when required. Each person searches with their own access. ## Add your first source -### Choose a source +### Add an integration -As an organization admin, open **Settings → Integrations → Providers**. Approve the provider for Sim Search, then select **Set up** beside it. Use its **Setup guide** for the provider's prerequisites. +As an organization admin, open **Settings → Sources → Add integration** and choose a provider. Sim opens that integration's page. If the integration is already listed, open it instead. -Approval lets members connect; it does not connect an account or start indexing. Slack also requires an admin to configure the organization's Slack app first. +Adding an integration approves it for Search; it does not connect an account or start indexing. Slack also requires **Set up Slack app** before adding sources. ### Configure it once -Choose the folders, repositories, calendars, spaces, or channels to include. Start with the defaults unless you need to narrow the scope. **Document details** contains optional metadata. +On the integration page, select **Add source**. Follow its **Setup guide** to connect the indexing account or choose the folders, repositories, calendars, spaces, or channels to include. **More options** contains secondary filters and **Metadata tags**. Select **Connect & Sync** for an administrator connection, or **Add source** for member accounts. Creating a source does not invite people or authorize their accounts. @@ -34,13 +34,12 @@ Select **Connect & Sync** for an administrator connection, or **Add source** for ### Connect and search -In **Integrations**, select **Connect account** if prompted—even if you created the source. Complete authorization in the new tab, then return to the source list. Open **Search** in the organization sidebar to find documents, or **Home** to ask the assistant about them. Documents become available as background indexing progresses. +Open **Integrations** in the main sidebar and select **Connect account** if prompted—even if you created the source. Complete authorization in the new tab. Open **Search** to find documents, or **Home** to ask the assistant about them. Documents become available as background indexing progresses. -Sim Search source catalog with Set up actions - +Organization Sources settings with the Add integration action Source availability depends on the deployment and organization policy. An unavailable source needs operator configuration before setup can continue. @@ -54,7 +53,9 @@ Most sources use member accounts. Google Drive and Confluence also support a cen | **Service account** (Drive) / **Admin or service account** (Confluence) | Connects an account that can read the content and the source's permissions or directory. | Join the organization with a matching verified identity. Confluence also requires each person to connect their account. | | **Administrator token** (GitLab) | Connects a self-managed instance administrator token and selects projects to index. | Join the organization with a verified Sim email matching GitLab. No personal connection is needed. | -Some member sources offer **Sync documents with**. **Connected members** uses members' accounts for both content and access checks. Selecting a dedicated account uses it to fetch content; members still connect to establish which documents they may search. **Browse with** only helps an admin pick source options—it does not enroll that account for Search. +Adding a Google Drive or Confluence source from the admin page starts central setup. For personal connections, use **Integrations → Connect account** in the main sidebar. An approved provider can create its first member source there; required repository, site, or project fields are collected before authorization. Admins can edit that source's filters afterward in its **Settings** tab. + +Some member sources offer **More options → Sync documents with**. **Connected members** uses members' accounts for both content and access checks. Selecting a dedicated account uses it to fetch content; members still connect to establish which documents they may search. **Account for browsing** only helps an admin pick source options—it does not enroll that account for Search. An administrator connection does not grant everyone access to everything. Search applies the source's supported permission rules. It also does not automatically discover every employee's data: the indexing account must be able to read the configured content. @@ -77,7 +78,31 @@ Some member sources offer **Sync documents with**. **Connected members** uses me Invite people through the organization's **Settings → Members**, or use your organization's [SSO provisioning](/platform/enterprise/sso). Share the organization's **Home** or **Integrations** URL. People need their own Sim account and organization membership; they do not need access to a workspace. Connecting an external account alone does not grant organization membership. -Organization admins manage source configuration and sync status by opening a source under **Settings → Integrations → Providers**. Other members connect or reconnect their own accounts. See [Connect your account](/search/connect-your-account) for the teammate walkthrough. +To request a particular account connection, open **Settings → Sources → [integration] → Accounts → Request connections**. This tab is available for providers that support personal connections. If setup is missing, complete the source or Slack app setup shown there first. The list shows organization account contributors and their connection status for that provider. + +These requests are separate from organization invitations. They let recipients contribute an external account; they do not grant Sim organization membership or Search access. **People** on the Sources settings page shows account contributors across providers. See [Connect your account](/search/connect-your-account) for the teammate walkthrough. + +**Revoke all account access** withdraws every account that person contributed to the organization, including other providers. It does not remove their organization membership. + +Request Gmail connections with an Emails field and Send requests action + +## Manage sources and documents + +Open **Settings → Sources → [integration]**, then select a source. Providers with personal connections have **Sources** and **Accounts** tabs; providers such as GitLab open directly to the source list. Multiple sources can have different folder, repository, space, or project scopes. + +Integration detail with Sources and Accounts tabs and a nested source list + +| Source tab | What you can do | +| --- | --- | +| **Documents** | Find indexed documents, inspect processing status, retry failed indexing, or exclude and restore documents. | +| **Settings** | Edit the source's scope, filters, metadata, and supported connection settings. Save your changes before leaving. | +| **Sync history** | Review recent sync runs and errors. | + +Use the source header to sync, pause, resume, or remove that source. The back link returns to its integration. **Deactivate** on the integration page makes its content unavailable in Search, Assistant, and MCP while preserving its sources and connected accounts; **Activate** enables it again. + +Gmail source Settings tab with label, date range, and search filters + +Source Sync history with no connected accounts or synced members ## Search, Assistant, and MCP @@ -112,11 +137,11 @@ Search runs background syncs on an hourly schedule. Large sources, provider limi ## If indexing needs attention -A completed sync means the source was checked; some documents may still be indexing. The source row shows how many documents you can search and whether indexing failed for any documents you can access. +A completed sync means the source was checked; some documents may still be indexing. In the main **Integrations** page, each source row shows how many documents you can search and whether indexing failed for any documents you can access. -As an admin, open the source under **Settings → Integrations → Providers**. In **Documents**, select **Failed** from the status dropdown to inspect those files. Use the search field to find a document by name. **Settings** contains the source configuration and **Sync history** shows recent runs. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; select **Excluded** and then **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. +As an admin, open **Settings → Sources → [integration] → Sources → [source]**. In **Documents**, select **Failed** from the status dropdown to inspect those files. Use the search field to find a document by name. Select **Retry indexing** beside a file to try again. **Exclude** removes a file from search; select **Excluded** and then **Restore** to include it again. Fix a disconnected account or source configuration before retrying a sync that needs attention. -Source document page with search, status filtering, indexing recovery, and header actions +Empty source Documents tab with search and an Included status filter Temporary indexing-capacity waits retry automatically in the background. If automatic retries are exhausted, the document appears as failed so an admin can retry it. Other searchable documents remain available while this work finishes. diff --git a/apps/docs/content/docs/search/jira.mdx b/apps/docs/content/docs/search/jira.mdx index 7c7c6463cea..102f3e3c7c2 100644 --- a/apps/docs/content/docs/search/jira.mdx +++ b/apps/docs/content/docs/search/jira.mdx @@ -11,7 +11,7 @@ Search issue titles, descriptions, and metadata from selected Jira Cloud project This Search connector uses **Member accounts**. It does not offer a central admin crawl. Comments, attachment contents, dashboards, and saved filters are not indexed. -Admin setup uses your organization's **Settings → Integrations** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. +Admin setup uses your organization's **Settings → Sources** page. Teammates connect from **Integrations** in the main sidebar. For workspace Search, use **Search → Add source** instead; **Create & Invite** is the workspace equivalent of **Add source**. ## Before you start @@ -32,24 +32,24 @@ Sim uses its existing Jira OAuth integration. Search uses `read:jira-work` to re ### Choose Jira -Open **Settings → Integrations → Providers**, approve **Jira**, then select **Set up**. The connection method is **Member accounts**. +Open **Settings → Sources → Add integration** and choose **Jira**. On its **Sources** tab, select **Add source**. If Jira is already listed, open it directly. Jira sources use member accounts. ### Choose the projects -Under **Browse with**, select an account or choose **Connect Jira account** and complete Atlassian authorization. Enter **Jira Domain**, then choose one or more **Projects**. +Under **Account for browsing**, select an account or choose **Connect Jira account** and complete Atlassian authorization. Enter **Jira Domain**, then choose one or more **Projects**. If you already know the project keys, use the switch beside **Projects** to select manual input and enter keys such as `ENG, SUPPORT`. Manual input lets you configure the source without connecting a browsing account first. -**Browse with** only populates the project picker. It does not enroll you or share that account's issue access with teammates. +**Account for browsing** only populates the project picker. It does not enroll you or share that account's issue access with teammates. Jira Search source setup with member accounts and required site and project fields @@ -57,16 +57,16 @@ If you already know the project keys, use the switch beside **Projects** to sele ### Create the source -Leave **JQL Filter** empty to include all accessible issues in the selected projects, or add a condition such as `status = "Done"`. Open **Document details (optional)** only if you want to change metadata tags. +Open **More options** for **JQL Filter** and **Metadata tags**. Leave JQL empty to include all accessible issues in the selected projects, or add a condition such as `status = "Done"`. -Click **Add source**. The source appears in the shared source list, and Sim starts preparing member connections in the background. +Click **Add source**. The source appears on Jira's **Sources** tab. Creating it does not authorize accounts or send invitations. ### Connect your search account -On the new Jira row, click **Connect account**. Complete the connection in the new tab using the Atlassian email that matches your verified Sim email. Select the configured Atlassian site when asked and grant the requested permissions. +Open **Integrations** in the main sidebar and click **Connect account** on the Jira source. Complete the connection in the new tab using the Atlassian email that matches your verified Sim email. Select the configured Atlassian site when asked and grant the requested permissions. Return to Integrations to see connection and indexing status. Each teammate follows this same step. A previously authorized account may already be connected. @@ -80,7 +80,7 @@ Return to Integrations to see connection and indexing status. Each teammate foll | **Jira Domain** | The Cloud site hostname, such as `your-team.atlassian.net`. Use the same site during authorization. | | **Projects / Project Keys** | One or more projects. The picker shows projects available to the browsing account; manual input accepts comma-separated keys. | | **JQL Filter** | Optional conditions that narrow the selected projects. Leave out `ORDER BY`; Sim supplies the sorting. | -| **Document details** | Optional issue type, status, priority, labels, assignee, and last-updated tags. | +| **Metadata tags** | Optional issue type, status, priority, labels, assignee, and last-updated tags. In the add-source form, these are under **More options**. | Search manages the sync schedule. Item limits and sync frequency are not setup decisions on this page. @@ -88,7 +88,9 @@ Search manages the sync schedule. Item limits and sync frequency are not setup d Existing organization members see the same source configuration and their own **Connect account**, **Reconnect**, or indexing status. They do not choose projects again. Invite new teammates to the Sim organization through its Members settings or SSO onboarding, then have them open Integrations and connect Jira. A Jira authorization does not grant Sim organization membership. -Sim checks Jira separately using each connected person's account. Issue content and tags become searchable as processing finishes; changes and lost issue access are picked up by later syncs. The source row reports the number of documents searchable by the current viewer. Admins can open the source under **Settings → Integrations → Providers** to review sync status or update the source. +Sim checks Jira separately using each connected person's account. Issue content and tags become searchable as processing finishes; changes and lost issue access are picked up by later syncs. The main Integrations page reports documents searchable by the current viewer. Admins open **Settings → Sources → Jira → Sources → [source]** for **Documents**, **Settings**, and **Sync history**. + +Use **Jira → Accounts → Request connections** to send Jira connection requests. These requests do not invite people into the Sim organization. For a different site or project scope, an admin can add another source; members can also use **Add another Jira source** in the main Integrations page. ## Troubleshooting diff --git a/apps/docs/content/docs/search/slack.mdx b/apps/docs/content/docs/search/slack.mdx index 22994407428..a4bf04de7ac 100644 --- a/apps/docs/content/docs/search/slack.mdx +++ b/apps/docs/content/docs/search/slack.mdx @@ -8,7 +8,7 @@ import { Image } from '@/components/ui/image' Slack Search indexes channel messages and threads. A Sim organization admin configures your Slack app once, then each teammate authorizes their own Slack account. Their results are limited to the selected public channels and private channels they can access. DMs and group DMs are not indexed. -Slack app setup for Sim Search with application and client credential fields +Slack app setup for Sim Search with application and client credential fields ## Before you start @@ -25,7 +25,7 @@ Skip to **Connect the source** if the organization already has a verified Slack ### Open provider settings -Open **Settings → Integrations → Providers**. Approve **Slack**, select **Set up**, then **Set up Slack**. Approval alone does not configure the app or start indexing. +Open **Settings → Sources → Add integration** and choose **Slack**. Select **Set up Slack app** on the provider page. If Slack is already listed, open it directly. Adding the integration alone does not configure the app or start indexing. @@ -56,14 +56,14 @@ Organization setup uses personal user authorization. It does not ask for a bot t Select **Verify and add**, then authorize the app in the Slack popup. Sim verifies the app, workspace, client credentials, and required scopes. Allow popups if the window does not open. -After verification, Sim returns to the source form. If Slack requires administrator approval, complete that approval before continuing. +After verification, Sim returns to the provider page. Open **Sources → Add source** to choose what to index. If you opened app setup from an unfinished source form, Sim returns to that form instead. If Slack requires administrator approval, complete that approval before continuing. ## Connect the source -Keep **Sync documents with → Connected members** for the usual setup. Configure only the limits you need: +Open **Sources → Add source** on Slack's provider page. **Channels** and **Earliest Message Date** appear first. Open **More options** for exclusions, archived channels, metadata tags, and **Sync documents with**. Keep **Connected members** for the usual setup. | Field | Behavior | |---|---| @@ -72,11 +72,13 @@ Keep **Sync documents with → Connected members** for the usual setup. Configur | Archived Channels | Included by default. | | Earliest Message Date | Optional UTC date (`YYYY-MM-DD`). Applies to the thread's first message; replies are included with that thread. | -Select **Add source**. On the source row, each person selects **Connect account** and approves the configured Slack app. Creating the source or verifying the Slack app does not authorize teammates automatically. +Select **Add source**. Each person opens **Integrations** in the main sidebar, selects **Connect account** on the Slack source, and approves the configured app. Creating the source or verifying the Slack app does not authorize teammates automatically. + +To send a Slack connection request, open **Slack → Accounts → Request connections**. This requests an external account connection; it does not invite the recipient to the Sim organization. You can instead select an existing account under **Sync documents with** to supply message content centrally. Members still connect their own accounts to establish access. The selected account must itself be able to read the selected channels. -Admins can open the source under **Settings → Integrations → Providers** to inspect sync progress. Search reads the indexed content, so source changes appear after background syncing. Slack retention and API limits determine how much history is available. +Admins open **Settings → Sources → Slack → Sources → [source]** to inspect **Documents**, edit **Settings**, or review **Sync history**. Search reads indexed content, so source changes appear after background syncing. Slack retention and API limits determine how much history is available. ## Permissions reference diff --git a/apps/docs/public/static/search/add-source.jpg b/apps/docs/public/static/search/add-source.jpg index 1e98c5502a4cade6e4b43fd17f629076bb550625..0fb4997da09d62bf416dd327560da1056c6198d8 100644 GIT binary patch literal 29305 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 H$H;#Hyq2p! literal 79992 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 literal 93826 zcmeFZ30PCtx;MTN6%`RDqy>TF03wK-D#HX`pN3}x*?a9_t-aPe z{NCUD3f~JqLVHav8()S*L?B26{6In~bP*EWviaHkEebwcw{PA2?AX42+xDG1cJ11^ zW9QCYyCrw;65k`fbEm{Ui9M2g_wL)fYxn*G`}ZCI|L@(rh{)!dqFZ->6ZeYm6bF0% z$&c_SXy1;l{B1;0k)zO-eIla!M1)O{0(j1CB0qnifBA@P5#73NyV#DMyTm~Q!d_?# zxc8Q=qT9A@-3nS`!EtEozHR%Dd~sp>0gD@AM{gfI^KHVj9ml>beJypphk5+$%{zB@ z?m8s>+2=BfN+*<0s%U6xY5(P%&c#cHmyNC%n^;;|BW-N$>~Fcay19FJdinVW1O^3% zgx>q^epK{>nApcpo+c(G|B#ZJmHj*?_eEZQL0NePp|a{#bxlKKQ}dgax2;|In{}pkG_If*}>#?3c)v zAh3z<+q&(@7u)w=un@a(`@qpN-|jg0Wx})4*E^4$z0Q=nd8cRBq2n5(imc79{oJ!p z>)74j)U$u>*uV9Q0__$R0WVKJq9-iF9X<@M`umo_hN$xR4ln6D$V z@K*{AJ`-5cmYao;%J~%1^u377m4V!zs*%Vqcq#C7oDiaIk1y{KLg!tC5K+Ph&Ca1H zi^?u6!(E>v825~ZroffXz_jg^fw)jDTqyL0d!DxZ#+>`HXDvhsO@D`DzsBQ<{k7N` z(E|(1La1x!&!C@z-uqkE}#XziV48Y;N^36rE<`Ejn)a z?dQ!JNEO(^gI3n35cA4gbW2tfCCmZ@WzRCV#47)>ec~AG^tLc`9ZXGy(zlspJ+r)C zcuh3#`7r%5!wa%^%6)P!r!`a5Gut!!cJ}SeZIqLqwGaOyKNfj-`$>c6Vj7uak6wn&YoUOw5x`bsHMrr}v=Vro_>biet_fwQUK)^u-m z&(Zqv>d6YIZ?MQVcm96CG~U=-J@HIE6twq4$lirZf?XY4BkHjfIsHj{LVuBBG&_D7 zU7#(E{Kn|SQy~-)d5#*t+Hnanf3jR_{qxywAykyPW05pyrKw5YXp4&6rJVK0_K9Pl zSlF%therflj)i(19>CKD5dnXy{tj+;;ms?>Lhrek5X(adoo!8TO8YMQemwTOKfA*9zQ;Aa24d-y-@eu2%U3Brto5O!B%R;0G!0Ex%j z{1%HMP$k!c{|f(f|LYzDSs~@hs0D12Z_X%CGp!|ck~kiFiE=r(r>&mZQEmN^j0Bv`#0zHpMt97Oa z6g}Lz1SsPC+Z{*mcY+u6?9VeC){KK7Rtu?EzH?)jAtH?a3b(=Q}GX&9ZIu zeimPwBJ981ejmAJ{ZM~(q4l2@b0 z=!!OKQ9<(|*0FFTP`$luSQ_N8myudWh8 zHV4RC$m~b8^6pe?>QttreI2JSL=88Tpf%_nZkaOfG`oC)Ws}xpAfM>Xa-Q~6?De&O z#2v#=%yqXcy%9o<&VGhaU@D?XHeENcYaEX^9UJIaOdSl<-yr|cW3b=RboyN%g4OT; z3B&a%L;63o&HkQG6V$(|(5zkpTPknUs=l^0Xj6=)&huR_{@2s%KaPd*ZfBp^L^<11 zAryZ{oP|t(?6r4u?km`Bqsq{OYN(y9NrYT2uZqN;zW8w`kbnKr7~pefE)mMz46M z44~ZG4W}OZVR%w~o- zj3Yh%2|tf^qTS#y*VZu`+a}XFslTBYL_SnW!)o~!6dpWN!bngSjd8HUEh-xG(*pP{ z#SJ43QYq;@TK$hr(NjK`OrSCQhDq7QYlG6NJV~d-f@2@x=SQt)A9rzM4CKQUf9%1o zWG_4h9aCA*oO#C8Ul}s%rK5}0!l%ru4GyQicdTOSY2w|?iHTJ0C)MEk`NNNae*r*p}kn zgVBt(7-R+KS;l2-3_)4+TeQw}U`M>s`_n-_OC$9n_|dTV^aE(EB~{&kkq2pcqW9xX zQ_^nbXjatXJ{lD_43E}02_dDq1j_|x`2y&hjafDPG4y4PX6Nu?d}XbvY?xboSe8}L z_1xi@ax`@Nj%VL7pG$e*IjL?f#bcN5AEWJ8nv-7Wx!gHZ3of5J=t11DOlq4XM|36C zsF~RM9TIA|IT85}lw?^wflzoK@(9Tp{LX(0C*mF|;C^Y(UM#n8**1>R?`wOB)gSs+hz&gY4OBW z=aD(@z>)ZCJqFUx2Z|jy^OnXe$sy~6`Sh$v9dX71Gu4R2@~J_LBA2mw*4tInABf}q zG-}YJTJ1sfL6PS*lVhiwLgTsi^W4oI)z#FuRnc-=3mi$T0UhNnjn41d%duwiC4L9P z_RT#!D3V#zF-0R?jd!TCUY9TT$P|C{G=5MhN$4qK%xE>UFAzyum)N&Q=>t0l#ENafZ<8^1A ztXrrO3-zTrRwr}j&S@Iw#NQg&r7YrrS3G!4#PAchO;;f6=V@%PZx}Ah^YY$AhMXS05PsDm5rNbwk(VSsWS)*26_%7PH-#P!mP94>ERsuE0^9?b_#&s+9J; zRkJFoXdb0GufXCfbuq4OQ~4BRBuQa4QEJm@h8}HNK$cEmB6@AUqrM^D7Z#ds2AyXEx#Ck;Tfplg~^CK`?uYd zB^nPOmZ_)aS0>+iSndj0a8GGqlVrLDZ>t59;?Ery*Lx$+3VyyqmOR}Zt51?}Jj$eo`gqu(y!?69-S$3LG`rsU=nWAHib8WmsG=pZel(Oz}a z8eWLQEneFW58cRKcsVeuG5mk2mYrY)=zHk8O(Dl(&RAv=-&sWnu9SG-igky!qo~b;p5&BE2P# z2qblPigQ6#>?-PPC)aeb$V6E*M+kkl?69J7Qz8fZS3>n}=7%ry7*(!*b0c2(E46)K zEeyWwu24zPpDW33pEPFAYgSdUx;GDqc~n(;wUgZDWac_11iQw=he)K2zPcfpWFVK= z%>U7J$!FNgepZn(GwaxHdR7R@?dpRgB6U0o#{-6l*?o4OKM$P_BC+SLEGorB7-jBx zRzlB0;oRmPVvb;Np*E*GHqViFq0ut;6qr)A;^EesAFGl&3rooXcfx4g71ghBEe3K~ zv>|?r|M0aBURrNSN*x1l*UMpe^;xRBKnI#TeHx!r&Yi7E%W6mOuVfdy`%@$MyZTPB zy2Y#m@*R$+9UH0y*X$yU``b?prIQ}rPjUh0jd&tE7yRTL~pKxZD-2_5t z-ayVj8QDuM3s3Cqa7jz)nZu=NvxSiT`BoCiKq4Vf^GwFumErh#gPn$_TUN7gZFFz3 zFfHYKycbkJPp>b)_F4!$qw_ZjD6&pMH0FG;`Ohn6L~ZL zw4MS6A#gQvtUmNZPpt`kZosK}=53cioP-PwP1o$;YNG^o-g4%SynI2sHv1&;5^1?J z@@Uoz?qO=gq$Yj}Xcj|5y)1w3>{p+L+x||N?Iy;Xsv8}fzP4Uae^BHWec9rV|NhsE zfu+l<5HFceQwP7|(rmHMAiMuqJGV<&v@qIj5`KdAyeReElFCuV+p1w_PIrK?L%wER z8oOJ}Q}KSPS!s{ffWvn$tI#oJ)wOuvsd3I+n)5sQay=9%E>({0NId>$Tm5Nl;u}1_ z4VLXARTRU-6%n%bd%<*TW%g1LBHr~50$nZO>(Z-qBlr;73wO)Ip>4=<9y^!tA}}xS zlUC*Lrq(u%T$Sefr(}iODq}OrYP^FY$%bC=*B^w?o%jXWO$*OSDxZJPkKcxP=?hmI zeD05Yu_n<4EXCKGmZEEq{lhHB5~g*C#x#m#aB!v&b<<0~sb2&cOITCNUNAF|^7yx1 zF9(Ygow(hf?4y0EFZVy7-PQ^V6H;j8{@59R(jIK3+{& zwd3}rdb@#w&IivfZ>827lmY1>GBukHc92gF!XN3kyWG2ZzsUWYp zl;p0ee;2CPr`f(>wi>{Qbtdv@wtS`8h%%+!QlX{nv{yqtgCYN%>?%HRz%th zYP;XgvgZrpjicYKs~A^&7FgabCf{mTWn5b5wWO}%cBv?gRu7iIKN)2FXM>XeH`*uR zc3~1cpB8YHMQeIj)AUXc-+=+S3K9z*#TU*L!sC;R&JswoLy)Au`u8H z#D|nQt-5Lq>1?-HcdGism7&G7u2jv!jxjwsbs6v0tR$WFdd#Bb;#VuPnx-w>WdwiK zK*7XIUX4k6!YxrpyUr5TdyCam!oF@ zb2Xc-${o$Vp-y54r2b1FND5GjR8#;6@Ki)@lTwoVb7c9Smv7fE2nb#}(i2|Lin?Tb z*=NJ5l{KtHUX4%Sj>Uq+iJGhB6Q^77Ijr3XTBhWczHmSI#;%4(02=WzW|>U4qfTlO zLL_;|_rVeIoGV8Kd?<7UcZguKB!H`t_=wXVvN4I;R}#m-+WOv*zkwM2Qyh0iWKn`u z#!pO`R~jF?&u?z>LojVX{Gs83GkHDM#SfWXmWe3Ox-<2ap zlwkw>#)FS(Ns_ZnE@NRw9h$0Q{)$Qm_ ztK$z#j7fW}>G=sE4-}(kItQ|SmE4h#QO1Z^wSPP-<*n}-KA5><=6~a2i9N||o_d>a zAYm26eR@U*yTPb{#fR`U9f2y3>a%S_eAfI$S}X|j&zQvtd-Abso~pg41pAJ!o&8D( zg>jTcn=9+3=wI+uD#NtQ*U`3t2=PT{*0V%?duUljwRaWuT@}mmlon3YPp9RsrqfYZ z(+AFx=L%H2(Gdz}@QXLh6AXER2K-&sqcSXBi}zGy(#pm!gxP0p%1|1SYqzIh8mMpe z!`?=K>+MqQW$1r4a!*0s_)e3{)2!frr3=}TdbA-^Pm#^M00_j6QYD&h) z=(d!~sZJv^+%cq!<^bA|?G~$X3cuKQo$Oj$JV&pSE%DgM#gRfo(o`oA6{dWaeJU!3 zpr#gh;Vd2sRFHlmP`M%2(o61$sUE$2QULV+;LE{<6{F9~DB^6K)Xh zPh!@*3#vGVix5Ld z+6k^yr=UaYQq`arxc(^*# zgwI!@3f7Ay$D$X8KXyrZ1ntD+{#53(u7wX7iD#8JJ0Gj7D*sj?kdZ-5Vt%Mfwm*!4 z1*N^U%jX|g+I`lRA0_?gM=H*rC`@K_ubCQ?w8gJ zCulonJd0>PPZr4!f({GFf{(f6eCJ@l3yJoflB?~uW#JnAxak;W(dZXwcySj4FOc%8 zP3|yRIIS;bN164a3u-~|1uHe+6bx1e_X0la{`^IO6tZe!eZ;g|Ox!R?f=RNq4O+-^ z80{=bVEAY5(Tb%X=Xe$wx{>3>=_ccge+pItHiIH$^xt{Mztg#*&rn*1mjpUo@iiNM zqUD&z?YWvF#LVi_>Evb9MFBtJr-)`PW;1hYxaR<1%BcyVoAJ>WU*@gd2GOiQK;Vl~ z{=Q8L-}~U@mW|?MJoXW7;!#C~5Q;+{I`jpwkltmuLLm&^7pTUPb!NPPlP&nH zWR%R~04{8}%`-cm%S+PWv6lq1wpEJp7*yJ*GcbPt+H84a~w(YZ{<=(B2`;%oQ1btsWIzftBgDOU>;X$g!Ly@>Rc1k z=06GGx0PrXbz@gbu5i!mMohZS%Q&iw>nK9sR9HPZk$6ne=pRer|Huvc#rOSvqj4Px z*Hf-j+b6G-7|66|A8Qc|d`ST?gsKVIrqa*`uD`BT?*q7wkV{MEhgxh~5bqdUmpJKd zH1-!8j`AzkRyDS=sA7feQ+qE?=p=d3dS-QEczN(%@ZF&!@1Kg?rAV}0tC480YPGkR z@8(hGt^~AuqyhqY`w0R%-n!7-w%#ay+}#yk^X?Qvw{VX_m9j^}oc1p*Nu@|* z-mR|MP&7>W<+?u&%(@0M7B)tx$v;fJxj`hDK3x}UjM%}#MG^9RBi<|&(}qim>$J$~ z&)%>-E6ox$;<6C5C4G}dR&xA#y-_E5?-a&Sr#SxHLZ@G=TV1impI?8S{oQ-sq!7A$ zPe(fj$O_T7& zhwQGSA9C7MUNFhut(WjOf^gdGkx2c!{rZ2JS(?G`zM57^zBhj$XJF;YiQ&Kkl1Cbb z7W(LaM4G^9PXvoE$!$fwM3thtm?LC9g%?0bZhK`T7`K^uvEabHG^3;RL?N0G))eR7 zzN`mWl&rIjI>kBRT^MvN%(D5hgPGmLINEU{wVh948*&IAfogxo{CHfq&Xq*bFV|}c(g-?R`=?}tL362fg_27aKivon!gQAViX+b6n;DxAt*!x zcK$W7d%$tBv&w%8 zy^K3fqaLCi1)(l|VCCJ7)8427VkS|}PIWe(sygl(-6R)kiq>-RxEZ>RJm;)5@>C?} zxMU5XLifb7cKywk0w3Q1DtE0=&PbUKctFO#)KlvB$Yn#RRMZuhpZ+~Ko& z7k?Yq@n@2{_^Yt%)@fnlX(g*y=w`3VQU^$(X&zg4owS+GKTb%I4$G!z?#K_4^fF2M zi&FBU;$|#Fv8bKhd%r3rIid}UjdjYVJpQy9^!v~W0LU#`z{E5m_Hwjlef`^8j}Gz4 zB_4e+TKxesa9)x+fyU9v9TnHa`e;llyq7dBKyepe;SNXiMVw>ZuXS+py1tGP3{&mWmTJbOlNgqy zQC|*OaL)$89=NS>O$C0 z$JFILaJL+O$Tg!4XG$Jnks}W@eqZ#KTi8|D!@E7s37AKfAGP_hY9w>(uS976T}0&f zi+sGeoR%7S{E?Vf^1>{C!%my`vV~pPOO)m9W}S%t+h$ zrp>6*>DUT0wUWN6b#1i$x)5^g4p85N(oE-_F2apu?hZ7opb);PC1Y&>id=cr>X24! z1;uIXH2eOX79j=k?aUS#6--$d$iW=R_DGkVHi6JmCx)h|B=>fUU!aD@-Wbivroh43 z8e^0f*$(sEW5ZE*u`b_%Gl^RiLO&rR|FWT4#>GSNPVPixGJNexf? zd67|tP+7N_tYLu6i)eiD5$|-(eJ)gz7jZHXF;wjQH(Q`ScP2Fnf8vR|&r%ilq&52H zvab|^IIwY&dq~hp*;DnrWlYYwLy@)|-fEyA(ZWoAbEkNvXE6}qNLPW%G6X7X3y9Lv zG`V&{XcuXeez)k1XJtE(0EHGjWu`_UQBQs-nNNXu#=mT?0XJl^O86qaFe8=!3LG)} zh}jSYR7x5+lFc;di_l2`#Mw-_{KY+-mq*?IdMewqSR-V>k{`?e2^=;0h}#gQ!Zax( zd(N?s=<9Dx-FrT+_i>+!a7+VS{oIdT{N@oJXh;+?VhFW$L0`eU*Kzh`R--Dpjn%YN z*#wY&yzM2L13pUZ`q|1=3rO+d`QOEtNQjR-DFU2=}WGM=$Y6sRS;Bs7|(BmTo10s z3==1f6^lStM&^z|o695dmd3E3%0dVZ{bi}H5ZdE_L#~fdRQGy?s;s+NNvfZmdLbnxp43~B+gcL9%T2#ZqX4g0A%Bd!^ zj2b6Qo0s$#H(H6DhZktF5WrOwjB8yX%ta>EOwfp`2rsjF!YRKXXsq+F zTqI{31A8YpJUOavx;f*B;6t6~lf`Z^#J>PT+sWSzC|pYsLNRK?AVJw$2o2?r98aWP zUxK5QpSbfRv@J#zI6M&KD?#xKDrkG*xAqt|fV6r{4L+~A(RD39^9V^LQ<%)0*e7LCInC5R}MpYIK8w<=YvhxOU zQ(Jhb;2WN&;0@tX=ZO%P;`tT@Np;Qn++f;d=!C<^LvQR7*qV^`MNT1pK6T~KSvqf4 zXOc(GbGMFsg$r}_+dwqD=v{nP9nVm7WCb%d(rr^$Ug^2{*{dI;c9027IR0BlN9Ax@DOez-n=dY1>kGGHcaL_g^RstdQh~= zZs8rgK6mJ`hLPC-Qy!;t?2H~{e4GJXM~9YWEj_nZ?|P#BV9!FY(nyzq+#XWIC8~q-;8KnjZ^sO^PdfW9&3+)qg48XkFTEU43Ih0~jLdX++ zNvOJl9}iAAS@Za!TAFT_Z$XW3zPQ8sSt2DG+5c>b_k*&iN|SGQD=vaX(XYfx&5v7 zH8EEV6K7^S)W=XX3SmyYw!yXxn@o;#nuB8poQP`9CbW8Pg-E{-k0Rj%P~@a#oT76t7?spvZJ#S zDv_0V)!QRURP}X! z{>+~S%2|7=+^4V^Q`R*0+Q8=-Q)_Oiv%_ipf_rrHuRMq6)_;0DhWcnyVkouk{x6Wv zzbEX;s*~ud2d|X#o!_)X;)-h@f>zkL+F>E{S5*ms-nqTwcQQgJcYj|xgk}@^G zZk{@wzSY?a4qIfHKvSC${8dSDj`UA5MvXrR6nPfaWW{J}Qu5XAm2@TB%%u4?YtKc+ zBx`iS=}AADo5v)On9fats47yHLZ!p3;3orhcvgn4qeTyQq_PJ?vsSRSUTmR}wD4 zoX}}$#L70?B-nHAHJabZ4{l%ZqbFbEUhm9%3FA$j;wBNT^`u&!zerOHSD*JauKD4| zAL>3oU(@m)LD;{ori!YTyNc3u9iG&|1aM27+#BJc=r^G+n&MEqgN4wAj4pFCEhqc& zh18s+`Mk#`!=K-E>Nv2NXszH&uO(s$y>`6ooPbetfUq^xykz0l3OzHnv9>4G)FCaK zr3RnnIbKkqG!@sbsa&F+^)XKoOuBFoW4LcCNV|CF`Y@{umGLjTc@FLoB-g~c7|eB4 z*^A+Iwy!{;mKUZhn#dA+U2kJCP~oKT)5y-julqHv`X`gb>#w&>Z8J5^zlko-?O)2e zQdw8F04zqo36~<=q41rY{ErXy$E{h~QR9__siC&4!JI4XASdH z+2%tGJ7&oP4LNO-Bo+fPdYFSPrp#-7@!k;tCM_fROHDn7m39_c$w7;_$@QQzOX5+( zEIYel4}lsB9Thz)gboLr(2SY=51)-tVK=38_+aS;y~6b>S=lMRU~RY>Wc)}sl0=Eh z90K05aYQQYO>N&3yEwkewqcj$3UT#L+R=~#S{S!hFx`bjj2eVH2^wFqb_E+#-t?-* zMNz|idn+vThg@UTwL6j&1xwjEp*C^)$HTRI&r9bAo4yvDdt#ZOuV5E^M>VnR)jhh6 zXMx6YQ!RPI{A3yf7WLr*9*sXmy(L~G_sJ+?ztI@H$5VRbFtg6yu(=}Rpm(}E{kB1m ziv2KpsV*O;BnD=mfu*2exPb%(W12!SF?HzibQ3{WgJA#NVTO&FH5Wb5+!%7rp_w#c z)`_oA3mhhRJ2Nqj@O}=)Y*2syh&PU!99rhNpW|+op_(=nl&xX2SHq-sOrTKBrld2I zo1G=&8U%mlc#d}LhPpJ1jxIJV=IKbw#wk#M}$*)FK9Y;lOE3nFxb2zT0FW%lGhpV>&h zH|(oPrMpTaSaahPXDBg8V#W{>#1zb!p0P%MH5XkN zVqVqZf_^NRvySr%F)O9|HrX?XvK;cLQG?_{y_~+{i`XOeENoKwZNKfw0S9GVbF$jG z!;gzWfZKG69$*D0M6BKh7*xcuV9b^72*BYAHLQal=$v@q@GjQQ4nMZcTW6!eThS3h zl`A4W;g|S7E-d5@YQUm1Iu-WKq?n>Qy^8lcvQ$q`{>>bi?!r-lmwrdQm4l?_2H2_Z&th2!nMBh2hKhxEmV?A0!ulqOm<`H zi>OgpKG=TRJg#{ywZ4H9)Ubb+W$3xTYU7d+s<8=+PxBq1@nFqwNZTULaxgy~x`W~* zErrc@am;)ON%z`9T$5;T>te(1W2)=JS1~DU0`v`0i6hDKZm{&Mq|ol2FxGVFTA-rJ z%`qW03_-B=&`_nRpdAg9_>}DN`0q%2iHE6_k>JJ)Tsi!QlC74n12BHlskl%j??4ye zExHmzSL36JY8)G;c{2ztq9atih+m*MS6pAcs;D5my4xmhM97dNm`gPjb4zH8>k)IR zJesB}&xJJ|r7n=Aa?W00VWJ3H*f6f;!iX%hb`}}8-=ODI8N(W+n5407Lc>X6z*@im z->F=%i992l^!E>*NF6wOg(6!E6Vy5xA5Ni~7HF@l7D+;=+;(-qjzjG1GDhv<-$nNL z?vvpMMF+#yo22GjM)MKD?sy;s4Lz zhGrbv5}Xisi4FWjKuUVf@jD!fEY#l63lF;b$R=)4p91k?tN4{fIn!OWw3b@_#uI_8 zVKv$-sY82gTa_8T2qAw7#A!;ATp`H|LA78^|N0eWqrvC>*0r)b zOQvkmeSSzn%UyzlwM{T!zs;$1yh-;H^$B*)el+OmFku7|Qwo)!vcH>V|LO1VMJL)-OTBqbVzk6c%3hZsh!M}1mHYoUoc?p zG^T!+B>jEO+xV)fqSRk4fb@YG&x>$^$t8jTd&~pGgqk)t0iMZu5o{ztoF>ha!OX>L zHz_O~O5?vJtz7Tkj{X(9Razt6-L@N(J>V~gTsE(Z<6C#+G#aV^iPgH?N5F?Uu;iA# zoR18u2k5pq#rt7(yHrnbyFiZqmj7e?rN7nu`>jjY!Z6TTjDs38Km6g8j^U4w8G^Y@ zpbvWl!#%_^OwxoGh9clK6?4u_(gV`+s5YNvprF}q>F&ZlXph4Gn zGivGQi4!SFq=3k6m9xkg-sdLC} zE`VJzW&^JUUEID=?4z#wwa_KpgVfG?V4WW@E@+;jUoJUu_T8=IrDgdk(=tI8-o8Lao^;e!OZ}cP{@JoFB@5sBkrP$@4M8jZ(iRAwP0%-{@s8 zXuWgUxUP&km0dg+HPSE@Xk`_;TJpIE!iQMJJ&&jjU8ulChn}|&*FGIH1*)5|Q=K}J zH)fo?(y=?oB_(H;DQ|IZhAyajXYssCN$l%KvBN7MXX$UkL89xIK6O4}qR-*_ldkG& zJ1xU%HrLE?ksySQfI7$<8_7cGBECx;*wgjXTo$}A z5RHf5-UMbbF$eHIX11gQQ|8bq5RuC^XVgdJMKqGcS3avdv8VL5`++O7wSI~bcC(13 zz0v%YlK1BCYX!!H5)k&H%j8y%K9q5-e04>NRBMksGn2eFuVE}tE|KEoV>ImhoR3p0 zVTs##maapU?ZT=3)>fI4d5AINsSw>i4I@eA6}0uWI02_5ji*|~d1A%dR!2@gRp=a3 z65O_YrDn-V;Pg~v*33Oeoff6eoqAT+y%NSn-lu1|1_%B*d z>)`_XGADgH4%A4&A*!kx(^VTORn!HwBz0{rfn`=-_`w+U48^p-th=MO0Dod`NC?G7 z9H3W@wsLmmSLun1n!K?Y1^#u$Qdh+6cp7B0BC}o*qE1xCHKSqI4F_jx~a_G&F9yI;c-Zv!*Cw_8iW#=UL>r$IT)^+G=+Q%;bK znFc)5lcx1Th=fcttutT0xdOY602llEipcfYf%rytyg1_Vs&z$elMqS*w!HF(RW~!8 zCB+dYk#g*1U1CtPH~~Ut6&0ri)5}{!-}mv3z_9pN-;+Rg->TG$fXoqxcirpiSJN)k z#Y(}7f>5X}3lHpz5#J$DU}pJR2S&5jCsC_=tJOb<_WWKMVGhpwUYRP6;S&JD$f(J_@5Ft-CvRc<&@L(J3~E>WGHaQ5N6fU#hY4BY!X z6+0ahuI-A>NB7Gv;9PAFh4~ZQY&@PUhJ!jrLa3=*EUm{mCYOJgZC1sS7>UW%Yq0eS z%W|-?O&MECRifZdu&gM08Hoi(?nTBq29(4%38zXO9PBQ&pUU@dum5`8g4QNb-~~pW zA51SD(egK<;IM_grz@x~bwuom#@m$@Nrx7a&QhA$!_RUc^FN{a!d3yN8IszI}imoW@YQ z=$w-0so-AMPa2hG4o5u;PR(wfC7kRpFAZR!ur4+* zWQPhR?ZJWp6OfNJ6++Jjr|%1)@sVXdhqUI^I7piK0v1B3>q2P8U*syVkHzi1ed_Mh zxT_nJ+`XJ=vl^yEeX8S&A7a?vOA-#ZFeYsEZvoO9SkJ5+y}lFIDxgCVuY==$lJTwA zPFHiSYLJvfJAI!!Q4)uSKW6!UUtlWPaUE`KCe1#Cu&=$D%O>TIwc~G=S=L=(a?J+U z)=8m6Iq(+Z;653|=ooF~O{9KV+Q)R<+TD%=0=jB`hVe=K{6(pdq)uP>gzcq1UVGH_Y7%;t4vkh2vIFThCYT-4~2@Y)o0L1wi|C=#mgQycO(Jg_-xT4Eh2KK zY#1iD=eMOVnOag7mXom;Oi0JBiG5vGb1F=qZj3EoxPvK<=yC{_zQyaO(%rmshIkqx zgpVQNcuyw;$$3;h{YGJn?1&BkQUZzIrKHpb*VGe~fmb8v2IZ{xPm*1su+{14^D1eU zE&+!#K4-GiWuJe6F4^{^CAE=GyR*XJn6HwO`HDmnh~3_`$K#|dTxeYsyn^00M6%iJbZ6r=V9^a#@l#*_TtRACo1ZhUjvQoYdTI~r&q1C4h*kQ# zk#GQ2>2UEJ?HIk#w2+p?OFpwnCbqU1B3>FsCSM^1tgGd0=DI-wN%mbx}I z&Ufit)m}Rd4(WpxM$_CqXrl$7m?Qp~J3M|RT&)cD{RUVLnV6C8GdS-T0&*%APnlH- zwgI*ZlKftyWPLnD2z?8dO;gXBgsLET1pfFXK(sYP;tWBF3gEeBXyZ70Njx)!uX{<; z52poN0dwSl!Ds)I&hAgza8A5^`>?***m`kXEq&*vD%~z2wQ-iK2uLC4B6fxc^Ks!P zS>DYfDy)v&l45=pU26lqn&qIL5ORJW-42~1STN?HLhGLhD{8|=0o-1`Nf8xEF!X5| zb+QHwziiOb{^3VChb)B%Q`5pbTWO!1+E(%cf2%_Ns{^@V4CtbNb=34cK?tghug z;Yx+;5eN?zUp`F3u)Xv6DJy9b2S)Mf@4m?r%*qpvbLO)toP-L~7l!YtUar@_;5UQNUd7M(mUyBLttCanP3nBHRgRcjk$$K{O)HsPBWrfg|`99C8mo*Dm!W;5?T2oeZa$^F(CYpuYtFnNY z3W(<4f%!81A~W(*oD2EERimg_qT+1LV_#-{bKP|SCAfd+0}l9E6MQYla%!l2Q5D!J z71{g@kV(UwZivw8Wz)Rm|2!byc(o_HiqCi&`>woPH#~-$55FH;Ui|;qd-JF!&vk7a zYt>y9sUXmbK&yhvlwD;wMIc&56iN|5QbE-?v#yzlcq?|onQH8ju- z)aM4Z=BWv$`tNnTJ7_CtU(|j6qZw=XKwW08a7?IIPFGp5o~zA8fmK1;ku3c-+KoN0 zl5VwgY}2O}Ked60WUdCPeJba@0oc24uNqV=n0NjPn(v^K_AOM$%{DZ)k`1f)>}ndc z4FOvbjM|Kk67&%VYJ=7M1B0P-Oy!K$nUtjZS{*o8_BG9YlCjtiCBZopKC;&q(M7>9 zi-*fap<*L&6@)PMVA81tJJFX19WZ|qn(4QVCTYBz?Tv@4Ix0^*7^;HjB$>eLI7paV+_3xg(8tS6Yw3S4)^pCt~Jw^rdq zBSno5tC`@C0Z-lCmdjghF0;5$61p_7ToV`Cpb;jMRL2zO7u$kj(tC3uzdrO%2*S3z zLcWCub`D38uFa5?GuSXhMdTFY+WaC+*5+hZK5jclqH74Z&U7gWwRjy;6pg#9>0%;*0J z5FBy^E8Txq^m-19Ts$;g=QOyF&Ell4geJd75OH8%X=dXhHk5t>Q*y`nY0rTURmFs7 zFjmdbCpjWHx^t($PgiJEj@y2;z4S(YMOWi7K|l1YH9r1;H79k-3vY!J9A*3IkIv8de7w@?HQUy|GTzvu zx=*fg)k(WuDk&8hwKauCJELw^WGvVQ+nd~S8`T$$m=AD_!4j$u2KGP88gWOc1#yun zP0kEX%;+-zc6c^p3rBIUV=Nxs;5P`((C;g1O>0yIuoNk1j=@~B%3Cof!8{2AqG`80 zy*#nyC>mv)hk|8n2`br=m@Ca1FnZ3(z;iRj#g{ObQOw8c!wTGF=%y!YKG|ybZTRV) zivkB)#Srg6h;^oiS1vPbZ*u5T^G`1cZ5pA@T$0{3%=Scv?nEki$ z@AE3y!~Aen8JBgUN4+aWfqUvfvGff~ORd-53}dEA11CGt`*6PvS#}W4!sk(S^B097 z?nRp0QzCjS*FCjJQ@x*z>2H1tN~fN-IpXI)&ouodxFLt00cBd1-Z(;GIiS9ac*1A~ zME!bX-zqepVQfp^nrcdep$}&WY`^ik-_&G}G!A%3$I1`cWB{ebjx+t*MenfS_c|W~ zbhOx7k+M1leJ4r_t?cGsO=tD^VL4yIJ=^ESJzRErhIu8Ovu=mIBErL~>%8J>Hz3Paq%|KkQFsM=!va7DcQAT7H^b4Nf$O6@%wrbFTinLj zR$0Q(e3DRnRSQ*HN_kZJXA)xG_}bdJAI4@D?W(ddZDjV?ftj3etUzlIi$VyR&-4I^ zg^RBMl5;VY;YAyo9FCuo-0|Ag+Si8ZCi-_$JCrb2hJBz_!%C)zLmsXC6MCoA=_YVb zxB)xEje*m)G{&Zs-7H#;$J)iCb|b83l(@{Hwgisaf8Cg(U<&aB`bp}qE}sj`4QuP_ zn5bQi@sZKC6_e!O+Fs_(z}pFOm$6V#pu^DCQp9g=hsJ0}!K8Ex5;Rbc$gqQ(A9Y+1QzL>lXS zO0~=A@~z!L<#y1dxB{d3@a1xx7=YcqldIyZ?;r;AZRCmsl30I%`l@hG%nlC6|L=CFySMpy250*zIDvO8snPwOYdBTXxr2 zSvfKn*NrPWrx>8?*`nBnGT|(I%Kv7pj4*oLrnP6T-0i>xs)vT-0(Z&ry<03+GcpTx z7b^2Bb?pas9+NDA3w%FyVZ!~~UL@*=F$uRXcQB+su|byFY#O}z_)@cq6{{YdG25s4 zg@z#XOOwZ0p+nnng34_RJ5kr-qYe^f@jRkF`JUW-51N>?)emnur2V$_sDfNua`{qVzN0?JjY4Grr14L~Hy;&&%P2A%S zfK}XiuM@8!E*^I4g|fA*=`?WrQ^5d?U=}ELA*eusp_^v>TP1s-yK<|8cK;q>m^LN#MP1pGb{L1(==uw@$`Cvs0_BM~5q5XWSaVdq)$ov(;*x8w?Ck zQ~*(Q2B#gJrpOe$*SX~c)m0z9+{hFDIVRb;mFIB}^p%kV@t2C)eGJF=2a4n16!B{g zx#lpw+DQf`FvW2S3NW0p>wK?s&w#a0a`?>$2H=iZ>c`G`(ScMnVw?KwNn2PDBuf8L zMy;kz{_}}f@g)bc*lKTseONgnDXFquuEs_6FjU)<_?j;&u0Sgq|C>U*KipdD;Je5c z8Kpp7$nFhO)c!#H7y=rPbQ;1tRQ@x-1hN=s8R6!7F=YBW3eD@nimBVGPHH|;ZP3Cq zOp8=D`Y2L-G>*h}7hkCz=je#rZ#f-!q?eSAO^T#A8SI6B$m%oS3^sNuW}aj&S*l!% zMy5Nj@R0%YE*=eD02RLC_DeQGw9oY*MOA&`avb1wG2Sy8?&@8i zqChN#!K?fGen0RNd+JVrYq~j8 zRhFy8DbK^ODoapRdPvQ$#K-B+xOC?wa90;gw0{~Dj4;}3z%00V!okz5FLA*`u){k1 z&#O~@cjyMQ!Sv4*6fX+0zyEGvONBfzZ`fkHpHQ#7AcGIbsP&Bf2-9S zn!Rhf+doA4I-;c(G2XrS;?UL;=U|5_A7>?C9(@CyjwF`2?c&0ZHpCSUrm$#P9NyOt zq>!KLvR__^IHBFC4C4uqX-?g$kghX7uUUKKKK{hAZ0$lsx~0@CXUEVtIYuMIO{g8Q zL^E(Q1LMP_9L!(dt$PP6hTJ3>!SA98qZt4azn;$Xme4#$SK{3Ej8uWP_|n36#ogmg zjDKPwPbdm6>OO56Sicl96^qPkXvU!nsQ;Q_@o$M-e=UwmxsCx=u-Yz+tZ^896yU5e zjETJWI_|bQkz=DjNhX4y=#}sAgV)rt5ed_Lu$e|Sh3sEnyO{qU=v1x7Eb?W&K!J!j7wG28sNtXieAt8WkXNsg=^*v(#il}zbTLj&ghpwa_fE^q? z?O~7q_z+?sV8=Smht2rky-Pdh-#_yI-uJ&czF}Kb5kO_XE)jA?3z0BxWbIa@^sMpo z5|P|(FNePwnWQgkhYgMo^$i}{>v2A;vjq zxL9d9##joR>iUTuFoM$b5=Zr3rwFpIL9R~@EZC{Ycx}q`Z4SSo?j|}t z1be~bv^^fDjCQUyF0-Db*VqixbbZN%lQ#pre@5R~_a;m4RnmSEJ_9%4fNz&(6B=TS z5y0rMi(!!-&Q48BUIZ>?5TG2wXuIA3`e;dflwa2&Tf8-Z{e(~GM)nhW9^JZPWEwt@nhW+6o?bv zk;?eWCDyqH^w;E!WYzkmLNFF^>C0UZY0Z$Am~D$payfWz%r-K}&p5Jbn{zIUDw(Z~ z`hh(Bjc_2;vQ)zN197Ys##P(&bA_{tOu{{!K3mwsxZ+@$UpN^*^1+ziwfD+uCq|i^ zUel0@@Ee+3Y5p}SMCa+>8@~SY|07J6lJFwPdsB6%6$gQl;xE?aE(&aOX6xL{n zk9x;Z0V&_Ec$R}Ger>;ENPz~t!kaHT zvXi%4x&hSTtDiu`mdS*mL)T>IQ*Cnidnj`RW5;Ch4FPF`u=AMZ!5ShT~jb zhXqnjtOTTZ;<5sG{KIN~GJc-wSc`wY*YVSu%yOr`p}s<^deyfdM32T5R)Z#f!%K0t z&Eb^xv4~MK+r~~`b@n*JNumVx;q3s|O=kxemq-VQlSxR1LSDJpa#o3O6tDV`2NcGV zS0ATiuBwk=k}O(-T*3la?1-3P<2VL4RJ6iSS^GI%QJ-7}zJz-1PYk5XrYsTSW5W(go>Ce;(o)OH+mi#uX$cS94btw<8_l3_(-?p+mNig*YJ!sOIq$Ni z=Ub^=<#d0piWM2k0H63d=wU_^-1vIf>G7_i_zPJ01-udW8J{0}Ge}a`RrPc@w#4k4 zd-O9|t0qWLaFd;$hZwn8JRnKLGXI|k<}xb;wtWqhxsr_t&}G$m`wDq`+88MPv{O*^ zcMf~0*HR?a_JkD--|NVZbCQ=7H=G7F9iUGAyB%zzIt& zGCk)u^q@!PLsdm+Mm!nTm`&WOk9;;MvaRng@*cT7512Utzg1?NBd2(EhR1_#w?J_W zeM*bfUdbh&EI91Y?b&!6hm|kARsmvZV*V6id%|78sk_ahh^s=C%9$Gxzl^tg>lByS znU$<`N&tIvEBdG)FaC`8!v~bI<)CD~A@*){R_* zchto#k7OA)Ne@wl5lV#FT{7{aQh))qOzSluUBqC84KU!SF&6f9GSnq>m0h0+^&dj?(lGf|PhY8p^T)JO1mM4LD-c8S}W z#mtjCX0GY9X*vNmewgm?zsiU*#ukCo{#(ljkQ%+rV9Mzs9eVlpUbd!$Cfi#0 zO;USKxN4UtJI`SzGsDoDYqcAgWYofXOIS_jN3@DYy=QIF##U+wB)0kh|{$%w37g z(8|SVY#2XK(t|C3nzL)XiJU^#2K4kF&+XI3wu&G z0=P$xg_1S1;(Hgv=aL#%8CP9=l4jFFP!pw#Vrpusyfc7|7Ol{qh73KFn%^WY&JNl! z+IP2{B{sY-GZCi2otq>b(w)k#(=&k#=th&*YbO?%>33XA#yZE-5m!zcW3- zUFno5#C7lF;hJ9e&S>ha^D^)^-J?s9?$%2x6&)yE9a@kABoZI$IN*J1-zdRskPx!8 zfA_Kru}h`lJ3Glu0Gse|z2Z#RsO{M7(RlN`P55_BT~U#H+A~ z0Zh4@hmr+4uO`lbLGVN<(s+NdXvBUYV?V_TO*D8Ur=vPlbya_wm6+%395i% z$qO2Va91~yM#O&0@R&Hl3{1%`vu)<@QNP#OiwB0xV?NodT?SroF&XaS=Vjx^X&vvm zOfpEG;Xs}htbpV5Y6BdxA+!cjQS~*7y7-zh+%XBPrK#6+pm;i@ ze@AOm(|l+69`u5dXbHzk5Dw9#&A5vKU8jItlL5{7rd%6h58RSc z(;{0&0k^K*XvOD2$)oSDT14Y!A_BRc(<**SgwFT#Zac>u`qS(ZIrb%=-QArQ5|9(X zU((1LY}6J46SifxuEUsDTGq=28@#a?Ggl-=m4nY7(pA%6?Q~6Svx@Kk#YqTTu4flo zpo$J)Zm_dFUl$0r;arLVU>(!u4|vy|?h&X8W!V;z<{joCq!4H?0 zkTCBlc(JRGNvsN%5a8OZGAS>%CuQzNfb zN{G@A@5Yv+5-+H7`6)>{m!)7|D|zXq%GgxGb>ZfB1>7|dA8ZyaC|gQr#n_*h{oV6aH;GKQdJolj^a z2#}koMN!#v$hR@IB4yUv@ejWiDnzG$l=gK~^u=CBaM!dUQZ%uSEbUaBszBQxz%)NP z=wNFn)GmZojC<{;u?28Fr&t%fz9^m#<%PVG8sBnpYW}8SA7|zv*M<>;3@Sl%EO)=i zSMe*gA(Vk2>URyg*_HUN~zm)-C|o)y>j<<0VY{ku*~?|K+9K5w9yTv)nd7u6XMJ96{xB-OEm#h}%LL zPbeIWkAD+zJpM&REE;SNE%E~tp2HyD3%SLg8mV$!gqJ+#u`wAl@yc-2+J%vI1H4qH z?h>Q6u+W&!b2(^M#KRoQzWx=vr^?}3RsXU-^NqRTZgJ*;08BwrH-hS+YUVpVs}wnW zOSfp_n!W2#+B*$tg&0B-N=Bb!o@fx{9hR|Z?H$1Ti^v|b<-h9(wGM+_wfUmLsk`X; z#mzCqS$MxJ1%@>&3+*I>E1IF|Y#2&)3Oo5uelosZJDkVN38&`VJu|D~J3W`fXI0qY z7_EzhORwElYfI{TZaCuCnVEZF-2Y^CXzoisRXIu*gGxBOEwR#Q9=4_a#q3OE?&B%1 zhlt$=0(@sm05boJ=}Pxfydz6K=`gh5%5Kr>JXD<#+!i^ebrsfo zbTrANp-B|a$c)i4USM|z(K8u`pwB8@lTIsGo?e7fJ6TKn zcuJG3RVAY<*x9bDHYj$ywlA~s<(NDj^!)CZ8Y>b+tv!%u^Q~95Ky?;Uwg5Kn@$C}` z&5zhxgahIdagD&|qn5E@3y-xYZjTc=atJ$qiN>(jruX$zfO``m4`G;^VEs11@8$BC ziS1>TAMZ~{N5X%^a64i46SR{0?Wi*=Yvi= z2JN2f;3GPa|3PZ_ zUlaSi{5bWv-L>wX#1=}ePEuKX)7ZB}12t*euNUNI7lyme_u|i1FM8B58_)K2n!W{x z%|$Z4VBVF95Bv2zrZy%;*Pe2#?}L5u)!rYZj_)vKO^&sxpq+@S(yQMi^~e^q1)i$r z2FtWx3@$l9+9%HTlIfSVBMeU4%S?v&G_`9j^Et2^!#&+ezh>8kvNsDGe+&HYV#pG4 z#xLX#EcDAo+F2NH<*>skO+y+b>My`j@h#rmFuHVSaax-@xgFx-HF@i9xtZntnpA%uQ5jt^)AEi(xQ$~0P3(oUvP zfg4|r6cO3`WETd-_P?Ngh@3rkO#Z>ZQQvv~Cy5a%6E=Ivr*x?{(f3I}H)iwR@7lkV zR{ji?)S)lG*Es_2pW?FKF_(1$@9n@ezYR407FqqLAdmMVD#i!2%8*&~Imxxj`tB~H zN&CEiaA7hYW0QVJdfQue(b905`n$Qp zAA-gQ-BZj=8D+NHo|>8m4cjE2^<1mw_T|mi_qSbQ3|Pe}lbeM)lW&PfZu*h6{WqYb zxYDEAXQ|CL=+Tud){K+7Ri#pM37tSJ4r_Mt($x|gf_brI=6RG|rEQVeyK&wIei!p* zE9dQcW;D^WMe2yVFAPh$MYOHIJq)II?yv~X4xb&J$?tWBZ5NDHh8APZMbFLGBJS*D zy|yzNTgvpaE(u%-=TI{nZ>e0kl|Z_-3FHVywtOpne()R7E<`5QEdXzn9;&T%=pyB} z^|3B1w_`T9GbXs8I}H)-9ZNziYBIc0`oW}WGI_c0Rj5@{Cv>b?++n@QW}v`^9b2$z zq1dvxn%z(6*+3|v6>*Q+4)u_^Jj=k>z@5cOjFLsK|FPj$Qd#P3+1?5A{A~Y9<_I5b ziIL5!qf%4yJ+f299@c1fyk882>@3YDb?xShoJumz@kzC} z1F&E=@sMLOjgjMH&9~R~7Fdpu4r|C_S!Yl^;_ml3V*#OzMLVH==sxdPD1zAK7=i7; z;Dr0M!M`iDc19^HLi3lw&PO`3D?em7v6C4#wV3>A&8e1|%%LXF`;}>TE2ll*ZE=kd zCD<&X-3jxhWq15|{U0w}+#zhq#L{6Gl#YiMUz4^~PHpKK8q<1bB-GlKX6$HH-fwNI zfnYl|jB*fGvMKG{<#T&~;2oQ>Z`q4qSyGxh?HNrMJLt6`(+|gxsm&D>GZ+>kUMjM9 zUDDdbIP_j;XD6{=zED*V3LmY(K+Mcc!3VE8!|WXk8XZ)=eh{ zf)@9aT{h%&X9UNxWX+V1+c?dcT`aHWYQdSbj_^*q|5#))5lg*5|C}2!6Qhl_@7!K` z3AjX=i%}>54E=a|Q~6-%Tmk7M%ARk*8;7YfXj`e(VF!C!=)!6u)|jh=s~E|ovV|x8 zldCuVN2+L~Jk?i%JW-3IxE#&5`Z!dI1^^9O^t*=4LxvRyy&T&Fre?`20F7zoFmn-K zs_T|3!I(S1NW-wsWC4UF8~+5;u;*-=_RC?DZlCY-HjH!Km$mZQ6P3vWPEk^@QY>`R zG=_Yn`T4O$aXZJ`>sz?k$)`dHtJq(S9pVLGN9j}QMMjDkc0-=~W$T#j-ob8^1n)Yef3y;urVD?hFlhuQS%8rOY5ybF+1TUE>io7ejR|S8tDQeI08SxAi#y`xg3wF&uED+d#W| ze|=u@(b4d>+gh&+L6JW$8Os|w`}mY(E@#25Ydg(bCc6PyeOMdRZj$J8aMCR}YtRUc z2Qc9u=3Luqr>x(hc7%l>KP5cjb9ycewl2XF!CpR!Y0--1jPa^%8wv3F6gfgjsMNah z7G{+x$8nT{pvSfiEzNUyn{*QG9x0a%ae9&x#8fa&pH@c(wuK0NGXPu6RG@#7u zjcvvW@>F?-skCnjV@s*uwzv=yTMl`aBB&Ds>MWQDcYpnl4~J2}t z-Rt1`oAre|#Y|PwD9x{@ieh z_S1!;*qK#k=xVvS2aQ4VDnDvxw;Ox6n7PbIqNJ$I55-k&OUPaI(MLQnYH8Y+OS0a= zbW-_2THx+hhumAI@w$f1ku#;y<#|@D;kznAl)& zm$YZCJ-usJpsBgAX76Q#czeHeiyE4>H;7`r#94W@sbnxT@Rma_%ibtM^{k$n=Z|S4 zKJSRNj05>i5w%B8sXw=sJW>o@^3q71bRH3#bKoIs`PBDyZl@) zJrRuov(kXc9H`xHO7q;qs}tbx_K}vn{`_HQOr(4d&o61XA3#;$6yye4hem3(29{7 z);6Y=s_c6GaPFh=rG6!$U)k*?M`#usKBgnV0$tDPDpm1Cr#Ee}z`lU}z^6gq%Jpf! zjsQ%Zr=)1FlXTMqdX}(Bz>4+t1jpXFxuIda^*3Q(!w(PAe3mhr%08TRho_3x)QGV< zGAVP6nqK>tt&HwMJ8;!WAa@yW{MQwL-s}(0VE-w(@3{5sv-_33h;vz>BWP_zpSbNB z7;sZ#cE!y-)DEopnQz?as2H@FwV*Y!mKpq2S{bNCwgyTTwCFwHsr~Dv;(vYN0YY8aK0XZ<9jLOEZOUW|3u0X}7PcCNa2J zUVv%|41YSsKWYs-23@8f-km|n@RmNGM_Z$onH_kV0s-ZmE1EHwNmtNTa=!ZIr%V^u zPcDCh*e;Gp-D)o>A^;Nl7QlS_s5M(}$DwNU=rZbhqWu_(d`ga7C{XM_RFhgp_mQ}@ zZ7aQxxtGZz{I*ypfnk$SdmT@yx|Z~}&2Ojbnyi+uWDcwY~?4ax?7 z4+p#A(yKKj* zyL=HhLU^+tH{;WL3c9;C1Q(~nvPe>hcPi&uBKL^dW#k*xdmTO39_CP%NU+S1f_g%L z#Ql|-Gf5aC&uwxLZHRlrp4+pR5C#|MDYtlQrx9xhqSrg-T9YOD*;piKK1I{iJwoH1 z6}2;IbR>kGd{D!!>|IGv-d~?n-L5=FC&2a=BP;+HeeWW}Dr-T`SY^o>OK3*&m49%yrlWLI z!&x5LpNHl9o;9Zc^&eUd2xrIM!fnht`O)dGNzlOj;TIU zM1^H^>5tC}_qy$h57LVl+<-7Xvp4ty8`FmrrPv6k}_&5$RJ_awWlJ+Ii*XO z4*yw+{08bm_V`ow?uX#dgS=-d*k~zgiDHk}QnE&qz+4lIt11UWFJzey!+XZu%u*vX zqtwin0D4Sk6 z7|K_783esTe>K^kckdyX*}elt>v6`Dx7^Z+nP0>B36>?#Ncz44~AW*n@b2?vdU`A z`GLc+DU@VJOhs^b$=*}Rc##%N^PUH1Z5nP`^-8l5Z=cDYf(_fwgsM{Z&^qt0FRZ5O z#_~O=uSBc)hdfnVGRg43JZ4PFZmU+x0I;J)#SSZq_}xIflA6vo@haJy0Y8!BHek!Z zb}~_KFyaJIDd&p5e3h7zZF=BcLx@-Y=c_&3oJ7j$L z$umN=MeWmBDwd{MYV6}XO(+>R=akXwZ&Y`|VL@n*`$(8E4AV&&wfiF10t;?tSON=6 znN_+aA+TAVk6x)EHT|{YLh4@*V_w;bKfkb&+}}DG9?Egc%9}+YWGGH=D+Uf4uR!gCRc%lif;pM42m{t_e{Tg8Oq-F5$zXDpR9mkOdGMg6 zKy~86inX~QDmy9EQ(3{|fF}jSuW^$eIXw3=ABR#9JFqZ@`P>GwdTY`4%%!g6qEzx@ zOSZKr9y^uwx04F*tQ$q3g9dHtmQ$8u=fU;QUKpb%>LEZ6_MgNQUU9Pq%JbZi$E_#c z=1}SDhu?TarVwB0DfYKv@WdG+ z<{rdX^3$6f$K40yW(A8l#*%B2H~#e@$i)3663!mM{m?PE?wsK)`KOef9b;r#XQ=!* zVsT@7c8zX#+#R46x6TxL{>!@i;70NH{{AloD-fe8jPFOj?9fh$8$oWLuy?UWT6|RM zboHF1M>FlU58E~y`>w(5qttNOnzyHQw?;f5UsyJO#Q0Qw>3V;HhGFG?QPRpYH` zr+*pDX@UYC3x*Q>@-MOK6NdZ!@KW=dF~<6LpVb9sbdLkgVQ2#~%TRH7l3gkK8FB~o zrTriREuL`;0Y(H6jr^?7ZDgLgU(NBo>@x~)@%XUd z2Bp9y;s;rALcSS2E$}tp!aFU^VUcOSv^a2jY{nq75zJ}k>1aMk7R}WuJIwh7H=RPb zuLg0)NZEysOwz#M5hF`lN6Cqll!?_Xo=Y6=eEaE-D`P)ok-CjK$;WG|uk8IjA(dqS zm3Dc!>!4D<3q<1Yf!@3np}7k(G5U07k`doin+NrO|&7qiofcyO&ex1Ca6E9BU#L(!WAfVE{tM zchKFj?qX8;IhzZ^X98&Oud|YWOfc_50TKi-%n~86`igyN zH*fEW!r^Y`vUXtkp4mXZ;4|4srpRSxDX+!*u8Fq0_$mEbmwc9-REA)S{NU{K`x`kt zNhmLaX%+xBqFH-Ik)Ej4{EEWhnU>9C2v=Il<-R^5z;0o#JJ#8=P4XeYHTx@t?{&bnGqC76d`Uw}yxPW3#L zp4kb`1%JouBvVhGO6AGZ3ayz-U^KR1Csz$n@nBA5M7L!%P0^NDtt&}kVCv6RissZf zMxJ&hxa;(0O`bB z!l5vj2rv*!DSouFm(hu3&G}IIV!| z5OA7>h;lViHG6;Xh_P|t=oz2*0}j?bEtsx&+0A8!xa_u&KVad|R zC9TT9&A_8ORPO@doWr{|a@>fBmReBsB5YhY5KSuPf z9^H7^ ze2P$_JX9f+fyf2O0tJl(KOSGH65@I2GtwK2@w!i24qJmu<%szaKq@z}arPjucZ&n59>q2CU_@@&mL~WkWRnacqhGXfB~zKZt0O*Z_Cx;p>}u&%ggSu5ShaK zKSXE#K!FC7X8Z~%8Xi(Nu2a+TR=IF4&I$CE4g_D&({J<{I59_XC!J8`9D{@UdxK7d zxGaAlq~aUQfV0c>cU4;%6$KR}@Kwz-A5WcU|N150fG`q^>o zd9fng2i(UdAsXq2+gPN}E`=MnIia161_)>P6_>EwvgMb^17)8Nju!o^g65;Ys!IRR z$naG|7kS@{kw9OG-22pOg9E&yDwpq(BMxnb$AzKPttU`&*{e;5cDwl5AKZiAvzUaM ztYh7a9XBo4tfV&1e=!ORwOy*s9YU03JS-0{o%MO6q_LVFzUwkyOsV*?^of4YG#lPW zMYr|OILaf^QZm6@X9hGa{8$~q+vXwfJsuBQXk#;y?qy0PNL*0!8b9s4*eX9&M1`A^fDdQ)iw)?*Pj1r zWX1oj4B*w@Q(?d>jQ_6X->VJIzwey*@r0a)*r7DXz#Ecaz%R-UQ=HOrbo*U zW4QHyl^m%fh;HU+4UO|LZ?}LkHhK`~eDXk|@`jENtRR3vbfOggVc`B$Wjml*2@ty( zr9SR+ESvHu4}iX|+IAwh445FkJdr(V3fDAd|BrU=54*UH#~8V3IKwu)cZ_VyiDXr6 zd;D_Lr2qKMq(D|X)Os$r?iFAG75Q|XL4>-{&-Xj^ANf4Xa0sBAe()G;GEEWCMX3=5 zHt&0~*6tkEM1jatSV?J8yU#D&Jg>$d(S4}!&x!0bmt(&}UEf(0&xU`h_IfbUES6i} zAJp!R36%TRP{BBJ-{UR6)C8v7pH%oMz=qd0@4% zI-uCt+-PF$D%Vr>^-~qm%j9=T7=;AMNjC1Jrx$3A%y7<)hehlopZ!^F)sYm1m3=tC z6)XLPa&<#U+0E|Gm;gWM8-g`7*T_8LLNQokQ`FjP^Aztm;2Y+@aK4)*5r*6;{VJ0c z+xwqpDQtW$_l_j435SZ8%9x1Nk#)MPwZ7~+>U*8wKhUNGw!0amCi7IU`hvPkeLK)mN$-8Z|tG7KhO5k&y=9MHv+UJ*%T_WC? zZt4lK8Dqh=liz7)(DFCXEfb1U=SJ>f?rLM#jse1}b6u%i?l>-KeX+6-boX3rZ^_Bk z$r}weyDmaR=09Ud^^aAkb&9@8+b=mLU1<3(AM3c|L^AYE)w4W7tkUN<=d(_0H`l&N zU?aZ0yo(dVy4A@u<^&{XuxQ7so-{R${lKnXY)YdWezR;3WPUV&0ijL;ey;=OqU52Z#(ladL3RLsnzsE!;#LDvuuFJ+t*BDs8j#TybZ8rt`MYT%c zNyGa`^WrWLI;!a=CdWg(N1OK!XFbi+j-CNGeN-L$Y#a{<40pT>hj3xQ{BU#r64A|P z6?IxsGien)jyzkV2G+)Ue^2e`J()@)d?SU<10HNF;n=@H8}Ho~&RVD0)^uRcm7e#~ zXY_I0mS*k?N6WAAmNMse9FW(>>ewcE!=9h_a`l|ukc)7H*ae0XDG8toOt=@C0rx&i z@*jg_O@JNwtWpFhQ~ZGQsy#k{T%{`b;D>Kju$T|kVwRv1L#U!rhlnB~lPN`r@de|S z(6bmqdBW$x41R2UGo>l$)FHNz^0Nb9jkXWmN(Ul&J|4l|i2<;}1m=wu5KLk&#QYw7 za}gAW4M1Lbdc)@=ThDpQ0OqoF8u8+ar%1(84S@SXU;FInYGAg2y=q;Oy{hKiqOmvt zoMUR%Iy8k~h&iC?)qVv2HT003s04COx%mel{{Wo}gCYF?{3mYoHYEJNxA@1S|NoAK z&cCe0{~sR<$NVVu&O4oq@oTZby3&7LvHPhcq(c*PYt9PhZGfrH|HO#+6WjkJF&j~l z?xV&W(=G=t8ZQO{sFBA4gTYlFMF1GU#2KC|_9i0~8$t>uJ$|eWmA;j|U@Wo9)!&Ue z1w^Q7i`aeFCiP-FEszWIg2er9_NP2ucG0ArDTdvV=U-j zf!bo?h*y)%^+@w}iLZUnVHajn1!?f`z_%&t9l@AU)^F+Pleq&&w)fscsa9j5dM=Dh zzZRtc2-0>+i8H&hpK@ciNyW57BIww+d2%EaMmiPGnXb}vt*-k$%hvu6$x9Ea^Fuy; zi9C(a|SZOQfIcrjHi4sLlJ=Gi%DhI7Ea@ah`60!f<(WS;%15KLCv`BSwZ zGqmwklh~GpzO`_~m_Am?Z}@d2Y$JaMC**+^6YCA)cWrxbq3mkd7X7WGP?EWL3_2k4 zOFI+KZ;`#)SU+AMf2;DmT z#w{a~bk42}Ytwz_>IqRy_S4ildBF=IltghQ9&x~csucK z9T7ZkmYzO#Vy@=$tBs6`iuSbmg4LjaYj!O-3j1MzkypfYnM3QM==5)G_rdhEKa2*hzh|ZBPxW&~K@om~60T=SL zILxBGs97|>90*l?sT~P{mDW9(6s1cI&rB;T=)WO$slQ_Ffj>vtuq!p~#4|QMr=R$g zb-A5?+55(gVld05c}?M7pKnv`!ky8Str@)ODrqsgJsgW0p3z#-=wB$#GN9w2vJ|&B zBLq&OEpMP3-a46o&$#x2z1-M!X;#uNeRxZ7-*2XHer6Rv`9tgDky3k~96)EN3jDcW zkbN9eM)#1=X=@hCOtk|aou#OE>P8u!MTog(;u2a($0^sVd_j5noj939D-}W&@K2Xi z-wp5r3kQ#w^&q9N@!*n};#uNxAiq)_r@msLpApFPV7>@u>_eQ^i`Nwcv?U zn=$xi#A(IV(vT6bQXgaInqG=lhNIVyHoIA{dsGWS$<={a^%_DQi6V7P^WL%URca`W`;GLy&VQ(lVtCs@FZDOWc-P_Juhi7|ih(H) zl)_Ag&|s1O&NK6}_aJcrBVayuauDz5WGB?mfBp+>>+8_xt@Uduph) z-zjG^99G!chvf8t?KKfHEl{#p09v%}Wdc}%Ivjjnn6d%1JqDp`usI*Za7jC4JaNhG2 z@=U}XhJ=9#OJk?SO_#{0?lQGQUN#WHB@`YY4*J9CkKLp+fs%&nL^#H&V(`x`Nzj)% z9#5m9HfJU|-q|y#hJ?AJcoGPG=O=Zzi)gJkQYDX4a8LiNBVPr$9nXKMVIcNm=& zx2jpx_|0izBFsaB$MN+(nE2y(PTQHy1nWkakK4>PI&%cY8WVMsHn;lS!9%NS7^!2y zGz!fVVS%tO^a7GUV9rM!8d2i7*FUl#P1MCaA;nYIB{?^{60OkhvB*^xj=d#Y$h)AWKuvN<8ZE5_dD&{$Jp3At5ZY#!90nbK z7T~3A>Dng8X1&uKtF2}Jh@y^QNVW^NiGH%}n%^OXt5~&m(S6_GixSz2hc&9CpEfhX zqHJYt`nPU0R!5gq{znjsvHU9flH{E*bBVSJl-Hr9$_(ypIAWfet*BgBMyqI9!&TccdA!T z4o1CQp6wR}X1_u6!}xs+)rnR2Y#&a0uAQpe>Z_I7>l`es)9XMZ_*t$n_kAF( z)Dopyj*GPwvs4HW07cbK>YVcjvxbwS*1Dray<`FUkynL8fcJjDkTo&6AO)LRwdHpZ zUIII`@NpcE+^5%9z+aF3lv}t11glphv~1Hl+)~VWm8G`ZLo)iOSrQaI3)Yg=z&Qp0 zI424mmBF>^6iX{}PGH#nU{q6k8%mGDk`!_r3m7v*Bs+qDO#vqVIvr6B?!0%=;O;Xf zL;Gv_;)`+fHEH&@xbTpKwpYwXZ@y|)`t-eYNpA4D!-%as4VC=01ajV_L53P-J)V0G zk#I~_I-*r4l32WQ-YP6tyM)qtGRdhi+#wlI{Npp!YY$GY%d~U%>XsN2c5K|{lB6p% zntp&zO`OfzsQm@~MW)c6E^Ex8b4N%hW40+uFxT3Q1LMu;t2#=Xe0<4M*Y=NitboJ^ zrOUs3m~n*giV^8q!|lqd?Y~wkf0O$5tM9MwqOzu-g{3H7Bv1gG$iwD;Sa(dY2U=c# ztU(})6j$Yk@(n{edyG_p)pORt>nJB?Xg=>@b!pUG|HE}&txNz{kf5m5%Ns%?@xZB< zfoPbo3y*8vUea1uZ^7fga9C9aFVgWykQ{IEQ%-ayuiJMsAYU7}S@AHlieBV&Q1Li- z9ri1aooh!Gh~l5=LlGSrKksk~x4JS>S4&4+dRkW%w0V-8Fuf+R46ZKwaZxGIfz$0L zr)+pK@$t=yPH#mBsH5C>+xRdAcmZ-D#x4~_vc?L$*1&EEp*p;%J-%UI2g9~jC}^j3 zVb|a3i~-)mf-q9Gf|!lx2T@CF?Kcfjpy*3a?*a7I2P3vByG2O8Uq$xPIt}62BP}}t z9z*2hkj~tG+;(bvz0W^PLM>iMiMuV(cFu16CG*tPyO0%sV|DpWRp*8GYfC2O^O0%x z9v0p8jBKpy`jeauM25M1<*KleX*D+%rrzJV=vIwj6Be%?8^&c7z>xW({Mi* zo(SseH#9Vmz`%lp%%Wppk_gjsS-^)O2dup-3>M56493e$xN#ua(eZl@*|1!N9WnFy zyT;vRgD-W|vos(}<9E}19r3O|{x3f_` z)Rmz&Fi$HHntT;bk=lCWT0f2Txa;@8wp*q#&0Md-v(`4HSb}uMTq8fA?FF*};Tld{ zSK_8~M^e|we3$$zd<<$^498ELJ~_63*jf5M{t4WGYP1CZ4& z0lf-fgaiPfz)bkpVATKYy?>Ww-j@}!z8|3_7X+Cvb^K{m-1F$`dIuHTRW9)t`7vF% z6I7fTKv#xf{BD67iPI3=e`rFBqRfU0vLvegPt_|zl}BYUrLF&jDEzN0W{OK!Z|hsZ|bbij_LY+Jm5J&s_FT9ier` z?Ad2Mk_yjoaJr2@ZR#K-(Lqd=i&ojg0wwf*PBZT7%o^9-14p8=;Vs@2yANi}c`716 z{Spc()@obQpuFAZSjGr$h2Bo3sH>|AMOoao0M^9KoJoh zvjXE)v@g3*S_B;AHzspkpIZVHD>jvbSf;p2UU%Qxk)7vXFq~ZKn|;-Fh8Wd1x2a&+ zw6kwbTXAuhd-nR!6h@cZfY^Yo;we6w)VWtk0p8v;V543pOG2q{5i}7|Qi6zg~Sx)2~1c$cakkTrPQHf@u~ zYyRnTS%-U_Kfn1EwfBR?G&yqrgP_&g!ILQ)IkStDYhFDP)afo*D$)SWWepCnTtL}s zwfFW%{mUjPntZT1ZmU56e|D@3(D3`4cY9k8+`5?OspF{ABjISDj6LbcMMB zo;3N3PT+c$c^J3eIUIMRkG+y%t(A70^rM5TyIqa@iWmcF-@ho$rbVj=zB=?k?WR030flT*TZIAZJ7Iuhna*&JbcipF5^_@`qL%LTTewFl|pAi$=Ay z0&ZGhGZ3I9L5?h-SdbcgXi~yV3k|ki@EyX!KhL_-V!Qct)Zn22#m!yqB;o9!qw33~ zXjLTHdD_Zrv~|gz+oiQk1YI4|+`iMuA&Z~3VugzhCoJ@2Rgjlqgt?jl7X}d=<&#LD zdM7SyxXvqj;lsqswuXMU=_E{b=)e_XZCnY!9p$fG#IsGG-4js5^`_lBDTC%rIaBX= zThuef^=qi?bh>ITi?6pfU~(Qa_h($>$sAdSe_l)qE=Hg3HWR5_Berc_(5mG`1aFb> zE(M0gAcTLi?vM*B?LOYP9i3`+A_T-QUorO*H{det`ba2LQIZNGXe|x-_85g$8}2(Y zsHGzEO*G_!yF0clN!r~#+m{=7F)*nq!;dCq^qG1DAlL!esj3CLB9adEI)rt z2I&`>7C=L0Mv~6^h2!qxW67;YFl!g}0*UL@4c^-3PAu2DE+Duu>tSkn#{f!e#4}AM zs$&q|({A~s(Q|ewr(25xTHh-xBW$Pd2eM7T)d*Ufw`IxQj0eWXw5L&4*20ohWV*E# zqo^uvBzI)c(wol4aIs=ZH)K^jwE>prNVzcLXP@~ zB1&llRL}VvUXZ8jAQyhTwKfi#d|CRi&62)dEnuq;bKdN}^*fe;-!bJM>A=1COiwj| zxI?InQ)eL&a?9y4FBFg~1EDW#LF9ea1TA(R78WFtPdZMedo zX^xDYGCKd={<7>@$4iVw#Z#RL9X;^mKS*TV{mY~F>qv3Sr(8F6JMTiRB=fG9H9q_ZvOyx&n{|(r~Ri6b1m*0BuwI$sN^ew>LT%z|um|+vsM=hM_Sd9y1z_ zPUS||$*!j(IH!<9uX~K{G+M0Tl$4s<)6rnfLBdh0xr}n;rRl0Yvx^=N**wCB>^^Xn zMx95!Hb4BcJ@sEd{~tkN+_a6c+OlM5KLESWKbM7Qh$5`9U1C(pc1;1Zs{HsL9zg70>tH^&aCrqcgyxtz%GJ7%Qv zIQ+-OxgwEvZF%BQns!%@$=sutI@Jg$#51_OcGdeih zZgv0a3G2X>ES?GkjToXe(rb97!;`&Uo{cH*ogVN+M({#U&cwR*#44G4csoBaK`+F5 zpb_y@`zy^Mx)@)aDQZT`O0%BiNcoR?LkHuj01=~@3p*0;!0Gvdp-HsQ5=tki(-hWx z?_LB!oSZV_vrLz}5F%=Es`*(AxK1r@4A`lYgZ3*t?CKMTo>dM0btjt1$(0fxT{{@Ky z(P$ETdl_5i?Jw{6@z9Z0v=tex&5DpcCd-*%^;+tM9)7Q`;|1&7!Gsg3JmEnhB{t=d zB8#n^U$9B|BlFi=oD$V|>-isvST#`rzO6A!Xn2CAB2zaHk!qQ-13VG*$j~b8Ep}{?3(JbtOvC6Ld*y!J|GO9FItJr)A9hbU`_`AwE+x# zFfEF);cEEl2xwl`0Ev}7O6w0grsSbTMOsKctN*6IBs>56#7zIGM+v8j9L3L7PUJ^) zz_OQ^UH{Pb4NX#_d3qDo<5T4kdGfyFNhK6FIL@9Xfb!%(zzjxGFFI29}~X-5q$?s_DVB z`uOf#OF{Y{lZsHC#|F?!T-^lFZ?O*TVO9bcNEKp!%2s<$|HRv;vK9oo$)^=2Dt9Dr zMU?&@uBm}0`2`@mcB6+S@patiXLfP4^e-;oET=dZr!xRr?4vt=QSA)Z{?rc2i0gn5 zqrGxLvV^$>l+}1^7tMe6*SB-|fTkBR(nHwfkV45vK6Cjm1#csHlWl5Zb0g{)AhYDt zDBl46?vDb3a98rj*c$omap3#`3gup*v8vg(-zO~&{2kQH4p7R7q|hV-m2FpqLnAnHWAf!i#YL)2QTi<@ac}SK~a_PW7JU1)RB#rdsKBN*HWZc=-HUj3`Ygd`jAv{r!-H99Ds;8N;1r-u^{83O$-3Jk0 z!+{dU1Z4P+REBa+Xd>)1dqJxN=ULE&1DEOW#AKr192z8VBRmY5dH6#I@3J^;wQzQf z60TL2LmV2k-~E8&Z3A+_b_rCI*|q1iN{~NIx&BeLcFj-6R2Bgfhsqt~s|OO!3?p_^>rnQ{G=iTp7z z*w%>(Lgu;LZ(bgjRkKAT9^+N-e=;FebFrX=T^qRa`K_ccZfMzrC%Ff-Y$X{Ivl_*% zJ;s${I4{&(z4_(4zz+q4d5!I(eYmFw^;Dw>?dG#PK5+JpYl}QgcldTJZeS;K7WwI`7sy4 z*>PC-A0B!L?E#PE+!b((>l#g!1AWB1x|E_ouwLvNST4t2`)_nw%VDHPu_L z&VBWf8lx_1mi__ERA67q4_maQ=*_*le{1rqeev2;Tn&KLZyJj46~6n%|4Vz-ZayMe zT)KxRDE9_2@2>01InC;Lu&?Y5z|DR_v>-(o5KvcRH}@S=>PL`%7f^O_s(u``@t0-y zPgA_L75dN4s|jKs-3!9R*k0{3^3zs?!u&YHLdu>wO!&nUZKp}T3J6E0gGxA}@GmxL z?rNtJE#60W3=2*v7Rbr%w!e6-m9tji?m3ICqm`R$FptxAn&`9#f%W!$UUNhKG0zo> zpji8F0Oa(5f4-J~h>^m&JG;n8-~6hhd~5j?7WS;+Z>TaY`jumTsXV>99{nr-|GNrK zhXRVH&fkt`%1|d;uX^98Cl@(d{!Np-p#IQ3>=L{dVrxxv4@MNWj(Du-tqgayuT?GY z2atmX1pLeTPhI{rQ@~DM1~J;*|EzUG?|Hla$WfK^)=^m2RG`rl{KkY7X)hxl;ic`k z;z72FB_#k-LzvYwd`QhhV5-pj?fEC4!3`}w{`_9ZPwEeAkp&z1Te8I6xDORrRN^!$ zlN6sO%Bz*gCWJ9=(HKgBrK0Lj(~!oiB#eX^X7B=+R|^*}pY++swI)Qso_f0Ctt{=k z9+I@0F!;UUS`@b}KCkvGy*yO1ZRruP1m1Mz)Dz27e7yHZlZLOJAM%)g;Mk~C%xs9r2o!ayv>#&b;~~nj{Ju{|LEL(uyGZ@R z(IJV-18?*{(otk+m#-h5S^;lj(9Zi7FjrPnW=<%zLhL!*JvY`!e)5VEmZ*QrVy~Wd z2R5Dv_wsZiKPz9aFNfw_T%+WIs>)eMRuzh>X=(1Uv)k9t-#?Kn>UQyHM{zMa2?J@B z)I$--2fXc(Z?(tW@;_m#T}pySw#)(jg28aP;fNv z>?=tvg63Ku8vkZJxqHr~407p*rkjr<304`wab*#?jx*a^w^PpGBtJCxi6}3)Qs|$; zj{Y&Z^CHKNocDlMZ)&pYz!k2gagP+ab-_n3E$w1~m)NIQKd_+ZNb{2(g0nI`+}W#) z#;Z*{tswgElVOUzRieuA@=NxtVYBX7V1C$TO^)yaevQ@R*LC-aEzyanzg7L0jlGE# z=5!wdtQ3KA7|`_(XM!!v4>dfI+e@9ooU_}J*Cp88;>lc?M|_HN`>wj4_KF-mif1j> zt4;f0lzT)I9yXtS{vzkI?&w=g8r_RDqdeH8?ed~feU|my7}ld8f-qP5Xa5v=Jr&+J zxA&!vk4S|DPAQ$D?sXE(3z*l+A!6|^y&rNvINia@wtx(BE8|$2X|+AYByHA{ZSGUe z>I{nHSJA2{R259zzZ#0tM)6oPxHBOz%Cy>nw8>%Kk4+)>AFDnm$SpWLZR+GWKgenn zaJ74`e<+jeEkfIOM8ISll4El}K#vWya6{sPT4~2|?oih%Vj| zt39mZ2Iyxgaz{}qP>T1beaK!|M)|m{HK}nTX6-k@30`Y%d9FzY$SsHN5`Tb_d`N?T z5zYOHBor0hrF{25Lt0Sc9m&E7K_s2*q7yO@zx!Y{$a&U~Z6bx&x<}yQAu-ukO^_&M zEC^?Yc}%ju0^xpFf_Xr*xib}=QU3=i6O|&Rb`Q=J%hES`D*5NznRAp-{+ zr)0gzy+bMnZ>t-POyW?7T5DA!xai@XuD+sXPTBTuW+WKVTZJsIv zQD$;S+_Z8T;)8~p1HpT%O)))*>XM4qpMi^pv&S=dQEdm>Y(X>TEF{L(I@z&o8{6sU zZo_cnPht-D>pntU1%V7Tx6%LRVQok5iv^-1nC`k3ipUUP78Si{{slGIIEe0?k(oAS ztA_xqM*IfWM%*hx@+J}v;bYvG77YsV5Wivx?E4}HoG_4_T`wEd-CY^#`BP!Kfoe`^ z@Q=0TcN$YvNy&RV7`us>@9vL;NLh5mT9Er=WZ&R>uZ>`uF*9cl)+U_5iJ>k!C~IL2 z3tM9ygLm>%T4ooXb=o|=2Nai)ZPE1AcgC+TBAoe+4D-Kd5B?iX34QXZ)b z;7=X*7;V*!(h643;kP0v{rzSA{p&@w!zK!K9e5lFO&Jib|1I)3TZrpq%m{I|48YlM z_$*DdkY|Oz)Nuw?8jv+tZE(hWD@TBB0D!GOUAp1jhwnP!|LKw7+8PR?0|V{Sy0cr_ z4|+vO9NHMH``y2f^7!)?8l*hoUdNwOokadze#^IM#<@znODz>kOz@PvGjx3EO>oXsPWtx%)}B zgHQyZG{k)n(eup^qS-1XS}K}}LwON~Zbx$)!-T=25l6Fmh!`O%Zqa#^IW)QycK5=* zY^`X7TbE)j`r0q)(uov=NEAdT?l+u8`XxPL4CYSQ^q|<)qk}NAEh?MV`ohjOI#XS( zBvos8&#r&Cu9|_c#nhyYYIs><--M7eN4LX+HWJN(y9!3ug<_!Vp#gD)<#Za3rfqVs z*ydU4we73SX4}V?$@CZ3m!puU?~q!#UN2Z`3Rl{h_e8oyJx0wwuAQ-Mg=f0t`45;L zxm6~+eTf}YdkuJpqa}wO4N|N}_%1DWwxN}-xLj;EV7iSjS@);nyICjpNojIF$3x84 zGh-OMphL-~Q9f@nCn@qBLMj89bRIw5YqO+G~@8{Eu#SRFBoIqiTA)_Qc@M zPeD^r$>M5E9>PhR5UISavTn*)lb*7tQ)rW^R?YLv&JiW@KaVZUF5Uu$PSdIiPzV`al=Px%IOjMlxr2P zkAGn0vrY~Y>>~q)8pguUc$~&(ZatQLO)GxFje{O>5{hr~wncehPr|^B++K`iTMP0| zB+%@cZORiodzeapbi})|tyarddd>9wn022`#3~Ij_fblwG=XBy4GxM>YCGSnWX>VB z1(iKwDFV-KKiY{N3(qtRkAoMF1!Y5Njt#Qb+s8m04iBx|5TNzL<-Qp7kN*3G{$F~1 zDBFk@>5d|}INYMu<@JQ*4ay$=sME(!2smgL8>-bW?w+t;yN@ea$2*ycm@6j(M^sz+ z>f2A3*u2!~YS4npzJRj7A{f`qfQTKnt%nzkcUbDAAsov<%l1#~RbK%0h^a}0=A(b^ zSM;wWuzu^Y{}a$3zvWurCNo5av+z;335mADWpILB0$E z5?5eL9+66vwYDjhxmwjtVJ=~21_(LsTzC83(eL`?_l%SCUN3b{muaeIv{+E!VNQ@@ zPPbNyPJsWhXE!rXXa=^bO|WIa{Ok9KT)f)=^=c9U2EngbaZdYXC$82&n;IDRro5HT z$#yqXe4OW^lM->;PqPvcPO_q?L3>R>GAkv537UC@(^I5SOX;C{<8`Bw@keMORN5G%yj(!IJ439 zbdDvsaQ6bAZEGbyCbc15ql&y#xk%g+A}ORZ+X#PbGvJnF0z1;ET(h#UA>(}{ejGBR zrfsx!#}2!%m=P8NughJ#`6{RPhpRj6627k9LyrrHV)TdPz+=;}LZaN4DQaobHg`kD z4ZuQ--H;)`9MXOpN01NSUUJA|Ixzg{#5a$MmD3aAB)XiQ+;uk%iPL)|g?^8P?5Vua zCP=(EzsVaJK`e9jO+YyC?0vCuLA-=mQ3YCMau~o2g2pt82uS6e_x#c!9Ph&Qm9~og zAoqB5C5XWx-Ql?Yq-0*b_DVZi#S%tw{bJa`To~NI)A2k0P>*E*oIOyb++S8sq`goY zXv)Z%j544GKciLKoAk|>Xcmhh;s&2(53P)4*)#zgqGAThltxP^PPD4d%Ni_eZ&& zs?`DItAeYZuczy5Fb&tY$GW;gsI#^n18i|P9NB9L9S zw_nh={M~}1f4#U@|2jIqft&M>^@0ME5h2xAP5{BpQ}uFOB|WN59b1V^v{mZ*<9f|s z>a>$~e&81Ey5??2A^b&M-V@IJVeiT#gZIW7SrE2V%@e4(mc9&2hfbgIUO~X2_LE)6ZR8u+NC=`_0w-33O6?FB=tPeN;NU&)t+Q~U+43nYPOCC z!tup7o1k@Oq>2npZm9FYBmQQMm38IDKH^p8I}OITUo==g*E)Q+G7RpbF4 z1rNMb%-mvPv3gWbqSMNQ;rzSw?xA~7TjdLaC6Ih*^`%|3!yFuB4S$*k;FZ5Z z4^ixRl`FzhlR=+>F4Z~QW8E3)cnKdEG^xTd37|xh0YxFFOr(00mpTK zog;TuI|4N%lH9Wz>{xi!BRm@B=s#+f%_lZj!owr&lqWqAmDXH0)m)m2kOY1zagn^k zV#+nLAW|?!Jr|Ry^gU2EgxoCT!nO0|JlX_eh684nMZGU|Qf~_9VQLxJ6#Wd)4E){&owY4Vk6EVW6&xMw>+b^7q4(#^FA*7b~S30|_Kk~%1w@dSi& zASna%u#tqXi~Lt^+`B-tQ*$JIP&b*FRDOsp_G7NZ194TcaCGHGnVs5?(0MG6Fd zqScd7Y8ukh0@H)mKDdMB72(>DZE9Tv&;Wkzfn8roI@E|R+imKaU2@O9L0R4Q9-_7A$oH8u3Ln|uBF>de3U;#Wt%&;ONOz3+*r z?24#`V2Z2u`0BMEo1rg|KX-YKs~%ZM%XBR=2Ggjq18c4aR5P9;Hr{RLlwo~--9pQR3?iaLsCjQtC} zuVK~nY?yW_g=n*{I876=1ATp2yPMa_e0EcP6Psbv&M|c+X}aP7Ht_~UXSbWaJt?0p zNMBiQyK$4Zr3GN~8JvM=rgyFaC&?@c;PHni*vfE@0)Wy~9h}qX7J;Ip;qjrt#`F?_EvlzY)a0rIz&9W8P-8)nzPeMWKronaEZM^~;=( z(dXD)y2jL&UjaCeBF2V1RQHQGSzTl-*Lio*CQmv$EK5#jhH7P;o=$asaPNJ|WbC?* ziQDpT?1;$KFLiEh7F%pa=ZceAAfm}*FjIAAC#+_P&>`6b^YxE7Qxg~aF+5>n zEj%mweI9RcCK*pOxObYzYv6~M&k~WXrIGD9T*1`Hc1@vetpUgwpY1hp(@Auctt_aH z(Ysh-Wi`u2`rJvK^z+ZOH61oX4{KNUywurFR#^trt>8u!*mXlHtz-?>7jEd6e{4JC zU0p?P)y$91)}Nl)cV)t=V`-+)ne0+HXti&GLZwNf_Lk3sd$k<4KGrJijHvr?YTKTI z!>1>3;rUG5wZarxiAunWty>A-R|`BUiI5fXi5z8NH>v+?mBoRwjHvP_l{h9(vOyZS zWl6X7ENa5P1GwYFmFHX z!J6KWrj|SKa>d)bcMM(B?vg>~9)aoDl%nGmNe38tTyYU@Xj6qPcgE${i`g@wc(g7ESru+%`VdGvm+~?gN^yOD;5ZFuQq0X zBjF};LnP9ns3;h|S4`QE6zd0Imp7|B(PD1M`S0b{tWZ%Q*snrjZZ9VMgLWc3ogU_$ z$axZi#LdyKvSPGyxrK}{tZG#mw*Ghlw{2)kQR>o^{t})IFX!y%+IwJoYuKiKACT}e z?t~*|9)Ngcu>s%?l8`|kjUt4b7#^tNP9gSbd+WL$bUq9uwG-3Qm(2)aJ`>cq-XAy^ zCAMXXrWpZNRgYB5!2Z`64Uv2X=!~wfG)=uF839pNP(e{B>da}{I`Jvn>?KwAs-Os9 z6>h(m=h;<3dQn?*r?%h|R?nkP545nv_Bw~&*j!Cbz2U*`O^E9L0SYVcs;9HBlNCaI zct>__pZyBrN)@y1o9QU6teLxW?VE3qm>Hh zuSN-JT1DB6n>{0aWuxudOI)LX*s6M+-LDSi*MAqTsXC!={sz1GEsF?mzMIbR>&ssI zm6^PHtastr_3ys;Z&T3!$*y+DFM&azSV|Flw zlA)NUEM(Y9wC4is-sS4wl6C)j&a5dy%^8v>!Ha1rtIy?!d}PeXoP`?P!L zv;^O%P^A__FrVi5u#Dg z=i*hpUfh6un2KfQCn*c|944&V9a`!hx~Ym|GhrsB;YdnHsBsZFqKY?5xZMc6BwCe zz$rI?wTES(t%#@SXEdb&$DmqAKT_D7r&IdD2?!<9wN+D?rA))U@YEG$CwHT3EpQ+) z*aZ6tv{7GCD}!fzzzswup->_t5hRHgr7BjAXvcteLq}&!(t8&@lRl_v3UUod?kUg| zN(tod&F z)iF%GzsL0)o)3dAWz@!D9^q6L4@zn(CU1)brBaXyh&}7Frf~!N&vzz!bG(Z%S7hC$ zX&QSDR7F4Za8L>|f3=5WP-lemy=kB2`gsUN)tSVdZW-5FUh&Y+59zUH#=e!*JDa{R3F}tKDrFNs3nt-K8VF>(m@s2KTv+5DV9{K8vp*oy@36E78>b@2m2WpRjR+_JG=TQu+k=~Q1T zQg*{cmS}GkpV4;kJ87>^9hK!p`*{Bp2&!pyq;T!Vo>@AsI)KOUy(x0*O9yioldc^J zWm|Q!H}!rbePk()MKjuVe)xN;e1AFD4;I^ZNx&04eQ!gv`kW9qRnD6K(C=zsVAFln z1-8i;XV3?DA|=X}fTd5ro;b z3rGdwg4Z;GyP-t0)D|LE`D!Ww4&&eqNVroD6`r+unMm@@mpXpV2o*qRV6gM`Iw9?D7&FYU z_}f7A6=z!s8Ll`cYvsF`yYu)ftWQn}V`*`B_6(u3E$t5Axgvpz0F;1}xo(Lg1VKNa zo7UQj@@xuT`?SaUw0Ku1K7fTp3z77MgmnlF{S3BED@Gz9BY|)pxya+J+o= z6Mj#Y&R*JdYwA5_R8xO-5@v)K6p|sReC||qQCP5Da`KwlP<7Jvem6|1=bGSP?m)uI zwVor%s(e>(#YY-CkhL5q`%D`Mrk>|7d+-Hm&Q=czYb}G1$IS<4;bi#w9kS;dKgJa8 znCo1KGAJuiK!hQxLob`wU1-}s4f}qsltr_4cDY@F$62xZ9pg?beKABi!W6BH100C_ zz_ZRdsj^EibxwL6YYpra%%P3rzf3X_KCE#$=>_pk;CkG}@ahP1#71h*Vb!Bib#{yT zD+OT1zMtFVNxm4Y-(#iTy{Rs%zt8#>GqOzV0Zcf>=V~b9m9+y zmSMc@<93m?aBkeRdqY4p!d@n>>tDxC6;jk>N90r8%=X}s=i>fiBVE4kCE!FWz7)J6 zZTHhc&orViSd(4uJLq?eZ~`$EpyfBFABs14Mv%p&ZkF)UlU;5_OmpJN_hknsS4CtA zk=9>A0g=5_>bbTOw+0oX)qBoa^lTPJLSWnG=X&rMKG6l;5QxcdtShhEn;VCn4jzK{ z?{BsJ5g(gOHx%!Hv>w(1JMM;q3M5~cFl*OEA#yd_?`uE(HaBh_HBkPzg*DULa_$(e zH&AD0gJq9>MnC<*h9i+Otht0rF)J<&zcqPvA~Ed=$E&H4c^DB9M67h?<(?KPC($2c z*{&86{-lR_I%7TNRN)b~b=9blGP|mYtIkXqVTTeincW{J9Gaq!1?osQSn?RBBqqBg zj+dN+3d3^e-BWLNs%`RadD`6khE{h5U@t}aJzKJk`bGGb6s8x!Nj)_qWtwX88KJ{$ zlf$emxTITFbR)26wE6~sAVd|F>`}$pRigT(;viL!Omtn(vatSKBca;hvf936GRu=s zejgFB!8KP?9dk1_hcnE;UcQYYtQ9F_M#s79&10UBigBY;etU;dom z`*W$<_quu?qn#02syNq>7kmx9EY}K3?O8q8zo)FC;}*$=JwX@2+G>1sskr-nikRs& zyV_CAZRRP*x@xQuK3zGOZpL2v_^)EJZ%v0?y zC4ay-96YqIbC!}ix>aanW15c|$qDdl@8wh-1S5tSIsWF)^MeKWa%2SWoQ_KtNppw2>`GI9rxy$cb!P z@|B?o%^Ha-tQZ#M4kv-x(OZ8g zZ~zyfAvVPQao3rm$!!C6r1$6}DA@rZG$73qR{*3-uZaY~-{?lP zu*Fk80hjGEnB6S?dLWf+>|caR2Oe8MfM(YHB6gG7tV6vEgL<|Cy_zz1MZLSozE}3x z$8FiQsNCrTE#;ZCJXN>r$$lx0c0h6MdE0sHis_3@DGdDu-`TMgXPC{68v|~bwJVNB zW)4QxWryqy%{|kkB42e7Ddn&y;D=Bj!TZ$tL+u}W83~2O%(~u`WHa=wBXI8!gR7yp z;hKv`qLSt8CHn$*4mY60-5o?e*Smk0>>Tr)uzVue46!C&?n&z{+T6(0%WaTV+W96BznPDO(ux*WTm5fw3L?o$VQd^q+E*xdlbA# z&9i+BZlNyOUr_=~(ALCW39O&5bUa~8>FTs# zgWutr@Lvp*ciGwhquJSCk%{}gYx{3G|K0lkJJOV)M=){<}!zx0-aeC*S8XH8XyfWkI~pj`~AB%s(^0{Fg2h}Lwc?2ZwkSt)U^lq7f(mTX@#TAS>by#Owzz7elVx;M2p9e{a>fyG~4!F z!+Oh!XSC}NJu}z5k5eA52MmRpMM}*-YVSHk(n44S8Q=X3rs zg7qydrwYDnc&p$9uGV=&dgnG!OpAO3l1)CkKNDV^Yh1g40=E$8;he3+P1|$T5eoOx zWaH^GVU7ln$V$3*jen4UJKCh_0p1t5wxNo}XC0!iC3BO~CpM_3ab+nm6>p#d5eRhm zz$~Z1cmmX7uh$K*Ew1lXP2&XJk6%@!)G7H7EqwnYG**AZy}hbq*v&?2zg)dQ6F*Dw zenrJFViXjfKKlSN02Yd!fjUK?S=~y7`EbTr-tZB~YIVrb=SIOp&!IW@hm&_qTTEQt zQ^vMZ@zMFTyb!! z;IwAobGTPgL}uTSaDb9OSng{@vLZ1NO!7LO=LW}muJkqM1G1%K!)VRnY3sRAvN zwxW`Y{IfI70s8_yqy)pg#@Ub0IwzepS<6T$O5O*oyRX>g(mJCv1oWaD-5h_jZ1d2d zOOw+muZjt|7G1m37|BQX%b)9>i%w!EH3ol}!)fzYimsu*&c5!&jjQpnbOla#f^x)S z^|tA@#%mQfB(W(nab-eql6{wt+nN^DF|UrQVj1o(3qu_DPRpa6RqIb9`4`hd72nTa zC@l}`t=kZfiL7u2x{613R-$rX2us0~l-2?qjtPV1xc=VVk^$B-wHJ<$)Dy0N^FHo} zYp&I#k-Yqb{OoK75eoAzKrq@WvtC@+)1SV0pKKiekzpD^KP)A5C8)g0j+E1Uys6@r z05y4VJFa!}UJ_~dGjWPt`ZA;wh@p@W$&YS)C(O!qPH73KxYmdc60`ASw#aY<)hY#b z(y01F{5`?Obr%~ED_zaip4A=pZHlkfG?9`yZk=u}MT0*gOn**oTT7H;CxcjGoKds^ zp$2k)O3yGj{z4nPV7>=o!q z9y|>_m$0lRk4Y$=_+wxYe4t!xTTs=cDn<_x%Mmt!&SQTXYp2*XZ7?h&7!&zCJ4jrqhH(i8m0t}V5@^@;2iHGC7^*E5j>B`*YDH>+?OhNg)4uA#vQfo@JBi^2 zc_a&ES*a}jGKr?iRu)uit&{gkNWI_2wCTksJuu$T^`d7kDe3!jdn7l*FZWDGp&ce+ zDY&G1=A=k#3*@KI{ze}DUkjCsCKGYrxf&`C{k+5Eva1=JzhX+f)}^s77Jt(lt$Q_m zO@j9+=PF{dKt;7Ek!U6}po%|gKbv0rgL*xvHGZGFTl<98ydEcOhm3go=Laz z_@;s$D^`|CCn0)RGc`oQOyLtgE%{!(Yj{ghXEK+*A`PE3Wu9G>hJ+J$IK!{SZcFBw zvx8vYtKB7Q8am?B+$FLiARp8S94L&r@u;#xV5k^K=~;>0g5uUsjtB|IiskY$HJ2JmhPG?BCOf7z zVE>><3V-foIX>KLJ?FU+-Mrz`y7Iuw9-(Vj7k8x;STkWFn)!gzHEDBj(adRI4<3UcABvqe2Z=64vE5p2MFspHL> zcXvr}O9V>QFLlhO?t|a43ShDiJ=GmD-Zt$<_)cwE7GE~MKJ?;O-;PO5RUIrz;Y%Hc z3R>$whr7%{$fAg(ajkKel}J>WI^)%O>@J-CNfCyL&J#R3H4>%Nx+xud-KJOE&v=el zIyv+Sjp2z*>w~n9g$z{gzd~B$sQv(2tB4V&1wPJ;$_6!$ZDHHZy1dFF4)M5c;j(D- zQ2Fx99dz2D*F$`q&$4EY0G?c$Os>JT=|RxhqhNtyVPF}2 z03%9>X;ZjoHBM{jLUB=*a<$SkHe&>nU&O66NmQq{&ES@PBYejD6f|cGNVYeeE&f+~ z*B;bVdd0)~s;(6k*sVI6#pR($2(;8yyNmJ+%YdqH{HA%I=D@U<<`0=RP=K1;TByg0QP$uMA(r z4!L#)r-oeC0xT%DIkwhB>*2DwX#5fs(=(2uV}2y+-vq5aDtsKPS?)77sY)4&AHeuU zjk$)xx!e(CMI~G9^q_OSR{!b8F_SyAJ!@rv$vhmEFM?{!P6}Jx0?zA8V1zm}ZEB*s zL^08IxC)HSQi3W-CJsW1Ax0q8zZ}Kun(s6tBr~gf|-#lf+7kYV}HdG5Zy@b@;?Hmu-fw z8$tD+P7#!AT#lCxQsWQllK;pL2+x+MyA_i03>Xebs+D?(>tpuc^;aRp5{at$4tRa|4Snc1I8t}FHhcNOJ0 zHxxv}Ob=-;A1`eW+CUQd`3FP-bv0`H_?f9F$jr%R7A45j2_>`44%;-lNT-{2D%Ixp z={n1x&#FbDD2io1J0y|=$J5~hRH?k)Mz^71DlmZ7Z+YcwJbSP*C(^U3J0!Uv1$#9f zwsMD|USv|9_4v6dM*he@Qx{=+2|-JDpE+J?$DnIK6BbGTIUl~c`!g3I6|}f)6OMNl zCB$I|(Pk{@VZ6QcUL^8V76%Af%e@6=j!?ctLu^_$0K>#FK2WroxUJ(qUmoYQHziZD ztBlKFYPS0OTKjnqAuRT)dPeS)ZEFRG#tLnU-=w~Dt4ENCZ6E2gj%7oUYP>m5o9%nk z>zTOgj9^b^?V7=^S~`!V@ObJu>x4D)r)sKjVaf4*3`2U=`RWOJGN#7fM#YV)d9tLw zF0#6iFJO5q4rOSjBE4IHvw!p|hTpf_{i{j6xItCv@O0VNIN_gcCKid+kmL#Q_h~O) z&o*n+pmhxz8H8XO#g?$NJ`wQEw3G?p?N|8NgLp?UXvmZ9z$Dn;lH}~Pu|ouxbSuZ5q<0$wi~D>0y$}wzdD*uHv}Wh-K!twK0Woo&HXuCq9;ATnJS=M*&t?yYhk$E#?cafVOy4k7I7AusF0F= zgdp;N3MqpH`Jo=H2h;tWd|jI*TkbCE+m6@Xus!DI1u44P0-HbwtTZKhgU+Yf-`%k} zfmuU8+)wI*g)`t@79yVjbq{p`%o!&aRDAgto65_2gWBqlW(bhMvid zFAT3h|Sw28g?rT0M!4p0_9uWv+Rsc3Bjq$WWPl+%DrUTF#|ak@K0#d)im zk+rbtjH(zKSU$&J2iH+fqFy7#O?(b=g#0T&5*)3=kKw+l0&#{oTj2P)>a8{CDFp!( zY=SLsN||E{Y7A0h{{~9qdlC(AxIhTtO->i|gnk6kokTFA*Tz3#oCzZ)ezw)&x%V&I z9RSlqibhaCbpy~LmpB|3>`J2PX^F#)y9-{ue5?=QA!N{*Cyb z4^9@UjS>Gw{4Z2&&u3gl{2TEyo5hW#?yI9e$U9k!>*uH3`|EEulV9R6tOT40 zhq<=4!1wi$EWry~?Xuw$pPZa|fx}b`wsxL!o`zdAsR)RDdGwoI9q+&LZ&a-9kE- zWpe8FDgCFD#VrD@i$AkCkg(*uy$A1i#N%x!hj&UQ3K<2xy&OplU6#-$n3d$MkZs3} zVldh0=`53tbKM^bLHgN`@RNzZ3-!dmYg~(8Y2~9n>0ajW=rsSU@Ll;0E3Ug7zEtSV z+rnB`(6jZv`BMHT9J_&-2<0*5!BvWh4UwUR2j%)H3Z@zu{dtTH)O!Ctvrnqx*M}7I)K!lL4sNVWl{nznpS$fHOXIU0 ztj~0h?wp}!N@KF`rfxX0tS@inz5{OSZ-QRZsr6AjOK@@zuIYnHim5cg^tIpqDD~KX zsmT7ny`JE*pgJFt46|jC$NB=Fl9;W&(GJ2J1f(+AW!Hw>I^K~^3v-hi5#0V!31H8j z6PDUc`Q9TeeHejpptj~;#MY4PsFmg>mir3LZk%{$ebGO)jep6$EZ^_ZvXI{6-gf^3 DswYR5 diff --git a/apps/docs/public/static/search/connect-account.png b/apps/docs/public/static/search/connect-account.png index 5e7fd98d9f88807c74f0b26c52cfde81796b842a..163bdd34312829e1835b6301ab694a94231865d5 100644 GIT binary patch literal 153886 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


    b(_rFRz0861s;A)#>At$ptUlL$-_-hD*z*O; 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

    rv<#%X!=Y5b{)%#WfqMKcOByBiI57sT}T?K$eU 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 Lakj3p3`qD70#;F0 literal 117806 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 Ngt`68@4#d2zW}m}p^*Rp diff --git a/apps/docs/public/static/search/gitlab-options.jpg b/apps/docs/public/static/search/gitlab-options.jpg index 911ba48f620fbbb1f0733a25c60a733b9b028fcb..c2ab696601f9e1e0b2c2dc4b39b482faeb6e6168 100644 GIT binary patch literal 47941 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%0A;GKP;UqOgZ zfp3OK#Tx%)b>f5sBbez_Pj_;Djqo{7=WhI}?IHR@+Yx5YNLxK4ta+%qAp<;`XyV34 zXiTed@YP9SZ2R(N3K!io{1pRvM*et4F{dp_m#nAnIKDHmI+i$yxlr`ofc5=soh_{biEZ7??npj+%FfL2jinhlBm(q z7utm`B{#a76|)Iktx&E5r~K%fO6vm%AxNaMjua?Rt}HKV?W^uu`*fk! zIs>YJPK>73ufs(N>npqACC3v@74CV-X4I8?G_3>0(Fs))se-!ulMY#TbIMVx8G7Ta zek*FiK&(DENG7V(D>*$qoWa7F0xSq>mI7&>+@XTa@x>x-{Wyo}_(_+O@PHCYXab!8 zye_9U-Gdni15rk~smOS|=N7?`J-GoMJVJHIz?F@;Xl%LKtUi2I+uV3?Ue7%zpdWvN z5^a87x}_cG$?0ZyqE_ba8-=nkQfg?6g!wUWWakFPwvE5GNAj0#7Ixl zHZER5!sl_mEqf8LeynI(2=_yRD1ZEV>}>n2)K2A#sD^CZWJr9gOLMQ(m_dEfvs>rX zYKLvDHRK3^m!Cghr?Rat)hA;s2Ko4mK2Nb7xOMd|9{Kdb^aXRA_f z?j;-E76QjI29xCz0O-yD1ynNq8Zq)ig`Kx7FpO~Ol9J3QY`zcXj_(bXTyY?a9OOub z7jj@Vl_>ZkSg8s^7K>^@H77tU%NCLglVyiZMGGH-#cRx>RyS~WKfD5b&plhguw;Hi zSQikss?2WQ4S-2Awk&D0ou-32jK_R`z9`t6xPV{V{$t<_BwP$8_*bq349*b;qX#nb9|Jh%^@E_%f z?;D^2zv=0-`tKXSP$cgpDH#yZdolt^x%DWJftdto-1$)ga7RlavB{Fygq!aUc-Id9 z(;sqId!EU(0_YMgC>8Of(woKxTxAc~fVYH%V$eMlm7sbx|E}>9J}2KDAL`&Cd5*#f6jtlPwT zp|ID@`PRX7k4zpxKwV0`6`~UK@=ET2gNovdu2_B6c%Kqw+k4Y>R0HRqEo|fKPqTWQ zPwwY)qM#QyRLxuACDHEUH)TR_$#)tFRWcDc1eDX==-qK z0!{U2CbcOO`XMVMuZ0$I*TR;k?=l}sZ+SUiw69*U#_AJ=pByD2T@&2LJ%_h+%x%Kl z&Bm}Qs)%0ly)-7hDR-JZ4n=|dMnZ4&E^$_z1kE$qFq!GWy4QY2kC@_)y_)Nq8&3+I z4IvV(@U#v;s66f=-g|>Vd-R5(2KCAMugh^<>VkDug=1aS;JhG`(JSZ0+Rm=h)lh5^ z?~hf;0h)eWzWD+!^;B65aol5xtXiDGPgylX&o}lhqeJ80TLj3KKk1 z;Za_gg4W~FeI*tpL)UVp$rk&9AS0wBaHe;z9Cj3sP@Pm zen>|6F&lVB7D0VIXF_nF__^OM9pSHw`W&t&gqO1zsVrOJI71e;EBZBpe?wIl*HhKs zSyFmylqtB`8<}gni1ON&NSpj8JqB@SsC=*IH=%8)g%?;r=yl;aHEdnw&5bhBt$=6Y$u`iM{CG|)WiXzoBhH^TYb=s?I>?qI z+?mR33v3@0$2JznCC}PrS>biM9#2>lJ=e#XVejaj&N_O%RZ$Rz#}gAHrgy9`Dp zXNr`fT_=%_v(fPs%3PqM9vv4X`H|^syFxJ6#5$3`kf}tjxBcb z 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 Gd;TBys)C>Z diff --git a/apps/docs/public/static/search/gitlab-setup.jpg b/apps/docs/public/static/search/gitlab-setup.jpg index bcbf0139e33f1f7f59c68589c1bfe76dda63936d..eb2dccf93e72f6b0a2830160ebcd84cd5c85ca3b 100644 GIT binary patch literal 35088 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 literal 94777 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 diff --git a/apps/docs/public/static/search/gmail-setup.jpg b/apps/docs/public/static/search/gmail-setup.jpg index 3a61445225513f0e40286dc6f6e712d62cc44665..40a6d38c5e7e906a45d7307aabe1981d722659c2 100644 GIT binary patch literal 30459 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 P5N0jT{~g2<`a1kK9A9r- literal 92460 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 Z!+O?nLtEZ`&?0ykf@O5yT6bLE@CSHfi$VYZ diff --git a/apps/docs/public/static/search/google-calendar-setup.jpg b/apps/docs/public/static/search/google-calendar-setup.jpg index 16f560171ad6cf1f43bc1e1f75dedaba3ce9ab2f..553cdd2c5df05b393636d9549ebe706ed50c9863 100644 GIT binary patch literal 36478 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 literal 94711 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 F{3kM9So#0} diff --git a/apps/docs/public/static/search/google-drive-setup.jpg b/apps/docs/public/static/search/google-drive-setup.jpg index f96b6eeb98d27d8707aeb73664ae5a49966e62af..b9f4368fc721ca3b00bae0d73ae526944ded3297 100644 GIT binary patch literal 36311 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

    *l9v_!7R{3foL()=_ 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 literal 103051 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 z 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 E0r)Yi0RR91 diff --git a/apps/docs/public/static/search/google-service-account.jpg b/apps/docs/public/static/search/google-service-account.jpg index f8d8b1218ef3f0845515bb55b75e6294450018ac..ee8b551f93cd731b014a51d6a9d8a62e032037cb 100644 GIT binary patch literal 45360 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 G>VE--1$deO literal 81494 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 diff --git a/apps/docs/public/static/search/integration-provider.jpg b/apps/docs/public/static/search/integration-provider.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96341327613d9e536f260924778075db657daeaa GIT binary patch literal 14091 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 ZzZsT)nv~(~idlO#sSk|NoKu}dXn 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 literal 83176 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 C?qyHk?_^N{L20kw&MXp;5 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 s?0F4YSI5kDanp9624!kY$EalG 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 diff --git a/apps/docs/public/static/search/source-documents.jpg b/apps/docs/public/static/search/source-documents.jpg index 502bd2cdc398ecb1aabbaed4f9830f5f035e57fd..a1b25b1be53c0427971db11cc8395e7b2e287de0 100644 GIT binary patch literal 27721 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 literal 69718 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%0D73>^_I%8=41 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

    ZY^)qm~j}Bno#;h2BHeg z8YEeMEQ$^6PWCdgb<`(lmHWC$ik~-z3E!uYfXstfC_K?h#@yxHM0Kb~ZSPQR{#Kec z>wg7@?jMoy?|1&B?l^__3mp{Yl{j5E%@TR)tgy!3ejeK_{!H>jE_1E<^F{zPPz0(m zQQq6Bpo?dpkFxkHuVguQZZWP}@4YK@c=yfvu@*luCD}u&wyC+v@#kljQjO1%s@{XB zOOWS+Cj6C_0jk<_V~&wLDmi1Ik$Lbo#+DEuco z7p$a6Oz2fzOG6gjOOz27&GtO7{_}QWcH(rLzqDW~lQFhQX@SSeYA8f}9s0az`n*cY z6-mkSv#+^^XgBO)i{0VAo%Ud*N`5PQl7$IxrnOg`^@vK9U63r_4C?-Qw<1PyGqg&l zn(tEv`c^MHB2aT<;=zgr-h=Ytv9!l|l4u(`{Z{4i9%V!QsBd2LD{IwPgiq<5X1W5V z_An`3$?#6eUCPP@eXZ_M2A?uGL&p%Iazg+T%k+3ESp3u8QfBq{D^F;?aDCSCnlqvL z9?`H&8wuy>LtL0p`tFOaxD|ATf7<}gKeFYRXDqKr7 zVf!7P*{jlgki55w&!Bv9^Vou#l@XvRTo0uVuIAh3gXdu4Fr0hM8U`8Ddb`AMq-4!n zR4ZR5R^D5rIp_4U@Aqt;%K)VQV)y+dx<>8qw_tOt-tx~JFabMD4lweV{A?(q+UuIT{fs&YxW4upf(Zk(Q`7pknzGtF9k zOYv#WKK@jR91UJS0Z|v_v56#XoPZkYwhqCz$i+J^kX~*JyTZ*Up!O0;nz(`%H&EuM z(JPujzB9ti^q;r;XJ`I%sQhyx{AXNM=G+dq-)0A_95JJoXLBy(ls<%Bb5_M%QGIrO zgd3}(0a7r#Lbkl6f51&OXsWv-_YmTrkha(Jzh|KS-DoyX@#4a7!QINEQ$Sj#khjK7 zuM@JZ;+nh99(w}1#!b~oCHcNEBhdw~Hp0K+9ZHOtB-$6vOOQ?-Nv~-slD-4An>mbx zm_@oY%hb;F21^sYDz&I3H2#FCj5LTaRg@rv-pT^MV9>2ct-daORX}kYCFe~iN zH~Kk)$?y>1<#q>0Dsacn`HRQdS`eV@=`!{`SsPQ?oe1HXT^CR;O0zX_bUS+5{OJ47 zA~Wo0`U;2*^oZ6qb;iCE4QUl5RBDr=u?x}2S@q>!H8tr=HSlBUK?MQz15i zKT>OY*8Wa3Exhbb(xu9?C!pAOq*ObiS0`AIY(O$TuKIvb9`}D^{AfdYKhlJ~?)Yhd zR!DXG4bCDT>g9t@v!0apA~qw6U`W>j3z^3OYciv^SldRM0X}UFPd@?Ooh0AFOdcHY zzM+f&WI^2sUY4f01hyZ8Ij8d2CKf91)PO9^BR7J=Oa#nmpUG2n^_jK^ zBHM<9N>*8pOvaYs_~s8fr{?;J;buiXPQwlXD^Xoh;2m^P20)ET^y4r=VrHz!Slemc zFku%vwr0YQ6HvIPa>vD~4KHrZ-JS1oKw7}Zn|A&|uVJmvlFDax@Y}gG(Tqp5^@1TR z4XE$Fu%NIG$&(DONmPq&J$$OODI&>9ii`5mJq|MKe5ZC|?CFWqxm9#Q2wf18f` zpRt<5*lB#3(lKp+cy3J~Yp8hSII04@du^0K;2%rC{oPZVd*xv|zd76hEJ$yR5=zm- z8W)7CCwj53SbwxhEG7M_;P+LiWpQ-gs(mk^w#y@r@q-)+$ilY10@F~i!Y~1}9yS5I zZf11M6-d-pz)0UAuA|5mm)a8$+5$rMY`P#xQ+{+a3RoU=P{)Tr%!Ky~MFFcve!&Fg z_#Tqjy!1YgtzknQe9X$5d$0y1Ws}GDvl%Eci6%#TKEO*k*3$uj7HU^uyGqu`h0;`t zs@^|k_-8--b3FWWUi@=?`2S&@Y_x?VVX6tTmrg+UDv$->~1JufP(6&A( zeX;kdJb*d}YW01a*3<#Xe||4I`&KBU=>H*C^!Mjss6b0VnlHi`f>JVl%dx$j)=Ne4 zqw>USPj8g*-EA7%60Jox`O20)MHULv-Kq4bour7PQlPAbB(u#!H-5yWV)5fdjk>oV zPxrrkq)W#VqUzbdntr)QwQGT?O@I`6yQr(!Dz5H!>Als!Ckx+=;G^0*GIH^p<*k=K z^zyWJQn{xTF@cDN7l)%w)Ad0t+ekJyj7%$R(d!I^X=W{lv#vS?LTggePcXR{vMRgO zO3iR?$X)D|VDjwUdU9P4`Q9i3@~)$BU6`{@-@>f^?OdO$m+zT;zZc1)Z&I_PJV&62 zx3?JNk=O+e*JrZxsC;{y>s``f`<0v@H+@b+? zopd80t%BHu7hIa_Z}NGO#Czp!QbPA9lIG(3UAO+9V;iztyRv$QMzyt*5{+;9f9e+* z6#20$HVn3RJ}IJ8qQWUzRQ3>#unS4bvm>mekWNKcM}6X_l$XoakHKOSm=P$kMKwFS zI*JWjE3DnFDQ$Ly4ea7am=u$=ycjT6H_PA8+rE1qh!pv5W7E^dXo_Ot?(e;dyEyY3 z)NziHA;#3UvL_Wx61_RDBByzWn)|XqU~PP!85^HPN8MD#k8j2$~oxW z|5oq3`3H)`s2MM?>0M>mD+s5$&laQx5_-6w#~L4Yj0w+GLW7Oc`c95}?I))X0^ z1-nC}AVcM<#>B0ZUE6aA%>vTIow|?ra9<{Fr`^B2m=rkTa~nfazQOEM{@BC)m*PHL zmNtcan4xDAANxhXA#G>t(K3`B{P-I&u-D^u_y5)2cSkj~ zZF`5_q$*9Cbd)AYks<++E=5t0E`mrAkRFNzK|pFK0!NVE1O!BS7ebNVTR-JswZ4W>m^ksj4>PIpAcJLmh#y1nfQED8e#@AQc|LvLfVgPRz z{q{yJzzu$33e^zYEtVe&vm3iS1@2s_@kG>-}NGb^# zaKUL~9hP7Z1BDaYtmvg&-)~-Vc6M2=Jh*JQ84F>!Vb&kfn~sr}0S%Sj^i%`y4wbpV z{5~(?DJc$4<45L&u-Qcc?&yWK&0AaT-Yq1<xAsLWUfSa4#JR)byAI6G(+wQ zW~EIHBsgxnSY^5aLCJuZI;^j5DU+@2!<0C&a3n0U5Ul}IRB+38tf^4nnKmz2TnbqR{KP}S)|m*|ZW%hq494LA*&_bI3`F!jlK|D>yt)JV?4+I`OV$VE zH{wH25oLT_vqBp+`=H9B!1iWbjM%~}&GqQOeB^-q)~niWnGJ_5XZilQ9+&%yhXCOL zQ3h@2288qVr^~Nl-}bUU6vQ$BCx%gh<~EN4+=o*96uO% zGS@iHsqSNIn@rscup-J5JHV7p#>kUsF?qT-FXP&N{fW-%-YyI7h!HDyRvb3JaNi(mruP^DkkMQZxdnDO~rb&tk z5$)WHJd`}lZt^e0oyUd)QuOd8YFGrW`~*N#(MMWw^k7J-grv2qoC+#~L`SM9Tg-XZ z3JlsR>h3$GpabN$fO7(MEbrcVwAF*|sA{foE?R)^U+>A*Xr`;TaAUk(-@_+AEi>6a z&EEzTYSVKDHW>uIU|*gGUMx%%f8@Cp^O>{=RnF>Y+LB$2W!7s>1=Ft@H3U}PiXJOg zDH1L3;h$E1Sb2L-GVyTbQ_FvzwZwNUb4sCCr^=LHpE@UJkcXz=jUzLRe(Fh#YGlT^ zh6LPZ_e+6!ZiJ3|VuxMFa>*N>J2o=Oy#`1%GrW?q$5cWBI?e^Tb^D+{DqgD@iCAh1 zQ|rHaW02kd`DOUWE5=RNQKiP6h|Il=XL0Hb+>H6n&jZbkMrh(s?Q*!`tf19bU#@uo zkm-%`L%LmpuB{zLt-BH=Pwv;{{3HeC=jSXZ)m95YzIlA^wsTo-QcL8k%;D>%6sOoF z*ll=%6xe3%s_P^YAD_3kI_T*E5O~EROX<`5&p8x25Q9mMBBkXL8t z0Q@jgW(vB}T!^OxfC|_*pu6Y#&hQx@zxSk*S{lxy!uRCbsxTM+xU&!59|2t~Tll); z4UDB4ph&u~2}T>c0-N5eM3#|2C?C!Oc=C+BOsp`#zFP8xwmSpkX2@S3#|R8yOao|& znul&ghJ};*bh4pD{kedF(TeYH&xKBNYTcP115~iQzZww*DL})x=v-S^11`S6MgRy* zHj{=IKAvL%Duw)Sp7z_^wvrV5WJMBkZ1=Vyq6B+@qK(1}K^CrK0qs*iolRG>aod*h zt+&yEd&Y1jLJSkj=8XfM)MfCmJN=uxO3%z|nci{k1USP#)v=tHfB227&tX{I>V;2R zz{x{!BNR9nzzHC>aQnc~Lz_h_a5|Ai?I+CpZwmBLdw!gVNAWp|&wpnkJIbHGT>fAc zod+RYrjU#a3ffH*WqPl3tCIP_JEQ6s3wNa>6`jf?+ETy1mTKUivhZH|h7%t-ZmG!R zdv7NlJQx?^Qf@LJF<{iPx_A-)xa!BUi+@JeQ0)Xmo0eKn+fpo43E;Igvsqxx78j_o zhI$iT3Sg$eDZ~k2U(uzqQuQ{K)>CSD)>Q(*LUxS#z*PItqbm_PoGdAj3?ZAd+R-u6 zy&qzDXSZMXgWQi7&_D)29=pb_)@c2XWS{*zo!-vQuAK4D%x8z3?w?p3a3<0ok<((o zbP#7JGaLB|N(9M3;P=|^pB~j!>J%>vf0~w6W6Kb}7!vf7`xJY;GRv;98*=Nx{ON`f zFKUktQ{Rf}O7wd~aQ89Hr(VSx&o}gm1J~k?#k_glY2(C272un-I#lNPnJn>c6f?qj zQ;T=@Q*XgJKDTEeBb&OpKDDbuCv<1VE)VH#DzD#tHz zx1CvL>P~xVm%aqpzQ~~WN}j3ZO^a@ZW<1}Mnd&>QUibJDL|>$*u2(0>M(=6HI6=o1 z3$^{W@(3nbBO@Orc5#7hpFK^r=5a~X66-eG-CvA}_;Lf$Hj}00uec(2wBriHx!LAA zIJ}~480NwdybM)YzD-Mgf{^_+W%k>QBdeK|fv2zu6I*u`CA);)B~vHr5^CDQBItR2 z3>8C&Hw|Wkcw3zAsAHK?6q`8N;`NJiw=mS`pc~WcOal>K3U!84bxxo1b)MEg*(c=|Z0i~2*I4Y%cGLFQxmhV-m3EDbZW+CW zd-Cv>?utE0-EJ0*OXU0no)t27aTr)(364vhV@wm#<&COK zN71x$CrEqn`EQf&keRmquT~rWN@DmE1codx7Cv^gF*{c`a2@R>3|EIZ5w;L+YMJT3 z#Km}nik8M~y03870dpa(ht8u_V1-3)Wm(bB>tqpTAI>C`!BtT?DlNera@*>CSW?%< zV=u7dPOaRT#W)*;#H&G4U0-QHQtG5}bRaWUz9;G7?m)8rpOsK{snX#f6`pF7@KgTy0T=0lPUaia{sKlbFOWyP=B!gS=Z=CkGdu{ za2B+wBg&k)vYoJS!*$dBSlyZ?#L6S7)6RTjqv!E`$F@!uxryOzZatE@Yf(Qm5X~HL z2|JU6g&QCYR{ zM7;rnS6urwVXj{iZlz@0*W`^v0ZMPWXrE5nFevqwNO%~VSxZe~M{+|t4)IVz9o^}| zPg%@hM9aPNOJl|5_f~Pn(goOeU43nS#-W8~BNxIW7OvEv(x@2gdBE(trLm=?F(lmw z^d8tNF~)kJbX}&*F(>2)Dn>pYG`^9cBDZn#Jyz@NZe#PVFz)>a0_V|t`h>ZoN)iww zT^$vGizy1Y&j5CAUQp@g{HLxb;`C1igw3^>Tx7SQt|NB!+mRO{8rh|d3?vI%fzO|t z%$+neMGpj3SH7sdbRdGHQWP5{yBM<*4DSmF(qMgE;*2p=59#>K*|f*}K&qTlw@~+l zfsJGnv+#C6U%hO7=vEJB2h09y2X|txd&u771E7+EW@7@9VN?n16>M0O(TVsM9*Vm{ED!mdod2AqtHG;BM39+@B%!}^ z;@a~%P>`+IYc0@&U=$*@D74)Bc3-CV(8cA0pLA6I0EnYhc#NQ}8 zM}hdi8VCYF*2QbZX_L4vCK>tNU>jO9ESSof&=lq%5g=*htuytJz8WKYZcx(qr%8t zQCYZYf`chEf_r>MG}o-}5%cm6dPaGn%iy-pbz!j-@E#376&s;dW_S4~H{x$Q#XnrR z|A|#`DHl2P^-KYD`XbliF(WT|R=%+784RjjZHW%uyzy8Avg_h=YnhMTqE}**N`Z}E zC&3_ov{1$DJ14NSZ16pD&MUfU`sR0}qnuG3R7O;8UQmuCxR{;MgXp`5dr8DAoWc3u z0jde+oVZv}lTund;{jklFXpkyK`p)Nvo#9LeGK=XN> z(fQ;$d{a#6#_c%Qh_v|a2>NrIsgvlH&eG#*_nEd#(XxB7`N;RGh4V4jauf+QY>lrl z>74eS*@$)8eB^1nSl&zN+-EZ#-g2>i(OO?W76>oXy?aeZ@RyOEDu!2_ zZ!po(?<$UWyBCJr496zXdjSTf#r02~(5yZt4^How-=2Y*)8vx<0A0RH)QTzWnr<@8 zbM#K0KiL#%VT4zhDQKMJe6PmmGEi}?`(gA7=ghMveT)qpvG)WeY@vYsRNIV^ikB%; za6A~7eaf$7dY7fgm@I=pu=-x>uh8$XZ(-}o92tceZ)z7nQ&kp`8McqWW_9yEH^%xq z8qVscyQLHPxg=tJI_o+i_K!SN6OMAoz0pE0u{YQoj0MAi4?YqbS z>o9_}PyY~+AH)!8^=-3$ji%2c&Pn-ExCn&4PrjqO|DDNj6#3uhfgEMs@9|fTM%?dG ze^&o+wow_s9kfzZ(r_n2dXr&vdrEz>Oq8ct|I7!LyxDg`r!t_Fg})*bt$sIkf`V=m zy||ZlP1vP`!OJofxnq^oesRM!a29NT+RPO?DEf-_9qNvRz&WRDXx6>P$ppv z1e0USQ2kc35YxjPx7LB!o*B1|#7+Y;D*TI^?6-|w^s@n?r+#Hk{rHW7OyUGaqg!!@ z??GDNAY%N9ws5%G4q^RV^PpP@@Lf_&J}K^s-rmmO$FdT7#bg56B0<#s9TIb8-Nc#N zAfXad?}$>ziavqF+&6QNNbfM!G)_vacNN>N6tZ@`Wplqzo<))q+@^9%pQu_1BIex7 z-*GJL5;Z3>&fRaANT@K%tkP+3OF-52-HGGA5Tn4|-oK2I&CfFxXe1?{`?3oSLEoy8 z=$tlqWlN_8!Yq_mgZx%H7U&Uc^T*JKp*8iWU&_gXpVKDZ_UyR{?~$W95mFVsLRR32 z#)>XlTm<$mR8<M&|^SFAc}?{;e*&RDY$3~h;#)3n%k4f~^-x~5RDj#&;lDJR!Q z4ew_741sp`*M?+?LN1iktk%LJlilC|9W$yPZllYc1@o@W~{lWhjpHe6eXEoSH_Q9-ASoO9OrX z=3E$X57-nr{&XfCEA+nBjt5^2H7tF2kjf>yo|{RD^6)3#T$pr_7(j zBp2p%BHsX*l*gYv*)E^F-?^M|*Uj-O%N4c(rkl zXL~a@`V3#;;Z1dFxM0A^9cr?!3@LQp@it^RXbo!ZFFjN*Tz@dCd)Yig*e?1%?w54bwQ0)OdmRgd>cc#UbWp&n>@*z(&R?edC?EfA~?ZlFyEuhMs(Pv}uyxAEq^A$6y(vw{#peZm+&PYI`=Bt6@QH15>1pKi*}U zUX?TZenYw@m**vX#$$$H<<6~h%ABE?ly=iQ4-~ncL(DWob8Biaq4lx6+)Bo2Hw9*P z0;bts$U@zlGRhn+c`*WI1qh^UF5oEv8t&3#Xgfdh3+OY=n=hcnGB94wm|gN5?=eRAGIusU?_P|SG9wtt z0Qevrk^wah+8DT&Jr_?eP7AC8y|;jaT{i%u)H^loDXQAhkmskALfJIR`+`56Yi3i(yLU^3UGY)hmEe1Gx!3M z6=e6!Ki|e@3)14u^2(z8jxKZMw{#6p)0JRFE#w$|=y&(dhe1vpbp+@N)m&$@AGyGBoa{FTlq!S7+4) zW4BqECA4hLyM3rQM?0YgavQ(W+JBw@MF-REJyhfmORS$?gN&kGaWS8b4<7=;9wSjE z)&Bw@Z9t~h=qQZY&Qg5pDZLtp?K6s6q>n%5?4DXN(v>%YGQ4R#C{g0gmh#jidg-Y# zf&bmfT2e{(aB8YAAYVD~fwY=3=LU-Yjw>3!PQ^iGkO_ykJBsj8JJ!$*y%ij)i<`Gk z?T#pY!K#*zrb$nT>#Km;oyo7^>$FO9Iwo@@9 z${arJw^$XgR6V$dXJ}-4cac<+w|}GSOaKWbDQY*RjcPGX&6V~p*X-Nu5WG^; z&O6_JoNt<9t8j}q(A1b!`T1<*n=8`y#k^u6BNHY|bL5^v#vI!$u&!bS3A;tH6_M+t z!+BpoG=Qe&zId3snF^9a#+7ERA%FR$laFf03x^iHF3y_>!5t+xu9WmVH0gWeb4sm6 z=D5>P+8M`^+XebdzM{z#`9@(>Mwe1tjNc}lH9N1A^zItqXpPgTXsJNUWCdLP{CFVW z$%vuODHuw*?{QU`)sqkYpRowx)gb@CI-#E4srdyX+C=PK&vzo~B@Ot8ughoL=( zs(ndL5Nyu#PXt_Z4HR0nJUMQ+6MER(ZaUkOGEJd1cV7jjG*b@7WF`SYZEf@a0-8Kb zJ#g{+1a?q32Z-$LI3?(}6xuDaFtpCIF5f>hUtR8Kx|e7=ZbhC)U*0!}s#$M3rZt!Yfmk+R) zT^o65VI*x4#l8$Jxf}mPgY;Be%Pm&yx)70mr{$T601IIK<**(>Y|TS&YKG{3+v!ZV z#z3nw#nrig@a@@>0U9#<6s=T+QS|dp@+~n>kJoSz(T1+%MThFI+7re7O@dUDut<1S z(`q#Nhcu8sVe}WQNp?(wohgENZJC1NM*Fa}=L{@MgZJkR0XD(fImZCe+dV z^JAvie`0(zV!XP}pEHFn)=WdCxCV>X{aSLLYYL2)&0lT3Cm%|*${bm$_QP|OuaM54 zKTBcvvZEvu85kz$5ky21oM{`kEjq@WnZ~{pOnc${N(OU~y!m8jYIEjc7 zkNwFIKBmc$+4OjG(lZnm15|{(aY5?qCQZVNbxLfV{Ncg;O=GZNgzrbqU8kGz^W-nz zmZz$S?LIy8T!Ss;3=snh2y&aFr;m4fV6#DfHmKTEh6H*VW>q6i? zPR^2AZYQ;e=a@zB)0?nJSciTBJ!gByH|2uU6^FNmnM%K_EZjhKEnJ4FN4mKd5()52 z$R2-fMW_XRNLNL$v~7=gdQ!xaJE3!O67}u|?=OJ8R7IZ48kT|w9IA_KrF6nejCUm= z(4G$L(8_i1#J3~Lh1F? znJL2iGR|uz85A!^0wgd#-SX~h_Iph7O4Y}V!hBdSnVjgbP`c~(iUXs}ZdZz~?EcK4 z*w7uuN5PPnD5?4It~Yt!Qs$Fi#FtFuGeS!2eQM>sOKmYax9{yuQ9|FQw>z60$A2bm zEGLJNZ+K_$PgcPwH44;htZn$K^o8~IX2v%so>;Wl_9mR0m41T_MoMRwteSpEv^k7$ z!nmx1>F1z!m$qk2nqD=%)YG(AQ5YM1-8HYtK1>#Lwaf>^7{LdkTTGlLvbw}Yjy1zG zqzepnWKt>hlSP;cTUD=4?n(6B<&LXjv+>w_*8SlZ%~y+0T@^5v6y+Pd9Vh!6Iw#W| z>;!I$x)z%8(RXvHsYSc9IW7Zcz}3iBB1mFq^3J-^Su+&};%vdz=DOJVIVI@Crv$o} zTANQZLY`iQq`hk4MOV?S`(WBGr1yt%kKZj@s;_k?4XEIeBVS_AWs`>s9VnpUxt{k!0My_84gS-A{t2K~PUKmA0+l^pDbN)o z5vfw+t9Kptn3<%NxmehuR0YIJ!2c3WID^)$Hg%%*E^5bqzk%>2Bw%$csFTVA?X7jyy<4M}Vt67^{gF-tf~6{g8;#CA*xA7@YjLnEd(u!U>%s#Kr00$@3FeC`c~7=G|`g z*wa2tZoL!3!{NG@felABTh3Zy3QBXarW?o&1bJszrqmTJs2g8|40_;IY zJfgSJ#oKRA59hw7(im-dIgX<`pkDm~s!%Jab#q1CH-KXRV>ESGx2act-qnRRcBaw$ z*~nzR$EIv|8)j3Cv}%`wI;IQ{6mWnKW2h1hxNRW_T1~RjE^38m63g{RE*!^}!^=bh z?%4c-s%AE})(Yw+z}JRMekyu%~@r7@&paLIc7gi&@=!T^35RSTCo1E9{n0 z4D)OC38~o-C%2o0yq>V4=OXI9%(ez(EA?wrCy*y*k7a1|z1i5{n)Tnic9^9kiXUHK z4iv%3Vx2vTA^z$Z>E3nI)OpiaJQB02imlv<_c~lzml7?T^8g3N!Y*;@8-Om34YnjJ zr4nnGs$P2_gWXs47b-icK+9fk|+PGFSSzF`#S0*&>N;MEblM z3Jq@qXkyM=LE@z?#H;%JF|$&}`(ep0ts#LS03F|c-_Wq;Fxze-dqUBe2`1ga$yxm}bV@gMQG;_r9Qq_aymutvjT$J>*MLcb z`<8iyBIUu*o<{|C3m~RVm&50ouwDmOupW!}N(YRqY4yZHXT~WfZXZ5_8DZsY>&Kcl zw>l@DcqDP?2|MkTVpIbM0i~6bQ2X+S^86WTOEXPgSy*k|`%>3qcAJ3oux}c_n`=ur zXQ>?%LHNOW-Vyl=9l@vNRZQ=24=1HhPRsIPDAc|+0$e4&$%+mI`meWfeY}c`ZbJr0 zrxRkE>F+XTs+_{)%?D4gg&Yq&Sn>8~1sPvJvjNR*bEOIp#!kq#izEECF&|2O&<*}Z zBO(FfMKg+5WU}op73kC@D1Oi!b6lpCmD^J0;^f-**wn`8GAT}1WQ4VpA3g!wz##}#tClfm)kl;Ux0gvXWZ@v1p|t3Up_#tDB<#e2 z?K)l>OLCwGDZ*XPal%tidR=N57eU$MWQ$A@ih#d;8$oS^iT5u{3O6nrH-iGg)dC|S z(7jujhpjJe1@=au^^H?kjIjQ)9c`%A_fBC!8|~MeoTYjL)sm`KO_^13hU^}ZxQ(07 zx}@E`D-Qaqwn<5qg1EYVxcg1{8$qI+|MCAnhRSOWIq=cV)NA^LQ1J1;ga0rg0#$aD z|5lBko#rj|dL&d^`yYpDKeAZ*6ZS|(u!n4}QBsv(Kv!6xySFC22sI)eRwS@$o{H_3 zBACj9-MJ?ijeMMYdg#=HIFE8R?G>+$i0x6o1+`O&^q%riY_@uM}^zI?UEu2xWvCbbLZ37g#jR03)|eHgbuy?TISJz z#WR8SqV#7Ky7uRpCUJroG5{bIs%S>qxU`3PnCOHE=;N=+du!xN*mm#H@aqt#_JhYk zgmIm^=74H|3zWeG5@gd}XgRdG~ip z9D|)|7u2gpLTBfJA~bX0Yc0t8U!bgCg~@=dX~PO_0E@+QPv&9-BkneV@B7ns#wc|6 zom;B}Awr|Ub~V+6a@PZU<8lO(k9&jPmN{{CSk)|a#rQAQMg)>t$|R)HMl?CdMtD)b z=pUuXPZ@N&WEc0a+QHi7BAqR#@#kL5)^{-g*ERvQEI1V?ZZ*E@{1TO87ckHcD5sL> z#sUk@+QEUTsBEEnU|fbmD5#e(TEHTWkAzqvAXvGrjkCT0$S6%E(Hn1OvGstW0_hTp zq$d0@$rU4GaT2;&4ePa6d}sg8%vX$9FESx%hp=q$<4)n;ekgcl=WFpy{uPSA^?g_f zK1^BFlB`4oh$DxnA^UsQSTmG~qBt^2pLR_?wzSYu$8%EVbst?EJg`{llZf}?IpYgU znFt`FDKPWU4Wm)MjG3Bw4dJsJAC4vK8yp+xlJ4 z@$=|H9R6z+{}ug~MQesVIIzI(>^&OI8wt=wiqkkqfTKR(wB)fa^N^ug7i5^+@*An` zkVL|sIOhF?zR_Ceudi}076FV=Nf|c0J&<~5}*=#yh+h@HL zH>O|2%CaGX8TZDj5_R8d=K5>Gh0d2tU~Mq4PAf`J7?XV<=gYBteO9bR)dk&ZmM75$ zRm0lej5nDqhBac^S}w=Z^1^=Id4LW4&9DiQhdzWd1$dx^Q8I}bCuDNXp8RBtTx#zc ziniXwTe2ZOOx>bagO%*rx>78rcC!&}bL}wG>pY$Y$Btfr!`L@`BJM0Ti>nT^Bd{s@ z-V0LqELcMv_BwMrk{t{0#cMnX9SBJJgD6}W+MGGing<-_4=!sg$wZmSclh+>@=cvC zpboiZ!g48BW`K#uI=)Vh(^dMdCI8ed3^>Azi$OKd)M4$}!hi=y%tJNn8k+a`tE6`% zaz0F#G~=%wtmNAPbo3w0RSY9nemIvMeSQ?5qx|{(cm2`$_-~F6Tx;iOesvs`e`7co zkHfwk&f4v|dMna;-=&(zpZ5JYILjTXonHn?o%fd=-Hr0T@wOYm|M+btF+G0klmY2! z@w(*I4jcTZKT=Hj`J=c0M5C>LbDRF02ARQ+%7wqeXMdvP`6Kb^zryD~Ek^rCWA3l; b`O&=b&D`_Pc|+(gasK-Mdp=D2W#<0@7BT^x literal 0 HcmV?d00001 diff --git a/apps/docs/public/static/search/source-sync-history.jpg b/apps/docs/public/static/search/source-sync-history.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84151025f0db3aaa60f680903ddc80dbd14ee51b GIT binary patch literal 28372 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

    H)Z8%v-*!ga?JM!JXrmqyFN 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 U|M~s@)Q$htjX$d)h(D(O3$~IFa{vGU literal 0 HcmV?d00001 diff --git a/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx b/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx index 8923276aab2..ff95caa7120 100644 --- a/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx +++ b/apps/sim/app/credential-groups/enroll/[token]/page.test.tsx @@ -224,12 +224,7 @@ describe('focused Search enrollment', () => { .find((link) => link.textContent === 'Return to Search') ?.getAttribute('href') ).toBe('/workspace/canonical-workspace/search') - const guide = Array.from(document.querySelectorAll('a')).find( - (link) => link.textContent === 'Setup guide' - ) - expect(guide?.getAttribute('href')).toBe('https://docs.sim.ai/search/confluence') - expect(guide?.getAttribute('target')).toBe('_blank') - expect(guide?.getAttribute('rel')).toBe('noopener noreferrer') + expect(document.body.textContent).not.toContain('Setup guide') expect(mocks.read).toHaveBeenCalledWith({ principal, input: { optionId: 'site-two' } }) }) diff --git a/apps/sim/app/credential-groups/enroll/[token]/page.tsx b/apps/sim/app/credential-groups/enroll/[token]/page.tsx index ba4afb0d942..57febd8e801 100644 --- a/apps/sim/app/credential-groups/enroll/[token]/page.tsx +++ b/apps/sim/app/credential-groups/enroll/[token]/page.tsx @@ -16,7 +16,6 @@ import { CredentialGroupProviderConfigurationError } from '@/lib/credential-grou import { getCredentialGroupProviderService } from '@/lib/credential-groups/providers' import { enforcePublicCredentialGroupIpRateLimit } from '@/lib/credential-groups/rate-limit' import { APP_ENTRY_PATH, organizationRoutes } from '@/lib/navigation/paths' -import { SEARCH_CONNECTORS } from '@/lib/sim-search/connectors' import { AuthHeader, SupportFooter } from '@/app/(auth)/components' import { LogoShell } from '@/app/(landing)/components/logo-shell' import { OAuthConnectLink } from '@/app/credential-groups/enroll/[token]/oauth-reconnect-link' @@ -212,13 +211,6 @@ export default async function CredentialGroupEnrollmentPage({ const focusedConnected = focusedOption?.connections[0]?.status === 'connected' && (returnToSearch || connectedOptionId === focusedOption.id) - const focusedProviderId = focusedOption - ? getCredentialGroupProviderService(focusedOption.provider).providerId - : undefined - const docsUrl = focusedProviderId - ? SEARCH_CONNECTORS.find((connector) => connector.providerIds.includes(focusedProviderId))?.meta - .searchDocsUrl - : undefined const connectedOption = connectedOptionId ? activeOptions.find((option) => option.id === connectedOptionId) : undefined @@ -317,12 +309,7 @@ export default async function CredentialGroupEnrollmentPage({

    {focused ? ( -
    - {docsUrl && ( - - Setup guide - - )} +
    {returnLabel} diff --git a/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx b/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx index 7f119589368..7c766ee450f 100644 --- a/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/integrations.test.tsx @@ -3,6 +3,7 @@ import { act, type ReactNode } from 'react' import { createRoot, type Root } from 'react-dom/client' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { SearchSourceSummary } from '@/lib/api/contracts/knowledge/connectors' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' const mocks = vi.hoisted(() => ({ context: vi.fn(), @@ -137,6 +138,7 @@ describe('organization integrations role and source paths', () => { afterEach(async () => { await act(async () => root.unmount()) + vi.useRealTimers() container.remove() vi.unstubAllGlobals() }) @@ -162,6 +164,16 @@ describe('organization integrations role and source paths', () => { expect(mocks.connect).toHaveBeenCalledExactlyOnceWith('search-index', 'member-source') }) + it('debounces server search while applying the selected tab immediately', async () => { + vi.useFakeTimers() + await render() + mocks.filters.mockReturnValue({ tab: 'mine', search: ' drive ', setSearch: vi.fn() }) + await render() + expect(mocks.sources).toHaveBeenLastCalledWith(scope, { search: '', mine: true }) + await act(async () => vi.advanceTimersByTime(SEARCH_DEBOUNCE_MS)) + expect(mocks.sources).toHaveBeenLastCalledWith(scope, { search: 'drive', mine: true }) + }) + it('offers an approved integration before any source is configured', async () => { mocks.sources.mockReturnValue({ data: [], isPending: false }) mocks.overview.mockReturnValue({ @@ -173,7 +185,7 @@ describe('organization integrations role and source paths', () => { isPending: false, }) await render() - expect(document.body.textContent).toContain('Approved') + expect(document.body.textContent).toContain('Connect your account to search this source') expect(buttons('Connect account')).toHaveLength(1) await act(async () => buttons('Connect account')[0].click()) expect(mocks.connect).toHaveBeenCalledWith( @@ -210,6 +222,21 @@ describe('organization integrations role and source paths', () => { ) }) + it('keeps configured sources in alphabetical order with approved providers', async () => { + mocks.sources.mockReturnValue({ data: [memberSource], isPending: false }) + mocks.integrations.mockReturnValue({ + data: [ + { connectorType: 'confluence', approved: true }, + { connectorType: 'jira', approved: true }, + ], + isPending: false, + }) + await render() + const text = container.textContent ?? '' + expect(text.indexOf('Confluence')).toBeLessThan(text.indexOf('Gmail')) + expect(text.indexOf('Gmail')).toBeLessThan(text.indexOf('Jira')) + }) + it('withholds connection when an integration is deactivated', async () => { mocks.sources.mockReturnValue({ data: [{ ...memberSource, approved: false }], @@ -273,7 +300,7 @@ describe('organization integrations role and source paths', () => { expect(buttons('Connect account')).toHaveLength(0) expect(document.body.textContent).toContain('An admin needs to finish source setup') }) - it('keeps personal connection actions and gives organization admins source management links', async () => { + it('keeps personal rows consistent for admins and directs management through Sources', async () => { mocks.context.mockReturnValue({ organization: { id: scope.organizationId }, viewer: { isAdmin: true }, @@ -284,7 +311,10 @@ describe('organization integrations role and source paths', () => { document.querySelector( 'a[href="/o/organization-a/settings/integrations/sources/member-source"]' ) - ).not.toBeNull() + ).toBeNull() + expect( + document.querySelector('a[href="/o/organization-a/settings/integrations"]') + ).toHaveTextContent('Manage sources') expect(document.querySelector('a[href="/account/settings/connected-accounts"]')).not.toBeNull() expect(buttons('Add source')).toHaveLength(0) expect(buttons('Manage')).toHaveLength(0) diff --git a/apps/sim/app/o/[organizationId]/integrations/integrations.tsx b/apps/sim/app/o/[organizationId]/integrations/integrations.tsx index ab0782ab38c..57501db1dcf 100644 --- a/apps/sim/app/o/[organizationId]/integrations/integrations.tsx +++ b/apps/sim/app/o/[organizationId]/integrations/integrations.tsx @@ -6,10 +6,12 @@ import { getAccountSettingsHref } from '@/components/settings/navigation' import type { ResourceScope } from '@/lib/core/resource-scope' import { organizationRoutes } from '@/lib/navigation/paths' import { + connectorDisplayName, getConnectorAccessAvailability, SEARCH_CONNECTORS, SEARCH_SOURCE_TYPES, } from '@/lib/sim-search/connectors' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { OrganizationPage } from '@/app/o/[organizationId]/components/organization-page' import { useOrganizationPageFilters } from '@/app/o/[organizationId]/components/organization-page/use-organization-page-filters' import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' @@ -31,6 +33,7 @@ import { useSearchSources, } from '@/hooks/queries/kb/connectors' import { useSearchIntegrations } from '@/hooks/queries/search-integrations' +import { useDebounce } from '@/hooks/use-debounce' import { useMemberEnrollment } from '@/hooks/use-member-enrollment' import { useDesktopOAuthConnectListener, useOAuthReturnRouter } from '@/hooks/use-oauth-return' import { usePermissionConfig } from '@/hooks/use-permission-config' @@ -52,7 +55,8 @@ export function OrganizationIntegrations() { const routes = organizationRoutes(organization.id) const scope: ResourceScope = { kind: 'organization', organizationId: organization.id } const { tab, search } = useOrganizationPageFilters() - const sources = useSearchSources(scope, { search, mine: tab === 'mine' }) + const sourceSearch = useDebounce(search.trim(), SEARCH_DEBOUNCE_MS) + const sources = useSearchSources(scope, { search: sourceSearch, mine: tab === 'mine' }) const overview = useSearchSourceOverview(scope) const integrations = useSearchIntegrations(organization.id) const availability = usePermissionConfig() @@ -93,6 +97,21 @@ export function OrganizationIntegrations() { )) && meta.name.toLowerCase().includes(query) ) + const integrationRows = [ + ...sourceChoices.map(([type, meta]) => ({ + kind: 'provider' as const, + type, + meta, + name: meta.name, + })), + ...visibleSources.map((source) => ({ + kind: 'source' as const, + source, + name: connectorDisplayName(source.connectorType), + })), + ].sort( + (a, b) => a.name.localeCompare(b.name) || (a.kind === b.kind ? 0 : a.kind === 'source' ? -1 : 1) + ) const failedQuery = sources.isError && !sources.isFetchNextPageError ? sources @@ -111,7 +130,7 @@ export function OrganizationIntegrations() {
    Your accounts {viewer.isAdmin && ( - Manage integrations + Manage sources )}
    } @@ -140,7 +159,28 @@ export function OrganizationIntegrations() { Loading sources… ) : visibleSources.length > 0 || sourceChoices.length > 0 || sources.hasNextPage ? ( <> - {sourceChoices.map(([type, meta]) => { + {integrationRows.map((row) => { + if (row.kind === 'source') { + const { source } = row + return ( + enrollment.connect(source.knowledgeBaseId, source.connectorId)} + /> + ) + } + const { type, meta } = row const connector = SEARCH_CONNECTORS.find((item) => item.type === type) const access = getConnectorAccessAvailability( meta, @@ -165,8 +205,8 @@ export function OrganizationIntegrations() { hasSources ? 'Connect a different site or content scope' : canConnect - ? 'Approved · Connect your account to search this source' - : 'Approved · An admin needs to finish source setup' + ? 'Connect your account to search this source' + : 'An admin needs to finish source setup' } trailing={ canConnect ? ( @@ -182,24 +222,6 @@ export function OrganizationIntegrations() { /> ) })} - {visibleSources.map((source) => ( - enrollment.connect(source.knowledgeBaseId, source.connectorId)} - /> - ))} ) : ( @@ -209,7 +231,7 @@ export function OrganizationIntegrations() { : mineOnly ? 'You haven’t connected any sources yet.' : viewer.isAdmin - ? 'Your organization hasn’t added any sources yet. Open Manage integrations to get started.' + ? 'Your organization hasn’t added any sources yet. Open Manage sources to get started.' : 'Your organization hasn’t added any sources yet. Ask an organization admin to get started.'} )} diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx index fb9e717edca..9ea2460bd81 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx @@ -167,7 +167,7 @@ describe('organization integration invitations', () => { expect(container.textContent).toContain('before requesting connections') expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) expect(findButton('Request connections')).toBeDisabled() - await click('View integrations') + await click('View sources') expect(container.textContent).toContain('Provider setup') expect(mocks.invite).not.toHaveBeenCalled() }) @@ -179,7 +179,7 @@ describe('organization integration invitations', () => { }) await render('?tab=people') expect(container.textContent).toContain('Account access denied') - expect(container.textContent).not.toContain('View integrations') + expect(container.textContent).not.toContain('View sources') expect(mocks.people).toHaveBeenLastCalledWith('org-a', '', { enabled: false }) expect(findButton('Request connections')).toBeDisabled() await click('Try again') diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx index da5415ebcb0..80ab693734b 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx @@ -27,11 +27,11 @@ export function OrganizationIntegrationsSettings() {
    void setTab(value)} options={[ - { value: 'providers', label: 'Integrations' }, + { value: 'providers', label: 'Sources' }, { value: 'people', label: 'People' }, ]} /> @@ -58,7 +58,7 @@ export function OrganizationIntegrationsSettings() { Add a source that uses member accounts before requesting connections. - void setTab('providers')}>View integrations + void setTab('providers')}>View sources
    ) : undefined } diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx index a49bd664ca4..57b0ed07fad 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx @@ -133,7 +133,7 @@ describe('organization integration management entry', () => { }) it('does not turn a failed summary into an empty setup state', async () => { mocks.overview.mockReturnValue({ - error: new Error('Could not load integrations'), + error: new Error('Could not load sources'), isError: true, refetch: mocks.refetch, }) @@ -146,7 +146,7 @@ describe('organization integration management entry', () => { it('keeps loading distinct from empty and disables creation', async () => { mocks.overview.mockReturnValue({ isPending: true }) await render() - expect(container.textContent).toContain('Loading integrations') + expect(container.textContent).toContain('Loading sources') await click('Add integration') expect(document.querySelector('[role="dialog"]')).toBeNull() }) diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx index 01bcd635e9e..25664a9c7d8 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.tsx @@ -44,7 +44,7 @@ export function OrganizationIntegrationsSetup() { return ( void overview.refetch()} variant='inline' /> ) : overview.isPending ? ( - Loading integrations… + Loading sources… ) : visible.length === 0 ? ( - {query ? 'No matching integrations' : 'Add an integration to get started.'} + {query ? 'No matching sources' : 'Add an integration to get started.'} ) : ( visible.map((provider) => { diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx index 56b847554c3..8250da53e98 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/page.tsx @@ -7,6 +7,7 @@ import { authorizeOrganizationSettingsSection } from '@/lib/settings/application import { SEARCH_SOURCE_TYPES } from '@/lib/sim-search/connectors' import { buildAuthCrossLink } from '@/app/(auth)/auth-redirect' import { OrganizationProviderDetail } from '@/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail' +import { SettingsEmptyState } from '@/app/workspace/[workspaceId]/settings/components/settings-empty-state' interface OrganizationProviderPageProps { params: Promise<{ organizationId: string; connectorType: string }> @@ -41,7 +42,9 @@ export default async function OrganizationProviderPage({ params }: OrganizationP ) notFound() return ( - + Loading integration…} + > ) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx index 7f271ae6656..9a46db9e19d 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.test.tsx @@ -73,7 +73,7 @@ vi.mock('@/hooks/use-permission-config', () => ({ usePermissionConfig: () => ({ integrationAvailability: new Map(), oauthServiceAvailability: new Map(), - isIntegrationAvailabilityReady: true, + isIntegrationAvailabilityReady: !mocks.availabilityError, integrationAvailabilityError: mocks.availabilityError, refetchIntegrationAvailability: mocks.retryAvailability, }), @@ -317,7 +317,11 @@ describe('organization provider management', () => { expect(refetch).toHaveBeenCalledOnce() } - await click('Sources') + const sourcesTab = Array.from( + container.querySelectorAll('[role="radio"]') + ).find((item) => item.textContent === 'Sources') + expect(sourcesTab).toBeDefined() + await act(async () => sourcesTab!.click()) expect(container.querySelector('input[placeholder="Search sources..."]')).toHaveValue( 'handbook' ) @@ -335,6 +339,9 @@ describe('organization provider management', () => { ) await click('Try again') expect(mocks.retryAvailability).toHaveBeenCalledOnce() + await click('Deactivate') + expect(document.body.textContent).toContain('Deactivate Google Drive?') + expect(mocks.activate).not.toHaveBeenCalled() }) it('explains and retries Slack account lookup failures without hiding its sources', async () => { diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx index ff75bfb22e5..a1e80cb610c 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx @@ -90,7 +90,7 @@ export function OrganizationProviderDetail({ connectorType }: OrganizationProvid const provider = overview.data?.providers.find((item) => item.connectorType === connectorType) const approved = provider?.approved === true const back = { - text: 'Integrations', + text: 'Sources', icon: ArrowLeft, onSelect: () => router.push(organizationRoutes(organization.id).settingsSection('integrations')), @@ -157,7 +157,7 @@ export function OrganizationProviderDetail({ connectorType }: OrganizationProvid : []), { text: 'Deactivate', - disabled: pending, + disabled: approval.isPending, onSelect: () => { approval.reset() setDeactivating(true) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx index 5384f18605a..d16dd95ea5b 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.test.tsx @@ -353,7 +353,7 @@ describe('organization source detail navigation', () => { await render() expect(container.textContent).toContain('This source is no longer available') expect(mocks.actions).not.toHaveBeenCalled() - await click('Integrations') + await click('Sources') expect(mocks.push).toHaveBeenCalledWith('/o/org-one/settings/integrations') }) it('requires discard confirmation before leaving dirty settings', async () => { diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx index 56f7177958d..7670e68e7e6 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/sources/[connectorId]/source-detail.tsx @@ -66,7 +66,7 @@ export function OrganizationSourceDetail({ connectorId }: OrganizationSourceDeta const index = useSearchIndex(scope, { enabled: viewer.isAdmin }) const knowledgeBaseId = viewer.isAdmin ? (index.data?.knowledgeBaseId ?? undefined) : undefined const detail = useConnectorDetail(knowledgeBaseId, connectorId) - const back = { text: 'Integrations', icon: ArrowLeft, onSelect: () => router.push(backHref) } + const back = { text: 'Sources', icon: ArrowLeft, onSelect: () => router.push(backHref) } if (!viewer.isAdmin) return ( diff --git a/apps/sim/app/o/[organizationId]/settings/navigation.test.ts b/apps/sim/app/o/[organizationId]/settings/navigation.test.ts index 1f347662b4a..1272cd00052 100644 --- a/apps/sim/app/o/[organizationId]/settings/navigation.test.ts +++ b/apps/sim/app/o/[organizationId]/settings/navigation.test.ts @@ -31,10 +31,15 @@ describe('organization settings navigation', () => { ).toEqual(['members', 'search-mcp']) }) - it('uses Integrations instead of Connected accounts when Search is available', () => { + it('uses Sources for administration when Search is available', () => { expect(organizationSettingsNavigation(true, enterprise, available)).toEqual( ORGANIZATION_SETTINGS_ITEMS.filter(({ id }) => id !== 'connected-accounts') ) + expect( + organizationSettingsNavigation(true, enterprise, available).find( + ({ id }) => id === 'integrations' + )?.label + ).toBe('Sources') }) it('keeps members and billing reachable without an enterprise plan', () => { diff --git a/apps/sim/app/o/[organizationId]/settings/organization-settings-sidebar.test.tsx b/apps/sim/app/o/[organizationId]/settings/organization-settings-sidebar.test.tsx index 8660ee4c298..24658ddd67e 100644 --- a/apps/sim/app/o/[organizationId]/settings/organization-settings-sidebar.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/organization-settings-sidebar.test.tsx @@ -96,7 +96,7 @@ describe('organization settings navigation first paint', () => { expect(container).toHaveTextContent('Audit logs') expect(container).toHaveTextContent('Data retention') - expect(container).toHaveTextContent('Integrations') + expect(container).toHaveTextContent('Sources') expect(mockRequestJson).toHaveBeenCalledTimes(1) expect(mockRequestJson.mock.calls[0][0].path).toBe('/api/organizations/[id]/billing-summary') }) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.test.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.test.tsx new file mode 100644 index 00000000000..09571d37abb --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.test.tsx @@ -0,0 +1,235 @@ +/** + * @vitest-environment jsdom + */ +import { act, type ComponentProps } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import type { Credential } from '@/lib/oauth' +import type { + ConnectServiceAccountModal, + ServiceAccountConnectTarget, + useServiceAccountConnectTarget, +} from '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal' +import type { ConnectorSettingsFieldsProps } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields' +import type { ConnectorMeta } from '@/connectors/types' + +const mocks = vi.hoisted(() => ({ + credentials: [] as Pick[], + serviceAccountModal: vi.fn(), + serviceAccountTarget: vi.fn(), + selectCredential: vi.fn(), +})) + +vi.mock('@/hooks/queries/oauth/oauth-credentials', () => ({ + useOAuthCredentials: () => ({ + data: mocks.credentials, + isLoading: false, + refetch: vi.fn(), + }), +})) +vi.mock('@/hooks/use-credential-refresh-triggers', () => ({ + useCredentialRefreshTriggers: vi.fn(), +})) +vi.mock( + '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal', + () => ({ + useServiceAccountConnectTarget: ( + args: Parameters[0] + ): ServiceAccountConnectTarget | null => { + mocks.serviceAccountTarget(args) + if (!args.serviceAccountProviderId || !args.serviceName || !args.serviceIcon) return null + return { + serviceAccountProviderId: args.serviceAccountProviderId, + serviceName: args.serviceName, + serviceIcon: args.serviceIcon, + label: 'Add service account', + hidden: false, + } + }, + ConnectServiceAccountModal: (props: ComponentProps) => { + mocks.serviceAccountModal(props) + return props.open ? ( + + ) : null + }, + }) +) +vi.mock('@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-config-fields', () => ({ + ConnectorConfigFields: () => null, +})) +vi.mock( + '@/app/workspace/[workspaceId]/knowledge/[id]/components/connector-access-field/connector-access-field', + () => ({ + ConnectorAccessField: () => null, + ConnectorContentCredentialField: () => null, + }) +) + +import { ConnectorSettingsFields } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields' +import { confluenceConnectorMeta } from '@/connectors/confluence/meta' +import { googleDriveConnectorMeta } from '@/connectors/google-drive/meta' + +function fieldProps(connectorConfig: ConnectorMeta): ConnectorSettingsFieldsProps { + return { + availability: { error: null, isFetching: false, refetch: vi.fn() }, + isSearchIndex: true, + connectorConfig, + selectionLabels: {}, + sourceConfig: {}, + credentialId: null, + canonicalGroups: new Map(), + canonicalModes: {}, + onToggleCanonicalMode: vi.fn(), + onFieldChange: vi.fn(), + isFieldVisible: () => false, + syncInterval: 60, + setSyncInterval: vi.fn(), + hasMaxAccess: true, + isSaving: false, + error: null, + access: { accessMode: 'admin' }, + onAccessChange: vi.fn(), + canAdmin: true, + showAccessField: true, + allowMembers: true, + allowAdmin: true, + allowWorkspace: false, + canReenableMemberSync: false, + accessDirty: true, + accessModeChanged: true, + accessComplete: false, + isSwitchingAccess: false, + onApplyAccess: vi.fn(), + onResetAccess: vi.fn(), + scope: { kind: 'organization', organizationId: 'org-1' }, + needsWorkspaceCredential: true, + workspaceCredentialId: null, + contentCredentialId: null, + onContentCredentialChange: vi.fn(), + onWorkspaceCredentialChange: mocks.selectCredential, + } +} + +describe('connector settings service-account choices', () => { + let container: HTMLDivElement + let root: Root + + beforeEach(() => { + vi.clearAllMocks() + mocks.credentials = [] + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) + }) + + afterEach(() => { + act(() => root.unmount()) + container.remove() + }) + + async function render( + meta: ConnectorMeta, + overrides: Partial = {} + ) { + await act(async () => { + root.render() + }) + } + + async function openAccountChoices() { + const dropdown = container.querySelector('[role="combobox"]') + if (!dropdown) throw new Error('Missing indexing-account selector') + await act(async () => dropdown.click()) + } + + async function choose(label: string) { + const option = Array.from(document.querySelectorAll('[role="option"]')).find( + (node) => node.textContent?.trim() === label + ) + if (!option) throw new Error(`Missing account choice: ${label}`) + await act(async () => { + option.dispatchEvent(new MouseEvent('mousedown', { bubbles: true })) + }) + } + + it.each([ + { + meta: confluenceConnectorMeta, + provider: 'atlassian-service-account', + product: 'confluence', + }, + { meta: googleDriveConnectorMeta, provider: 'google-service-account', product: undefined }, + ])( + 'opens the correct $meta.name service-account setup from Search settings', + async ({ meta, provider, product }) => { + await render(meta) + expect(mocks.serviceAccountTarget).toHaveBeenLastCalledWith( + expect.objectContaining({ serviceAccountProviderId: provider }) + ) + await openAccountChoices() + await choose('Add service account') + expect(mocks.serviceAccountModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + open: true, + organizationId: 'org-1', + serviceAccountProviderId: provider, + atlassianProduct: product, + }) + ) + + const finish = Array.from(container.querySelectorAll('button')).find( + (node) => node.textContent === 'Finish service account setup' + ) + if (!finish) throw new Error('Missing service-account completion control') + await act(async () => finish.click()) + expect(mocks.selectCredential).toHaveBeenCalledExactlyOnceWith('new-service-account') + } + ) + + it('keeps an existing Google service account selectable without opening new setup', async () => { + mocks.credentials = [ + { + id: 'google-service-account-1', + name: 'Search indexing account', + provider: 'google-drive', + type: 'service_account', + }, + ] + await render(googleDriveConnectorMeta) + await openAccountChoices() + await choose('Search indexing account') + expect(mocks.selectCredential).toHaveBeenCalledExactlyOnceWith('google-service-account-1') + expect(mocks.serviceAccountModal).not.toHaveBeenCalled() + }) + + it('preserves the regular knowledge-base Confluence account choices', async () => { + mocks.credentials = [ + { + id: 'confluence-1', + name: 'Existing Confluence account', + provider: 'confluence', + type: 'oauth', + }, + ] + await render(confluenceConnectorMeta, { + isSearchIndex: false, + allowWorkspace: true, + scope: { kind: 'workspace', workspaceId: 'workspace-1' }, + }) + expect(mocks.serviceAccountTarget).toHaveBeenLastCalledWith( + expect.objectContaining({ serviceAccountProviderId: undefined }) + ) + await openAccountChoices() + expect( + Array.from(document.querySelectorAll('[role="option"]')).map((node) => + node.textContent?.trim() + ) + ).toEqual(['Existing Confluence account']) + await choose('Existing Confluence account') + expect(mocks.selectCredential).toHaveBeenCalledExactlyOnceWith('confluence-1') + expect(mocks.serviceAccountModal).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx index 9f0bc153dc0..fdf529fd31c 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/connector-settings-fields.tsx @@ -153,7 +153,7 @@ export function ConnectorSettingsFields({ : undefined const serviceAccountTarget = useServiceAccountConnectTarget({ serviceAccountProviderId: - requiresServiceAccount && + (isSearchIndex || requiresServiceAccount) && (serviceAccountProviderId === 'google-service-account' || serviceAccountProviderId === 'atlassian-service-account') ? serviceAccountProviderId @@ -313,6 +313,7 @@ export function ConnectorSettingsFields({ {showServiceAccountModal && serviceAccountTarget && canAdmin && ( ({ canAdmin: false, @@ -158,11 +159,29 @@ beforeEach(() => { afterEach(async () => { await act(async () => root.unmount()) + vi.useRealTimers() container.remove() vi.unstubAllGlobals() }) describe('unified Search sources', () => { + it('keeps typing responsive and debounces the server search', async () => { + vi.useFakeTimers() + await render() + const input = document.querySelector('input')! + const setValue = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')!.set! + await act(async () => { + setValue.call(input, 'git') + input.dispatchEvent(new Event('input', { bubbles: true })) + }) + expect(input.value).toBe('git') + expect(mocks.sourceQuery).toHaveBeenLastCalledWith('workspace-1', { search: '' }) + await act(async () => vi.advanceTimersByTime(SEARCH_DEBOUNCE_MS - 1)) + expect(mocks.sourceQuery).toHaveBeenLastCalledWith('workspace-1', { search: '' }) + await act(async () => vi.advanceTimersByTime(1)) + expect(mocks.sourceQuery).toHaveBeenLastCalledWith('workspace-1', { search: 'git' }) + }) + it('shows configured central Drive and GitLab sources to readers without setup controls', async () => { await render() expect(document.body.textContent).toContain('Google Drive') diff --git a/apps/sim/app/workspace/[workspaceId]/search/search.tsx b/apps/sim/app/workspace/[workspaceId]/search/search.tsx index 76600a927b5..2284ac9d141 100644 --- a/apps/sim/app/workspace/[workspaceId]/search/search.tsx +++ b/apps/sim/app/workspace/[workspaceId]/search/search.tsx @@ -6,6 +6,7 @@ import { Plus, Search as SearchIcon } from '@sim/emcn/icons' import { useParams } from 'next/navigation' import { useQueryState } from 'nuqs' import { connectorDisplayName } from '@/lib/sim-search/connectors' +import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { IntegrationTabsHeader } from '@/app/workspace/[workspaceId]/components' import { IntegrationSection } from '@/app/workspace/[workspaceId]/integrations/components/integration-section' import { useScrollRestoration } from '@/app/workspace/[workspaceId]/integrations/hooks/use-scroll-restoration' @@ -30,6 +31,7 @@ import { useWorkspaceMemberConnectors, } from '@/hooks/queries/kb/connectors' import { useWorkspacePermissionsQuery } from '@/hooks/queries/workspace' +import { useDebounce } from '@/hooks/use-debounce' import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter' import { useMemberAccessAvailable } from '@/hooks/use-member-access' import { useMemberEnrollment } from '@/hooks/use-member-enrollment' @@ -48,7 +50,8 @@ export function Search() { ...connectorSearchParam.parser, ...connectorSearchUrlKeys, }) - const sources = useSearchSources(workspaceId, { search: searchTerm }) + const sourceSearch = useDebounce(searchTerm.trim(), SEARCH_DEBOUNCE_MS) + const sources = useSearchSources(workspaceId, { search: sourceSearch }) const [, setSelectedType] = useQueryState( searchSetupParam.key, searchSetupParam.parser.withOptions({ history: 'replace' }) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx index 226d06b2986..22d0f09b014 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.test.tsx @@ -159,6 +159,12 @@ describe('SidebarFooter', () => { openProfileMenu() expect(menuItem('Organization')).toHaveAttribute('href', '/o/host-org') + const labels = Array.from(document.querySelectorAll('[role="menuitem"]')).map( + (item) => item.textContent + ) + expect(labels.indexOf('Organization')).toBe(labels.indexOf('Settings') + 1) + expect(labels.indexOf('Organization')).toBeLessThan(labels.indexOf('Teammates')) + expect(document.querySelector('[role="menu"] [role="separator"]')).toBeNull() }) it.each([false, undefined])( diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx index ea28df62789..3187bccd6fe 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/sidebar-footer/sidebar-footer.tsx @@ -56,11 +56,12 @@ import { useWorkspaceInvitePolicy } from '@/hooks/use-workspace-invite-policy' * never lists a page the server would refuse. */ const PROFILE_MENU_ITEMS: readonly { - section: SettingsSection + section: SettingsSection | 'organization' label: string icon: ComponentType<{ className?: string }> }[] = [ { section: 'general', label: 'Settings', icon: Settings }, + { section: 'organization', label: 'Organization', icon: Building }, { section: 'billing', label: 'Subscription', icon: Credit }, { section: 'teammates', label: 'Teammates', icon: Users }, { section: 'recently-deleted', label: 'Recently deleted', icon: Trash }, @@ -180,7 +181,9 @@ export function SidebarFooter({ */ const menuItems = PROFILE_MENU_ITEMS.filter( (item) => - item.section !== 'billing' || canViewWorkspaceBillingSettings(hostContext, session?.user?.id) + (item.section !== 'organization' || Boolean(organizationHref)) && + (item.section !== 'billing' || + canViewWorkspaceBillingSettings(hostContext, session?.user?.id)) ) /** @@ -273,18 +276,18 @@ export function SidebarFooter({ - {organizationHref && ( - <> - - - - - - - - - )} {menuItems.map(({ section, label, icon: Icon }) => { + if (section === 'organization') { + if (!organizationHref) return null + return ( + + + + + + + ) + } const destination = resolveMenuDestination(section) if (!destination) { return ( diff --git a/apps/sim/components/settings/navigation.ts b/apps/sim/components/settings/navigation.ts index 4cb95e82f4d..0d639e307bb 100644 --- a/apps/sim/components/settings/navigation.ts +++ b/apps/sim/components/settings/navigation.ts @@ -931,7 +931,7 @@ export const ORGANIZATION_SETTINGS_ITEMS: SettingsNavigationItem -

    - {searchConnection - ? `Ask people to connect their ${searchConnection.providerName} account for Search. This does not invite them to join the organization.` - : 'Ask people to connect their accounts. This does not invite them to join the organization.'} -

    Date: Tue, 8 Sep 2026 20:26:51 -0700 Subject: [PATCH 13/14] fix(search): reconcile sync progress and finish source guides --- apps/docs/content/docs/search/confluence.mdx | 2 +- .../docs/search/connect-your-account.mdx | 4 +- apps/docs/content/docs/search/index.mdx | 2 +- apps/docs/content/docs/search/jira.mdx | 4 +- .../static/search/member-enrollment.jpg | Bin 0 -> 13811 bytes .../sim-search/sources/route.test.ts | 1 + .../organization-integrations-setup.test.tsx | 8 ++- .../use-connector-settings-form.ts | 25 +++----- apps/sim/hooks/queries/kb/connectors.test.ts | 34 ++-------- apps/sim/hooks/queries/kb/connectors.ts | 21 +------ .../kb/organization-search-overview.test.tsx | 18 ++++-- .../kb/search-source-progress.test.tsx | 59 +++++++++++++++++- .../lib/api/contracts/knowledge/connectors.ts | 1 + ...rganization-search-overview.integration.ts | 30 ++++++++- .../organization-search-overview.test.ts | 57 +++++++++++++++-- .../organization-search-overview.ts | 24 +++---- 16 files changed, 190 insertions(+), 100 deletions(-) create mode 100644 apps/docs/public/static/search/member-enrollment.jpg diff --git a/apps/docs/content/docs/search/confluence.mdx b/apps/docs/content/docs/search/confluence.mdx index ff64d3c2f21..92ab84db517 100644 --- a/apps/docs/content/docs/search/confluence.mdx +++ b/apps/docs/content/docs/search/confluence.mdx @@ -196,6 +196,6 @@ Configure one shared Confluence OAuth integration for your deployment. This powe 2. Under **Authorization → OAuth 2.0 (3LO)**, add `https:///api/auth/oauth2/callback/confluence` to **Callback URLs**, keep existing callbacks used by the deployment, and save. 3. Under **Permissions**, add the Confluence API and configure the full `confluence` scope list for your release in [Sim's OAuth configuration](https://github.com/simstudioai/sim/blob/staging/apps/sim/lib/oauth/oauth.ts), including `read:group:confluence`. Also add **User Identity API** with `read:me`. Sim requests `offline_access` for refresh tokens. The service-account read scopes above do not replace the broader shared OAuth scope set. 4. Enable sharing under **Distribution**. Set `CONFLUENCE_CLIENT_ID` and `CONFLUENCE_CLIENT_SECRET` from the app's **Settings**, verify `NEXT_PUBLIC_APP_URL`, and restart Sim. -5. Start authorization from Search and select the configured site. Reconnect old accounts after adding scopes so the new permission grant takes effect. +5. Start authorization from **Integrations** and select the configured site. Reconnect old accounts after adding scopes so the new permission grant takes effect. A callback mismatch needs a corrected callback URL; a connection that works only for the app owner needs sharing enabled. See Atlassian's [OAuth configuration guide](https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/) and Sim's [deployment reference](/platform/self-hosting/integrations-oauth). diff --git a/apps/docs/content/docs/search/connect-your-account.mdx b/apps/docs/content/docs/search/connect-your-account.mdx index f85576bbc82..9ccaed82d0f 100644 --- a/apps/docs/content/docs/search/connect-your-account.mdx +++ b/apps/docs/content/docs/search/connect-your-account.mdx @@ -35,7 +35,9 @@ Use **Add source** beside **Add another [provider] source** when you need anothe In the new tab, select **Connect** and complete the provider's authorization. Choose the account associated with your verified Sim email. The provider may require your organization's SSO or app approval. -Return to Integrations when the connection completes, or use **Return to Search** on the connection page. If the popup was blocked or closed, allow popups and select **Connect account** again. While authorization is pending, use **Open again**. +Return to Integrations when the connection completes, or select **Return to Search** to open your organization’s Search page. Your account is saved when authorization completes; there is no separate submit step. If the popup was blocked or closed, allow popups and select **Connect account** again. While authorization is pending, use **Open again**. + +Gmail account connection with Connect and Return to Search actions diff --git a/apps/docs/content/docs/search/index.mdx b/apps/docs/content/docs/search/index.mdx index 91bb8e58d9c..1b45c074528 100644 --- a/apps/docs/content/docs/search/index.mdx +++ b/apps/docs/content/docs/search/index.mdx @@ -95,7 +95,7 @@ Open **Settings → Sources → [integration]**, then select a source. Providers | Source tab | What you can do | | --- | --- | | **Documents** | Find indexed documents, inspect processing status, retry failed indexing, or exclude and restore documents. | -| **Settings** | Edit the source's scope, filters, metadata, and supported connection settings. Save your changes before leaving. | +| **Settings** | Edit the source's scope, filters, and supported connection settings. Save your changes before leaving. | | **Sync history** | Review recent sync runs and errors. | Use the source header to sync, pause, resume, or remove that source. The back link returns to its integration. **Deactivate** on the integration page makes its content unavailable in Search, Assistant, and MCP while preserving its sources and connected accounts; **Activate** enables it again. diff --git a/apps/docs/content/docs/search/jira.mdx b/apps/docs/content/docs/search/jira.mdx index 102f3e3c7c2..21c421fe5c2 100644 --- a/apps/docs/content/docs/search/jira.mdx +++ b/apps/docs/content/docs/search/jira.mdx @@ -138,6 +138,6 @@ The deployment operator configures one shared Jira OAuth integration. Teammates 3. Under **Permissions**, add **Jira API**, then **Configure** its classic and granular scopes for Jira, Jira Service Management, and Assets. Separately add **User Identity API** with `read:me`. Sim requests `offline_access` in the authorization URL for refresh tokens. Configure the full `jira` scope list for your release in [Sim's OAuth configuration](https://github.com/simstudioai/sim/blob/staging/apps/sim/lib/oauth/oauth.ts); the Search read scopes above are only a subset of this shared integration's permissions. 4. Under **Distribution**, enable sharing so teammates can authorize the app. Copy the client ID and secret from **Settings** into `JIRA_CLIENT_ID` and `JIRA_CLIENT_SECRET`, set the correct `NEXT_PUBLIC_APP_URL`, and restart Sim. -5. Start a connection from Search. Confirm that Atlassian lists the intended site, then return to Sim. After changing requested scopes, reconnect previously authorized accounts. +5. Start a connection from **Integrations**. Confirm that Atlassian lists the intended site, then return to Sim. After changing requested scopes, reconnect previously authorized accounts. -For a local instance using `NEXT_PUBLIC_APP_URL=http://localhost:3000`, register `http://localhost:3000/api/auth/oauth2/callback/jira`. Use a separate development OAuth app when production callbacks must remain unchanged. After updating local client credentials or the app URL, restart Sim and begin a new connection from Search. If only the app owner can connect, check **Distribution**. See Atlassian's [OAuth configuration and sharing guide](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/) and Sim's [deployment reference](/platform/self-hosting/integrations-oauth). +For a local instance using `NEXT_PUBLIC_APP_URL=http://localhost:3000`, register `http://localhost:3000/api/auth/oauth2/callback/jira`. Use a separate development OAuth app when production callbacks must remain unchanged. After updating local client credentials or the app URL, restart Sim and begin a new connection from **Integrations**. If only the app owner can connect, check **Distribution**. See Atlassian's [OAuth configuration and sharing guide](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/) and Sim's [deployment reference](/platform/self-hosting/integrations-oauth). diff --git a/apps/docs/public/static/search/member-enrollment.jpg b/apps/docs/public/static/search/member-enrollment.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a350fe5110e414ae73d7012feb5cf2e820804b4d GIT binary patch literal 13811 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 { sourceCount: 1, approved: true, status: 'waiting_for_connections', + isSyncing: false, } mocks.adminOverview.mockResolvedValue({ providers: [{ ...provider, privateAccount: 'private' }], diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx index 57b0ed07fad..45559470eae 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup.test.tsx @@ -48,7 +48,13 @@ import { SettingsHeaderProvider, SettingsHeaderShell } from '@/components/settin import { OrganizationIntegrationsSetup } from '@/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup' const providers: OrganizationSearchProviderSummary[] = [ - { connectorType: 'gmail', approved: true, sourceCount: 0, status: 'waiting_for_connections' }, + { + connectorType: 'gmail', + approved: true, + sourceCount: 0, + status: 'waiting_for_connections', + isSyncing: false, + }, { connectorType: 'google_drive', approved: false, sourceCount: 2, status: 'paused' }, ] let root: Root diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts index 16194a28406..495ede16381 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/edit-connector-modal/use-connector-settings-form.ts @@ -294,24 +294,13 @@ export function useConnectorSettingsForm({ [connector.sourceConfig] ) - const hasChanges = useMemo(() => { - if (syncInterval !== connector.syncIntervalMinutes) return true - if (didCanonicalModesChange(canonicalModes, persistedCanonicalModes)) return true - const resolved = resolveSourceConfig() - for (const [key, value] of Object.entries(resolved)) { - if (hiddenCapFieldIds.has(key)) continue - if (!valuesEqual(connector.sourceConfig[key], value)) return true - } - return false - }, [ - resolveSourceConfig, - syncInterval, - connector.syncIntervalMinutes, - connector.sourceConfig, - canonicalModes, - persistedCanonicalModes, - hiddenCapFieldIds, - ]) + const hasChanges = + syncInterval !== connector.syncIntervalMinutes || + didCanonicalModesChange(canonicalModes, persistedCanonicalModes) || + Object.entries(resolveSourceConfig()).some( + ([key, value]) => + !hiddenCapFieldIds.has(key) && !valuesEqual(connector.sourceConfig[key], value) + ) const handleSave = useCallback(() => { if (!searchSettingsAllowed || !settingsComplete || accessDirty) return diff --git a/apps/sim/hooks/queries/kb/connectors.test.ts b/apps/sim/hooks/queries/kb/connectors.test.ts index f732b184a12..f374210a0ca 100644 --- a/apps/sim/hooks/queries/kb/connectors.test.ts +++ b/apps/sim/hooks/queries/kb/connectors.test.ts @@ -211,6 +211,7 @@ describe('useTriggerSync optimistic state', () => { function capturedMutationOptions() { return mocks.useMutation.mock.calls.at(-1)?.[0] as { onMutate: (vars: { knowledgeBaseId: string; connectorId: string }) => Promise + onSettled: () => Promise onSuccess: (data: undefined, vars: { knowledgeBaseId: string; connectorId: string }) => void onError: ( error: unknown, @@ -294,37 +295,10 @@ describe('useTriggerSync optimistic state', () => { expect(rolledBack?.find((c) => c.id === 'connector-2')?.status).toBe('pending') }) - /** - * The Search surface reads the member sync status from the workspace - * member-connector list, which has no poll of its own, so a members-mode - * trigger patches that cache too and a refused trigger refetches it. - */ - it('patches all loaded source pages without changing cursors or overview cache data', async () => { - mocks.getQueryData.mockReturnValue([makeConnector({ status: 'active' })]) + it('reconciles server source summaries after either sync outcome', async () => { useTriggerSync() - await capturedMutationOptions().onMutate({ knowledgeBaseId: KB_ID, connectorId: 'connector-1' }) - const [filter, patch] = mocks.setQueriesData.mock.calls.find( - ([filter]) => filter.queryKey[0] === 'search-sources' - )! - const overviewKey = searchSourceKeys.overview('workspace-a') - const pagesKey = searchSourceKeys.pages('workspace-a', { search: '', mine: false }) - expect(filter.predicate({ queryKey: overviewKey })).toBe(false) - expect(filter.predicate({ queryKey: pagesKey })).toBe(true) - const cached = { - pageParams: [null, 'cursor'], - pages: [ - { sources: [{ connectorId: 'other', isSyncing: false }], nextCursor: 'cursor' }, - { sources: [{ connectorId: 'connector-1', isSyncing: false }], nextCursor: null }, - ], - } - expect(patch(cached)).toEqual({ - ...cached, - pages: [ - cached.pages[0], - { ...cached.pages[1], sources: [{ connectorId: 'connector-1', isSyncing: true }] }, - ], - }) - expect(patch(undefined)).toBeUndefined() + await capturedMutationOptions().onSettled() + expect(mocks.invalidateQueries).toHaveBeenCalledWith({ queryKey: searchSourceKeys.lists() }) }) it('queues a members connector in the workspace member-connector list as well', async () => { diff --git a/apps/sim/hooks/queries/kb/connectors.ts b/apps/sim/hooks/queries/kb/connectors.ts index d4a39a2a08f..1a3698f52b4 100644 --- a/apps/sim/hooks/queries/kb/connectors.ts +++ b/apps/sim/hooks/queries/kb/connectors.ts @@ -1,6 +1,5 @@ import { useEffect } from 'react' import { - type InfiniteData, keepPreviousData, type QueryClient, useInfiniteQuery, @@ -521,7 +520,7 @@ export function useOrganizationSearchOverview( enabled: Boolean(organizationId) && (options?.enabled ?? true), staleTime: CONNECTOR_LIST_STALE_TIME, refetchInterval: (query) => - query.state.data?.providers.some((provider) => provider.status === 'indexing') + query.state.data?.providers.some((provider) => provider.isSyncing) ? SEARCH_SOURCE_SUMMARY_POLL_MS : false, }) @@ -807,23 +806,7 @@ export function useTriggerSync() { await Promise.all([ queryClient.cancelQueries({ queryKey: connectorKeys.all(knowledgeBaseId) }), queryClient.cancelQueries({ queryKey: memberConnectorKeys.lists() }), - queryClient.cancelQueries({ queryKey: searchSourceKeys.lists() }), ]) - queryClient.setQueriesData>( - { queryKey: searchSourceKeys.lists(), predicate: (query) => query.queryKey[3] === 'pages' }, - (data) => - data - ? { - ...data, - pages: data.pages.map((page) => ({ - ...page, - sources: page.sources.map((source) => - source.connectorId === connectorId ? { ...source, isSyncing: true } : source - ), - })), - } - : data - ) return optimisticallyQueueSync(queryClient, knowledgeBaseId, connectorId) }, /** @@ -831,7 +814,6 @@ export function useTriggerSync() { * refused sync does not leave the row spinning. */ onError: (_error, { knowledgeBaseId, connectorId }, previous) => { - queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }) queryClient.invalidateQueries({ queryKey: searchIntegrationKeys.lists() }) if (previous) { setCachedConnectorStatus(queryClient, knowledgeBaseId, connectorId, previous) @@ -852,6 +834,7 @@ export function useTriggerSync() { queryKey: connectorKeys.progresses(knowledgeBaseId, connectorId), }) }, + onSettled: () => queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }), }) } diff --git a/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx b/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx index 8a810f4affd..e2dc9aed9bd 100644 --- a/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx +++ b/apps/sim/hooks/queries/kb/organization-search-overview.test.tsx @@ -54,7 +54,13 @@ beforeEach(() => { ? { data: { providers: [ - { connectorType: 'gmail', sourceCount: 3, approved: true, status: 'active' }, + { + connectorType: 'gmail', + sourceCount: 3, + approved: true, + status: 'active', + isSyncing: false, + }, ], }, } @@ -109,13 +115,15 @@ describe('organization Search queries', () => { }) it.each([ - { status: 'waiting_for_connections', requests: 1 }, - { status: 'indexing', requests: 2 }, - ])('polls only pending work when status is $status', async ({ status, requests }) => { + { status: 'waiting_for_connections', isSyncing: false, requests: 1 }, + { status: 'indexing', isSyncing: true, requests: 2 }, + { status: 'needs_attention', isSyncing: true, requests: 2 }, + { status: 'needs_attention', isSyncing: false, requests: 1 }, + ])('polls only pending work when status is $status', async ({ status, isSyncing, requests }) => { enabled = true mocks.requestJson.mockResolvedValue({ data: { - providers: [{ connectorType: 'gmail', sourceCount: 1, approved: true, status }], + providers: [{ connectorType: 'gmail', sourceCount: 1, approved: true, status, isSyncing }], }, }) await render('overview') diff --git a/apps/sim/hooks/queries/kb/search-source-progress.test.tsx b/apps/sim/hooks/queries/kb/search-source-progress.test.tsx index 895826d3bbf..4fe230fd650 100644 --- a/apps/sim/hooks/queries/kb/search-source-progress.test.tsx +++ b/apps/sim/hooks/queries/kb/search-source-progress.test.tsx @@ -7,9 +7,15 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => ({ requestJson: vi.fn() })) vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.requestJson })) -import { searchSourceKeys, useSearchSources } from '@/hooks/queries/kb/connectors' +import { + connectorKeys, + searchSourceKeys, + useSearchSources, + useTriggerSync, +} from '@/hooks/queries/kb/connectors' let root: Root +let container: HTMLDivElement let client: QueryClient let syncing: boolean let progressFails: boolean @@ -17,7 +23,18 @@ let enabled: boolean function Probe() { const result = useSearchSources('workspace', { enabled }) - return
    {result.data?.[0]?.viewerDocumentCount ?? 0}
    + const sync = useTriggerSync() + return ( +
    + {result.data?.[0]?.viewerDocumentCount ?? 0} + +
    + ) } async function advance(ms: number) { await act(async () => { @@ -25,7 +42,8 @@ async function advance(ms: number) { }) } async function mount() { - root = createRoot(document.createElement('div')) + container = document.createElement('div') + root = createRoot(container) await act(async () => root.render( @@ -83,6 +101,41 @@ afterEach(() => { }) describe('source progress polling', () => { + it('starts source progress only after the sync is queued and stops when it completes', async () => { + syncing = false + const queued = Promise.withResolvers() + const original = mocks.requestJson.getMockImplementation()! + mocks.requestJson.mockImplementation((contract, input) => + contract.path.endsWith('/sync') ? queued.promise : original(contract, input) + ) + client.setQueryData(connectorKeys.lists('kb'), [ + { id: 'source', knowledgeBaseId: 'kb', status: 'active' }, + ]) + await mount() + await act(async () => container.querySelector('button')!.click()) + await advance(1) + expect(container.querySelector('button')?.disabled).toBe(true) + expect(client.getQueryData(connectorKeys.lists('kb'))).toMatchObject([{ status: 'pending' }]) + await advance(3000) + expect(calls('/progress')).toHaveLength(0) + expect(calls('/sources')).toHaveLength(1) + syncing = true + await act(async () => queued.resolve()) + await advance(1) + expect(calls('/sources')).toHaveLength(2) + expect(calls('/progress').length).toBeGreaterThan(0) + expect(container.querySelector('button')?.disabled).toBe(false) + syncing = false + await advance(3000) + await advance(1) + expect( + client.getQueryData(searchSourceKeys.pages('workspace', { search: '', mine: false })) + ).toMatchObject({ pages: [{ sources: [{ isSyncing: false, viewerDocumentCount: 1 }] }] }) + const total = mocks.requestJson.mock.calls.length + await advance(60_000) + expect(mocks.requestJson).toHaveBeenCalledTimes(total) + }) + it('checks progress without recounting every three seconds and slows long waits', async () => { await mount() for (let i = 0; i < 20; i++) await advance(3000) diff --git a/apps/sim/lib/api/contracts/knowledge/connectors.ts b/apps/sim/lib/api/contracts/knowledge/connectors.ts index e920990f615..ded0a02984b 100644 --- a/apps/sim/lib/api/contracts/knowledge/connectors.ts +++ b/apps/sim/lib/api/contracts/knowledge/connectors.ts @@ -422,6 +422,7 @@ export const organizationSearchProviderSummarySchema = z.object({ approved: z.boolean(), sourceCount: z.number().int().nonnegative(), status: organizationSearchProviderStatusSchema, + isSyncing: z.boolean(), }) export type OrganizationSearchProviderSummary = z.output< typeof organizationSearchProviderSummarySchema diff --git a/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts b/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts index 85f36ea1596..0a044596045 100644 --- a/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/organization-search-overview.integration.ts @@ -174,8 +174,20 @@ describe('organization operational overview with real SQL', () => { const result = await readOrganizationSearchOverview.execute({ principal, input }) expect(result.providers).toEqual( expect.arrayContaining([ - { connectorType: 'google_drive', sourceCount: 2, approved: true, status: 'active' }, - { connectorType: 'gmail', sourceCount: 1, approved: true, status: 'active' }, + { + connectorType: 'google_drive', + sourceCount: 2, + approved: true, + status: 'active', + isSyncing: false, + }, + { + connectorType: 'gmail', + sourceCount: 1, + approved: true, + status: 'active', + isSyncing: false, + }, ]) ) expect(result.providers).toHaveLength(2) @@ -272,6 +284,14 @@ describe('organization operational overview with real SQL', () => { .set({ userExcluded: false, processingStatus: 'processing' }) .where(eq(document.id, documentId)) expect(await provider('google_drive')).toMatchObject({ status: 'indexing' }) + await db + .update(knowledgeConnector) + .set({ lastSyncError: 'previous sync failed' }) + .where(eq(knowledgeConnector.id, driveId)) + expect(await provider('google_drive')).toMatchObject({ + status: 'needs_attention', + isSyncing: true, + }) }) it('surfaces retained source errors and stale member permissions, while pause and deactivation take precedence', async () => { await db @@ -295,7 +315,11 @@ describe('organization operational overview with real SQL', () => { await db .insert(organizationSearchIntegration) .values({ organizationId: ids.organizationId, connectorType: 'gmail', approved: false }) - expect(await provider('gmail')).toMatchObject({ approved: false, status: 'paused' }) + expect(await provider('gmail')).toMatchObject({ + approved: false, + status: 'paused', + isSyncing: false, + }) }) it('requires a current organization admin even for a workspace administrator', async () => { await expect( diff --git a/apps/sim/lib/knowledge/application/organization-search-overview.test.ts b/apps/sim/lib/knowledge/application/organization-search-overview.test.ts index 14ee8417927..bba1e96d990 100644 --- a/apps/sim/lib/knowledge/application/organization-search-overview.test.ts +++ b/apps/sim/lib/knowledge/application/organization-search-overview.test.ts @@ -49,6 +49,22 @@ beforeEach(() => { }) describe('organization Search administration overview', () => { + it('keeps recovery observable while a previous error remains visible', async () => { + queueTableRows(member, [{ role: 'admin' }]) + queueTableRows(knowledgeConnector, [{ ...health, hasError: true, hasIndexing: true }]) + const result = await readOrganizationSearchOverview.execute({ principal, input }) + expect(result.providers).toEqual([ + { + connectorType: 'google_drive', + sourceCount: 4, + approved: true, + status: 'needs_attention', + isSyncing: true, + }, + ]) + expect(organizationSearchOverviewSchema.parse(result)).toEqual(result) + }) + it.each(['admin', 'owner'])( 'allows a current %s and returns only operational facts', async (role) => { @@ -63,14 +79,27 @@ describe('organization Search administration overview', () => { const result = await readOrganizationSearchOverview.execute({ principal, input }) expect(result).toEqual({ providers: [ - { connectorType: 'google_drive', sourceCount: 4, approved: true, status: 'active' }, + { + connectorType: 'google_drive', + sourceCount: 4, + approved: true, + status: 'active', + isSyncing: false, + }, { connectorType: 'gmail', sourceCount: 0, approved: true, status: 'waiting_for_connections', + isSyncing: false, + }, + { + connectorType: 'github', + sourceCount: 0, + approved: false, + status: 'paused', + isSyncing: false, }, - { connectorType: 'github', sourceCount: 0, approved: false, status: 'paused' }, ], }) expect(organizationSearchOverviewSchema.parse(result)).toEqual(result) @@ -115,7 +144,13 @@ describe('organization Search administration overview', () => { ]) const result = await readOrganizationSearchOverview.execute({ principal, input }) expect(result.providers).toEqual([ - { connectorType: 'google_drive', sourceCount: 4, approved: false, status: 'paused' }, + { + connectorType: 'google_drive', + sourceCount: 4, + approved: false, + status: 'paused', + isSyncing: false, + }, ]) }) it('does not mistake infrastructure failure for an empty integration list', async () => { @@ -141,8 +176,20 @@ describe('organization Search administration overview', () => { const result = await readOrganizationSearchOverview.execute({ principal, input }) expect(mocks.availability).toHaveBeenCalledWith(input) expect(result.providers).toEqual([ - { connectorType: 'google_drive', sourceCount: 4, approved: true, status: 'paused' }, - { connectorType: 'gmail', sourceCount: 0, approved: true, status: 'paused' }, + { + connectorType: 'google_drive', + sourceCount: 4, + approved: true, + status: 'paused', + isSyncing: false, + }, + { + connectorType: 'gmail', + sourceCount: 0, + approved: true, + status: 'paused', + isSyncing: false, + }, ]) }) }) diff --git a/apps/sim/lib/knowledge/application/organization-search-overview.ts b/apps/sim/lib/knowledge/application/organization-search-overview.ts index 67a0a7923f3..6031da63c09 100644 --- a/apps/sim/lib/knowledge/application/organization-search-overview.ts +++ b/apps/sim/lib/knowledge/application/organization-search-overview.ts @@ -244,22 +244,24 @@ export const readOrganizationSearchOverview = defineAuthorizedKnowledgeUseCase({ const state = healthByType.get(connectorType) if (!state && !approvals.has(connectorType)) return [] const approved = approvals.get(connectorType) ?? Boolean(state?.sourceCount) + const status = organizationSearchProviderStatus( + state, + approved, + meta.mirrorsSourceAcls === true, + Boolean( + (meta.permissionScopedListing && availability.memberScoped) || + (meta.mirrorsSourceAcls && + availability.sourceMirrored && + (!meta.requiresMemberIdentity || availability.memberScoped)) + ) + ) return [ { connectorType, approved, sourceCount: state?.sourceCount ?? 0, - status: organizationSearchProviderStatus( - state, - approved, - meta.mirrorsSourceAcls === true, - Boolean( - (meta.permissionScopedListing && availability.memberScoped) || - (meta.mirrorsSourceAcls && - availability.sourceMirrored && - (!meta.requiresMemberIdentity || availability.memberScoped)) - ) - ), + status, + isSyncing: status !== 'paused' && Boolean(state?.hasIndexing), }, ] }), From 2f29207a8f2b1081ff3ae332f94c14fa3c73ee33 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 8 Sep 2026 20:58:38 -0700 Subject: [PATCH 14/14] fix(sidebar): restore shared collapse animation --- .../workspace-chrome/workspace-chrome.tsx | 16 +++- .../sidebar/hooks/use-sidebar-resize.test.tsx | 73 +++++++++++++++++++ .../sidebar/hooks/use-sidebar-resize.ts | 2 + 3 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.test.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/components/workspace-chrome/workspace-chrome.tsx b/apps/sim/app/workspace/[workspaceId]/components/workspace-chrome/workspace-chrome.tsx index fd0e5aac7f4..cf13dd83621 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/workspace-chrome/workspace-chrome.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/workspace-chrome/workspace-chrome.tsx @@ -160,9 +160,9 @@ function isFullscreenPath(pathname: string | null): boolean { * zero width, revealing the route content. Because this component lives in the * layout it persists across navigations, so the rail never re-mounts. * - * Nothing here animates: collapse, expand, and the fullscreen swap all apply in - * one frame. The rail and the pane meet on a single hairline divider with no - * gutter, radius, or shift between states. + * The docked rail and content pane share one width transition. Drag-resizing, + * hydration, and reduced motion bypass it; the floating peek retains its own + * enter/exit animation. * * Because the chrome observes every pathname transition, it records the page a * fullscreen route was launched from into {@link useFullscreenOriginStore}. The @@ -331,6 +331,9 @@ export function WorkspaceChrome({ ref={cardRef} className={cn( 'sidebar-shell-outer shrink-0 overflow-hidden', + hasHydrated && + !isPeekActive && + 'transition-[width] duration-175 ease-[cubic-bezier(0.25,0.1,0.25,1)] data-[resizing]:transition-none motion-reduce:transition-none', isPeekActive ? isPeekOpen ? PEEK_CARD_ENTER @@ -345,7 +348,12 @@ export function WorkspaceChrome({ aria-hidden={isFullscreen || (isPeekActive && !isPeekOpen) || undefined} suppressHydrationWarning > -
    +
    {sidebar} diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.test.tsx new file mode 100644 index 00000000000..358849dc00b --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.test.tsx @@ -0,0 +1,73 @@ +/** + * @vitest-environment jsdom + */ +import { act } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { useSidebarResize } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize' +import { useSidebarStore } from '@/stores/sidebar/store' + +let container: HTMLDivElement +let root: Root + +function ResizeHandle() { + const { handlePointerDown } = useSidebarResize() + return
    +} + +beforeEach(() => { + vi.useFakeTimers() + ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true + useSidebarStore.setState({ isCollapsed: false, sidebarWidth: 256 }) + container = document.createElement('div') + container.className = 'sidebar-shell-outer' + document.body.appendChild(container) + root = createRoot(container) + act(() => root.render()) +}) + +afterEach(() => { + act(() => root.unmount()) + container.remove() + vi.useRealTimers() +}) + +function startResize() { + const handle = container.querySelector('[role="separator"]')! + act(() => handle.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true }))) + expect(container.hasAttribute('data-resizing')).toBe(true) +} + +describe('sidebar resize lifecycle', () => { + it.each(['pointerup', 'pointercancel', 'blur', 'unmount'])( + 'restores animation and persists the final width after %s', + (event) => { + startResize() + act(() => { + document.dispatchEvent(new MouseEvent('pointermove', { clientX: 280 })) + vi.advanceTimersByTime(20) + }) + expect(container.style.getPropertyValue('--sidebar-width')).toBe('280px') + expect(useSidebarStore.getState().sidebarWidth).toBe(256) + + act(() => { + if (event === 'unmount') root.render(null) + else if (event === 'blur') window.dispatchEvent(new Event(event)) + else document.dispatchEvent(new Event(event)) + }) + + expect(container.hasAttribute('data-resizing')).toBe(false) + expect(container.style.getPropertyValue('--sidebar-width')).toBe('') + expect(useSidebarStore.getState().sidebarWidth).toBe(280) + expect(document.body.style.cursor).toBe('') + expect(document.body.style.userSelect).toBe('') + } + ) + + it('restores animation when released without moving', () => { + startResize() + act(() => document.dispatchEvent(new Event('pointerup'))) + expect(container.hasAttribute('data-resizing')).toBe(false) + expect(useSidebarStore.getState().sidebarWidth).toBe(256) + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.ts index a444efe6a8b..64177c769d5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-sidebar-resize.ts @@ -40,6 +40,7 @@ export function useSidebarResize() { const pointerId = e.pointerId const shell = document.querySelector('.sidebar-shell-outer') const target = shell ?? document.documentElement + target.setAttribute('data-resizing', '') document.body.style.cursor = 'ew-resize' document.body.style.userSelect = 'none' handle.setPointerCapture?.(pointerId) @@ -79,6 +80,7 @@ export function useSidebarResize() { setSidebarWidth(lastWidth) if (target !== document.documentElement) target.style.removeProperty('--sidebar-width') } + target.removeAttribute('data-resizing') } teardownRef.current = endDrag

    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 Z!+O?nLtEZ`&?0ykf@O5yT6bLE@CSHfi$VYZ literal 42066 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 F{3kM9So#0} literal 38878 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 diff --git a/apps/docs/public/static/search/google-drive-setup.jpg b/apps/docs/public/static/search/google-drive-setup.jpg index 9e4e0af001d46b3fa486ef3ec1ae93d159618975..f96b6eeb98d27d8707aeb73664ae5a49966e62af 100644 GIT binary patch literal 103051 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 z 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 E0r)Yi0RR91 literal 43690 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%0D=%N167|vHlx?g6%B_4s4 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%0D?My224J`lXWH&K2g!aC~SZUujdr3^!j3!g+Bm} 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 literal 34624 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 diff --git a/apps/docs/public/static/search/jira-setup.jpg b/apps/docs/public/static/search/jira-setup.jpg index 75af10157244b03a15bd2d2702a2229165dffd77..7a533a2e2846bdf2c3d888b04b207e3da2e77a6e 100644 GIT binary patch literal 87866 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 diff --git a/apps/docs/public/static/search/slack-setup.jpg b/apps/docs/public/static/search/slack-setup.jpg index 9b701cd44272ac2369d74306cdeecb5446f4e4f0..5076446a3faecb9c9c3b6841bd8994b9a563e8dc 100644 GIT binary patch literal 83176 zcmeEv30xCdx^E$^C`jXmv>-4pAc8=vEG-DZR$QPF**78M!Wu$a*_TkXHX_i-AOa0( z2(oV>LI{y9>1GiDk$p>m$i4;=wgj@h!nya(-1}zUI5Yj;op*m7teC1gr|O(j=X~e; z{@?#QB^(rf0QQ+&y>S%~5di=Z=noLmfXjgBj_uF(w#@|U66*&&<*e@cwUqsjlC_?4jDf00H{M$!lhv;WJcZu!ZBQ60YAnpTp zK=*#)ULGSVv=pcMa%y^Jc5a@vvbwgu!RBmkZP!Z#5dCAdpzl9c?7!4&KUA+BpFvG3wp}lg z9f8m$y8pAC$Ik9LaLGdK&Vz%;&waQ1(ANns%YNB&;=CnO`tHLn@xv#z#*|pwRr^@8 zPpjCYf2d~vQL#VOiwf)&6@ea}=zahO@D}rf&G-$QRtRI;2$fAsutS$uu;L~JGR!w^ zvvAjojlK|A(^s2>fa=9m%FN^NtCa!VF4AbkSzanQ6DtJhyW$D$Lg3yig9c&2jhI^5|`o^65p=%>p2+VwsW&eW1k$Y>< zv!VwVSA{^wo{!mPplk=AY^1Nd8HYq3Z-mBgj-BE&J-8Qzz-m2|y?=v_lQRZ>&(8q= zcxL6)AMd10GU*B6cJ4ZrsL5l2+z;KsR$zw=uh;{pg~tK+HqV0{r=S|Y*+K4K%PEw@Y5mYC>XDUX<$G&~h26dGWhLj?c#HNs zz6W@7M$$$0V86A^8Q6l#4t@N3lBAixp!{X#ju@5Swohz>JqQb9*Z#CLAbqDv)=MkP z;#;BxIU|g#%U*z^b6(@87>V#lu{ zi*#jdzrA+qg%AjjxIl|vZ@&UtI8D&mJTliQ1WGb@FH!ofwY3MfTAxISt7QGQePSCZ z6}PE^Vd4H)V}Nd_r{GLcxc~2}z6aax^A?n2fI;pR*y<2WZ)fB7e`oF2Ztd!z-hoDW z7bJD=rZ99MQ7{Bsu5QYT&>{Drgn&VhfSdjC@W_8XoR7|<3qr360kn8SR)nr`ABD%; z-iv_~X;Pa(KY%|+{=UmdP6&8C7KERGL|M}*Dg&GuhjC|ZB@c;I``{p91???bnYB}R z8}S0JbhI&ml*5F9rRLnFAAOENOtAAQMxg3+w&lIVznT3 zfLouL6`^1?GjmeGTy8_p?MM+^P)T^`r3*$q- zZJ*W#BI;0!?mWa94|bZ&x}Kp)G1{Ajo7+OZ&pp@RgGnQ5*2)zPUY@xj!N}Yzu4?<} zK6iFqyEMhuk9I&NQ~ZTB`!K<=vgLW^rwj1yr)6x}ASjPGQ7r@hLTkL zs)>}lZ)4lcJ+OeBw0)rQCQ}N#d=XaYpwog(2R}&Ln(3@)QY3KbE7Ys;C3I9W_2eMY z&XVc#IH)VjNtw|rvg$ZHuv8;>#|4M;gus0`H2D&sktMyZJrlWRcD(t1|9+6J{TS_@ z72LnkWp7+HD>{?Zg&#>WdMS0 z%`A`=qw+s>+u;a_Q(eC=aAbF|&f4EIa9Fp+hOv~fYg6U*>s1;W@Tc$XR%8_L=rt}3 z|Gc^CT( z_$a=%McCimejT}H6KA--SbF%rKpbxj1a^m+)*|2pu&lgjkh8VYZxGGj8lTOSx*0Xj zc=t_dw395XDFNJ6k&W_*>peH@>0 z$8nSMoy{w6gg}FfuQ3pi25Xc{*AM8Jz~M~C``VY%`a=!327c@^I&j-`=3Nhr)$8{O z&Gjiw`Y)R1K-Z@U>c2RlS-*mGse)~-`qpQG+hR0rf$w_xZ+EZ%+7>tVx_HMV$=jC+ zf%wQwNjK&Mj=a^5)IqkFDb%RJ>Gg%$x1Xu)KC!8z4SWj@=^C1+6Q+vDmm&G5x1_C> z!#x^(KlZiNwcu#AYQn20D&gZkB_kFGTTo~BJ4SqoTtlSx z!QI=8r{jE4Jn0_KK=>?zt?H?H?DgxF`$LrxUnRY&@~4+)I|Zj#9uMoA?KZw6O?exA zn-QPLFQA`lGdjw(znzV4m3=>DxMdJHaJZ6=*6}GSK6DPhoS-5a?c{)6Qo6y%`16}f z>qqOQQ`5V2dY_vjr@gP30OOAJQ*ukU`eoF3QqD<5Cx*eC<2G~8JGjwC3ZY6rb)na? z7oS5FQ(e@aeaSUk8#3!=AWPN5rp>F2j;0OXCNT}Pac<`1B${qwRak{t1+7@k^B!E& zZ627gt)CK%TiN!zBQb_vj2u&h8tgTuvfuDIv+cnNa(l1HlYSX}@v)Fa@{cH_%`Luoy@|IO{>(oGaM{>2g ziM`J;yG=DK(-^9g_O&6Sqb7s5tCt7Y)FazK(Sa;2+x^$d_RC@r2=`TVE3n%4stWZX z{6qUo4W$r3dfoY!#1O|GnMYzZ|eq#tDr#3Rj9_~i1I%+E+ z^%iRVkV+YKp7h?QvowV|@k0dU+owry7m~wm8uZXqpymIA=?a>5^6SaoF)sjbbVchT za_uYEGI&*WQDvOCPAf32Qi|ou4pGyUA4`<3Wq$6M;;~U$WN={U9)Ic@I*(@T_5Ov( zI|~zfaN(y<%!QD4?_lv!4*YXA)kAXs=nDvlxa5yXioa_hQ8Jvx-|EPU&;Y$|SC^x> zYc#ZphumaHu`%G|$ayxcP8%&4^-6TseZLObB2}N~YMGWPVEEZO46eWnO5_0|Z*PX` z_604w#h71EoGyZFk;e$#AL!v2W!yu0v$aR2r1F5K&LaI*X|C@yif%odDbZehy9PzS ziFBKyJR?B+Jzgp2OIzSm#jz!uw&CCS#~K4J@pe_l+_l+tOcILXuy$+b91($uC$GDV z&LaXw<8O5t$>j8vI&l`PZm^_=Y!VjIvm*2)mJgb#g)b4N`%y~V1hC*>XK3lCMzpkkWh;>Em8fq#|n0edzUYVL-oF zH3sOx+^$OD%wN#HksE)nPh3UB38!@EmWc5uZri3n*2ivaw0{IFDeyvUBSXL;3*+Cm zPizBIV`+7A$JxNnUCG!nE@qIOd#%tTP)AWeH!wrd$(;aKbG5`%o}i=~F6g#fiA^-QhqM((SXdsHFNWTXhejBcYy`Xq(Vy0+mu!&?ElMj+08lH=m_ZgB)+`CNk&$yjda%rT#Uso z-P#2X-N{~j)ikh&)z@=@8kC3sUVgj|=3z0#)y8$O zS48pS&3k4ucR`hf3JeK5_umeEVoN+3Z`a`^xg{Ac+}fq4@g}c#09=s$$58P-9uSJs z*R#HW**O?*)~nry5dzQcN?KKRggUj9RDKBAP1%zF&1(*+A#cf5C$nm5c^b;r_q3Fp^hiKO@!*@=|@^NZ)dk zmACKLT0dN1X7ITlbZNHnXY(` zSUb)sQD^6Fx0#+70`lTLV0eU{C-J2J5IMWY;Yd!%Ody3le|)c#$mIJ_zEMO0SfRU&+f!NsL9v+Pgi$VOIlCRh6#_WGU($e3 z3f=Lh0|R#tx^@-(9BR3<8^WZZ(&*9-*l_1;v+D@<;G@^;o{5~y zm4_w0Z@-U8?V878blF0{@nQ>wVkDUmpnWdm?b=BEg3%shjpp_2dt045EKJMz9)p4k z;DzNP=%@q30ZNBz6#L_TOZ2e`Okgo_9S9guTWOsM;y<}=N_en zPif<(p_#?l*dWV~JNM0};kLgLX1k5?rs+q;q;G5%)g2PK$5^%a?brX9Hn6(?I@nA0 z)24&JVAAYx%ouS0sb*eWMYK4|Z3;|8dR~_Pens`T(gU^7a~kcC+o4dq7Q^lo^HhpV zGb`)T>2v!26$u$#UR8thnV#UxV_e=bR_lNO326elJ?Z3^_J%X)q&GNzD=61PsVD`> zYa#=>gMyis%IuXASiI{)7_v&h*JqIQ!}$Qx3wzJQsdeb~0(w3nKcJxClSbvQHmz+d zxvEWdF9sAJsE*I3sPhhqq!@dFzaJI?591f*wlzFw=|cWvUw$j>l@C~Dbi~g#e?zhZ z(iDH$))Za49OJTXnECMn{{ZsdGX=ay{BdS}Ag_dZwY> zwjP;KzgQvi#===GNXE&&Pw;O2I7igUAA(NZAy6lVRNzU{^KO@{M|u_hZ6x;B0s5`7 z&AQcfav)URu|j0XLub!a@nUH;y`H_=Fk|etNLjL#c_NtfU+Z|n@T0-^(%K(PX|@?D z>J58#Ae39~Q2S(t2DnLU1~cE+o-GA)^4dEbga8w#Wt!)4m)l~bAR`%tVIM0z(LL&* za}uT zN4ss&Y(4f=eTS4|d4pQs4CHuo9D!BYS2q=DzE5Jn57h2=ADgvBz-wIeONBrY&qEaZ z>{Jrj#4nj(% zJn=5WKkQ9;wa!{d3WE*t24+R)Uh`bX=K8Ql|6LyHqn(eqv=|W}{D2J|MWGGL6JmrFBDthcIrv;k$6a0F$lB)o!vT+&24` zHihn!{+mFMG(;&FGkcVt653B zYVUyEOGQbO)i()~8qK&|)?OGrQ|fw8m@jxoy#5&kjdU< z>&FFrAY=`Dm}s{m0IO_q;Tpr)s3hI%N#oGi`hzil3pVzVTU!2oJ zZ!K4V5<|G^_5jsqb=mg8-Wz@*%@)Lkm(0?H&kNBTo@(7^1p7~Joc~4$gmP3wn=0$1 z8E1K_m7zN3n@IZrn8cC`>t&LmBe1Hf*1Zn@p2WI+MhC0ytJnNU+xfVw=~I`83q@+3 z$Z$n7F#iqn)UpCm3;dq+tQ?Kg;k^)aE-R19w>eT#^|ZH!p>M;X>xrv% zFB^U_db54QdK00e7+Kv&2tF+deA{bFe_DINH?w_m7(L(k*A@6*QE5L-!*a(l#(+N5 zWx_0~APe(!#Vt`1jNK&nS5J&W>E$xwIw1F^Pl&Doga%j54zF1l?SdFXp91Oqf0#z8 z5b3&-XID^=DRqh1cdWY1K9Es@wz7V*n@ZJ8t9m_?rulkZPM;9ACQ>$5XT{aGeKsXn zn%`*Rl+H71zx=@)*3h;XQ*L9*_M;H1?{<72J9~T0a33rH*Q>YC@5s70w zp^{K25zQ_#JnGuTiOtEM!V>+1EaX<)Eybx*cx_RFp8E^L2 zN7pCvHFx}9OLw}fafRPFVkDV`(?|&y0xOJDeAZ3DTZ$0CdVo}V04mE~coAWP3*v*TNxf-61WDIIt-lts->{wMt7rHa!f9~H`0vocWpW;ft7qsiV z`h_`TzS4tQdQJ$}4jO38kV$pxPT*CPzB?=)G*50-mR@L@hn1<%ZXYN;XB2EAPn=OX%K- zO9M{>j|v6^AMyqYU4ncsB{{yAT5q#257X+!&P1z-M&%>HCGlmPK-#M&rQKvv!%*6R zI_Jd@)IiP`v~-_y5HvctmvC8;3zr4bwxr3;QPWN_3FAOXCdJ-9aIwH??0r$fvR~%s zIx&os9M2MCw}E&GhRMXz?}C&eok0n>_Rl=yUn#HXOSq2l6@eaCV#AJ~WHqk!V7|Hp zHoLx}k+KTEEZ~R#9NwhEY+_E2bRC44a_U0hZhVx**9997Aa7OxMBsa(#(_AnhWocE ze1k!&&0D1@IP^36fI94Oa|=Nh!UxHU>k`EmNq9Wv4M#im$8_-+>V39-N@{LNx1eFR@xt23ba@(tUw(kw|U zHVZ~yF*IplrNmz}7;{!Yq%I$Kj^)oUzV~f$t1Y$o@|WLde?Q2Z5(1AN>*+>AvO;v> z%eg@MoTC5200m(lb9nS3E2)8MR;?AXIR(ELmh>UxyG4tUAfNsP?u{jjRDsuU)SI-E zW*gWG5KTOwR)%2(q6=21w{-~O4VG*>QR+Erq%Su9Y5#$@6!Ipbo;LuYXB`;GtXQ@U zS7y?whXoFa{@yNOrk##-HcCE>woyo#Ay`1)WJsaGGRsO}6)B=KbbgoanUM)EmFq+g4*7q@G_&br5<)V|E;tvek(DF7oECd%^bA!XHNHyK;%xV&{{#jMV|1QI#~pvi6NqGPiSQXx_+qgUkOI*YP7s zUE+19r41%j0)t<_&M$mVxk&h`#3stK7MU2$A|a>c#j?ssrl44 zU_pvDiNrDn+AD5}_0X9#a35tx0Ou~f#vTpt3BSOKtZ{PovfM-oMuH$;iT2dw070v# zhVYNJ;a}vB{@Q^OHVj>--ip+V3;HS1l%bGph~S&Rb7cKwTBaSFPFc31jQMZ|1dr`t z?7jzDx5S_hD-rmHvL?H2Q5Fb+$eIcGmLz14&}|yKjO0l?b-Jt&==7QqY!$Jwhj@2F zbO^D@0~pq@&dteY_W5 z#p6>??0Jl*IE&fpin9(yC~BX1qwI_G4P}aGz>VW>wr$?g+!)I)?c-8WI)Sohpo#hn z#QtPKbzAVvc0uR6ze^f%iBl@X`behKG1frD!G=GSyyX^m6nF6+OmO@c;DqCLKaoZ=Kl=+Fn*Zbx`Sm;>`ByP% z5htICd8I7Q@wXgwd9Rw;#oc5%-d@(J_#-a6o$rC;#lKrMC*-r|;t>4SEz>4=*-T7@ znL55_dQ%taxG4l~clv974%bfSX_R0`Gxr9VRZxlF)(oKSAQZXsxbRxZDXarbS8WcbjEyj~Gl27j%{ zEZ`m7&WPfU7c9U(3zICeZ}Hx`sHg`%jDYR&DJk`y^zhl=N1+xV<~wL=AJU^57$K(V zI*06CLpEK$%CLnrLV4+2g#^lSUjgsp3cnR-$Rc6tS8dVLDcX3t36T8{wmsw}G6oD> z{kZXF?t$E8tIG)O=3x_MVj6up7r10>jzDPlVosQ~+i6@hD0FNlUxyqMF)|ujnEx*>HG7NS1x1+Qj^LMtgqXJz{H%ccc$cQxSS_t5U~-TY_b9#_J9or z#)+e;Yo3Pc_U2O0nFBv@2#qjWO58b!cRus41cO)QK$M*|*s@aiFX2t#iWvhO#y8h# zPLZSdTl@%q^wP1EvG(c{d5jk#bu4}B{xd|z-1!pNV&7NcT97&7*zA6=w%pEtB0ef5 zZN29rYNhU>I#c4_nYY}u2)UO$oBs9okS{Fc?}e&jUvs zsp=D(7zM(8;wW7m;j!U)5C!>%qQe>P^ZkYDHDO7 z4FBekNFj52R4(p;r85RGbh3NR>;}dxX?%Enbu_l5J?D0C7k|E&#KQ3$pVK!xj1-6k zVW+yflGu6Fj;No*_7_>znGgoZii`R9rq~B3EYHqjhtS? zBMvwU71H6JRY099GR@l-=2>GhImRh|NC=zbR?n%2YtT&d%S~R0+#MM6N%GfO;}U0J z`z~Ji{BeQSwv9=mjCtQ~dO$w3iAZF*$0)Ppo72?+-`>AKd;YbA;Z57YUaHEDiBoBm zQ=`SnA@7Ut$X!OAFX}g`!4DUP_pa^p8sbDb5mpU5d{vjZT(2KGd_&Kh`EBc%mp1bA zw3gPxKHPYq$yBn-ig{H3e+}LJ=T<}z`+C$mW{xMlA+w0*+MH_maiW{(Kx>?DZYX;sfv=iDDHj8 z+AM)gPntj!;;V(~H+t%XQMAJ$4DCPiX%qFExoilfhHTi1@GkmMH%>nO#yQwhATMcb zp6i6xP9GtMsO)GAT-9XtwiQEWLU;ib?Li@yQYbdl)oCDkUGg7}`~IVeS>vi?2&o-I zc6r@y5HDUJ3%t+54Gx-te+-5$y(nEoEvl(s6X~$9^?{hya`)=jj|LD-=*JBpa}$oa zT1$#^9s@H9D{f-ZDk3jze)QJxk-K}MODXc58KETvz?rhW%*)&O%>^6edBFGfHw)~! zB+YHM-pkBXD3%Q{zB==NaJ#DhTI*-njM5H7hzCFjGX6g2Jl7y7YTUmUyk7|_LBOXg z+6J0ue!1x4WIxIfAYX`VP7sB_>(ey`3v0dt`5`IZ240&}$Q4I~AL*H-^jJ(;o6*&Q zFehU~P;3KRaJ2X2tJ=u^D`<-L{eLZO`afxl(nCRtV_@_}-)~>d9e!v^;T9VmMM|$l zQWl+9hwb}>0KpZqECvf(p z^f_G3(avvV)$X-M%IA1l%G+4@S92jbRR8YbCU$WVB+6eF<#;6+Qh{}(RlPtVI{C<* zs|oXOFwCB7L=vL8@~R^%nEbnW!tgb%9(3zkoXmt$`5erxhD%cs&55sJ45PT8qU;cGW$89v_k=BsE z`FaZ}aHIsbFKBvN2;B0_L>JpX;3V^X$lZwsK&UbP(b^G+r^L)!6sR_{u09@{EK60l zxcIg>78NavPbpKJF2Tf0(}#mG^ySW72GH_1=d7(a72Dkc^Zq){{A*#$g<~}*DgEjU zEN4VbgH$Ue1WqVn`TiyVKaBrepy;tB^_}-}_t3@WXt{va4L6n#=5QfDsZQ5Uj0;;f zkKE8VWDhO0h95`hv7>lq%EdAmqHOI?9cQ1x+untyYB=!oPhZ)3>^M-e77MR&_0JPmU!&f`IL2|mm4^IV>b;*dXO36%Ezuv#5da;^Nkk<@Rw zZC~Bb!HrGygv zLz`Pu9|oPUi7^nE_8n$U=fnwe7e=+vdWe=h(>jb7dr&JhX!2U*kpj^f{dVP*HdNZP znj*PSiPRwri-rDL*Gzu-7JZQ^U@Vk(hs)2hJekAQr&5g+^+!Deb>Isx{fqq9PW^BZ zmfe9k4#ngrgs%r_ygcAEay^2um+drs*0Tm^#U7C!3kLLz> z7d4jUs0T5x_6EsYAUokS9zgOb8?--JRA{7l3v5h$w-Ruv8V9<2QdSuNE><=~gI>>QK%?AyC@=xH0X531;s{;V?ym-Kc{?6`H)3l zc~9QiBLw;gLO>e0;El`TuD?WNJB*-PTN1GTULFrA>E#jXx{+fg=~kCQZAO!5nj=La z&rdj2ZUL*wW;kQBpc-Z5KNtcC`JRg)IO#ylP+6y2dLZ#yfk%&HsSp^;+*_n7NX%(3 za#pXnv1&Vw`=HO)pudM)oR%q}kSc-GNeRNPG|dXyYDWaQvpaI7ixs1m6%K<+^TnQl zP{7+6mk3phs`+0n!0mpDE@;<87&2lC;DQ^VV~rk>!KOK-lIzB+Wk&T}IE2^AHMyiXSoj)$j$ z1Wg9qm&wZR@xOpwT;Iq`;d+G`R1@Q7C~;0G_5wyaGB-9}-9G)R+cvjP*5OXei#-k( zaq^VSzCEHmHR94D8JQ84Uw-9jQM3yr*Ca7ax&VX(4!QVUxMuiph8(GDNxj1Kg{M6D zq>5RE+Dg5i~~*l1>R(mk*g3gTUo8+Yb1MzIe|benMZ+6LoY z!0k0Bq8j5&1S2m4x$DjCYHcUas?KaYd7gbFxYpeay|=UnxtY;MFtfiz9fzmM!~ zA+Y;BMA0?u0_hwIrwBH71eykCsG3|MAOnq+kCblS2|YTGYb*q|8)_WF#J_iUf>dq~ z$}$hmv)QJ3|5lRU+Qc^hw|?^9G3mWrI3m1jBkA1rttsw4 zPLx?SQ?f4YcK(miY{ZJB(>;_4Tk|`JRTfaktQ@o4gKZHofbd^}Vt!CW;VJlBoCTW(c*iODtV-`J#tkmZFy zR4mvd3mY4!uf2&dEXRCE$8J1oKPX_Rbyg@!4F)~zxF33$Eb(vY+E`+|L+4f&%%96$ zp}wyGz+Wz3ynM$$s4`$xt=#UH%0L%uENrB-Z9JvP;NG}SnG&D(o<@Bw3k(k-)lhUt zDq@H#1QgqEhqNy6{FV(-%XL7A*hXCjonpWB=5@T>N%Pwj$cH~yvP2J$*drH;%Io^a zm}I6_)Wy{l^d%F@iCbd7FRwlmYRI^OCM-Tgm4hHjMaVrqZvn- z>~y)Dvq=2T#OAaH2L0jMGRJ(KlEPOan*i*#j?X<#%YnrpGaoSPwP|$3I!R5yN9_JdgiBQ-?Yhrzf_M=&b?oa~Ri`CEC$tCDR5tasi zhhh6rXS66~^+G@!2ubwNI|(O0`+{n|)W3nblVyy8REq(0*algv|9~4*cKUQ0qBL-P`Iz1NHF;WTx@H;g%4%JVfHB{qixGcU704yP#>?zpU-4J7PEw0ULj1`LAEkv6mHb zv~-?+f>CT*OwZz_K#nH5jg7?+`O1iG%5{qWrh4u+?GO-9dnq#;&^-GxZDV?ZfB*fu z?uG_*%Fq(ZpuM->4uT37j`?No_V_DWQeE~S=;^f|YTx;unG}BOoVL29y!yS$XNTNq zE5>ZwlO@|EtmY{wa##o~wwbYHc#+WcA1d+>RfyaZ9EinkG9hKP`Qx0d0{Nn`5-=X5 z6ULM{s)!lsY_=Pk$_YsCL`l}!cN?9>B&W!TyC`IqEuU2R! z-F#}iC6h~Sm^n3)xmQ&U-mrCIK{wVrsmBX0nMWeIf5$!tLa`s#wu^=b`jryzIvMD3 zf2nSI5fkstEfC!iQ==RQ9vU^R=N5Hy;P&8V00=R? C?qyHk?_^N{L20kw&MXp;5 zfs~JAZ_(p1L-F<1#S9^E6-r8!`&kcHYv}i?x>HQa7|}A8ek0Jk5?#^Hd|yBydHaMJ&A%$VP8;B|vFaE-`1;gNDPwyd(ZHRm2n zUhCUFh{=25F#iX#JlLtD$sMnyjI$SY$L7{TW77`|9ll~dX0nyV9S?Yn60deSaUP0= zaCCGbxQ`ncnqiJOBT^PBl@uChF8Gt&;^F5z0iVoY^P&J>oBoePD42s9QD zVcK3n!M^?RXD!-_-O9Hr6>{#J;ti}-Mim5M#@wO`IC71LWludS(ZcUD8_zF)v@6{K z2XD7oNrrDu5itUhRR%sI?8X?wv_5TWCW`16hdP68O=&~6QTX#)DfQomo#ps{aK85@ z{40)~4l%!J+yQx)Tv0pRrH^M_=`QVHr*PZgT46?gwP*1`ZMOXv<+Dt4JlKH>NZgC^ zC67cQKpUnrRaxIwJ#HE=D(DF-T+Xe7*F4d$c zJ4Zg>k6Y3X_FIT#(ykQeG#yaWA}mLf14dRfTd@o~eW_oN5b5Fgz%h<7WT*KNT^eDUnbhGR68B+C?TxX(-ZQ0Hq4rtHHqp`< zrvn?id2cb#ow0QMH|~EREsjmRH9Rtp-G@K+jEYpWPOe`t%NQR$eK$rW*V7fb!e0-n z+;q~dWX!GDr9)%cM^loBy*KI!=>E+rH-3OPk$QRhE!=}!bo98>oX zs3SqFi`xDU8SVkPuL}6Ks`G#Cd0X@d6D`Q2gSZX->$>vURLk-D=PD<4{nF z%?8DoI+OTJ@-denDAuAu@e3~sv+VbsYw70W-;_*o72|3V%pT}LSB#k2q3vv#&#;L6IT^?A;jin+rlB^m4D9l8z{l!6&Ec{GurcMHwJJZ#zB6VT*{%;BOldK-EL5*7u*t|4e*1dcydt5wF_v%Y zQpH3?`k*SDVb;B8N~V(MN8D>oZ#X!$Mi04+^~ubvB#=YaV-;gv_Amue`Lh}7oFUCd z6oG@k((8vvU8}+CUaKHg+hznLj|K9&H0Yh;Aia&IwWpx?=dR-L2g3IExyCo3J{ah%Y@)(sP~&lKp{e6B5(dk9gkU^z zKg@r{2fg0w$VnNCk6q-6j+=#!=jD${bnNuN4(U3EV-OEEHeE)hJaP%?(plG1+Ns=h z9R`kJHR0ZX{~}DgOR#6bk?Of+&O2`FMEsGlR7*4P8JTh=Ra-l=4|8?!t#M_v5b%}A zs{Eft8vMC$>!14VeR)j%ZZOXBWZcUd64!EgiC^EuyV=f@3txaDV6@|%ZLqP6i)%?t z{Gbx@@YsI*K;ZJ!>rF5O$CCrU3!i~}*@M8;w&gK<5%Ntdu(8Wc&``HkfIOndAS7^W zD+MyMa2=4H-CQ@rWr2%*Q8@7JT_GSKLpDa|?2dG(T02TN29uWHqC&u3K6E^(zIGoa zkw4EuYX^>g9S>1=9`c`t8RStpyGB{+iSPWN@V{{#3iD=jkj)fk8gf96z}BebPS&-? z8l>1Q?hfT?98UAimQ7#U@bEVYD8V`qrUsEo=Y&9BFW68G&JodrkCi8@*!PbUo&k%_e*Fc$7c)HRn^YV)*#N?E^9M~ zKr(e5sk_*3XK66is)ce9Mfhu%U?$KwyBwB6t|q-I1lYQJBurPjsGS?vmqC)X5fqZI z#kS!yz%iA+usWcD(y zjbZni2%~*mQeKn%F8VOFx3+JMRxl6>nXT_ZDjP%E?5Ku9mcEa&q!AcU0XBWMVCk!y z;bwOIMD)RFLfi>jWvzDDwZh|zT+?3l5_%0PI3waD>p%lPS2u+n*zan1!^IYwrb1Hx zy0`h)iNLgFLvYvReaK`eEwtB$9Gtzc`qh`<9C;Pd4Z;Ul2QzO#P`A(!X8ZwagngX( zg+)xi8C@yFZV@xVS8NOyA-*zwv3fwgCUBtKiF4vwtfip)*`Za1ns575LQnVL6rbM0 zJ#83>GqL2Dr@C?OjgM%I;59W|U1OK*D#BzC*u~TX6JU!=LZL^0ND_W1_X^Dcfym~- zOw;cBMOz?d?j*lS0ucuZU%oqgB+~vpxMvem@^?ZQK|&hYp5yC}+?88?&6w`O;-Z44 z8yd;y(&R2AB*}3QQ=y^JxJmj!hS&Pd%dZ^#P04nD3cBpZgQVE;m}ZaquQuKg7!-tsZurVXcOe$cC& z&xIrjxj@u++_+I!mT*z33K3UWs*zWXTrr&g(@QdRFGBBHP)vcZFKkEYV#cL5CCmhq z@U7FHqx&J$s13ih4lT}DY=xlusFGJJxlq zUU_A|V;Mib2<+5Y74Wnb2eT5xF7q$+)v51!5y ztZK3aZkt7Mw*}38uvwX4$a5wezlgRHd>4pij}_gMaxe2Om=817Q=Qo`gfvE@nhq|r z7rZx*U6ZJVyd{#>mu|*X{l%Mp2BIi}4nZq7ObFarg}w;ExT)ZpfF&ARcTu2+w}X|f zn{VwL1?f++xr&e_lj%Ie=XiaLbNx$&DcF%N?fYj5|CBvb+|Q=tKMGy&XI1$a9Q)gC z{?xj^HQJxr;;;8KQ7Z_1WGx2^cyO-vodx*H7mx!HUkI-0&DO%)gApkIjbhK=k9Hwf z5Bes@=XCLmZ*Nv7XL0V=o)QyU0t(;*bP%wy+Jdc^~z zu+yO%1XKlTMF>3h_b~f_-(wm?g1z2U3uRP)9(DJ9%2{JsP4=wl2P{X0#3SIp^JDXA zO6WLlXxP>6+RMf0NA**#E0h}eA=-#R?F*5I#^}D>myLn|$T44p2t{hraT3mM@B6|{ zfO(mvK7$)wNE+Ie6mtxs2)KmiLSX=jL9}Uz6R?+?_V>LeMCIQwc2 zkalaq5x#+JI1T~fty!cn&1_{tSY-zr@v4`6lx9$a{*HYe+hC;NYU~f`;8NOEZbKVx zw42b$g~Nn1rzHrt#N>?;BSF5Fgx5}R!mBZ`=&jW(^!#>n;8r#ChONI9hV^SL^Dj=53xT>? zsO~RVs!StnuTM5tscrK#Pk&(^cS<1sJC@^{lpCu^{QIqd8389#steBv`U$rBrgmUF zpD}>rV9cL4m<2{V>+p!Ia41FI@3Ft7HT*j)C8U(0V|EI&h~SG5R4nBv1pWXS1bnoq5O~?SQ*WDc zv{);}y4;wtv)Uwk);lMj&ug#bpt#iv29 z;mF-))E?hv)Y91_iVz=nKR6>mahJ#lDDw-*x6{jk3IkgO>HgS~@Ii3Dzo~;d)-uTk z!aML8vze0d2ZFL~Sn6vjX-REukdhEmHv7->pP(g8dZ3W+tX#W6T6ctAJM?l7WxHsB zq{~HuErSuDcbSPe3JhWpoS`Xmwy?6Cix?i(YxN4r`G_OTO!<|O*?*7H{(Yk}f{Gz2GI&=- z)Kml{)wTz^azI7h#ls2QjI{*pcOFM-6TK2F@n{KIK%Y;Q9QF}rer2vr=Okx%aqsKQ z7AU8eZ&CtJ=rL%a=R;ochsnA@8{q z^^->m$xS5VRiIdrh>UOJIa8zaaDV zS)J%i6x_CFFct?mhQsg+1rr$(THsX9);x!ooQC!ivuAOhg&l&(eeo_@OJAde>TWL8 z0b;m>W^f{y*TYw%&r?#xp{lk4oKP*L_(ukEPIpi3XUg=In;3Kl%#4M@~K>{du7*g zVikP3pE1_Bvik-cyW8RM=>}(J4J~QGaP{ecsp)FKqgsXfb`~PQI^5~c)g{B&E-gSF zlJsAsUc5%rib*OQd@6{%ZCbRAHc^7|9-i-_N$&OY10L2E;7hGh-ddA*)qAOJiM8(d zVBDm51S@a=Fv82Q_C}`=rx0|(ptV0Es>fF~<**T#eMv6E4zedn(hWLBc0Bi6_0Jx7 z7l>jx8Ey`BU{la(UJNIwtf1KDbWb*@!~4}WRp++pHj`zqDFebf)Bc*Y31)deh14OG zyS*Hs24vJ$=LpnLS*6Ce7Q_LU;-uoSGogB1+@+{~HU$Ku#JcdJZp8|!j05TgbHr`5 zo}YdPn$ek9H^rE*djk>p_3#$5K!1B>CRC{AzrA$=sYJ`fr6UfGxas!e$82}*D-I{@ z!xaoMPZSTsaDh9%s_0VTwAW1z;-At2+6wbU)o&oyF`Yw)=BHx1^}3xbuvvP_jud~i zz~{Z@#hKc!m`R{nE7F&=>lEdrp(v&29~LpAozcm3wA{>1V}AwjeGTQ_$(I4%84hCe z?(Jt2C(z;sbcT?o-M%;vaJA@1!M59mXVbr#DIXdd9BgFy!QJ*81Wj%@rP72Z>2fvr zVJ6V(@T9TNC3Dh8$rJXIQnUBs_Y=2%{ol*O|G~fOb9gjqBnwMZm3O#A(4{c|qnevV z$hK1c30n2nf^*08SUAY#$yHvu;$S;YdPMWY4mq0dvD6@xJe4OM)7)M5Hdi58G({F~ zzRTjHyrJeg83VUwhC=(R8H(MeakcG>)(B4 z2*(UsvT=G`|o1s#x{Rnm6jXToU%m2=*GG1F5eWwf{Y}cjN_w zsoguf+d}?rd&4l#ZI39vLsK4+e{n!~1N&b<%Q4Mz{6KGYHEp^m7i9X<|1xaO&TgRWesSRIZ&tL9UVF|9H0W?L zZ8;vrqjiwc2W3KRy}R(oH;|8pr?anJ_-YZziBh%iR4G%$Uc>z?3>43K)Osy$u^!_Q z-t_&8Q|8$k-_<;T-WFC+H>!o5agv-f-vD^w-@2aI6u-0E+)r%OXsm`bV(yiYS6ZYy zc6L*35ZWS5*I4U5SdaPKz^jn+VLDc|loa*7vN30)tH2pgoTXI1$A*uHt)d;Cm^{Tk zi~e*P?<4X40f((Srg0g3G^XQXC`U}IbJnNbawGPLJ8@3+N}4-;GMufA*3NS8^_a1r zZU}z(oTdc{3wXdQkqPo2nh-X^-uF08u)G+ALo#&byL|-qXHYr?ugeshJPtp~XxcXX zY^M79p2xhY*c`+o*eZvdLfe8~Q0IKHZ+b2VnWT8ZT`ym^t3$@%=(9D#0_e7jp`_s) zMFXk`j{SxpIPFnHY9yiq_dKlz9vNdEH%eRUbzlHUFQB4c8wcbl9wqal06i;vY;pz` z!VgD?KzqeE==fP-yrLV~?4%~RQT>hoQgVtDNf)rVZh=+u8gz}ig0qJ+JA$=S(VN@Y z^L@cJUU=``i$h=zt`0oU8oUs)lJDr5vmeQ&}|m2JoCVJ9`@4 z^s-$)9sQ>p6H}@1fnYN&e<$`NqQb&kkHc=MGkL&Qqb@=)7_rJLxim~s1L6PWu zbBDdEjL5zIr~A8HlY5a`%Ed%I5r+$#$m7Q0BuqoFa5!ch+qLP|uMl2>YeummApl^b zp|Z?JDnE`C6z2HH*R7HO=dvDKmBEt$BO+E% z(EvPCgf1t3$>MVefzKEk)C`T_@ATICO#(MTP3s=(tgOR*-_0=-vj}?Uw{w#SktOwn zN-52!GQ^wojp*_N_RN64@C*gZd%39@%R6W7;&ggso00R65tt9=J6Bc#ZDE57dL@{r zfj?+mVfTJwaCw8(U^my^X>i8n+A#?Mexd?AYBAi$I&ImRfwU((SbCKPPKI~(@kN1`NCp2o@mBngIhew+BkG5Mp z*k_6@!tnJ#1Rs4uWHhFE8>1dXG4_0&>@T0ASNYPaGn#Zvf@3+0hFyZWqrHiU+l~1j zIY#eUj-bDazPY1~8-_bCE14tfq8n*jF(yZ36&n^)B`adEH7QW|o8{OEPbDWb!~hG#%Iz^qqfdpU*wDuWHXqnB*Y#!+MDu#;%$_b*D_D2i2WN?>Z<^e_c$1 z?yJ9FkTnAS?}u~IWE%>%-Uv9KanE%h+in>dxE*tMg{+xqaGMzYA_H1ovkGL&^o+yL zI~OF`4}9I3k@bf0kW^s8E#X=+3gi-pAiMXoF>H2(+L*W8s0e^J+z;D0!9jO{jprO_ zxO6RlZLR}a&7W5Q@NVpL;#p{sLU>owAq~14T$X%r_Nvy@!u_32&cH_=mny68 ze^4Bj*@(Cqy^D86RYD?~+LZcbII+%4ldX}37V85f_~^|f$<&nmqp6E@vP&tp(tg6c zGw#r7qLN`>1|TuZHu$VJj;BQtXWi~xI}xt$U(qgzWxfaPqM&(D;lW$)H2VFm(eT@j zpD4vXH>b;M+X3*=?5a#G#kOQ+VpYTl`MRHquGHVLc3Qh)2)D2c2GQ}+&9thsH*#9=*Z!)@M>XD{I1VGC=Ac$^TWqw=_|zW;1DLQ{8r#8m4^3M6SY3 z#7-Lo{-lZL6iRgw>##4KnDW(J+xUj{8Qj@wwy-~13;1q~@JX_bWmql{75&X&3liOL z)T9|}YxKivS~gcWfFof1c^b)utww@o%5y*^YQ~D-4F=$f^moZt9J%HPM2!N&m~oe^ zGyo~)DCWTYNr~y29|zCqRt+UTh?|>mnE(*p`7%-fdarNUt|8#t)+94c$TWpTWT^tTnk4X?mQFv1`@2p&}R=) z#*`;&I|Lu9VkJP34kYbD=@;5fP%$qeAjw-AgS4 z)w)bCdd}9y&VKdwld-|h^eULnRD8k9;3hpxb{74eS_*0i{;|~h z(Qp}8s8iG}-|OovJeOB%w`r4hx*qQ#W3le{+Un;}2Y49Of=J(Rs6O z_cFeSqWiV{)17H!tI)=av^v|9x{%p{Sm|4*@O#2noU7na%IwEXY?Q!Jjm5K--bu%< z^zUE4qAoZp+MesnQY8;?4~_fgyR#2F_iB9BM>QMO(KMd@q~HEAeu(8j7I|MjA}vXu z@j&p~pDiI76oJBbY&{NMH}Dd{>JEB)ta`#-l}}r$!o0_9zoS|Q3y}JWnboGAuXb%} zb~`jcciL9HET6y#U%@sHi_To^dx!<5$g3xw8V?&6WC(?Z3|_^Hr8$@T7yVk&Pp^#L zDn9h-RVYXEFIaM6qXfN9)HbU7Ia9qJBmC4>$Nwa$8ulvZdBT{V*!D-`3r4H4t6v5T zA-)Ryl<7;qUB^;oI)+5jsV8!tmX;2DGn6}D8s4D%<)S`7?5IE>8YVk>j=A7WG-|wk z4gK_2YndG3wctIwxsxL(>j~cFe>p&K5T{!Cbq;Ae{WfQ)*IH66lOh~ZkD2Z zs*0Jm~dA<|`-@ul$`E)KQSbM+r z%wh+;c1fMGscTrH_I8xj6z~1Ziwu}SJz=PM5!$|;paYd#_+^eatBnj~Gf>TK`g(EO zjfVO?)3z@VtSOPXfS-0u-OcvqJX8t;q~=MTLULVgTxM7rylt4N1YN0+v8l9>tfDZ) z({6)F+(p9&vIm}DXUzA`FXDt&FKD6IVRXGqb%V~p{5-bu>zc%i64UBB>h1f~!jYO# z6uWZLk4y}sJN6G)`$)eB%HQ~nj`2`~?rqVhG6G~cIxwk!NvA?b=Ufd43j0teIBvTi zmeNg3i_b?8u!^me2=DAs*1n1 z8D0}wWxWG_fBQn7RYJW0a0MNM-au6581AJZA*#s_ucA-i&xy<2i>1ad)OD*}HzHyb z3TD%50W0P;M{Bq`?&`IQrtXuAve!NhQaJWzC@a_YgD_Mz3qETrhzu*!s=cAZjJ!Xz z+k(;7jftxZMgnlyFH8Fl^-KE4!}+hT z8q}HOK0)rV>U;yy32<;vs*{yKYQ{E4ZPbN56&k99>L9P~AQ@Lev)T2YXdJpr{?wn? zrQ#c{MCsFm>gkd`tEAM*+v7Le9)L&aO{O&<@LVWM%$yPv68p&DfGCQ62&Ojyd^a|I5<-b{>$@=d}-)2(TL9xNW+dgP<1P^> z18a%sa?IkyghRUP`A`-c%8Fw1)CQ^iGQ!o%$cxB{;|ldDu65z(^y^>={&k_bM!=(H zV?X`+vbB4)(rgi>RbV4Qe~mWk@ElH1WrMqT2^*3}=4ISMbIF@cOtQWV*VQv`-+}On z^UUA|q&fD7%KBt3KrOm4pR?;mAS)IohdUP(<+Pb@Q&K z+Vpe@3YK)oGW=;v{h_4i0Q=B|AT39uc8$l{goCkqnf_E?3L+I8aOe@kqu)SA5cR-# zHSt8FhsF}ARKJG2kJ`&(cX$o9AGDgSQ$8=EcOZm>4VZJp0=x_-Xj;S+-VD9hfCglh z#r6(hrYkX-HQ*aoXE>|QM9*Cfod~Ze(e5bk&yaOxIbAoNG1biXB?_KzV;E8TzYf!W zOsQe;-70mW=U!Wi8@Oz@R-mWwH$ARa4+yQ!9rf1x^WnF1;@rVR5#SSVAj_>t^YLc+ z=e3TOHMjQI8coCx?9UJuS0f(Nn$otWjwPZ`Bwp+dxa4>y`eg%(YA?12eKh#Pm)GS- z3k8* z1mptQQ27D%SjC|-y~{3`Sn}dHC0@%VtG~Jg@QR|Gt{d%riP1q8%sMBbiq6u$rqq+) zKu$aQPzM|b+0d>ffE}kHp2(FR@fE08|H$t%$L8j*T2D3au#z}Sz=Vgi6xCnqg0U<; zS&H{PmB_L0NOw`rXtNwHCey+3X5p-jc5?(P?$d8(C|_7iSPO37Cyu4%Vlx7DjHUQs zpZAudcUB?^fA;Vd4Exa462PvOY{i5P%X$X-G7&dFgL5)btIUEpbOba1j3;aH2?dD~ zYfc7-0GGf80O1B2%5~{Pe{3a+yW1tYQ&88?wcY5Rgrdi(6JR>*KnUHXv95Wg3x%nI zAn=zZ1r2xa(b;_j1xWA4L`Z;pnD^6K|077%R6iwOuE4h9iTc5Id9o^Q$#4X(Hy~HU z$>PD=K1jd$P#+y07--g1TjAa{G%&^*E(ZpI#foCrYHfCsH*V$TrVVoY7c35t(Se7Eg)VYBD?6j>I zxd`oCUPs&-o5P+lTusq>p<*}_dG#RoR93R-Eyodx1OQ-x6Tr}hw8f&Jb!?|sAETLb z>G6#XKI!gUos-WyDBf&DeZ?bsvm3+a)9wq+s`nP>T{vSdv`As9*T`KWWuY&WwPyf2 zo~ce~@>x*XpJ@=M?6`d)w*>l}w(xR2^?1S4T%^4#!=(MAaQo)TwI#qc6w7vGVjGX< z)i*D*zfNlBYc%)3W>V|xtii{rgQlrUKb*VSFc7SJ3bt?YN?K?hNQJaOC#z_QtKUGb zIst#e?{2y*E)PbtBtao;??vqedqGV`-P$ah6ZB)dW!u7xGR)5p|X(IW+v+DOs;WOdJ{oME>3!?nIw>h- z_sh6jVOB~3XYMCXM6nN@vzjZ1B}5wW%i3a=o_c)JO`NP5NOiRpeP5q)s=>aZFl~DP znwlh}#d5LbE+Nqe>7@_gKBR3AY>kB1j_)8y*i^i+tSc?r?Il7Ji7b@iFsN^Yq_9P6 z^bUf&*fAuptcghx`K-5x#il=}q=yFD3W_pUc4w9Cj^8IS=hkhP3xK{Y1X1HE)cCY} zcc$6Kqo9o-XX{ul!M%reO)wX+QQPbh^$nGy{EWEIZauJGM#<4!P@%YDBkQm)=4g|{ z{adp44@~p|c-n(+npLdAJzzR;Qc~2zVV7g;8m=3fI*vwdKUH~u-awbGl7aB_VF*5S z3lh^J$>w1V+z~X_k$B=HZ-qPL|C#mo2HG#js7{WKHzVNU(mOQlqy-v>WtW9I@D0mL znX*jzx4jIiVjriP7VHqyF6xz&|CS!ottJqvV3pSDuNVm|Kjd?44NmU z3O<I<}33<-zOAk(QC!-wtvuFE?_z_cS-W9z2+oM}IDW`E61$^98Yk!S zotE*6RbiwD-CDF7i6;x}Jt+$o@%wWbFFNF`XA<)BnOXrMUzRtYdWwy_67CckoaNrT z0P7?!N!bw(Yx$?@BZC#BtEsYFR%mU!<4LD8h=3_EY{U&zPbfvp-iwtrJ?L$jqpSm8 zBcGSKhM*YCT)BWN4XN78E4Zl#`s)vxvnF!@iL2Q2s%d=U4qD?2f>d)J!>O&2orm|4 z({4dEK!LSTemvkW2kT^0jCh)v%VTia1M(8J`l>6ecQjl%x7WV1a3ti4`@)>OAA<62 z*vWfFRGW25_4~$`Z`OF>P{Vm^Ns*ePClH}4g6q;!G8tPSa%!{X(8^gCnC%ZQcszNZ zyQ9IOsAGEot4>pvlv0CBQkkQFRma_pNO52)Q_n%U=lw}!Rc-}Vm0eOk7g6do=ape{ z(K;OE7^1yehlwX((Hgi*>Q~MZ{qo}zd#g)2bdG=(d5yUnCWYp^ z`?;AKre2WY&&Mwy?)Tq6rS6Nk56Jj7wSda$&}an$cJxVtOMmaQNI6kcp>zR!71hWQn@lWzG__pk2Q zEE%c0aNd(y-a8>b_^1I&PZ{&gUNl^CR31wo*q3lAYNXtF-iEed zx1NeZdV7x{+mY{|CU);0EULp!q<}%!#eSmoIobgFVITPbRT391#Tjx-s@6g-eh;{_ zmz>b?*g-D&Yq*Vxk1;D%^LB8geg?K;h=4Wv@($vT`@526n7B=7!`m5IDcAJW^ zjRia-**XqbPhq3yMB4J}0^qwE-Vn=ohSLqEFP;oeoa=^C!v!Bw@0$zSAgOX?%^TQh zMX*(39CsmKC4Eb_-l>bXyg6mN;0!Ioc-2U}hltyQLs=j4(bByk#7W?WZv~N(Wfct{ z4r0vd4{LfaTEsY$GBL1GFdq7tt()~7RL2A*MsmAE`*Wq;^n3DVU{@Z@L2`tD$@52# zaNQ>hp0`r566G4BdCM{Du%XvtC)#O!nO(8iB3kQ;sNIVutJ@86G zXm?-$d(Ex_yW0UY!P=E{P zs(4%LjpC~65_Rll+*V=cb<1xeQ2ZZP5RNl#wVjm)z@a4{4l(&7^ z8_261h1*=isFq@N`%pyIoT16)R_6#n>aM7X3$3-=z%_$SiGO1w}Fl_+W!0B{~-YLHnBOgCM35m2JI{ zvpG8gyB2D@QYt0}fdA-$J;dYS*C4uV-PXRD*mY_uM*(YQ=Cjm0P+?@Io_*awy1bGH z4nH4W4v2uz!S|EQ%#eEmyZ@E9b!P@K9mY|M4vrvR`1g%#D5fgY*}E%2vzT4%5`5{| z%zRm1jV%?>EXnM3Y>D-#S*al?ud^GX`1BYIJYUpDM# zX*>__li{Yuy{}wNZ#R*ZG|oE5X>=V07UdP#Mz*y{+~>9{!9ZjGvHhIe-8T@CJ$2Rl@^r|*}gdy`CZubcV75|%7J%8i;$YC`M)RZi7FwOpHY zAosel;${l2$O9$=y%NW<=oeCxe@Z>S#D40Wp#~K&S*}mi#SISU+sTEC4FYzCw{%nR zWxB;fQS~n9iN`&uwpp2D2QEcXXw!>ao4Wi2bmyFOYu*0$PVqKUYX2PF>n%t!WF2_L zViGZQK%RBSN2M-snRX*#hVqfT(`4Pl!I7kLtM0DFCs3i5H>my_&^3z#udyHZp6fp} z+1J3_ZpL{?vDufeb6m;dV5RXBsb;8*COCK}`fyLxT*vCEo7Ji`>(+rtl2OM{ogb-v zarc6km;$y2h-2)JwP{W4>DBb?0l*53>>`WH%EM1f;9Rf(0N1P-*asKtNzCmoy@rMN zmP*=QygbPzd!jRB55?whARR*F2`9iC6{O)@Wq0|sm-!V-3tWsCjv?p?Pz2dX6*EaA zyg@Vdr1j>sC4V9(L`D&A3qMP&xx^GQ(QD16GQ=|Yl?g8D%he%+df2?c8R3b%kLgDk z1xC*;$lgFwWzF&x%c3yD$u4V&?MN-fI)?f!enITKS+y0kuZ|OIjQ zfe>zU{<-I4ITVK;MuYaSQdnZ6*&Gs@Nv`iCy>=U7L=hMA(p^0z4$kV7le8Avq+B~^ ztF1$CKv2T7M|D9<$=ldy9@hfMx~2V2BtJ&HpHLxM(3z2;)UMmt5HOK8LctKE%BS9G zdHq+15#ZMR6$gR2KtPXrtF{p65qH>aAigF3BTdBJ9B!{u$a5Ylu9qVKaNeCOGaOZ@AR@9?vF)FP#EKM$;Bb5fWW z3n}gL0PB^)170ua>Z>j5WUC$gO&r=Q6L&-JO6sXpke6q-={A@{Sm-_Q-E%T%#AB1> zfYhy;XL(zNv4|?KbB0MQF;{V8+4Xw?QdPrVbdF<;*mxf9SYK-ZiKd5P$BbfDaGxw( z?#mU^CHc@m3EWKAk(D=ma7UmCZKC&9+Y_>7vU%gqsG73`T% zy}osbCQvdm-0sm~?1+wE@u~YQ5=44FfFIn*%GLoAFXtS^uX>lKJ$qFz?IwH9sc3pv zdPm)xgMG}@%YMXV^y7>Dcw~ZhR_*mYJhS?$+Q$5z0QZ$y2IVG-{JoR9$rYejXd;iv zH35{+;F@Lb-aiBI2-VLY-LfCq|DJW%O$~ce*IC@F3JbLt+{JFAXD8FrMh-ACo?Urd zxp>J6QfSmDGu*&ha=I72uA6!0N~leL2Sa-5R)5Njkz-`nZCt-Sd%__{!FH3#yaRK3 zAoO(Nu8>UZQ(Ysu(gBT=ww3hsArYSw46W7*V)JSWKv&Pm*_!Z7?Nr)mR2SMSu_2Gw z5rZQ%(qWe^Q26ExrEDb**`~F4-$Y3z=2Xn)@XsIF9>5OeY(^*%gNk(N^AZ(X0kVxr z^yniavrc(M#%0a^bN7v5A?tuS(|WJC61@P2Cv%o4*AsOP7{usailT9yx1R;q zdU(gW5p3fmNR-|PxC{*hO&73O#u<=@u*J5(W2b7RlLHcY1G*w0fhLvc2o#7z|3w(V zUthl)&%);&@3-H&AAjrk?{P%gV0_dA`dH#yWw#-}AKEMTxB{-)4Et}{Ar8|yoAG~p zWhtl!x)LcU&!hT{_rEvw_m{o!^FU5`4b;m0j=9%2hK7iz{|#4TO)b2MVEhKM%OHy_ znt8jP^}XK;f60%Pd0MPdey;DSeFJf|>!Ty)4!#3-bSBMN~-W8?IavheFWA~-4HKJiPrRWTgwhmTFVa53~5_Yyv_dD zU#eVK#fILOG46Nnc+hp&&*9eorLROSznbb1^@PVAzbPWwN%S9a+*jrpX}7X#@>{p? z@(vL$JoZOzahUkX{-El;DAEvY9mZl5;J{n`lw3T%oZD^A&itG8*>Ve~{uNSDA*{`} zbkxEbJxbcN=Cgq=@=p_R%YM}Lz#I)Dx{gP^z(2h}W$oBSZd`bGzr zenAF-9YtX}_GD&-s#i%ZA_lET-cSjWP3NZPOh}66TynUF=Qp)YtM*~Ju!?y%$m?Lm znAGE&&FU7e$km=ucmWSzJm=NYAHk~(-EMlgU s?0F4YSI5kDanp9624!kY$EalG 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 literal 27967 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 Kb7q44|C<1^<{bP0 diff --git a/apps/docs/public/static/search/source-documents.jpg b/apps/docs/public/static/search/source-documents.jpg new file mode 100644 index 0000000000000000000000000000000000000000..502bd2cdc398ecb1aabbaed4f9830f5f035e57fd GIT binary patch literal 69718 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%0D73>^_I%8=41 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