From 0d581ce333398c1d4650d964c193c43a4ceea491 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 02:09:56 -0700 Subject: [PATCH 1/8] fix(release): bound release commit lookups (#7724) --- scripts/create-single-release.test.ts | 152 ++++++++++++++++++++++++++ scripts/create-single-release.ts | 140 +++++++++++++----------- 2 files changed, 229 insertions(+), 63 deletions(-) create mode 100644 scripts/create-single-release.test.ts diff --git a/scripts/create-single-release.test.ts b/scripts/create-single-release.test.ts new file mode 100644 index 00000000000..651f3677886 --- /dev/null +++ b/scripts/create-single-release.test.ts @@ -0,0 +1,152 @@ +import { execFileSync } from 'node:child_process' +import { mkdtempSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import path from 'node:path' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' + +const SCRIPT = path.resolve(import.meta.dirname, 'create-single-release.ts') + +interface VersionCommit { + hash: string + version: string + title: string + date: string + author: string +} + +interface ReleaseLookup { + current: VersionCommit | null + previous: VersionCommit | null +} + +describe('release commit lookup', () => { + let directory: string + let tree: string + let head: string + + function git(args: string[], input?: string): string { + return execFileSync('git', args, { + cwd: directory, + encoding: 'utf8', + input, + env: { + ...process.env, + GIT_AUTHOR_NAME: 'Release Author', + GIT_AUTHOR_EMAIL: 'release@example.com', + GIT_COMMITTER_NAME: 'Release Author', + GIT_COMMITTER_EMAIL: 'release@example.com', + }, + }).trim() + } + + function commit(message: string, parents = head ? [head] : []): string { + head = git(['commit-tree', tree, ...parents.flatMap((parent) => ['-p', parent])], message) + git(['update-ref', 'refs/heads/main', head]) + return head + } + + function lookup(version: string, commitSha = ''): ReleaseLookup { + const output = execFileSync( + 'bun', + [ + '--no-env-file', + '--eval', + `import { findVersionCommit, findPreviousVersionCommit } from ${JSON.stringify(SCRIPT)}; + const current = findVersionCommit(${JSON.stringify(version)}); + const previous = current ? findPreviousVersionCommit(current) : null; + process.stdout.write(JSON.stringify({ current, previous }));`, + ], + { + cwd: directory, + encoding: 'utf8', + env: { ...process.env, GH_PAT: '', GITHUB_SHA: commitSha, LOG_LEVEL: 'ERROR' }, + } + ) + return JSON.parse(output) + } + + beforeEach(() => { + directory = mkdtempSync(path.join(tmpdir(), 'sim-release-test-')) + head = '' + git(['init', '--initial-branch=main', '--quiet']) + tree = git(['mktree'], '') + }) + + afterEach(() => { + rmSync(directory, { recursive: true, force: true }) + }) + + it('finds the release boundaries when older history exceeds the subprocess buffer', () => { + for (let index = 0; index < 40; index++) { + commit(`chore: historical change ${index} ${'x'.repeat(32_000)}`) + } + const previous = commit('v0.8.30: previous release') + commit('fix(search): improve indexing (#7720)') + const current = commit('v0.8.31: current release') + + expect(() => git(['log', '--format=%H|%s|%ai|%an', 'main'])).toThrow(/ENOBUFS/) + expect(lookup('v0.8.31')).toMatchObject({ + current: { hash: current, version: 'v0.8.31' }, + previous: { hash: previous, version: 'v0.8.30' }, + }) + }) + + it('uses the CI commit when main has advanced and HEAD is detached', () => { + const previous = commit('v0.8.30: previous release') + const current = commit('v0.8.31: current release') + commit('v0.8.32: later release') + git(['checkout', '--detach', '--quiet', current]) + git(['branch', '-D', 'main']) + + expect(lookup('v0.8.31', current)).toMatchObject({ + current: { hash: current }, + previous: { hash: previous }, + }) + }) + + it('rejects a CI commit whose version differs from the requested release', () => { + commit('v0.8.30: previous release') + const current = commit('v0.8.31: current release') + + expect(lookup('v0.8.30', current)).toEqual({ current: null, previous: null }) + }) + + it('supports looking up an older release on main', () => { + const previous = commit('v0.8.30: previous release') + const current = commit('v0.8.31: current release') + commit('v0.8.32: later release') + + expect(lookup('v0.8.31')).toMatchObject({ + current: { hash: current }, + previous: { hash: previous }, + }) + }) + + it('ignores release-like commit bodies and releases merged from another branch', () => { + const previous = commit('v0.8.30: previous release') + const sideRelease = commit('v9.0.0: release on staging', [previous]) + const mainCommit = commit('chore: mention a version\n\nv8.0.0: not a release', [previous]) + const current = commit('v0.8.31: current release', [mainCommit, sideRelease]) + commit('v0.8.32: later release\n\nv0.8.31: mentioned in the body') + + expect(lookup('v0.8.31')).toMatchObject({ + current: { hash: current }, + previous: { hash: previous }, + }) + }) + + it('preserves pipe characters in release titles', () => { + const current = commit('v0.8.31: parsers | search improvements') + + expect(lookup('v0.8.31')).toMatchObject({ + current: { hash: current, title: 'parsers | search improvements', author: 'Release Author' }, + previous: null, + }) + }) + + it('returns no match for a missing version or a similar version number', () => { + commit('v0.8.310: a different version') + + expect(lookup('v0.8.31')).toEqual({ current: null, previous: null }) + }) +}) diff --git a/scripts/create-single-release.ts b/scripts/create-single-release.ts index 9d98b930593..162a6966196 100755 --- a/scripts/create-single-release.ts +++ b/scripts/create-single-release.ts @@ -1,24 +1,16 @@ #!/usr/bin/env bun -import { execSync } from 'node:child_process' +import { execFileSync } from 'node:child_process' import { Octokit } from '@octokit/rest' +import { createLogger } from '@sim/logger' import { sleep } from '@sim/utils/helpers' +const logger = createLogger('CreateRelease') const GITHUB_TOKEN = process.env.GH_PAT const REPO_OWNER = 'simstudioai' const REPO_NAME = 'sim' -if (!GITHUB_TOKEN) { - console.error('❌ GH_PAT environment variable is required') - process.exit(1) -} - const targetVersion = process.argv[2] -if (!targetVersion) { - console.error('❌ Version argument is required') - console.error('Usage: bun run scripts/create-single-release.ts v0.3.XX') - process.exit(1) -} const octokit = new Octokit({ auth: GITHUB_TOKEN, @@ -40,70 +32,79 @@ interface CommitDetail { prNumber?: string } -function execCommand(command: string): string { +function execGit(args: string[]): string { try { - return execSync(command, { encoding: 'utf8' }).trim() + return execFileSync('git', args, { encoding: 'utf8' }).trim() } catch (error) { - console.error(`❌ Command failed: ${command}`) + logger.error('Git command failed', { args }) throw error } } -function findVersionCommit(version: string): VersionCommit | null { - console.log(`🔍 Finding commit for version ${version}...`) +const VERSION_COMMIT_FORMAT = '--format=%H%x00%s%x00%aI%x00%an' - const gitLog = execCommand('git log --oneline --format="%H|%s|%ai|%an" main') - const lines = gitLog.split('\n').filter((line) => line.trim()) +function parseVersionCommit(line: string): VersionCommit | null { + if (!line) return null - for (const line of lines) { - const [hash, message, date, author] = line.split('|') + const [hash, message, date, author] = line.split('\0') + const versionMatch = message.match(/^\s*(v\d+\.\d+\.?\d*):\s*(.+)$/) + if (!versionMatch) return null - const versionMatch = message.match(/^\s*(v\d+\.\d+\.?\d*):\s*(.+)$/) - if (versionMatch && versionMatch[1] === version) { - return { - hash, - version, - title: versionMatch[2], - date: new Date(date).toISOString(), - author, - } - } + return { + hash, + version: versionMatch[1], + title: versionMatch[2], + date: new Date(date).toISOString(), + author, } - - return null } -function findPreviousVersionCommit(currentVersion: string): VersionCommit | null { - console.log(`🔍 Finding previous version before ${currentVersion}...`) - - const gitLog = execCommand('git log --oneline --format="%H|%s|%ai|%an" main') - const lines = gitLog.split('\n').filter((line) => line.trim()) - - let foundCurrent = false - - for (const line of lines) { - const [hash, message, date, author] = line.split('|') +/** Reads one release candidate at a time, stopping at the first matching subject. */ +function findReleaseCommit(ref: string, version?: string, skip = 0): VersionCommit | null { + const versionPattern = version ? version.replaceAll('.', '[.]') : 'v[0-9]+[.][0-9]+[.]?[0-9]*' + + while (true) { + const line = execGit([ + 'log', + '--first-parent', + '--max-count=1', + `--skip=${skip}`, + '--extended-regexp', + `--grep=^[[:space:]]*${versionPattern}:[[:space:]]*.+`, + VERSION_COMMIT_FORMAT, + ref, + '--', + ]) + if (!line) return null + + const commit = parseVersionCommit(line) + if (commit && (!version || commit.version === version)) return commit + + /** Git's grep also matches commit bodies; only release subjects are boundaries. */ + skip++ + } +} - const versionMatch = message.match(/^\s*(v\d+\.\d+\.?\d*):\s*(.+)$/) - if (versionMatch) { - if (versionMatch[1] === currentVersion) { - foundCurrent = true - continue - } +export function findVersionCommit( + version: string, + commitSha = process.env.GITHUB_SHA +): VersionCommit | null { + logger.info(`Finding commit for version ${version}`) + if (!/^v\d+\.\d+\.?\d*$/.test(version)) return null - if (foundCurrent) { - return { - hash, - version: versionMatch[1], - title: versionMatch[2], - date: new Date(date).toISOString(), - author, - } - } - } + if (commitSha) { + const commit = parseVersionCommit( + execGit(['log', '-1', VERSION_COMMIT_FORMAT, commitSha, '--']) + ) + return commit?.version === version ? commit : null } - return null + return findReleaseCommit('main', version) +} + +export function findPreviousVersionCommit(currentCommit: VersionCommit): VersionCommit | null { + logger.info(`Finding previous version before ${currentCommit.version}`) + return findReleaseCommit(currentCommit.hash, undefined, 1) } async function fetchGitHubCommitDetails( @@ -145,7 +146,7 @@ async function fetchGitHubCommitDetails( console.warn(`⚠️ Could not fetch commit ${hash.substring(0, 7)}: ${error?.message || error}`) try { - const gitData = execCommand(`git log --format="%s|%an" -1 ${hash}`).split('|') + const gitData = execGit(['log', '--format=%s|%an', '-1', hash, '--']).split('|') let message = gitData[0] || 'Unknown commit' const prMatch = message.match(/\(#(\d+)\)/) @@ -188,7 +189,7 @@ async function getCommitsBetweenVersions( console.log(`🔍 Getting commits before first version ${currentCommit.version}`) } - const gitLog = execCommand(`git log --oneline --format="%H|%s" ${range}`) + const gitLog = execGit(['log', '--format=%H|%s', range, '--']) if (!gitLog.trim()) { console.log(`⚠️ No commits found in range ${range}`) @@ -350,6 +351,17 @@ async function generateReleaseBody( } async function main() { + if (!GITHUB_TOKEN) { + logger.error('GH_PAT environment variable is required') + process.exit(1) + } + if (!targetVersion) { + logger.error( + 'Version argument is required. Usage: bun run scripts/create-single-release.ts vX.Y.Z' + ) + process.exit(1) + } + try { console.log(`🚀 Creating single release for ${targetVersion}...`) @@ -363,7 +375,7 @@ async function main() { `✅ Found version commit: ${versionCommit.hash.substring(0, 7)} - ${versionCommit.title}` ) - const previousCommit = findPreviousVersionCommit(targetVersion) + const previousCommit = findPreviousVersionCommit(versionCommit) if (previousCommit) { console.log(`✅ Found previous version: ${previousCommit.version}`) } else { @@ -414,4 +426,6 @@ async function main() { } } -main() +if (import.meta.main) { + main() +} From 6d42e7d13072eb399beb38a432d11d2962c226c6 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 02:23:48 -0700 Subject: [PATCH 2/8] fix(knowledge): cache the ingestion usage gate for a minute (#7725) Every document run checked the payer's spend by summing the usage ledger for the billing period. The ledger grows with every indexed document, so a bulk connector sync re-read the whole period's ledger once per document: 41,000 sums over roughly 436,000 rows each during one crawl, which was the largest single database consumer while it ran and slowed unrelated queries, including search. Background ingestion now reads the gate through a per-process LRU cache keyed by payer, billing period and acting member, with a 60-second TTL and coalesced misses. Staleness fails in the harmless direction: a payer at their limit indexes for at most another minute, and a raised limit takes at most a minute to apply. Interactive callers keep reading the gate fresh. Claude-Session: https://claude.ai/code/session_01JBacX6HGVhPMUySuMfANwn Co-authored-by: Claude Fable 5.1 --- .../billing/core/ingestion-usage-gate.test.ts | 98 +++++++++++++++++++ .../lib/billing/core/ingestion-usage-gate.ts | 69 +++++++++++++ .../documents/document-indexing-usage.test.ts | 2 + .../document-processing-source.test.ts | 2 + apps/sim/lib/knowledge/documents/service.ts | 4 +- 5 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 apps/sim/lib/billing/core/ingestion-usage-gate.test.ts create mode 100644 apps/sim/lib/billing/core/ingestion-usage-gate.ts diff --git a/apps/sim/lib/billing/core/ingestion-usage-gate.test.ts b/apps/sim/lib/billing/core/ingestion-usage-gate.test.ts new file mode 100644 index 00000000000..dbecf11abf0 --- /dev/null +++ b/apps/sim/lib/billing/core/ingestion-usage-gate.test.ts @@ -0,0 +1,98 @@ +/** + * @vitest-environment node + */ +import { sleep } from '@sim/utils/helpers' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const { mockCheck } = vi.hoisted(() => ({ mockCheck: vi.fn() })) + +vi.mock('@/lib/billing/core/billing-attribution', () => ({ + checkAttributedUsageLimits: mockCheck, +})) + +import type { BillingAttributionSnapshot } from '@/lib/billing/core/billing-attribution' +import { + checkIngestionUsageLimits, + INGESTION_USAGE_GATE_TTL_MS, + resetIngestionUsageGateCache, +} from '@/lib/billing/core/ingestion-usage-gate' + +const ATTRIBUTION: BillingAttributionSnapshot = { + actorUserId: 'member-1', + workspaceId: null, + organizationId: 'org-1', + billedAccountUserId: 'owner-1', + billingEntity: { type: 'organization', id: 'org-1' }, + billingPeriod: { + start: '2026-09-01T00:00:00.000Z', + end: '2026-10-01T00:00:00.000Z', + source: 'stripe', + }, + payerSubscription: null, +} + +describe('checkIngestionUsageLimits', () => { + beforeEach(() => { + resetIngestionUsageGateCache() + mockCheck.mockReset().mockResolvedValue({ isExceeded: false }) + }) + afterEach(() => vi.restoreAllMocks()) + + it('reads the ledger once per payer, period and actor within the TTL', async () => { + await checkIngestionUsageLimits(ATTRIBUTION) + await checkIngestionUsageLimits(ATTRIBUTION) + await checkIngestionUsageLimits({ ...ATTRIBUTION, workspaceId: 'workspace-9' }) + expect(mockCheck).toHaveBeenCalledTimes(1) + }) + + it('collapses concurrent misses onto one ledger read', async () => { + let resolve!: (value: { isExceeded: boolean }) => void + mockCheck.mockReturnValueOnce(new Promise((r) => (resolve = r))) + const pending = Promise.all([ + checkIngestionUsageLimits(ATTRIBUTION), + checkIngestionUsageLimits(ATTRIBUTION), + checkIngestionUsageLimits(ATTRIBUTION), + ]) + await sleep(0) + resolve({ isExceeded: false }) + const results = await pending + expect(results.every((result) => result.isExceeded === false)).toBe(true) + expect(mockCheck).toHaveBeenCalledTimes(1) + }) + + it('keeps a refusal for the same bounded window, then reads fresh', async () => { + mockCheck.mockResolvedValueOnce({ isExceeded: true, scope: 'payer', message: 'over' }) + expect((await checkIngestionUsageLimits(ATTRIBUTION)).isExceeded).toBe(true) + expect((await checkIngestionUsageLimits(ATTRIBUTION)).isExceeded).toBe(true) + expect(mockCheck).toHaveBeenCalledTimes(1) + + /** `lru-cache` reads `performance.now()` and debounces it behind a real 1 ms timer. */ + const start = performance.now() + vi.spyOn(performance, 'now').mockReturnValue(start + INGESTION_USAGE_GATE_TTL_MS + 1) + await sleep(5) + expect((await checkIngestionUsageLimits(ATTRIBUTION)).isExceeded).toBe(false) + expect(mockCheck).toHaveBeenCalledTimes(2) + }) + + it('separates answers by actor, period and payer', async () => { + await checkIngestionUsageLimits(ATTRIBUTION) + await checkIngestionUsageLimits({ ...ATTRIBUTION, actorUserId: 'member-2' }) + await checkIngestionUsageLimits({ + ...ATTRIBUTION, + billingPeriod: { ...ATTRIBUTION.billingPeriod, start: '2026-10-01T00:00:00.000Z' }, + }) + await checkIngestionUsageLimits({ + ...ATTRIBUTION, + billedAccountUserId: 'owner-2', + billingEntity: { type: 'user', id: 'owner-2' }, + }) + expect(mockCheck).toHaveBeenCalledTimes(4) + }) + + it('does not cache a failed read', async () => { + mockCheck.mockRejectedValueOnce(new Error('ledger unavailable')) + await expect(checkIngestionUsageLimits(ATTRIBUTION)).rejects.toThrow('ledger unavailable') + await checkIngestionUsageLimits(ATTRIBUTION) + expect(mockCheck).toHaveBeenCalledTimes(2) + }) +}) diff --git a/apps/sim/lib/billing/core/ingestion-usage-gate.ts b/apps/sim/lib/billing/core/ingestion-usage-gate.ts new file mode 100644 index 00000000000..2f6f1c5f5f8 --- /dev/null +++ b/apps/sim/lib/billing/core/ingestion-usage-gate.ts @@ -0,0 +1,69 @@ +import { LRUCache } from 'lru-cache' +import { + type AttributedUsageLimitsResult, + type BillingAttributionSnapshot, + checkAttributedUsageLimits, +} from '@/lib/billing/core/billing-attribution' +import { coalesceLocally } from '@/lib/concurrency/singleflight' + +/** + * How long a usage-gate answer stays usable on the ingestion path. + * + * The gate sums the payer's usage ledger for the billing period, which grows + * with every indexed document, so a bulk sync that re-checks per document + * reads the whole period's ledger tens of thousands of times. Staleness fails + * in the harmless direction: a payer at their limit keeps indexing for at most + * this long, and a payer whose limit was just raised waits at most this long. + * Nothing on this path has a person waiting for the answer. + */ +export const INGESTION_USAGE_GATE_TTL_MS = 60 * 1000 + +/** Recent gate answers, with `LRUCache` supplying the TTL and the size bound. */ +const gateCache = new LRUCache({ + max: 10_000, + ttl: INGESTION_USAGE_GATE_TTL_MS, +}) + +/** + * The gate depends on who pays, for which period, and which member acts: the + * payer pool and the per-member cap are both part of the answer. + */ +function gateKey(attribution: BillingAttributionSnapshot): string { + return [ + attribution.billingEntity.type, + attribution.billingEntity.id, + attribution.billingPeriod.start, + attribution.billingPeriod.end, + attribution.billedAccountUserId, + attribution.actorUserId, + ].join(':') +} + +/** + * {@link checkAttributedUsageLimits} for background ingestion, with bounded + * staleness. Interactive callers (uploads, search, the settings surfaces) keep + * reading the gate fresh so a limit change is visible at once. + * + * `coalesceLocally` collapses the concurrent misses of a batch onto one ledger + * read and bounds a hung read at its settle deadline. The cache write stays on + * the value this caller received, so a producer that timed out and later + * resolved cannot overwrite a fresher answer. + */ +export async function checkIngestionUsageLimits( + attribution: BillingAttributionSnapshot +): Promise { + const key = gateKey(attribution) + const cached = gateCache.get(key) + if (cached !== undefined) return cached + + const result = await coalesceLocally(`ingestion-usage-gate:${key}`, () => + checkAttributedUsageLimits(attribution) + ) + gateCache.set(key, result) + return result +} + +/** Drops every cached gate answer. Test seam; never called in production code. */ +export function resetIngestionUsageGateCache(): void { + gateCache.clear() +} diff --git a/apps/sim/lib/knowledge/documents/document-indexing-usage.test.ts b/apps/sim/lib/knowledge/documents/document-indexing-usage.test.ts index e68b00db64f..437de7bf205 100644 --- a/apps/sim/lib/knowledge/documents/document-indexing-usage.test.ts +++ b/apps/sim/lib/knowledge/documents/document-indexing-usage.test.ts @@ -65,11 +65,13 @@ vi.mock('@/providers/utils', () => ({ })) import * as billingAttribution from '@/lib/billing/core/billing-attribution' +import { resetIngestionUsageGateCache } from '@/lib/billing/core/ingestion-usage-gate' import * as embeddingClient from '@/lib/embeddings/client' import { processDocumentAsync } from '@/lib/knowledge/documents/service' const mockEmbeddingCapacity = vi.fn() beforeEach(() => { + resetIngestionUsageGateCache() vi.spyOn(billingAttribution, 'checkAttributedUsageLimits').mockImplementation( mockCheckAttributedUsageLimits ) diff --git a/apps/sim/lib/knowledge/documents/document-processing-source.test.ts b/apps/sim/lib/knowledge/documents/document-processing-source.test.ts index c3eeff755ca..5b36cbdf3c2 100644 --- a/apps/sim/lib/knowledge/documents/document-processing-source.test.ts +++ b/apps/sim/lib/knowledge/documents/document-processing-source.test.ts @@ -66,6 +66,7 @@ vi.mock('@/lib/uploads/server/metadata', () => ({ })) import * as billingAttribution from '@/lib/billing/core/billing-attribution' +import { resetIngestionUsageGateCache } from '@/lib/billing/core/ingestion-usage-gate' import { env } from '@/lib/core/config/env' import { markInsideTriggerRun, @@ -92,6 +93,7 @@ import { MAX_PROCESSING_ATTEMPTS } from '@/lib/knowledge/documents/types' const mockEmbeddingCapacity = vi.fn() beforeEach(() => { + resetIngestionUsageGateCache() vi.spyOn(billingAttribution, 'checkAttributedUsageLimits').mockImplementation( mockCheckAttributedUsageLimits ) diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index 8a555fb1834..7b962342a17 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -34,9 +34,9 @@ import { assertBillingAttributionOwner, assertBillingAttributionSnapshot, type BillingAttributionSnapshot, - checkAttributedUsageLimits, toBillingContext, } from '@/lib/billing/core/billing-attribution' +import { checkIngestionUsageLimits } from '@/lib/billing/core/ingestion-usage-gate' import { recordUsage } from '@/lib/billing/core/usage-log' import { applyStorageUsageDeltasInTx, @@ -1618,7 +1618,7 @@ export async function processDocumentAsync( assertBillingAttributionOwner(billingAttribution, ctx) const documentActorUserId = billingAttribution.actorUserId - const usageGate = await checkAttributedUsageLimits(billingAttribution) + const usageGate = await checkIngestionUsageLimits(billingAttribution) if (usageGate.isExceeded) { logger.warn(`[${documentId}] Usage limit reached — skipping document indexing`) throw new UsageLimitDocumentProcessingError( From bba8f909a5e3dda0db9b7fb8381f463381bffbeb Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 02:57:30 -0700 Subject: [PATCH 3/8] fix(search): reserve interactive embeddings from their own admission lane (#7726) * fix(search): reserve interactive embeddings from their own admission lane A search embeds its query through the same per-credential admission bucket as bulk indexing, so during a crawl one short interactive request competed with hundreds of batches for the bucket's refill. Non-checkpointed callers now reserve from a separate lane under the same identity; the provider cooldown and quota gates stay shared, so a provider 429 or an exhausted balance still pauses every caller. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01JBacX6HGVhPMUySuMfANwn * fix(search): cap the bulk embedding lane below the credential budget Every caller reserves from the credential's aggregate buckets, and the bulk lane additionally reserves from a bucket capped at 90% of that budget. The aggregate can no longer exceed the configured budget, and interactive callers always find headroom instead of a queue behind a crawl's batches. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01JBacX6HGVhPMUySuMfANwn * fix(search): keep a bulk lane bucket large enough for one valid reservation At the smallest supported budgets the 90% share floored below a single request or token cost and locked the bulk lane. The bucket now holds at least the reservation it is asked for, while the refill rate keeps the share. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01JBacX6HGVhPMUySuMfANwn * refactor(search): derive the bulk admission lane from one flag A single bulk flag now selects the shorter admission wait and the capped lane, the lane cap is a pure function of configuration, and a bulk batch larger than that cap is rejected up front instead of resizing a shared bucket. Tests use the shared env mock. Co-Authored-By: Claude Fable 5.1 --------- Co-authored-by: Claude Fable 5.1 --- .../rate-limiter/provider-admission.test.ts | 47 +++++++++++++- .../core/rate-limiter/provider-admission.ts | 65 ++++++++++++------- apps/sim/lib/embeddings/client.test.ts | 5 +- apps/sim/lib/embeddings/client.ts | 8 ++- 4 files changed, 98 insertions(+), 27 deletions(-) diff --git a/apps/sim/lib/core/rate-limiter/provider-admission.test.ts b/apps/sim/lib/core/rate-limiter/provider-admission.test.ts index 0307ed6f683..76d71ce4a81 100644 --- a/apps/sim/lib/core/rate-limiter/provider-admission.test.ts +++ b/apps/sim/lib/core/rate-limiter/provider-admission.test.ts @@ -1,6 +1,7 @@ /** * @vitest-environment node */ +import { resetEnvMock, setEnv } from '@sim/testing/mocks/env.mock' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { consumeTokens, getCooldownUntil, setCooldownUntil } = vi.hoisted(() => ({ @@ -35,7 +36,10 @@ describe('provider admission', () => { consumeTokens.mockResolvedValue({ allowed: true, tokensRemaining: 1, resetAt: new Date() }) }) - afterEach(() => vi.useRealTimers()) + afterEach(() => { + vi.useRealTimers() + resetEnvMock() + }) it('shares both credential dimensions in one reservation across concurrent callers', async () => { await Promise.all([waitForProviderAdmission(INPUT), waitForProviderAdmission(INPUT)]) @@ -86,6 +90,47 @@ describe('provider admission', () => { ) }) + it('caps bulk work below the aggregate budget so interactive callers keep headroom', async () => { + await waitForProviderAdmission({ ...INPUT, bulk: true }) + const [reservations, options] = consumeTokens.mock.calls[0] + expect(reservations).toMatchObject([ + { key: 'provider:embedding:openai:hashed-credential:tokens', config: { maxTokens: 600_000 } }, + { key: 'provider:embedding:openai:hashed-credential:requests', config: { maxTokens: 64 } }, + { + key: 'provider:embedding:openai:hashed-credential:bulk:tokens', + cost: 50, + config: { maxTokens: 540_000, refillRate: 9_000 }, + }, + { + key: 'provider:embedding:openai:hashed-credential:bulk:requests', + config: { maxTokens: 57, refillRate: 9 }, + }, + ]) + expect(options.cooldownKeys).toEqual([ + 'provider:embedding:openai:hashed-credential:cooldown', + 'provider:embedding:openai:hashed-credential:quota', + ]) + }) + + it('rejects a bulk batch the lane can never hold and keeps one request slot at a minimal burst', async () => { + setEnv({ + KB_CONFIG_EMBEDDING_REQUESTS_PER_MINUTE: '1', + KB_CONFIG_EMBEDDING_TOKENS_PER_MINUTE: '100', + }) + await expect( + waitForProviderAdmission({ ...INPUT, inputTokens: 95, bulk: true }) + ).rejects.toThrow('exceeds the configured per-credential token budget') + await waitForProviderAdmission({ ...INPUT, inputTokens: 95 }) + await waitForProviderAdmission({ ...INPUT, inputTokens: 90, bulk: true }) + expect(consumeTokens.mock.calls[1][0].slice(2)).toMatchObject([ + { key: 'provider:embedding:openai:hashed-credential:bulk:tokens', config: { maxTokens: 90 } }, + { + key: 'provider:embedding:openai:hashed-credential:bulk:requests', + config: { maxTokens: 1 }, + }, + ]) + }) + it('isolates another credential and does not impose token costs on OCR', async () => { await waitForProviderAdmission({ ...INPUT, diff --git a/apps/sim/lib/core/rate-limiter/provider-admission.ts b/apps/sim/lib/core/rate-limiter/provider-admission.ts index 895ebf33289..b9b191c2f81 100644 --- a/apps/sim/lib/core/rate-limiter/provider-admission.ts +++ b/apps/sim/lib/core/rate-limiter/provider-admission.ts @@ -12,10 +12,20 @@ export interface ProviderIdentity { operation: 'embedding' | 'ocr' | 'rerank' } +/** + * Share of a credential's budget the bulk lane may use. Every caller reserves + * from the aggregate buckets, so the budget is never exceeded; bulk callers + * also reserve from buckets capped at this share, which leaves an interactive + * caller headroom instead of a queue behind a crawl's batches. + */ +const BULK_LANE_SHARE = 0.9 + interface ProviderAdmissionInput extends ProviderIdentity { inputTokens?: number signal?: AbortSignal maxWaitMs: number + /** Bulk work is capped at {@link BULK_LANE_SHARE}; cooldown and quota gates still stop every caller. */ + bulk?: boolean } /** @@ -55,36 +65,47 @@ export async function waitForProviderAdmission(input: ProviderAdmissionInput): P : input.operation === 'ocr' ? envNumber(env.KB_CONFIG_OCR_REQUESTS_PER_MINUTE, 60, { min: 1 }) : envNumber(env.KB_CONFIG_RERANK_REQUESTS_PER_MINUTE, 60, { min: 1 }) + const tokenBudget = + input.operation === 'embedding' && input.inputTokens + ? { + cost: input.inputTokens, + perMinute: envNumber(env.KB_CONFIG_EMBEDDING_TOKENS_PER_MINUTE, 600_000, { min: 1 }), + } + : undefined + const laneShare = input.bulk ? BULK_LANE_SHARE : 1 + if (tokenBudget && tokenBudget.cost > Math.floor(tokenBudget.perMinute * laneShare)) { + throw new Error('Embedding request exceeds the configured per-credential token budget') + } + const requestBurst = Math.min( + input.operation === 'embedding' ? EMBEDDING_REQUEST_BURST : DEFAULT_REQUEST_BURST, + requestsPerMinute + ) const reservations: TokenBucketReservation[] = [] - if (input.operation === 'embedding' && input.inputTokens) { - const tokensPerMinute = envNumber(env.KB_CONFIG_EMBEDDING_TOKENS_PER_MINUTE, 600_000, { - min: 1, - }) - if (input.inputTokens > tokensPerMinute) { - throw new Error('Embedding request exceeds the configured per-credential token budget') + const reserveBuckets = (bucketKey: string, share: number) => { + if (tokenBudget) { + reservations.push({ + key: `${bucketKey}:tokens`, + cost: tokenBudget.cost, + config: { + maxTokens: Math.floor(tokenBudget.perMinute * share), + refillRate: (tokenBudget.perMinute * share) / 60, + refillIntervalMs: 1000, + }, + }) } reservations.push({ - key: `${key}:tokens`, - cost: input.inputTokens, + key: `${bucketKey}:requests`, + cost: 1, config: { - maxTokens: tokensPerMinute, - refillRate: tokensPerMinute / 60, + /** A burst of one leaves no share to carve out, so the lane then matches the aggregate. */ + maxTokens: Math.max(1, Math.floor(requestBurst * share)), + refillRate: (requestsPerMinute * share) / 60, refillIntervalMs: 1000, }, }) } - reservations.push({ - key: `${key}:requests`, - cost: 1, - config: { - maxTokens: Math.min( - input.operation === 'embedding' ? EMBEDDING_REQUEST_BURST : DEFAULT_REQUEST_BURST, - requestsPerMinute - ), - refillRate: requestsPerMinute / 60, - refillIntervalMs: 1000, - }, - }) + reserveBuckets(key, 1) + if (input.bulk) reserveBuckets(`${key}:bulk`, BULK_LANE_SHARE) /** When the bucket last said capacity returns, so a deadline hit after a sleep reports the wait still left. */ let capacityAvailableAt: number | undefined diff --git a/apps/sim/lib/embeddings/client.test.ts b/apps/sim/lib/embeddings/client.test.ts index 70ff9e97646..5efc3104276 100644 --- a/apps/sim/lib/embeddings/client.test.ts +++ b/apps/sim/lib/embeddings/client.test.ts @@ -1807,13 +1807,14 @@ describe('durable embedding batches', () => { expect(KNOWLEDGE_EMBEDDING_ADMISSION_WAIT_MS).toBeLessThan(EMBEDDING_RETRY_BUDGET_MS) }) - it('limits checkpointed admission waits while retaining the interactive request budget', async () => { + it('limits checkpointed admission waits and keeps interactive callers off the bulk lane', async () => { fetchMock.mockImplementation(() => Promise.resolve(jsonResponse(openAIBody([[1]], 7)))) await embed(['text'], { apiKey: 'fixture-key', checkpoints: memoryCheckpoints() }) expect(mockAdmit).toHaveBeenLastCalledWith( - expect.objectContaining({ maxWaitMs: KNOWLEDGE_EMBEDDING_ADMISSION_WAIT_MS }) + expect.objectContaining({ maxWaitMs: KNOWLEDGE_EMBEDDING_ADMISSION_WAIT_MS, bulk: true }) ) await embed(['text'], { apiKey: 'fixture-key' }) + expect(mockAdmit).toHaveBeenLastCalledWith(expect.objectContaining({ bulk: false })) expect(mockAdmit.mock.lastCall?.[0].maxWaitMs).toBeGreaterThan( KNOWLEDGE_EMBEDDING_ADMISSION_WAIT_MS ) diff --git a/apps/sim/lib/embeddings/client.ts b/apps/sim/lib/embeddings/client.ts index 0c6728d35e7..846ba759f0d 100644 --- a/apps/sim/lib/embeddings/client.ts +++ b/apps/sim/lib/embeddings/client.ts @@ -544,8 +544,10 @@ async function callEmbeddingAPI( expectedDimensions: number | undefined, isBYOK: boolean, signal?: AbortSignal, - admissionWaitMs = EMBEDDING_RETRY_BUDGET_MS + /** Bulk indexing waits briefly and is capped below the credential budget; everything else has a person waiting on it. */ + bulk = false ): Promise<{ embeddings: number[][]; totalTokens: number; dimensions: number }> { + const admissionWaitMs = bulk ? KNOWLEDGE_EMBEDDING_ADMISSION_WAIT_MS : EMBEDDING_RETRY_BUDGET_MS const admissionIdentity = embeddingAdmissionIdentity({ providerId, quotaCircuitIdentity, isBYOK }) return retryWithExponentialBackoff( async (operationSignal, deadlineAt) => { @@ -563,6 +565,7 @@ async function callEmbeddingAPI( ), signal: operationSignal, maxWaitMs: Math.min(admissionWaitMs, Math.max(0, deadlineAt - Date.now())), + bulk, }) } catch (error) { if (error instanceof ProviderQuotaExhaustedError) @@ -795,6 +798,7 @@ async function mapEmbeddingBatches( return results.map((result) => result!.value) } +/** Checkpoints mark the bulk indexing path; every other caller is interactive. */ async function callCheckpointedEmbeddingBatch( batch: string[], batchIndex: number, @@ -848,7 +852,7 @@ async function callCheckpointedEmbeddingBatch( provider.dimensions, provider.isBYOK, signal, - checkpoints ? KNOWLEDGE_EMBEDDING_ADMISSION_WAIT_MS : undefined + checkpoints !== undefined ) if (identity) await checkpoints!.save(identity, result, signal) return result From 6dba1169d52df338347c5046c207ff54e200acc8 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 03:33:44 -0700 Subject: [PATCH 4/8] improvement(search): reduce redundant metadata reads (#7728) --- .github/workflows/test-build.yml | 1 + .../knowledge/search/route.provenance.test.ts | 6 +- .../search-reference-batching.integration.ts | 123 +++++++++++++ .../knowledge/application/documents.test.ts | 4 + .../lib/knowledge/application/search.test.ts | 125 +++++++++++++- apps/sim/lib/knowledge/application/search.ts | 28 ++- .../search/queries-github-discovery.test.ts | 162 ++++++++++++++++++ apps/sim/lib/knowledge/search/queries.test.ts | 102 +++++++++-- apps/sim/lib/knowledge/search/queries.ts | 20 ++- apps/sim/lib/knowledge/service.test.ts | 67 ++++++++ apps/sim/lib/knowledge/service.ts | 57 ++++-- .../knowledge/tags/filter-resolution.test.ts | 11 +- .../lib/knowledge/tags/filter-resolution.ts | 14 +- apps/sim/lib/knowledge/tags/service.test.ts | 81 ++++++++- apps/sim/lib/knowledge/tags/service.ts | 55 ++++-- 15 files changed, 778 insertions(+), 78 deletions(-) create mode 100644 apps/sim/lib/knowledge/__integration__/search-reference-batching.integration.ts create mode 100644 apps/sim/lib/knowledge/search/queries-github-discovery.test.ts diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index eb467bfea33..dacc08540b9 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -187,6 +187,7 @@ jobs: bunx vitest run --mode integration lib/knowledge/__integration__/search-source-progress.integration.ts lib/knowledge/__integration__/search-source-pagination.integration.ts + lib/knowledge/__integration__/search-reference-batching.integration.ts lib/core/outbox/service.integration.ts lib/knowledge/__integration__/connector-upload.integration.ts diff --git a/apps/sim/app/api/v2/knowledge/search/route.provenance.test.ts b/apps/sim/app/api/v2/knowledge/search/route.provenance.test.ts index 6289e012046..3971a4c4ca5 100644 --- a/apps/sim/app/api/v2/knowledge/search/route.provenance.test.ts +++ b/apps/sim/app/api/v2/knowledge/search/route.provenance.test.ts @@ -48,7 +48,8 @@ vi.mock('@/lib/knowledge/application/contexts', () => ({ })) vi.mock('@/lib/knowledge/service', () => ({ - getActiveKnowledgeBaseReference: mocks.getKnowledgeBase, + getActiveKnowledgeBaseReferences: (ids: string[]) => + Promise.all(ids.map((id) => mocks.getKnowledgeBase(id))), })) vi.mock('@/lib/knowledge/embeddings', () => ({ @@ -63,7 +64,8 @@ vi.mock('@/lib/knowledge/search/queries', () => ({ })) vi.mock('@/lib/knowledge/tags/service', () => ({ - getDocumentTagDefinitions: mocks.getTagDefinitions, + getDocumentTagDefinitionsByKnowledgeBaseIds: async (ids: string[]) => + new Map(await Promise.all(ids.map(async (id) => [id, await mocks.getTagDefinitions(id)]))), })) vi.mock('@/lib/knowledge/tags/utils', () => ({ diff --git a/apps/sim/lib/knowledge/__integration__/search-reference-batching.integration.ts b/apps/sim/lib/knowledge/__integration__/search-reference-batching.integration.ts new file mode 100644 index 00000000000..a08d83b195a --- /dev/null +++ b/apps/sim/lib/knowledge/__integration__/search-reference-batching.integration.ts @@ -0,0 +1,123 @@ +import { db } from '@sim/db' +import { + knowledgeBase, + knowledgeBaseTagDefinitions, + organization, + user, + workspace, +} from '@sim/db/schema' +import { generateId } from '@sim/utils/id' +import { and, eq, inArray } from 'drizzle-orm' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { + createKnowledgeAclFixtureIds, + seedKnowledgeAclFixture, +} from '@/lib/knowledge/__integration__/seed-source-access-fixture' +import { + getActiveKnowledgeBaseReference, + getActiveKnowledgeBaseReferences, +} from '@/lib/knowledge/service' +import { + getDocumentTagDefinitions, + getDocumentTagDefinitionsByKnowledgeBaseIds, +} from '@/lib/knowledge/tags/service' + +describe('batched search reference reads', () => { + const fixture = createKnowledgeAclFixtureIds() + const baseIds = [fixture.knowledgeBaseId, ...Array.from({ length: 19 }, () => generateId())] + const deletedBaseId = generateId() + + beforeAll(async () => { + await seedKnowledgeAclFixture(fixture) + await db.insert(knowledgeBase).values( + [...baseIds.slice(1), deletedBaseId].map((id, index) => ({ + id, + userId: fixture.aliceId, + workspaceId: fixture.workspaceId, + name: `Batched search fixture ${index}`, + deletedAt: id === deletedBaseId ? new Date() : null, + })) + ) + await db.insert(knowledgeBaseTagDefinitions).values( + baseIds.slice(0, -1).flatMap((knowledgeBaseId) => + (['tag3', 'tag2'] as const).map((tagSlot) => ({ + id: generateId(), + knowledgeBaseId, + tagSlot, + displayName: tagSlot, + fieldType: 'text' as const, + })) + ) + ) + }) + + afterAll(async () => { + vi.restoreAllMocks() + 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(inArray(user.id, [fixture.aliceId, fixture.bobId])) + await db.$client.end() + }) + + it('returns identical active references with one query instead of twenty', async () => { + const select = vi.spyOn(db, 'select') + try { + const expected = await Promise.all(baseIds.map(getActiveKnowledgeBaseReference)) + expect(select).toHaveBeenCalledTimes(20) + select.mockClear() + expect(await getActiveKnowledgeBaseReferences(baseIds)).toEqual(expected) + expect(select).toHaveBeenCalledOnce() + } finally { + select.mockRestore() + } + }) + + it('preserves input order, duplicates, missing identities, and soft deletion', async () => { + const ids = [baseIds[8], generateId(), baseIds[0], deletedBaseId, baseIds[8]] + expect(await getActiveKnowledgeBaseReferences(ids)).toEqual( + await Promise.all(ids.map(getActiveKnowledgeBaseReference)) + ) + }) + + it('returns identical ordered tag definitions with one query instead of twenty', async () => { + const select = vi.spyOn(db, 'select') + try { + const expected = new Map( + await Promise.all( + baseIds.map(async (id) => [id, await getDocumentTagDefinitions(id)] as const) + ) + ) + expect(select).toHaveBeenCalledTimes(20) + select.mockClear() + expect(await getDocumentTagDefinitionsByKnowledgeBaseIds(baseIds)).toEqual(expected) + expect(select).toHaveBeenCalledOnce() + expect(expected.get(baseIds.at(-1)!)).toEqual([]) + } finally { + select.mockRestore() + } + }) + + it('does not cache updated references or tag definitions across reads', async () => { + await getActiveKnowledgeBaseReferences(baseIds) + await getDocumentTagDefinitionsByKnowledgeBaseIds(baseIds) + await db + .update(knowledgeBase) + .set({ name: 'Updated reference' }) + .where(eq(knowledgeBase.id, baseIds[0])) + await db + .update(knowledgeBaseTagDefinitions) + .set({ displayName: 'Updated definition' }) + .where( + and( + eq(knowledgeBaseTagDefinitions.knowledgeBaseId, baseIds[0]), + eq(knowledgeBaseTagDefinitions.tagSlot, 'tag1') + ) + ) + const references = await getActiveKnowledgeBaseReferences(baseIds) + const tags = await getDocumentTagDefinitionsByKnowledgeBaseIds(baseIds) + expect(references[0]?.name).toBe('Updated reference') + expect( + tags.get(baseIds[0])?.find((definition) => definition.tagSlot === 'tag1')?.displayName + ).toBe('Updated definition') + }) +}) diff --git a/apps/sim/lib/knowledge/application/documents.test.ts b/apps/sim/lib/knowledge/application/documents.test.ts index 751ea4c7426..4bded55be3c 100644 --- a/apps/sim/lib/knowledge/application/documents.test.ts +++ b/apps/sim/lib/knowledge/application/documents.test.ts @@ -79,6 +79,10 @@ vi.mock('@/lib/knowledge/documents/service', () => ({ vi.mock('@/lib/knowledge/tags/service', () => ({ getDocumentTagDefinitions: mocks.getDocumentTagDefinitions, + getDocumentTagDefinitionsByKnowledgeBaseIds: async (ids: string[]) => + new Map( + await Promise.all(ids.map(async (id) => [id, await mocks.getDocumentTagDefinitions(id)])) + ), })) vi.mock('@/lib/knowledge/orchestration/documents', () => ({ diff --git a/apps/sim/lib/knowledge/application/search.test.ts b/apps/sim/lib/knowledge/application/search.test.ts index 185e4d64760..86bc9e8a76f 100644 --- a/apps/sim/lib/knowledge/application/search.test.ts +++ b/apps/sim/lib/knowledge/application/search.test.ts @@ -13,6 +13,7 @@ const mocks = vi.hoisted(() => ({ requireOrganizationSearch: vi.fn(), resolvePermission: vi.fn(), getKnowledgeBase: vi.fn(), + getKnowledgeBases: vi.fn(), resolveBilling: vi.fn(), checkUsage: vi.fn(), checkActorUsage: vi.fn(), @@ -20,6 +21,7 @@ const mocks = vi.hoisted(() => ({ executeSearch: vi.fn(), getDocumentMetadata: vi.fn(), getTagDefinitions: vi.fn(), + getTagDefinitionsBatch: vi.fn(), recordEmbeddingUsage: vi.fn(), importProvenance: vi.fn(), rerank: vi.fn(), @@ -72,7 +74,7 @@ vi.mock('@/lib/permission-groups/resolve.server', () => ({ })) vi.mock('@/lib/knowledge/service', () => ({ - getActiveKnowledgeBaseReference: mocks.getKnowledgeBase, + getActiveKnowledgeBaseReferences: mocks.getKnowledgeBases, })) vi.mock('@/lib/knowledge/embeddings', () => ({ @@ -87,7 +89,7 @@ vi.mock('@/lib/knowledge/search/queries', () => ({ })) vi.mock('@/lib/knowledge/tags/service', () => ({ - getDocumentTagDefinitions: mocks.getTagDefinitions, + getDocumentTagDefinitionsByKnowledgeBaseIds: mocks.getTagDefinitionsBatch, })) vi.mock('@/lib/knowledge/tags/utils', () => ({ @@ -130,6 +132,13 @@ describe('knowledge search application use case', () => { mocks.resolveWorkspace.mockResolvedValue(workspace) mocks.resolvePermission.mockResolvedValue('read') mocks.getKnowledgeBase.mockResolvedValue(knowledgeBase) + mocks.getKnowledgeBases.mockImplementation((ids: string[]) => + Promise.all(ids.map((id) => mocks.getKnowledgeBase(id))) + ) + mocks.getTagDefinitionsBatch.mockImplementation( + async (ids: string[]) => + new Map(await Promise.all(ids.map(async (id) => [id, await mocks.getTagDefinitions(id)]))) + ) mocks.resolveBilling.mockResolvedValue({ actorUserId: 'user-1', workspaceId: 'workspace-1', @@ -554,6 +563,118 @@ describe('knowledge search application use case', () => { expect(mocks.resolveWorkspace).not.toHaveBeenCalled() expect(mocks.getKnowledgeBase).not.toHaveBeenCalled() + expect(mocks.getKnowledgeBases).not.toHaveBeenCalled() + expect(mocks.getTagDefinitionsBatch).not.toHaveBeenCalled() + }) + + it('loads references and tags once for twenty bases while preserving requested order', async () => { + const ids = Array.from({ length: 20 }, (_, index) => `knowledge-${20 - index}`) + mocks.getKnowledgeBases.mockResolvedValue(ids.map((id) => ({ ...knowledgeBase, id }))) + mocks.getTagDefinitionsBatch.mockResolvedValue(new Map(ids.map((id) => [id, []]))) + + const result = await searchKnowledge.execute({ + principal: { kind: 'session', userId: 'user-1', sessionId: 'session-1' }, + input: { knowledgeBaseIds: ids, query: 'answer', topK: 5 }, + }) + + expect(mocks.getKnowledgeBases).toHaveBeenCalledExactlyOnceWith(ids) + expect(mocks.getTagDefinitionsBatch).toHaveBeenCalledExactlyOnceWith(ids) + expect(result.knowledgeBaseIds).toEqual(ids) + expect(result.knowledgeBaseId).toBe(ids[0]) + expect(result.knowledgeBases.map((base) => base.id)).toEqual(ids) + expect(mocks.executeSearch).toHaveBeenCalledWith( + expect.objectContaining({ knowledgeBaseIds: ids }) + ) + }) + + it('preserves duplicate requested bases in retrieval and the response', async () => { + const ids = ['knowledge-2', 'knowledge-1', 'knowledge-2'] + mocks.getKnowledgeBases.mockResolvedValue(ids.map((id) => ({ ...knowledgeBase, id }))) + + const result = await searchKnowledge.execute({ + principal: { kind: 'session', userId: 'user-1', sessionId: 'session-1' }, + input: { knowledgeBaseIds: ids, query: 'answer', topK: 5 }, + }) + + expect(result.knowledgeBaseIds).toEqual(ids) + expect(mocks.executeSearch).toHaveBeenCalledWith( + expect.objectContaining({ knowledgeBaseIds: ids }) + ) + }) + + it('preserves missing-id order and duplicates in the concealed error before authorization or billing', async () => { + mocks.getKnowledgeBases.mockResolvedValue([null, knowledgeBase, null, null]) + + await expect( + searchKnowledge.execute({ + principal: { kind: 'session', userId: 'user-1', sessionId: 'session-1' }, + input: { + knowledgeBaseIds: ['missing-2', 'knowledge-1', 'missing-1', 'missing-2'], + query: 'answer', + topK: 5, + }, + }) + ).rejects.toMatchObject({ + code: 'not_found', + message: 'Knowledge bases not found or access denied: missing-2, missing-1, missing-2', + }) + expect(mocks.resolvePermission).not.toHaveBeenCalled() + expect(mocks.resolveBilling).not.toHaveBeenCalled() + expect(mocks.executeSearch).not.toHaveBeenCalled() + }) + + it('rejects a batch spanning different canonical workspaces before billing', async () => { + mocks.getKnowledgeBases.mockResolvedValue([ + knowledgeBase, + { ...knowledgeBase, id: 'knowledge-2', workspaceId: 'workspace-2' }, + ]) + + await expect( + searchKnowledge.execute({ + principal: { kind: 'session', userId: 'user-1', sessionId: 'session-1' }, + input: { knowledgeBaseIds: ['knowledge-1', 'knowledge-2'], query: 'answer', topK: 5 }, + }) + ).rejects.toMatchObject({ + code: 'validation', + message: 'Selected knowledge bases must belong to the same workspace', + }) + expect(mocks.resolveBilling).not.toHaveBeenCalled() + expect(mocks.executeSearch).not.toHaveBeenCalled() + }) + + it('reuses the tag filter batch when naming result metadata', async () => { + const ids = ['knowledge-1', 'knowledge-2'] + mocks.getKnowledgeBases.mockResolvedValue(ids.map((id) => ({ ...knowledgeBase, id }))) + mocks.getTagDefinitionsBatch.mockResolvedValue( + new Map( + ids.map((id) => [ + id, + [{ knowledgeBaseId: id, tagSlot: 'tag1', displayName: 'team', fieldType: 'text' }], + ]) + ) + ) + mocks.executeSearch.mockResolvedValue([ + { + id: 'chunk-1', + documentId: 'document-1', + knowledgeBaseId: ids[0], + content: 'answer', + tag1: 'docs', + }, + ]) + + const result = await searchKnowledge.execute({ + principal: { kind: 'session', userId: 'user-1', sessionId: 'session-1' }, + input: { + knowledgeBaseIds: ids, + topK: 5, + tagFilters: [{ tagName: 'team', operator: 'eq', value: 'docs' }], + }, + }) + + expect(mocks.getTagDefinitionsBatch).toHaveBeenCalledExactlyOnceWith(ids) + expect(result.results[0].metadata).toEqual({ team: 'docs' }) + expect(mocks.generateEmbedding).not.toHaveBeenCalled() }) it('rejects multi-knowledge-base tag filters without embedding spend', async () => { diff --git a/apps/sim/lib/knowledge/application/search.ts b/apps/sim/lib/knowledge/application/search.ts index a47c6f7141c..c5d83ca908a 100644 --- a/apps/sim/lib/knowledge/application/search.ts +++ b/apps/sim/lib/knowledge/application/search.ts @@ -49,13 +49,13 @@ import { import { importKnowledgeSearchResultSecretProvenance } from '@/lib/knowledge/secret-provenance' import { type ActiveKnowledgeBaseReference, - getActiveKnowledgeBaseReference, + getActiveKnowledgeBaseReferences, } from '@/lib/knowledge/service' import { type KnowledgeTagNameFilter, resolveKnowledgeTagFilters, } from '@/lib/knowledge/tags/filter-resolution' -import { getDocumentTagDefinitions } from '@/lib/knowledge/tags/service' +import { getDocumentTagDefinitionsByKnowledgeBaseIds } from '@/lib/knowledge/tags/service' import type { DocumentTagDefinition } from '@/lib/knowledge/tags/types' import type { StructuredFilter } from '@/lib/knowledge/types' import { estimateTokenCount } from '@/lib/tokenization/estimators' @@ -189,9 +189,7 @@ async function resolveKnowledgeSearchContext( `topK must be an integer between 1 and ${KNOWLEDGE_SEARCH_COST_POLICY.maxTopK}` ) } - const knowledgeBases = await Promise.all( - input.knowledgeBaseIds.map(getActiveKnowledgeBaseReference) - ) + const knowledgeBases = await getActiveKnowledgeBaseReferences(input.knowledgeBaseIds) const missingIds = input.knowledgeBaseIds.filter((_, index) => { const knowledgeBase = knowledgeBases[index] return !knowledgeBase || (!knowledgeBase.workspaceId && !knowledgeBase.organizationId) @@ -558,18 +556,16 @@ export const searchKnowledge = defineAuthorizedKnowledgeUseCase({ } } - const tagDefinitionEntries = await Promise.all( - knowledgeBaseIds.map(async (knowledgeBaseId) => { - const definitions = - definitionsByKnowledgeBase.get(knowledgeBaseId) ?? - (await getDocumentTagDefinitions(knowledgeBaseId)) - return [ - knowledgeBaseId, - new Map(definitions.map((definition) => [definition.tagSlot, definition.displayName])), - ] as const - }) + if (filters.length === 0) { + definitionsByKnowledgeBase = + await getDocumentTagDefinitionsByKnowledgeBaseIds(knowledgeBaseIds) + } + const tagMaps = new Map( + [...definitionsByKnowledgeBase].map(([knowledgeBaseId, definitions]) => [ + knowledgeBaseId, + new Map(definitions.map((definition) => [definition.tagSlot, definition.displayName])), + ]) ) - const tagMaps = new Map(tagDefinitionEntries) /** * Always read: the provenance snapshot vouches for the name, URL, and tags * a model may see, but the source card's modified time and connector type diff --git a/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts b/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts new file mode 100644 index 00000000000..76e6ef77d8c --- /dev/null +++ b/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts @@ -0,0 +1,162 @@ +/** @vitest-environment node */ +import { + dbChainMockFns, + hasMockCondition, + queueTableRows, + resetDbChainMock, + schemaMock, +} from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' +import { handleTagOnlySearch } from '@/lib/knowledge/search/queries' + +vi.mock('@/lib/knowledge/access/availability', () => ({ + resolveKnowledgeAccessAvailability: async () => ({ memberScoped: true, sourceMirrored: false }), +})) +vi.mock('@/lib/workspaces/permissions/utils', () => ({ checkWorkspaceAccess: vi.fn() })) +vi.mock('@/lib/credentials/managed-oauth', () => ({ resolveManagedOAuthToken: vi.fn() })) +vi.mock('@/lib/core/security/encryption', () => ({ decryptSecret: vi.fn() })) +vi.mock('@/lib/oauth/github-installation', () => ({ + parseGitHubInstallationBinding: vi.fn(), + assertGitHubInstallationActive: vi.fn(), + assertGitHubInstallationRepositoryActive: vi.fn(), +})) + +async function createReaderProvider(hasGitHubReader = true) { + queueTableRows(schemaMock.member, [{ id: 'membership-1' }]) + queueTableRows(schemaMock.user, [ + { + credentialId: 'github-reader', + providerId: hasGitHubReader ? 'github-repositories' : 'gmail', + providerSubjectId: '42', + providerTenantId: null, + }, + ]) + const provider = createKnowledgeAccessProvider( + { kind: 'session', userId: 'reader', sessionId: 'session-1' }, + { organizationId: 'org-1', knowledgeBaseIds: ['index-1'] } + ) + const access = await provider.get() + return { provider, access } +} + +describe('GitHub discovery through the request access provider', () => { + beforeEach(() => { + vi.clearAllMocks() + resetDbChainMock() + }) + + it.each([true, false])( + 'skips discovery for explicit Gmail with GitHub reader present: %s', + async (hasGitHubReader) => { + const { provider, access } = await createReaderProvider(hasGitHubReader) + await provider.getForConnectors(['gmail-source']) + expect( + dbChainMockFns.from.mock.calls.filter(([table]) => table === schemaMock.knowledgeConnector) + ).toHaveLength(hasGitHubReader ? 1 : 0) + dbChainMockFns.from.mockClear() + + queueTableRows(schemaMock.embedding, [ + { + id: 'gmail', + documentId: 'gmail-doc', + connectorId: 'gmail-source', + installationSource: false, + }, + ]) + const hydrated = [{ id: 'gmail', content: 'permitted content' }] + queueTableRows(schemaMock.embedding, hydrated) + + expect( + await handleTagOnlySearch({ + knowledgeBaseIds: ['index-1'], + topK: 1, + access, + accessProvider: provider, + filters: { source: 'gmail' }, + structuredFilters: [ + { tagSlot: 'tag1', fieldType: 'text', operator: 'eq', value: 'release' }, + ], + }) + ).toEqual(hydrated) + expect(dbChainMockFns.from.mock.calls.map(([table]) => table)).toEqual([ + schemaMock.embedding, + schemaMock.embedding, + ]) + } + ) + + it.each([undefined, '', 'github'])( + 'keeps current discovery for classic GitHub with source: %s', + async (source) => { + const { provider, access } = await createReaderProvider() + queueTableRows(schemaMock.embedding, [ + { + id: 'github', + documentId: 'github-doc', + connectorId: 'classic-github', + installationSource: false, + }, + { + id: 'github-second', + documentId: 'github-doc', + connectorId: 'classic-github', + installationSource: false, + }, + ]) + queueTableRows(schemaMock.embedding, [{ id: 'github', content: 'permitted content' }]) + + await handleTagOnlySearch({ + knowledgeBaseIds: ['index-1'], + topK: 1, + access, + accessProvider: provider, + filters: { source }, + structuredFilters: [ + { tagSlot: 'tag1', fieldType: 'text', operator: 'eq', value: 'release' }, + ], + }) + expect( + dbChainMockFns.from.mock.calls.filter(([table]) => table === schemaMock.knowledgeConnector) + ).toHaveLength(1) + expect( + dbChainMockFns.where.mock.calls.some(([condition]) => + hasMockCondition( + condition, + (node) => + node.type === 'inArray' && + node.column === schemaMock.knowledgeConnector.id && + JSON.stringify(node.values) === JSON.stringify(['classic-github']) + ) + ) + ).toBe(true) + } + ) + + it('keeps upload hydration without source discovery', async () => { + const { provider, access } = await createReaderProvider() + dbChainMockFns.from.mockClear() + queueTableRows(schemaMock.embedding, [ + { id: 'upload', documentId: 'upload-doc', connectorId: null, installationSource: false }, + ]) + const hydrated = [{ id: 'upload', content: 'permitted content' }] + queueTableRows(schemaMock.embedding, hydrated) + + expect( + await handleTagOnlySearch({ + knowledgeBaseIds: ['index-1'], + topK: 1, + access, + accessProvider: provider, + filters: { source: 'upload' }, + structuredFilters: [ + { tagSlot: 'tag1', fieldType: 'text', operator: 'eq', value: 'release' }, + ], + }) + ).toEqual(hydrated) + expect(dbChainMockFns.from.mock.calls.map(([table]) => table)).toEqual([ + schemaMock.embedding, + schemaMock.embedding, + ]) + }) +}) diff --git a/apps/sim/lib/knowledge/search/queries.test.ts b/apps/sim/lib/knowledge/search/queries.test.ts index e8edea4491d..49dd48de8c9 100644 --- a/apps/sim/lib/knowledge/search/queries.test.ts +++ b/apps/sim/lib/knowledge/search/queries.test.ts @@ -576,6 +576,77 @@ describe('live repository authorization follows ranked candidates', () => { } ) + it.each(['vector', 'tag-vector', 'tags', 'keyword'] as const)( + '%s skips discovery for an explicit non-GitHub source and retains full hydration', + async (mode) => { + getForConnectors.mockResolvedValue(identity) + queueTableRows(schemaMock.embedding, [ + { ...candidate('gmail', 'gmail-source'), installationSource: false }, + ]) + const hydrated = [{ id: 'gmail', content: 'current permitted content' }] + queueTableRows(schemaMock.embedding, hydrated) + const searchParams = { ...params, filters: { source: 'gmail' } } + const rows = + mode === 'vector' + ? await handleVectorOnlySearch(searchParams) + : mode === 'tag-vector' + ? await handleTagAndVectorSearch(searchParams) + : mode === 'tags' + ? await handleTagOnlySearch(searchParams) + : await executeKeywordSearch({ + ...searchParams, + query: 'release', + queryVector: searchParams.queryVector!, + }) + + expect(rows).toEqual(hydrated) + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith([], undefined) + for (const [condition] of dbChainMockFns.where.mock.calls) { + expect(JSON.stringify(condition)).toContain('gmail') + } + const hydration = JSON.stringify(dbChainMockFns.where.mock.calls[1][0]) + expect(hydration).toContain('acl') + expect(hydration).toContain('knowledgeConnectorMember') + expect(dbChainMockFns.select).toHaveBeenCalledTimes(2) + } + ) + + it.each([undefined, '', 'github'])( + 'retains discovery for classic GitHub when source is %s', + async (source) => { + queueTableRows(schemaMock.embedding, [ + { ...candidate('selected', 'allowed-source'), installationSource: false }, + { ...candidate('second', 'allowed-source'), installationSource: false }, + ]) + queueTableRows(schemaMock.embedding, [{ id: 'selected', content: 'verified result' }]) + + expect(await handleTagOnlySearch({ ...params, filters: { source } })).toEqual([ + { id: 'selected', content: 'verified result' }, + ]) + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith(['allowed-source'], undefined) + expect(JSON.stringify(dbChainMockFns.where.mock.calls[1][0])).toContain('github_read_grant') + } + ) + + it('retains every connector in unfiltered mixed pages', async () => { + queueTableRows(schemaMock.embedding, [ + { ...candidate('gmail', 'gmail-source'), installationSource: false }, + { ...candidate('classic', 'classic-source'), installationSource: false }, + candidate('selected', 'allowed-source'), + candidate('selected-second-chunk', 'allowed-source'), + { ...candidate('upload', 'unused'), connectorId: null, installationSource: false }, + ]) + queueTableRows(schemaMock.embedding, [{ id: 'selected', content: 'verified result' }]) + + expect(await handleTagOnlySearch(params)).toEqual([ + { id: 'selected', content: 'verified result' }, + ]) + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith( + ['gmail-source', 'classic-source', 'allowed-source'], + undefined + ) + }) + it('refills after a denied repository instead of letting its matches consume the result limit', async () => { getForConnectors.mockResolvedValueOnce(identity) queueTableRows(schemaMock.embedding, [candidate('denied', 'revoked-source')]) @@ -612,16 +683,23 @@ describe('live repository authorization follows ranked candidates', () => { expect(getForConnectors).toHaveBeenCalledOnce() }) - it('propagates caller cancellation before content hydration', async () => { - const cancellation = new AbortController() - getForConnectors.mockImplementation(async () => { - cancellation.abort(new Error('Search cancelled')) - return allowed - }) - queueTableRows(schemaMock.embedding, [candidate('selected', 'allowed-source')]) - await expect(handleTagOnlySearch({ ...params, signal: cancellation.signal })).rejects.toThrow( - 'Search cancelled' - ) - expect(dbChainMockFns.select).toHaveBeenCalledOnce() - }) + it.each([undefined, 'gmail'])( + 'propagates caller cancellation before hydration with source %s', + async (source) => { + const cancellation = new AbortController() + getForConnectors.mockImplementation(async () => { + cancellation.abort(new Error('Search cancelled')) + return allowed + }) + queueTableRows(schemaMock.embedding, [candidate('selected', 'allowed-source')]) + await expect( + handleTagOnlySearch({ ...params, filters: { source }, signal: cancellation.signal }) + ).rejects.toThrow('Search cancelled') + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith( + source ? [] : ['allowed-source'], + cancellation.signal + ) + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + } + ) }) diff --git a/apps/sim/lib/knowledge/search/queries.ts b/apps/sim/lib/knowledge/search/queries.ts index dbe5d64735b..cecc89281b1 100644 --- a/apps/sim/lib/knowledge/search/queries.ts +++ b/apps/sim/lib/knowledge/search/queries.ts @@ -454,6 +454,7 @@ const LIVE_SEARCH_BUDGET_MS = 8000 */ async function selectAuthorizedSearchResults(input: { accessProvider: KnowledgeAccessProvider + filters?: WorkspaceSearchFilters signal?: AbortSignal topK: number selectPage: ( @@ -478,11 +479,17 @@ async function selectAuthorizedSearchResults(input: { const candidates = await input.selectPage(pageSize, offset, [...excludedSources]) if (!candidates.length) break scanned += candidates.length - const connectorIds = [ - ...new Set( - candidates.flatMap((candidate) => (candidate.connectorId ? [candidate.connectorId] : [])) - ), - ] + /** Candidate and hydration queries enforce this source filter; connector types are immutable. */ + const connectorIds = + input.filters?.source && input.filters.source !== 'github' + ? [] + : [ + ...new Set( + candidates.flatMap((candidate) => + candidate.connectorId ? [candidate.connectorId] : [] + ) + ), + ] const access = await input.accessProvider.getForConnectors(connectorIds, input.signal) input.signal?.throwIfAborted() const grantedSources = new Set( @@ -578,6 +585,7 @@ export async function handleTagOnlySearch(params: SearchParams): Promise @@ -705,6 +713,7 @@ function selectLiveVectorResults( const conditions = [inArray(embedding.knowledgeBaseId, params.knowledgeBaseIds), ...filters] return selectAuthorizedSearchResults({ accessProvider, + filters: params.filters, signal: params.signal, topK: params.topK, selectPage: (limit, offset, excludedSources) => @@ -818,6 +827,7 @@ export async function executeKeywordSearch(params: KeywordSearchParams): Promise ] return selectAuthorizedSearchResults({ accessProvider: params.accessProvider, + filters: params.filters, signal: params.signal, topK, selectPage: (limit, offset, excludedSources) => diff --git a/apps/sim/lib/knowledge/service.test.ts b/apps/sim/lib/knowledge/service.test.ts index 8d05b403c38..b27489f6e9e 100644 --- a/apps/sim/lib/knowledge/service.test.ts +++ b/apps/sim/lib/knowledge/service.test.ts @@ -6,6 +6,7 @@ import { hasMockCondition, permissionsMock, permissionsMockFns, + queueTableRows, resetDbChainMock, schemaMock, } from '@sim/testing' @@ -31,6 +32,7 @@ vi.mock('@/lib/billing/storage', () => ({ import { findActiveKnowledgeBasesByExactName, getActiveKnowledgeBaseReference, + getActiveKnowledgeBaseReferences, getKnowledgeBaseById, getWorkspaceKnowledgeBases, KnowledgeBasePermissionError, @@ -81,6 +83,71 @@ describe('knowledge base references', () => { await expect(getActiveKnowledgeBaseReference('missing')).resolves.toBeNull() }) + it('loads twenty references in one query without changing their projection or input order', async () => { + const ids = Array.from({ length: 20 }, (_, index) => `kb-${index}`) + const references = ids.map((id) => ({ id, chunkingConfig: { maxSize: 512 } })) + queueTableRows(schemaMock.knowledgeBase, [...references].reverse()) + + await expect(getActiveKnowledgeBaseReferences(ids)).resolves.toEqual(references) + + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + expect(dbChainMockFns.from).toHaveBeenCalledOnce() + const projection = dbChainMockFns.select.mock.calls[0][0] + const [condition] = dbChainMockFns.where.mock.calls[0] + expect( + hasMockCondition( + condition, + (node) => node.type === 'isNull' && node.column === schemaMock.knowledgeBase.deletedAt + ) + ).toBe(true) + expect( + hasMockCondition( + condition, + (node) => + node.type === 'inArray' && + node.column === schemaMock.knowledgeBase.id && + JSON.stringify(node.values) === JSON.stringify(ids) + ) + ).toBe(true) + expect(dbChainMockFns.leftJoin).not.toHaveBeenCalled() + expect(dbChainMockFns.groupBy).not.toHaveBeenCalled() + + await getActiveKnowledgeBaseReference(ids[0]) + expect(dbChainMockFns.select.mock.calls[1][0]).toEqual(projection) + }) + + it('preserves duplicate and absent reference positions without querying duplicate ids', async () => { + const reference = { id: 'kb-1', chunkingConfig: {} } + queueTableRows(schemaMock.knowledgeBase, [reference]) + + await expect( + getActiveKnowledgeBaseReferences(['missing', 'kb-1', 'missing', 'kb-1']) + ).resolves.toEqual([null, reference, null, reference]) + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + expect( + hasMockCondition( + dbChainMockFns.where.mock.calls[0][0], + (node) => + node.type === 'inArray' && + JSON.stringify(node.values) === JSON.stringify(['missing', 'kb-1']) + ) + ).toBe(true) + }) + + it('does not query an empty reference batch and retains the singleton query shape', async () => { + await expect(getActiveKnowledgeBaseReferences([])).resolves.toEqual([]) + expect(dbChainMockFns.select).not.toHaveBeenCalled() + await expect(getActiveKnowledgeBaseReferences(['missing'])).resolves.toEqual([null]) + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + expect(dbChainMockFns.limit).toHaveBeenCalledWith(1) + }) + + it('propagates reference batch database failures', async () => { + const failure = new Error('reference database unavailable') + dbChainMockFns.where.mockRejectedValueOnce(failure) + await expect(getActiveKnowledgeBaseReferences(['kb-1', 'kb-2'])).rejects.toBe(failure) + }) + it('preserves aggregate counts for knowledge-base detail consumers', async () => { dbChainMockFns.limit.mockResolvedValueOnce([ { diff --git a/apps/sim/lib/knowledge/service.ts b/apps/sim/lib/knowledge/service.ts index 146f3c466ab..1bd2285032b 100644 --- a/apps/sim/lib/knowledge/service.ts +++ b/apps/sim/lib/knowledge/service.ts @@ -875,6 +875,23 @@ export type ActiveKnowledgeBaseReference = Omit< 'tokenCount' | 'docCount' | 'connectorTypes' | 'hasPermissionScopedConnector' > +const ACTIVE_KNOWLEDGE_BASE_REFERENCE_FIELDS = { + id: knowledgeBase.id, + userId: knowledgeBase.userId, + name: knowledgeBase.name, + isSearchIndex: knowledgeBase.isSearchIndex, + description: knowledgeBase.description, + embeddingModel: knowledgeBase.embeddingModel, + embeddingDimension: knowledgeBase.embeddingDimension, + chunkingConfig: knowledgeBase.chunkingConfig, + createdAt: knowledgeBase.createdAt, + updatedAt: knowledgeBase.updatedAt, + deletedAt: knowledgeBase.deletedAt, + workspaceId: knowledgeBase.workspaceId, + organizationId: knowledgeBase.organizationId, + folderId: knowledgeBase.folderId, +} + /** * Canonical identity and configuration for application authorization and retrieval. * Reading a reference never scans the base's documents to compute display counts. @@ -883,22 +900,7 @@ export async function getActiveKnowledgeBaseReference( knowledgeBaseId: string ): Promise { const [row] = await db - .select({ - id: knowledgeBase.id, - userId: knowledgeBase.userId, - name: knowledgeBase.name, - isSearchIndex: knowledgeBase.isSearchIndex, - description: knowledgeBase.description, - embeddingModel: knowledgeBase.embeddingModel, - embeddingDimension: knowledgeBase.embeddingDimension, - chunkingConfig: knowledgeBase.chunkingConfig, - createdAt: knowledgeBase.createdAt, - updatedAt: knowledgeBase.updatedAt, - deletedAt: knowledgeBase.deletedAt, - workspaceId: knowledgeBase.workspaceId, - organizationId: knowledgeBase.organizationId, - folderId: knowledgeBase.folderId, - }) + .select(ACTIVE_KNOWLEDGE_BASE_REFERENCE_FIELDS) .from(knowledgeBase) .where(and(eq(knowledgeBase.id, knowledgeBaseId), isNull(knowledgeBase.deletedAt))) .limit(1) @@ -906,6 +908,29 @@ export async function getActiveKnowledgeBaseReference( return row ? { ...row, chunkingConfig: row.chunkingConfig as ChunkingConfig } : null } +/** Loads active references in one statement while preserving requested order and missing entries. */ +export async function getActiveKnowledgeBaseReferences( + knowledgeBaseIds: readonly string[] +): Promise> { + if (knowledgeBaseIds.length === 0) return [] + if (knowledgeBaseIds.length === 1) + return [await getActiveKnowledgeBaseReference(knowledgeBaseIds[0])] + + const rows = await db + .select(ACTIVE_KNOWLEDGE_BASE_REFERENCE_FIELDS) + .from(knowledgeBase) + .where( + and( + inArray(knowledgeBase.id, [...new Set(knowledgeBaseIds)]), + isNull(knowledgeBase.deletedAt) + ) + ) + const byId = new Map( + rows.map((row) => [row.id, { ...row, chunkingConfig: row.chunkingConfig as ChunkingConfig }]) + ) + return knowledgeBaseIds.map((id) => byId.get(id) ?? null) +} + /** * Get a single knowledge base by ID */ diff --git a/apps/sim/lib/knowledge/tags/filter-resolution.test.ts b/apps/sim/lib/knowledge/tags/filter-resolution.test.ts index c1a4322cf57..7a88bfc8817 100644 --- a/apps/sim/lib/knowledge/tags/filter-resolution.test.ts +++ b/apps/sim/lib/knowledge/tags/filter-resolution.test.ts @@ -3,12 +3,13 @@ */ import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetDocumentTagDefinitions } = vi.hoisted(() => ({ +const { mockGetDocumentTagDefinitions, mockGetDocumentTagDefinitionsBatch } = vi.hoisted(() => ({ mockGetDocumentTagDefinitions: vi.fn(), + mockGetDocumentTagDefinitionsBatch: vi.fn(), })) vi.mock('@/lib/knowledge/tags/service', () => ({ - getDocumentTagDefinitions: mockGetDocumentTagDefinitions, + getDocumentTagDefinitionsByKnowledgeBaseIds: mockGetDocumentTagDefinitionsBatch, })) import { @@ -38,6 +39,12 @@ function definition( describe('resolveKnowledgeTagFilters', () => { beforeEach(() => { vi.clearAllMocks() + mockGetDocumentTagDefinitionsBatch.mockImplementation( + async (ids: string[]) => + new Map( + await Promise.all(ids.map(async (id) => [id, await mockGetDocumentTagDefinitions(id)])) + ) + ) }) it('resolves a display name to the slot it is stored in', async () => { diff --git a/apps/sim/lib/knowledge/tags/filter-resolution.ts b/apps/sim/lib/knowledge/tags/filter-resolution.ts index 57b4bde8854..c374105b284 100644 --- a/apps/sim/lib/knowledge/tags/filter-resolution.ts +++ b/apps/sim/lib/knowledge/tags/filter-resolution.ts @@ -2,7 +2,7 @@ import { KNOWLEDGE_TAG_FILTER_OPERATORS_BY_FIELD_TYPE } from '@/lib/api/contract import { OrchestrationError } from '@/lib/core/orchestration/types' import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import type { TagFilterCondition } from '@/lib/knowledge/documents/tag-filter' -import { getDocumentTagDefinitions } from '@/lib/knowledge/tags/service' +import { getDocumentTagDefinitionsByKnowledgeBaseIds } from '@/lib/knowledge/tags/service' import type { DocumentTagDefinition } from '@/lib/knowledge/tags/types' import { buildUndefinedTagsError, validateTagValue } from '@/lib/knowledge/tags/utils' import type { StructuredFilter } from '@/lib/knowledge/types' @@ -72,15 +72,11 @@ export async function resolveKnowledgeTagFilters( filters: KnowledgeTagNameFilter[], knowledgeBaseIds: string[] ): Promise { - const definitionEntries = await Promise.all( - knowledgeBaseIds.map( - async (knowledgeBaseId) => - [knowledgeBaseId, await getDocumentTagDefinitions(knowledgeBaseId)] as const - ) - ) - const definitionsByKnowledgeBase = new Map(definitionEntries) + const definitionsByKnowledgeBase = + await getDocumentTagDefinitionsByKnowledgeBaseIds(knowledgeBaseIds) const sharedDefinitions = new Map() - for (const [, definitions] of definitionEntries) { + for (const knowledgeBaseId of knowledgeBaseIds) { + const definitions = definitionsByKnowledgeBase.get(knowledgeBaseId)! const currentByName = new Map( definitions.map((definition) => [ definition.displayName, diff --git a/apps/sim/lib/knowledge/tags/service.test.ts b/apps/sim/lib/knowledge/tags/service.test.ts index 2dc314fd369..92e8c31f515 100644 --- a/apps/sim/lib/knowledge/tags/service.test.ts +++ b/apps/sim/lib/knowledge/tags/service.test.ts @@ -3,7 +3,7 @@ */ import { knowledgeBaseTagDefinitions } from '@sim/db/schema' -import { dbChainMockFns, queueTableRows, resetDbChainMock } from '@sim/testing' +import { dbChainMockFns, hasMockCondition, queueTableRows, resetDbChainMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('@sim/utils/id', () => ({ @@ -14,6 +14,8 @@ vi.mock('@sim/utils/id', () => ({ import { createOrUpdateTagDefinitionsBulk, createTagDefinition, + getDocumentTagDefinitions, + getDocumentTagDefinitionsByKnowledgeBaseIds, updateTagDefinition, } from '@/lib/knowledge/tags/service' @@ -32,6 +34,83 @@ function existingDefinition(overrides: Record) { } } +describe('getDocumentTagDefinitionsByKnowledgeBaseIds', () => { + beforeEach(() => { + vi.clearAllMocks() + resetDbChainMock() + }) + + it('loads twenty bases in one query and retains each base in requested order', async () => { + const ids = Array.from({ length: 20 }, (_, index) => `kb-${index}`) + queueTableRows(knowledgeBaseTagDefinitions, [ + existingDefinition({ knowledgeBaseId: 'kb-2', tagSlot: 'number1', fieldType: 'number' }), + existingDefinition({ knowledgeBaseId: 'kb-1', tagSlot: 'tag1' }), + existingDefinition({ knowledgeBaseId: 'kb-2', tagSlot: 'tag1' }), + ]) + + const result = await getDocumentTagDefinitionsByKnowledgeBaseIds(ids) + + expect([...result.keys()]).toEqual(ids) + expect(result.get('kb-0')).toEqual([]) + expect(result.get('kb-1')?.map((definition) => definition.tagSlot)).toEqual(['tag1']) + expect(result.get('kb-2')?.map((definition) => definition.tagSlot)).toEqual(['number1', 'tag1']) + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + expect(dbChainMockFns.orderBy).toHaveBeenCalledWith(knowledgeBaseTagDefinitions.tagSlot) + expect( + hasMockCondition( + dbChainMockFns.where.mock.calls[0][0], + (node) => + node.type === 'inArray' && + node.column === knowledgeBaseTagDefinitions.knowledgeBaseId && + JSON.stringify(node.values) === JSON.stringify(ids) + ) + ).toBe(true) + const projection = dbChainMockFns.select.mock.calls[0][0] + await getDocumentTagDefinitions('kb-0') + expect(dbChainMockFns.select.mock.calls[1][0]).toEqual(projection) + }) + + it('keeps empty bases and deduplicates requested ids', async () => { + const result = await getDocumentTagDefinitionsByKnowledgeBaseIds(['kb-2', 'kb-1', 'kb-2']) + expect([...result]).toEqual([ + ['kb-2', []], + ['kb-1', []], + ]) + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + expect( + hasMockCondition( + dbChainMockFns.where.mock.calls[0][0], + (node) => + node.type === 'inArray' && + JSON.stringify(node.values) === JSON.stringify(['kb-2', 'kb-1']) + ) + ).toBe(true) + }) + + it('skips an empty batch and preserves the singleton equality predicate', async () => { + expect(await getDocumentTagDefinitionsByKnowledgeBaseIds([])).toEqual(new Map()) + expect(dbChainMockFns.select).not.toHaveBeenCalled() + expect(await getDocumentTagDefinitionsByKnowledgeBaseIds(['kb-1'])).toEqual( + new Map([['kb-1', []]]) + ) + expect(dbChainMockFns.select).toHaveBeenCalledOnce() + expect( + hasMockCondition( + dbChainMockFns.where.mock.calls[0][0], + (node) => node.type === 'eq' && node.right === 'kb-1' + ) + ).toBe(true) + }) + + it('propagates batch database failures', async () => { + const failure = new Error('tag database unavailable') + dbChainMockFns.orderBy.mockRejectedValueOnce(failure) + await expect(getDocumentTagDefinitionsByKnowledgeBaseIds(['kb-1', 'kb-2'])).rejects.toBe( + failure + ) + }) +}) + describe('createOrUpdateTagDefinitionsBulk', () => { beforeEach(() => { vi.clearAllMocks() diff --git a/apps/sim/lib/knowledge/tags/service.ts b/apps/sim/lib/knowledge/tags/service.ts index 8f837de9ccb..7a599fea365 100644 --- a/apps/sim/lib/knowledge/tags/service.ts +++ b/apps/sim/lib/knowledge/tags/service.ts @@ -9,7 +9,7 @@ import { import { createLogger } from '@sim/logger' import { getErrorMessage } from '@sim/utils/errors' import { generateId } from '@sim/utils/id' -import { and, eq, isNotNull, isNull, or, sql } from 'drizzle-orm' +import { and, eq, inArray, isNotNull, isNull, or, sql } from 'drizzle-orm' import { OrchestrationError } from '@/lib/core/orchestration/types' import type { DbOrTx, DbTransaction } from '@/lib/db/types' import { @@ -201,23 +201,23 @@ export async function getNextAvailableSlot( return null // All slots for this field type are used } -/** - * Get all tag definitions for a knowledge base - */ +const DOCUMENT_TAG_DEFINITION_FIELDS = { + id: knowledgeBaseTagDefinitions.id, + knowledgeBaseId: knowledgeBaseTagDefinitions.knowledgeBaseId, + tagSlot: knowledgeBaseTagDefinitions.tagSlot, + displayName: knowledgeBaseTagDefinitions.displayName, + fieldType: knowledgeBaseTagDefinitions.fieldType, + createdAt: knowledgeBaseTagDefinitions.createdAt, + updatedAt: knowledgeBaseTagDefinitions.updatedAt, +} + +/** Get all tag definitions for a knowledge base. */ export async function getDocumentTagDefinitions( knowledgeBaseId: string, txDb?: DbOrTx ): Promise { const definitions = await (txDb ?? db) - .select({ - id: knowledgeBaseTagDefinitions.id, - knowledgeBaseId: knowledgeBaseTagDefinitions.knowledgeBaseId, - tagSlot: knowledgeBaseTagDefinitions.tagSlot, - displayName: knowledgeBaseTagDefinitions.displayName, - fieldType: knowledgeBaseTagDefinitions.fieldType, - createdAt: knowledgeBaseTagDefinitions.createdAt, - updatedAt: knowledgeBaseTagDefinitions.updatedAt, - }) + .select(DOCUMENT_TAG_DEFINITION_FIELDS) .from(knowledgeBaseTagDefinitions) .where(eq(knowledgeBaseTagDefinitions.knowledgeBaseId, knowledgeBaseId)) .orderBy(knowledgeBaseTagDefinitions.tagSlot) @@ -228,6 +228,35 @@ export async function getDocumentTagDefinitions( })) } +/** Loads each requested base's slot-ordered definitions in one statement, including empty bases. */ +export async function getDocumentTagDefinitionsByKnowledgeBaseIds( + knowledgeBaseIds: readonly string[] +): Promise> { + const definitionsByKnowledgeBase = new Map( + knowledgeBaseIds.map((id) => [id, []]) + ) + if (definitionsByKnowledgeBase.size === 0) return definitionsByKnowledgeBase + if (definitionsByKnowledgeBase.size === 1) { + const id = knowledgeBaseIds[0] + definitionsByKnowledgeBase.set(id, await getDocumentTagDefinitions(id)) + return definitionsByKnowledgeBase + } + const definitions = await db + .select(DOCUMENT_TAG_DEFINITION_FIELDS) + .from(knowledgeBaseTagDefinitions) + .where( + inArray(knowledgeBaseTagDefinitions.knowledgeBaseId, [...definitionsByKnowledgeBase.keys()]) + ) + .orderBy(knowledgeBaseTagDefinitions.tagSlot) + for (const definition of definitions) { + definitionsByKnowledgeBase.get(definition.knowledgeBaseId)!.push({ + ...definition, + tagSlot: definition.tagSlot as string, + }) + } + return definitionsByKnowledgeBase +} + /** * Get all tag definitions for a knowledge base (alias for compatibility) */ From 3c735d21a51fd0d8bf2f4eae4b229fc86884c218 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 03:37:08 -0700 Subject: [PATCH 5/8] fix(search): tighten Google sync and invitation recovery (#7729) --- apps/docs/content/docs/search/gmail.mdx | 28 ++-- .../content/docs/search/google-calendar.mdx | 21 +-- .../docs/content/docs/search/google-drive.mdx | 8 +- .../search/google-domain-delegation.png | Bin 126240 -> 0 bytes apps/sim/app/invite/[id]/invite.test.tsx | 98 ++++++++++++++ apps/sim/app/invite/[id]/invite.tsx | 20 ++- apps/sim/connectors/gmail/gmail.test.ts | 124 +++++++++++++++++- apps/sim/connectors/gmail/gmail.ts | 22 +--- .../queries/kb/connectors-cache.test.tsx | 122 +++++++++++++++++ apps/sim/hooks/queries/kb/connectors.test.ts | 11 +- apps/sim/hooks/queries/kb/connectors.ts | 13 +- .../selectors/server/providers/google.test.ts | 22 ++++ .../lib/selectors/server/providers/google.ts | 13 +- 13 files changed, 434 insertions(+), 68 deletions(-) delete mode 100644 apps/docs/public/static/search/google-domain-delegation.png diff --git a/apps/docs/content/docs/search/gmail.mdx b/apps/docs/content/docs/search/gmail.mdx index 8945c941261..b4ce9e2e53f 100644 --- a/apps/docs/content/docs/search/gmail.mdx +++ b/apps/docs/content/docs/search/gmail.mdx @@ -36,7 +36,7 @@ Open **Settings → Sources** and turn on **Gmail**. This allows personal connec ### Connect your account -Open **Integrations** and select **Connect** beside Gmail. Authorize the Google account matching your verified Sim email. The first connection creates the default sync configuration: the last 6 months across all labels, excluding Promotions, Social, Spam, and Trash. +Join the Sim organization, then open **Integrations** and select **Connect** beside Gmail. Authorize the Google account matching your verified Sim email. The first connection creates the default sync configuration: the last 6 months across all labels, excluding Promotions, Social, Spam, and Trash. Return to Integrations to see indexing status and your searchable document count. @@ -52,6 +52,8 @@ Configurations are additive: a narrower one does not restrict an existing broade +Admins can request member connections from **Manage → Accounts → Request connections**. These requests do not invite recipients to the Sim organization. See [Connect your account](/search/connect-your-account) for the shared connection and recovery steps. + ## Set up a central service account Open **Settings → Sources**, enable **Gmail**, and select **Manage → Advanced → Add sync configuration**. If personal connections are disabled for your organization, select **Add source** from the provider page instead. @@ -100,16 +102,6 @@ Teammates join the Sim organization with their matching verified primary email. -## Connect your account - -These steps apply to **Member accounts**. A central service-account source does not require a personal Gmail connection. - -1. Join the Sim organization and verify your Sim email address. Open **Integrations** and click **Connect** beside Gmail. -2. Complete the connection in the tab that opens. Choose the Google account whose verified email matches your Sim email, and grant the requested permissions. -3. Return to Integrations. The source shows its indexing status and the number of documents you can search. - -Teammates follow these same steps after joining the organization. Once an admin allows Gmail, the first connection can create its source with default filters. Admins can edit those filters afterward or request connections from **Manage → Accounts → Request connections**. A connection request does not invite the recipient to the Sim organization. - ## Source options An admin opens **Settings → Sources** and selects **Manage** beside **Gmail** to open its configuration list. Each row shows **Member accounts** or **Service account** beside its sync status. Open a configuration's **Settings** tab to edit its filters, then select **Save**. Filters apply separately to each mailbox in the source. **Documents** shows indexed threads and **Sync history** shows recent runs. @@ -121,11 +113,11 @@ An admin opens **Settings → Sources** and selects **Manage** beside **Gmail** | Labels | Optional comma-separated names or system IDs, such as `Engineering, INBOX`. A thread matching any listed label is included. Leave empty for all labels. Custom IDs such as `Label_7` belong to one mailbox and cannot be used for member or central setup. | | Directory administrator email | Required for central indexing. An active Workspace administrator who can read Directory users; this does not limit the crawl to the administrator's mailbox. | | Users | Central indexing only. Optional primary Workspace email addresses (up to 100); blank includes all active users in the customer. This selects which mailboxes to crawl. Each mailbox remains searchable only by its owner. | -| Date Range | Last 6 months by default for Search sources. Choose the last 7, 30, or 90 days, a year, or all time. A knowledge-base connector outside Search defaults to all time. | +| Date Range | Last 6 months (180 days) by default. Other options are rolling windows of 7, 30, or 90 days, 1 year (365 days), or all time. | | Exclude Promotions / Exclude Social | Both enabled by default. Choose **No** to include either category. | | Search Filter | Optional [Gmail query](https://developers.google.com/workspace/gmail/api/guides/filtering), such as `from:team@example.com subject:release`. This filters what is indexed; it is not a Sim Search query. Member-account sources with a search filter relist the mailbox on every sync instead of using Gmail's change history. | -In the add-source form, **More options** contains optional **Metadata tags**. Sync frequency and the general knowledge-base **Max Threads** setting are hidden in Search. +In the add-source form, **More options** also contains optional **Metadata tags**. ## What gets indexed @@ -137,13 +129,9 @@ Search schedules syncs hourly. The first sync lists every thread in scope and ca **Member accounts:** later syncs use each mailbox's Gmail change history, unless the configuration has a search filter. A full relisting runs about weekly, or sooner if Gmail no longer retains the saved history. -**Service account:** each sync revisits the selected active mailboxes and resumes unfinished listings. It does not reuse one mailbox's history cursor across the company. Only new or changed threads need their bodies fetched. Failed mailbox reads leave the crawl incomplete; they are not treated as an empty mailbox for deletion reconciliation. - -Updates, removals, and access refresh in the background, rather than being checked live for each search. - -An empty mailbox or filters with no matching threads complete normally with zero documents. +**Service account:** each sync revisits the selected active mailboxes and resumes unfinished listings. A failed mailbox read leaves the crawl incomplete; it does not cause existing indexed mail to be deleted from Search. -Threads that exceed indexing size limits are skipped and reconsidered when the thread changes. +Updates, removals, and access refresh in the background. Empty mailboxes and filters with no matches complete normally with zero documents. Threads exceeding indexing size limits are skipped and reconsidered when they change. ## Troubleshooting @@ -155,7 +143,7 @@ Threads that exceed indexing size limits are skipped and reconsidered when the t | Reconnect | Click **Reconnect** and authorize the same account again. | | Unavailable or needs admin attention | Ask your Sim admin to check source status and the deployment's Google OAuth configuration. | | Directory or delegation error | Check both central crawl scopes, the service-account key, and the Directory administrator's user-read privileges. A normal OAuth account cannot replace the central service account. | -| Gmail access fails for a selected user | Verify Gmail is enabled for that primary Workspace account and delegation is authorized. Narrow **Users** to accounts with Gmail enabled. Aliases and external accounts cannot be selected. | +| Gmail access fails for a selected user | Verify delegation is authorized and [Gmail is enabled](https://knowledge.workspace.google.com/admin/gmail/control-gmail-access-for-your-organizations-users) for that primary Workspace account. Set **Users** to accounts with Gmail enabled; leaving it blank includes all active users and can stop sync on a service-access error. Aliases and external accounts cannot be selected. | | A central source indexes mail but a teammate sees no results | Confirm their verified Sim email is the mailbox's primary email and they belong to the Sim organization. Administrators do not receive other people's mailbox access. | ## Self-hosted operator setup diff --git a/apps/docs/content/docs/search/google-calendar.mdx b/apps/docs/content/docs/search/google-calendar.mdx index 5435e41ebd8..37f427a369e 100644 --- a/apps/docs/content/docs/search/google-calendar.mdx +++ b/apps/docs/content/docs/search/google-calendar.mdx @@ -29,7 +29,7 @@ These are alternative setup paths. When only a central Calendar source is config ### Allow and connect Google Calendar -An admin opens **Settings → Sources** and turns on **Google Calendar**. Then each person opens **Integrations**, selects **Connect** beside Google Calendar, and authorizes their matching Google account. The first connection creates the default member-account sync configuration. +An admin opens **Settings → Sources** and turns on **Google Calendar**. Each person joins the Sim organization, opens **Integrations**, selects **Connect** beside Google Calendar, and authorizes the Google account matching their verified Sim email. The first connection creates the default member-account sync configuration. Return to Integrations to see indexing status and your searchable document count. @@ -50,6 +50,8 @@ The default date range covers the previous and next 30 days. Save any changes to +Admins can request member connections from **Manage → Accounts → Request connections**. These requests do not grant organization membership. Connecting Gmail or Drive does not replace the Calendar connection. See [Connect your account](/search/connect-your-account) for the shared connection and recovery steps. + `primary` means the connected or impersonated person's main calendar. A calendar selected from the list is a specific calendar ID, even when it is your main calendar. That same ID applies to every selected user, and only users with access to it can search its events. @@ -102,16 +104,6 @@ Sim verifies Directory access and selected users, then probes one selected user' -## Connect your account - -These steps apply to **Member accounts**. When only a central Calendar source is configured, teammates use Search or Home directly and are not offered a personal Calendar connection for that source. - -1. Join the Sim organization and verify your Sim email. Open **Integrations** and click **Connect** beside Google Calendar. -2. In the connection tab, choose the Google account whose verified email matches your Sim email. Grant the requested permissions. -3. Return to Integrations to see indexing status and your searchable document count. - -Teammates repeat only these connection steps after joining the organization. They do not need to configure the source. An admin can send connection requests from **Settings → Sources**: select **Manage** beside **Google Calendar**, then **Accounts → Request connections**. These requests do not grant organization membership. Connecting Gmail or Google Drive does not replace the Calendar connection. - ## Source options An admin opens **Settings → Sources** and selects **Manage** beside **Google Calendar** to open its configuration list. Each row shows **Member accounts** or **Service account** beside its sync status. Open a configuration's **Settings** tab to edit its filters, then select **Save**. **Documents** shows indexed events and **Sync history** shows recent runs. @@ -127,13 +119,13 @@ An admin opens **Settings → Sources** and selects **Manage** beside **Google C | Search Query | Optional text filter applied by Google to event titles, descriptions, locations, and organizer or attendee names and emails. Leave empty to include all matching events in the date range. | | Include Attendees | **Yes** by default. **No** omits organizer and attendee identity fields and keeps the attendee count. It does not redact names written into titles or descriptions. | -In the add-source form, **More options** contains optional **Metadata tags**. Search hides sync frequency and the general knowledge-base **Max Events** setting. +In the add-source form, **More options** also contains optional **Metadata tags**. ## What gets indexed -Sim indexes event titles, descriptions, times, locations, and the selected attendee information. All-day events and individual occurrences of recurring meetings are supported. An invitation you declined stays searchable and is marked `Response: declined`. Results link back to Google Calendar. +Sim indexes event titles, descriptions, times, locations, and the selected attendee information. All-day events and individual occurrences of recurring meetings are supported. Declined invitations returned by Google stay searchable and are marked `Response: declined`; hidden invitations are not requested. Results link back to Google Calendar. -Cancelled events, attachment contents, meeting recordings, and transcripts are not indexed. Status entries such as working location, out of office, focus time, and birthdays, and automatically generated reservation events from Gmail are not indexed. A shared calendar where you can see only free or busy times contributes nothing, since those blocks have no title or description. Events outside the selected date window are excluded. Private event details that Google withholds are not available in Search; see [Google's calendar sharing rules](https://developers.google.com/workspace/calendar/api/concepts/sharing). +Cancelled events, attachment contents, meeting recordings, and transcripts are not indexed. Status entries such as working location, out of office, focus time, and birthdays, and automatically generated reservation events from Gmail are not indexed. Events Google returns only as free/busy blocks, without searchable details, are not indexed. Events outside the selected date window are excluded. Private event details that Google withholds are not available in Search; see [Google's calendar sharing rules](https://developers.google.com/workspace/calendar/api/concepts/sharing). Search schedules syncs hourly. Event edits, cancellations, access changes, inactive or removed users, and events moving outside the date window are reconciled during completed background syncs. Central crawls page through each selected user and resume unfinished work before removing documents no longer listed. Authorization, quota, and provider failures stop the sync rather than treating unread calendars as empty. The first sync may take longer, and results appear as indexing progresses; Search is not a live Calendar read. @@ -148,6 +140,7 @@ Search schedules syncs hourly. Event edits, cancellations, access changes, inact | Reconnect | Click **Reconnect** and complete Google authorization again. Allow pop-ups if the connection tab does not open. | | Unavailable or needs admin attention | Ask your Sim admin to check source status and the deployment's Google OAuth configuration. | | Service-account authorization or Directory error | Confirm both delegated scopes, enabled APIs, and the Directory administrator's user-read privilege. Check whether delegation still awaits approval or propagation. | +| Calendar is disabled for a selected user | An active Workspace user may have Calendar turned off. [Enable Calendar](https://knowledge.workspace.google.com/admin/users/access/turn-calendar-on-or-off-for-users) for them, or set **Users** to accounts with Calendar enabled. Leaving **Users** blank includes all active users and can stop sync on a service-access error. | | User not found or inactive | Use an active primary email in the same Workspace customer. Aliases, external or guest accounts, suspended users, and archived users cannot be selected. | | A central source has no results for a teammate | Confirm their primary Workspace email matches their verified Sim email, they belong to the Sim organization, and they are included in **Users**. Check calendar IDs and **Sync history**. | diff --git a/apps/docs/content/docs/search/google-drive.mdx b/apps/docs/content/docs/search/google-drive.mdx index 8cde905b3e9..52ecfc4864b 100644 --- a/apps/docs/content/docs/search/google-drive.mdx +++ b/apps/docs/content/docs/search/google-drive.mdx @@ -21,7 +21,7 @@ Admin setup uses your organization's **Settings → Sources** page. Teammates co These are alternative setup paths. When only a central Drive source is configured, Integrations does not offer a personal Drive **Connect** action. Teammates use Search or Home directly. Existing member-account sources keep their connection actions. - A central crawl reads each selected employee's Drive through domain-wide delegation, including private My Drive files and shared-drive files they can access. Leave **Users** blank to include all active users in your Google Workspace customer, including secondary domains. Files keep their original user and group permissions; indexing a private file does not make it visible to other employees. + A central crawl includes each selected employee's private My Drive files and shared-drive files they can access. Files keep their original user and group permissions; indexing a private file does not make it visible to other employees. ## Connect member accounts @@ -38,7 +38,7 @@ An organization admin opens **Settings → Sources** and turns on **Google Drive ### Connect your account -Open **Integrations** in the main sidebar and select **Connect** beside Google Drive. Use the Google account matching your verified Sim email. The first personal connection can create a source with default filters. Teammates follow the same [connection steps](/search/connect-your-account). +Join the Sim organization, then open **Integrations** and select **Connect** beside Google Drive. Use the Google account matching your verified Sim email. The first personal connection can create a source with default filters. Return to Integrations to see indexing status and your searchable document count. @@ -52,6 +52,8 @@ Keep **Sync documents with → Connected members** unless a dedicated account sh +Admins can request member connections from **Manage → Accounts → Request connections**. These requests do not grant organization membership. See [Connect your account](/search/connect-your-account) for the shared connection and recovery steps. + ## Set up a central service account Open **Settings → Sources** and turn on **Google Drive**. Select **Manage → Advanced → Add sync configuration** to open the central service-account form directly. If personal connections are disabled for your organization, select **Add source** from the provider page instead. Teammates do not need a personal Drive connection for this source. @@ -80,8 +82,6 @@ Open the service account's **Keys** tab and choose **Add key → Create new key In the service account's **Details**, expand **Advanced settings** and copy its numeric **Client ID**. Sign in to the [Workspace Admin Console](https://admin.google.com/ac/owl/domainwidedelegation) as a super administrator. Open **Security → Access and data control → API controls → Manage Domain Wide Delegation → Add new**. -Google Workspace Admin Console Add a new client ID dialog with Client ID and OAuth scopes fields - Paste that Client ID into **Client ID**, then enter these exact scopes as a comma-separated list under **OAuth scopes**: ```text diff --git a/apps/docs/public/static/search/google-domain-delegation.png b/apps/docs/public/static/search/google-domain-delegation.png deleted file mode 100644 index b68680d0b82de247f34046162221cc2424164a83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126240 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%0D(z}S zI_J+w%`8}yI*zJ8kdC_fSAs5>4>!4vAtV5Fc;+q+bEMD|>j%fq*^m|zX5brSRtO$I zAv(0v;H+x|zP;y_P|(@fp#dt6jN{tR!?WCcJR>oQ??DkFS`KDstjwss;v%se*p=qBdk|KtZrYUWGCyinuo@OG_UW{J zgnVNCi2a^u>fC;oA!M5r=CNW+W9Z~9?DH$x0XK4t+=8Wsjd6ivh1H57?OX9zq$3|{ zy%U52De%!(8wxefvNEPj^#}RCWCk@OT#f}ofF{FYeeZCwqHM$^$cp7l6(~u|ah@h} z7__hOhn{FXQ7ZC7c|=LltrtE-qSLhbOiQz*UF&*jJd{e}`NT^sBxB1-q#VMOpshpi z{>dW$%@a%0(@}|SE%nL7Vo{29R^}^N4xW?I*e-Lu?VeHE6QiARX!{?+*)_KugQzHe z`ni)74vc!utK2+7{q?%_k)N!F94J$1Cj*v=CnV#G z<6`S*iFXx8E*(FP#W$~PBfiG%u#M*DrSgT)CX@%0AS{SKn%_}k23-BQovbM68LMTq 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 z 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 diff --git a/apps/sim/app/invite/[id]/invite.test.tsx b/apps/sim/app/invite/[id]/invite.test.tsx index 1a966c3f386..b04b3123473 100644 --- a/apps/sim/app/invite/[id]/invite.test.tsx +++ b/apps/sim/app/invite/[id]/invite.test.tsx @@ -276,6 +276,104 @@ afterEach(() => { }) describe('Invite', () => { + it.each([ + { status: 401, body: { error: 'Unauthorized' }, authRequired: true }, + { status: 403, body: { error: 'Forbidden' }, authRequired: true }, + { + status: 401, + code: 'UNRECOGNIZED_AUTH_CODE', + body: { error: 'Please authenticate' }, + authRequired: true, + }, + { status: 404, body: { error: 'Invitation not found' }, authRequired: false }, + ])('uses HTTP $status when the response has no known invitation code', async (response) => { + mockRequestJson.mockRejectedValue( + new ApiClientError({ ...response, message: 'Request failed' }) + ) + await renderInvite() + + if (response.authRequired) { + expect(container.textContent).toContain('Authentication Required') + expect(container.textContent).not.toContain('Invitation Error') + await clickAction('Sign in to continue') + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + } else { + expect(container.textContent).toContain('This invitation is invalid or no longer exists.') + expect(actionLabels()).not.toContain('Try Again') + } + }) + + it.each([ + { code: 'disclosure-outdated', body: { error: 'Your workspaces changed' } }, + { code: undefined, body: { error: 'disclosure-outdated' } }, + ])('preserves a known invitation error before the HTTP fallback: %j', async (response) => { + mockRequestJson.mockRejectedValue( + new ApiClientError({ ...response, status: 409, message: 'Review the updated disclosure' }) + ) + await renderInvite() + + expect(container.textContent).toContain('Review the updated notice and accept again.') + expect(container.textContent).not.toContain('Already Part of a Team') + expect(actionLabels()).toContain('Try Again') + }) + + it('offers sign-in if the session expires while accepting an invitation', async () => { + await renderInvite() + mockRequestJson.mockRejectedValueOnce( + new ApiClientError({ status: 401, body: { error: 'Unauthorized' }, message: 'Unauthorized' }) + ) + await clickAction('Accept Invitation') + + expect(container.textContent).toContain('Authentication Required') + expect(container.textContent).not.toContain('Welcome!') + expect(actionLabels()).not.toContain('Accept Invitation') + await clickAction('Sign in to continue') + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + }) + + it.each(['internal', 'external'] as const)( + 'offers an account switch to a token holder who is not the %s invitee', + async (intent) => { + membershipIntent = intent + joinPreview = null + mockUseSession.mockReturnValue({ + data: { user: { id: 'other-user', email: 'other@example.com' } }, + isPending: false, + }) + await renderInvite() + + expect(container.textContent).toContain('Wrong Account') + expect(container.textContent).not.toContain('We could not load how this invitation affects') + expect(actionLabels()).not.toContain('Accept Invitation') + expect(actionLabels()).not.toContain('Refresh invitation') + expect(mockRequestJson).not.toHaveBeenCalledWith( + expect.objectContaining({ method: 'POST' }), + expect.anything() + ) + await clickAction('Sign in with a different account') + expect(mockSignOut).toHaveBeenCalledOnce() + expect(mockClearUserData).toHaveBeenCalledOnce() + expect(mockPush).toHaveBeenCalledWith( + `/login?invite_flow=true&callbackUrl=${encodeURIComponent('/invite/invitation-1?token=token-1')}` + ) + } + ) + + it('matches the invitation email with the same normalization as the server', async () => { + mockUseSession.mockReturnValue({ + data: { user: { id: 'user-1', email: ' INVITEE@EXAMPLE.COM ' } }, + isPending: false, + }) + await renderInvite() + + expect(container.textContent).not.toContain('Wrong Account') + expect(actionLabels()).toContain('Accept Invitation') + }) + it('clears the previous account cache before navigating to the invitation sign-in', async () => { mockRequestJson.mockRejectedValue( new ApiClientError({ diff --git a/apps/sim/app/invite/[id]/invite.tsx b/apps/sim/app/invite/[id]/invite.tsx index 09fe4ed825d..288c3f19eec 100644 --- a/apps/sim/app/invite/[id]/invite.tsx +++ b/apps/sim/app/invite/[id]/invite.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react' import { createLogger } from '@sim/logger' import { getErrorMessage } from '@sim/utils/errors' -import { formatQuotedNameList } from '@sim/utils/string' +import { formatQuotedNameList, normalizeEmail } from '@sim/utils/string' import { useQueryClient } from '@tanstack/react-query' import { useParams, useRouter, useSearchParams } from 'next/navigation' import { ApiClientError } from '@/lib/api/client/errors' @@ -263,9 +263,11 @@ function codeFromStatus(status: number): InviteErrorCode { } function codeFromApiClientError(error: ApiClientError): string { + if (error.code && getInviteError(error.code).code !== 'unknown') return error.code + if (error.body && typeof error.body === 'object') { const code = (error.body as { error?: unknown }).error - if (typeof code === 'string' && code.length > 0) return code + if (typeof code === 'string' && getInviteError(code).code !== 'unknown') return code } return codeFromStatus(error.status) @@ -316,6 +318,11 @@ export default function Invite({ registrationDisabled }: InviteProps) { }) const invitation = invitationQuery.data?.invitation ?? null const joinPreview = invitationQuery.data?.joinPreview ?? null + const isWrongAccount = Boolean( + invitation && + session?.user && + normalizeEmail(session.user.email || '') !== normalizeEmail(invitation.email) + ) const isDisclosureMissing = invitation?.membershipIntent === 'internal' && !joinPreview const isLoading = Boolean(session?.user) && (!isTokenResolved || invitationQuery.isPending) @@ -330,10 +337,15 @@ export default function Invite({ registrationDisabled }: InviteProps) { * Action errors (accept failures) outrank fetch errors; the URL error param * only shows until the invitation loads successfully. */ - const error = actionError ?? fetchError ?? (invitationQuery.data ? null : urlError) + const error = + actionError ?? + fetchError ?? + (isWrongAccount ? getInviteError('email-mismatch') : null) ?? + (invitationQuery.data ? null : urlError) const handleAcceptInvitation = async () => { - if (!session?.user || !invitation || isDisclosureMissing || isAccepting) return + if (!session?.user || !invitation || isWrongAccount || isDisclosureMissing || isAccepting) + return setIsAccepting(true) try { diff --git a/apps/sim/connectors/gmail/gmail.test.ts b/apps/sim/connectors/gmail/gmail.test.ts index 0623b164f61..346021bb07b 100644 --- a/apps/sim/connectors/gmail/gmail.test.ts +++ b/apps/sim/connectors/gmail/gmail.test.ts @@ -110,7 +110,7 @@ describe('gmail listDocuments with maxThreads 0 (unlimited, a per-member sync)', describe('Gmail listing checkpoints', () => { it('keeps a resumed query fixed when a relative date range crosses midnight', async () => { vi.useFakeTimers() - vi.setSystemTime(new Date(2026, 8, 1, 23, 59, 59)) + vi.setSystemTime(new Date('2026-09-01T23:59:59Z')) const urls = mockPages([ { threads: [{ id: 'thread-1', historyId: '10' }], nextPageToken: 'page-2' }, { threads: [{ id: 'thread-2', historyId: '20' }], nextPageToken: 'page-3' }, @@ -124,9 +124,9 @@ describe('Gmail listing checkpoints', () => { memberContext('alice') ) const initialQuery = new URL(urls[0]).searchParams.get('q') - expect(initialQuery).toContain('after:2026/08/25') + expect(initialQuery).toContain(`after:${Date.parse('2026-08-25T23:59:59Z') / 1000}`) - vi.setSystemTime(new Date(2026, 8, 2, 0, 0, 1)) + vi.setSystemTime(new Date('2026-09-02T00:00:01Z')) const resumed = await gmailConnector.listDocuments( 'token', sourceConfig, @@ -141,7 +141,9 @@ describe('Gmail listing checkpoints', () => { }) await gmailConnector.listDocuments('token', sourceConfig, undefined, memberContext('alice')) - expect(new URL(urls[2]).searchParams.get('q')).toContain('after:2026/08/26') + expect(new URL(urls[2]).searchParams.get('q')).toContain( + `after:${Date.parse('2026-08-26T00:00:01Z') / 1000}` + ) }) it('resumes with the saved label query rather than resolving a renamed label again', async () => { @@ -181,6 +183,19 @@ describe('Gmail listing checkpoints', () => { expect(new URL(urls[1]).searchParams.get('pageToken')).toBe('page-2') }) + it('replays an existing date-based checkpoint without changing its provider query', async () => { + const urls = mockPages([{ threads: [] }]) + const searchQuery = 'after:2026/08/25 -category:promotions -category:social' + await gmailConnector.listDocuments( + 'token', + { dateRange: '7d' }, + JSON.stringify({ pageToken: 'saved-page', searchQuery }), + memberContext('alice') + ) + expect(new URL(urls[0]).searchParams.get('q')).toBe(searchQuery) + expect(new URL(urls[0]).searchParams.get('pageToken')).toBe('saved-page') + }) + it('still accepts a legacy raw page token and upgrades the next checkpoint', async () => { const urls = mockPages([{ threads: [], nextPageToken: 'page-3' }]) const result = await gmailConnector.listDocuments('token', {}, 'page-2') @@ -1307,6 +1322,107 @@ describe('Gmail change feed', () => { }) }) + it('uses the same timezone-independent cutoff for full listings and history', async () => { + vi.setSystemTime(new Date('2026-09-10T12:00:00.987Z')) + const cutoff = new Date('2026-09-03T12:00:00Z').getTime() + const config = { dateRange: '7d', maxThreads: 0 } + const urls = mockPages([{ threads: [{ id: 'recent', historyId: '77' }] }]) + const listing = await gmailConnector.listDocuments( + 'token', + config, + undefined, + memberContext('member-a') + ) + expect(new URL(urls[0]).searchParams.get('q')).toContain(`after:${cutoff / 1000}`) + + mockFeed([historyPage(['earlier-that-day', 'recent'])], { + 'earlier-that-day': metadataThread('earlier-that-day', [ + { labelIds: ['INBOX'], internalDate: String(cutoff - 2 * 60 * 60 * 1000) }, + ]), + recent: metadataThread('recent', [ + { labelIds: ['INBOX'], internalDate: String(cutoff + 1000) }, + ]), + }) + const history = await gmailConnector.listChanges!( + 'token', + config, + '500', + memberContext('member-a') + ) + expect( + history.changes.filter(({ kind }) => kind === 'upsert').map(({ externalId }) => externalId) + ).toEqual(listing.documents.map(({ externalId }) => externalId)) + expect(history.changes).toContainEqual({ + kind: 'removed', + externalId: 'member:member-a:earlier-that-day', + }) + }) + + it('keeps a missing member label empty when moving from a full listing to history', async () => { + const config = { label: 'Engineering', maxThreads: 0 } + mockFetchWithRetry + .mockResolvedValueOnce(Response.json({ labels: [{ id: 'INBOX', name: 'INBOX' }] })) + .mockResolvedValueOnce(Response.json({ threads: [] })) + const listing = await gmailConnector.listDocuments( + 'token', + config, + undefined, + memberContext('member-a') + ) + expect(listing.documents).toEqual([]) + expect(listing.hasMore).toBe(false) + + mockFeed([historyPage(['unlabelled'])], { + unlabelled: metadataThread('unlabelled', [{ labelIds: ['INBOX'] }]), + }) + const page = await gmailConnector.listChanges!( + 'token', + config, + '500', + memberContext('member-a') + ) + expect(page.changes).toEqual([{ kind: 'removed', externalId: 'member:member-a:unlabelled' }]) + expect(JSON.parse(page.nextCursor)).toEqual({ historyId: '900' }) + expect(page.hasMore).toBe(false) + }) + + it('matches existing labels in an OR filter even when another label is absent', async () => { + mockFeed( + [historyPage(['match', 'unlabelled'])], + { + match: metadataThread('match', [{ labelIds: ['Label_7'] }]), + unlabelled: metadataThread('unlabelled', [{ labelIds: ['INBOX'] }]), + }, + [{ id: 'Label_7', name: 'Engineering' }] + ) + const page = await gmailConnector.listChanges!( + 'token', + { label: ['Engineering', 'Missing label'] }, + '500', + memberContext('member-a') + ) + expect(page.changes.map(({ kind, externalId }) => ({ kind, externalId }))).toEqual([ + { kind: 'upsert', externalId: 'member:member-a:match' }, + { kind: 'removed', externalId: 'member:member-a:unlabelled' }, + ]) + }) + + it.each([403, 503])( + 'does not treat a failed label lookup (%i) as an empty history scope', + async (status) => { + mockFetchWithRetry.mockResolvedValueOnce(new Response(null, { status })) + await expect( + gmailConnector.listChanges!( + 'token', + { label: 'Engineering' }, + '500', + memberContext('member-a') + ) + ).rejects.toThrow('cannot resolve the configured label filter') + expect(mockFetchWithRetry).toHaveBeenCalledOnce() + } + ) + it('keeps the start history id while paging and advances it once the feed drains', async () => { const requests = mockFeed( [ diff --git a/apps/sim/connectors/gmail/gmail.ts b/apps/sim/connectors/gmail/gmail.ts index 1f65f4354fe..c85f7df81c0 100644 --- a/apps/sim/connectors/gmail/gmail.ts +++ b/apps/sim/connectors/gmail/gmail.ts @@ -308,7 +308,7 @@ function buildSearchQuery( } const after = dateRangeStart(sourceConfig, new Date()) - if (after) parts.push(`after:${formatGmailDate(after)}`) + if (after) parts.push(`after:${after.getTime() / 1000}`) const excludePromotions = sourceConfig.excludePromotions !== 'false' if (excludePromotions) { @@ -350,21 +350,12 @@ function isBoundedDateRange(value: unknown): value is keyof typeof DATE_RANGE_DA return typeof value === 'string' && Object.hasOwn(DATE_RANGE_DAYS, value) } -/** The earliest message date the configured range admits, or undefined for all time. */ +/** Uses second precision so Gmail's epoch query and local history filtering share one cutoff. */ function dateRangeStart(sourceConfig: Record, now: Date): Date | undefined { const range = sourceConfig.dateRange - return isBoundedDateRange(range) ? daysAgo(now, DATE_RANGE_DAYS[range]) : undefined -} - -function daysAgo(now: Date, days: number): Date { - return new Date(now.getTime() - days * 24 * 60 * 60 * 1000) -} - -function formatGmailDate(date: Date): string { - const y = date.getFullYear() - const m = String(date.getMonth() + 1).padStart(2, '0') - const d = String(date.getDate()).padStart(2, '0') - return `${y}/${m}/${d}` + if (!isBoundedDateRange(range)) return undefined + const cutoffSeconds = Math.floor(now.getTime() / 1000) - DATE_RANGE_DAYS[range] * 24 * 60 * 60 + return new Date(cutoffSeconds * 1000) } /** @@ -766,8 +757,7 @@ function buildChangeScope( const labelIds = new Set() for (const value of configuredLabels) { const id = labelIndex.byId[value] ? value : labelIndex.idByLowerName[value.toLowerCase()] - if (!id) throw new Error(`Gmail label "${value}" does not exist in this mailbox`) - labelIds.add(id) + if (id) labelIds.add(id) } scope.labelIds = labelIds } diff --git a/apps/sim/hooks/queries/kb/connectors-cache.test.tsx b/apps/sim/hooks/queries/kb/connectors-cache.test.tsx index 7bce795ad62..89ee868601c 100644 --- a/apps/sim/hooks/queries/kb/connectors-cache.test.tsx +++ b/apps/sim/hooks/queries/kb/connectors-cache.test.tsx @@ -13,6 +13,16 @@ const mocks = vi.hoisted(() => ({ requestJson: vi.fn() })) vi.mock('@/lib/api/client/request', () => ({ requestJson: mocks.requestJson })) import { + type ConnectorDetailData, + getKnowledgeConnectorContract, + listKnowledgeConnectorsContract, + triggerKnowledgeConnectorSyncContract, +} from '@/lib/api/contracts/knowledge/connectors' +import { + CONNECTOR_SYNC_POLL_INTERVAL_MS, + connectorKeys, + useConnectorDetail, + useConnectorList, useConnectSimSearchConnector, useCreateConnector, useDeleteConnector, @@ -20,6 +30,7 @@ import { usePrepareSearchSource, useRestoreConnectorDocument, useStartConnectorMemberEnrollment, + useTriggerSync, useUpdateConnector, useUpdateConnectorAccess, } from '@/hooks/queries/kb/connectors' @@ -123,6 +134,117 @@ afterEach(() => { for (const root of mountedRoots.splice(0)) root.unmount() }) for (const queryClient of queryClients.splice(0)) queryClient.clear() + vi.useRealTimers() +}) + +describe('manual sync history reconciliation', () => { + it.each([false, true])( + 'resumes polling after an early idle response with connector list mounted=%s', + async (showList) => { + vi.useFakeTimers() + const client = createQueryClient() + const detailKey = connectorKeys.detail(KNOWLEDGE_BASE_ID, CONNECTOR_ID) + let serverDetail: ConnectorDetailData = { + id: CONNECTOR_ID, + knowledgeBaseId: KNOWLEDGE_BASE_ID, + connectorType: 'google_drive', + credentialId: 'credential-1', + sourceConfig: {}, + syncMode: 'full', + syncIntervalMinutes: 60, + status: 'active', + lastSyncAt: null, + lastSyncError: null, + lastSyncDocCount: 0, + nextSyncAt: null, + consecutiveFailures: 0, + accessMode: 'admin', + viewerMembership: null, + credentialGroupId: null, + credentialGroupOptionId: null, + memberSyncStatus: 'idle', + lastMemberSyncAt: null, + nextMemberSyncAt: null, + lastMemberSyncError: null, + memberSyncConsecutiveFailures: 0, + accessRewritePending: false, + createdAt: '2026-09-09T00:00:00Z', + updatedAt: '2026-09-09T00:00:00Z', + syncLogs: [], + memberSyncLogs: [], + members: { active: 0, suspended: 0, stale: 0 }, + } + client.setQueryData(detailKey, serverDetail) + client.setQueryData(connectorKeys.lists(KNOWLEDGE_BASE_ID), [serverDetail]) + const trigger = Promise.withResolvers() + mocks.requestJson.mockImplementation(async (contract) => { + if (contract === triggerKnowledgeConnectorSyncContract) return trigger.promise + if (contract === getKnowledgeConnectorContract) return { data: serverDetail } + if (contract === listKnowledgeConnectorsContract) return { data: [serverDetail] } + throw new Error('Unexpected request') + }) + const current = renderMutation(client, () => ({ + detail: useConnectorDetail(KNOWLEDGE_BASE_ID, CONNECTOR_ID), + list: useConnectorList(showList ? KNOWLEDGE_BASE_ID : undefined), + sync: useTriggerSync(), + })) + let mutation: Promise | undefined + await act(async () => { + mutation = current().sync.mutateAsync({ + knowledgeBaseId: KNOWLEDGE_BASE_ID, + connectorId: CONNECTOR_ID, + }) + await vi.advanceTimersByTimeAsync(0) + }) + expect(client.getQueryData(detailKey)?.status).toBe('pending') + + await act(async () => { + await vi.advanceTimersByTimeAsync(CONNECTOR_SYNC_POLL_INTERVAL_MS + 1) + }) + expect(current().detail.data?.status).toBe('active') + expect(current().sync.isPending).toBe(true) + serverDetail = { ...serverDetail, status: 'pending' } + await act(async () => { + trigger.resolve({ success: true }) + await mutation + await vi.advanceTimersByTimeAsync(1) + }) + expect(current().detail.data?.status).toBe('pending') + if (showList) expect(current().list.data?.[0].status).toBe('pending') + + serverDetail = { + ...serverDetail, + status: 'active', + syncLogs: [ + { + id: 'new-run', + connectorId: CONNECTOR_ID, + status: 'completed', + startedAt: '2026-09-10T00:00:00Z', + completedAt: '2026-09-10T00:01:00Z', + docsAdded: 0, + docsUpdated: 0, + docsDeleted: 0, + docsUnchanged: 3, + docsSkipped: 0, + docsFailed: 0, + errorMessage: null, + }, + ], + } + await act(async () => { + await vi.advanceTimersByTimeAsync(CONNECTOR_SYNC_POLL_INTERVAL_MS + 1) + }) + expect(current().detail.data?.syncLogs.map((log) => log.id)).toEqual(['new-run']) + expect(current().detail.data?.status).toBe('active') + const requestsAtCompletion = mocks.requestJson.mock.calls.length + await act(async () => { + await vi.advanceTimersByTimeAsync(CONNECTOR_SYNC_POLL_INTERVAL_MS * 2) + }) + expect(mocks.requestJson).toHaveBeenCalledTimes(requestsAtCompletion) + expectInvalidated(client, UNRELATED_KEY, false) + } + ) }) describe('connector account cache reconciliation', () => { diff --git a/apps/sim/hooks/queries/kb/connectors.test.ts b/apps/sim/hooks/queries/kb/connectors.test.ts index dac82a534f6..457a1c648fe 100644 --- a/apps/sim/hooks/queries/kb/connectors.test.ts +++ b/apps/sim/hooks/queries/kb/connectors.test.ts @@ -211,7 +211,11 @@ describe('useTriggerSync optimistic state', () => { function capturedMutationOptions() { return mocks.useMutation.mock.calls.at(-1)?.[0] as { onMutate: (vars: { knowledgeBaseId: string; connectorId: string }) => Promise - onSettled: () => Promise + onSettled: ( + data: undefined, + error: Error | null, + vars: { knowledgeBaseId: string; connectorId: string } + ) => Promise onSuccess: (data: undefined, vars: { knowledgeBaseId: string; connectorId: string }) => void onError: ( error: unknown, @@ -297,7 +301,10 @@ describe('useTriggerSync optimistic state', () => { it('reconciles server source summaries after either sync outcome', async () => { useTriggerSync() - await capturedMutationOptions().onSettled() + await capturedMutationOptions().onSettled(undefined, null, { + knowledgeBaseId: KB_ID, + connectorId: 'connector-1', + }) expect(mocks.invalidateQueries).toHaveBeenCalledWith({ queryKey: searchSourceKeys.lists() }) }) diff --git a/apps/sim/hooks/queries/kb/connectors.ts b/apps/sim/hooks/queries/kb/connectors.ts index 675d6e3e4f1..8c524b253fb 100644 --- a/apps/sim/hooks/queries/kb/connectors.ts +++ b/apps/sim/hooks/queries/kb/connectors.ts @@ -807,7 +807,18 @@ export function useTriggerSync() { queryKey: connectorKeys.progresses(knowledgeBaseId, connectorId), }) }, - onSettled: () => queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }), + /** An early poll can read idle before dispatch marks pending; reconcile after the request settles. */ + onSettled: (_data, error, { knowledgeBaseId, connectorId }) => + Promise.all([ + queryClient.invalidateQueries({ queryKey: searchSourceKeys.lists() }), + queryClient.invalidateQueries({ + queryKey: connectorKeys.detail(knowledgeBaseId, connectorId), + exact: true, + }), + ...(!error + ? [queryClient.invalidateQueries({ queryKey: connectorKeys.lists(knowledgeBaseId) })] + : []), + ]), }) } diff --git a/apps/sim/lib/selectors/server/providers/google.test.ts b/apps/sim/lib/selectors/server/providers/google.test.ts index 318a68b1136..0f737ec42fa 100644 --- a/apps/sim/lib/selectors/server/providers/google.test.ts +++ b/apps/sim/lib/selectors/server/providers/google.test.ts @@ -150,6 +150,28 @@ describe('Google server selector adapters', () => { expect(mockFetch).toHaveBeenCalledTimes(2) }) + it.each([ + { files: [{ id: 'folder-1', name: 'Notes' }], nextPageToken: undefined }, + { files: [], nextPageToken: undefined }, + { files: [{ id: 'folder-1', name: 'Notes' }], nextPageToken: 'next' }, + ])('reports incomplete Drive searches without inventing pagination: %j', async (page) => { + mockFetch + .mockResolvedValueOnce(new Response(JSON.stringify({ drives: [] }))) + .mockResolvedValueOnce(new Response(JSON.stringify({ ...page, incompleteSearch: true }))) + const args = listArgs('google.drive') + args.context.mimeType = 'application/vnd.google-apps.folder' + + await expect(googleSelectorAttachments['google.drive'].execute(args)).resolves.toEqual({ + kind: 'list', + items: page.files.map((file) => ({ id: file.id, label: file.name })), + ...(page.nextPageToken ? { nextCursor: `f:${page.nextPageToken}` } : {}), + diagnostics: { truncated: { reason: 'provider-cap' } }, + }) + expect(mockFetch).toHaveBeenCalledTimes(2) + const fileUrl = new URL(String(mockFetch.mock.calls[1]?.[0])) + expect(fileUrl.searchParams.get('fields')).toContain('incompleteSearch') + }) + it('continues real folder pages after the final shared-drive page', async () => { mockFetch .mockResolvedValueOnce( diff --git a/apps/sim/lib/selectors/server/providers/google.ts b/apps/sim/lib/selectors/server/providers/google.ts index 8784433ffaa..37c92ecef0d 100644 --- a/apps/sim/lib/selectors/server/providers/google.ts +++ b/apps/sim/lib/selectors/server/providers/google.ts @@ -68,6 +68,7 @@ interface Sheet { interface GooglePage { items: T[] nextCursor?: string + truncated?: boolean } async function googleAccessToken(args: ExecuteServerSelectorArgs, serviceId: string) { @@ -297,9 +298,13 @@ async function listDriveFiles( url.searchParams.set('supportsAllDrives', 'true') url.searchParams.set('includeItemsFromAllDrives', 'true') url.searchParams.set('pageSize', '100') - url.searchParams.set('fields', 'nextPageToken,files(id,name,mimeType)') + url.searchParams.set('fields', 'nextPageToken,incompleteSearch,files(id,name,mimeType)') if (pageToken) url.searchParams.set('pageToken', pageToken) - const data = await fetchProviderJson<{ files?: DriveFile[]; nextPageToken?: string }>(url, { + const data = await fetchProviderJson<{ + files?: DriveFile[] + nextPageToken?: string + incompleteSearch?: boolean + }>(url, { headers: { Authorization: `Bearer ${accessToken}` }, signal: args.signal, }) @@ -308,6 +313,7 @@ async function listDriveFiles( return { items: [...sharedDrives, ...(data.files ?? [])], ...(nextPageToken ? { nextCursor: driveCursor('files', nextPageToken) } : {}), + ...(data.incompleteSearch === true ? { truncated: true } : {}), } } @@ -371,7 +377,8 @@ async function executeDrive(args: ExecuteServerSelectorArgs) { id: file.id, label: file.name, })), - result.nextCursor + result.nextCursor, + result.truncated ? { truncated: { reason: 'provider-cap' } } : undefined ) } From c5e65a011083ce14960f6d4bf502f82ef2ef6505 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 03:46:56 -0700 Subject: [PATCH 6/8] fix(search): preserve source rows during approval updates (#7731) --- .../reset-organization-search-access.test.ts | 55 ++++++++++++++++++- .../utils/reset-organization-search-access.ts | 12 +++- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/apps/sim/hooks/queries/utils/reset-organization-search-access.test.ts b/apps/sim/hooks/queries/utils/reset-organization-search-access.test.ts index 8e6a96e4a35..7040c040f72 100644 --- a/apps/sim/hooks/queries/utils/reset-organization-search-access.test.ts +++ b/apps/sim/hooks/queries/utils/reset-organization-search-access.test.ts @@ -1,10 +1,63 @@ /** @vitest-environment node */ -import { QueryClient } from '@tanstack/react-query' +import { QueryClient, QueryObserver } from '@tanstack/react-query' import { expect, it, vi } from 'vitest' import type { WorkspaceKnowledgeSearchResult } from '@/lib/api/contracts/knowledge/search' import { resourceScopeKey } from '@/lib/core/resource-scope' import { knowledgeKeys } from '@/hooks/queries/utils/knowledge-keys' import { resetOrganizationSearchAccess } from '@/hooks/queries/utils/reset-organization-search-access' +import { searchSourceKeys } from '@/hooks/queries/utils/search-source-keys' + +it.each([true, false])( + 'keeps administrative rows visible while revalidating access, refresh success=%s', + async (success) => { + const client = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + const scope = { kind: 'organization', organizationId: 'org-1' } as const + const adminKey = searchSourceKeys.organizationOverview(scope.organizationId) + const otherKey = searchSourceKeys.organizationOverview('org-2') + const viewerKeys = [ + searchSourceKeys.list(scope), + searchSourceKeys.overview(scope), + searchSourceKeys.pages(scope, { search: '', mine: false }), + ] + const before = { providers: [{ connectorType: 'gmail', approved: true }] } + const after = { providers: [{ connectorType: 'gmail', approved: false }] } + const response = Promise.withResolvers() + const fetchOverview = vi.fn(() => response.promise) + client.setQueryData(adminKey, before) + client.setQueryData(otherKey, before) + for (const key of viewerKeys) client.setQueryData(key, { privateContent: 'previous access' }) + const observer = new QueryObserver(client, { + queryKey: adminKey, + queryFn: fetchOverview, + staleTime: Number.POSITIVE_INFINITY, + }) + const observed = vi.fn() + const unsubscribe = observer.subscribe(observed) + try { + const refreshing = resetOrganizationSearchAccess(client, scope.organizationId) + expect(fetchOverview).toHaveBeenCalledOnce() + expect(observer.getCurrentResult()).toMatchObject({ data: before, isPending: false }) + for (const key of viewerKeys) expect(client.getQueryData(key)).toBeUndefined() + expect(client.getQueryState(otherKey)?.isInvalidated).toBe(false) + + if (success) response.resolve(after) + else response.reject(new Error('Could not refresh sources')) + await refreshing + + expect(observer.getCurrentResult()).toMatchObject({ + data: success ? after : before, + isError: !success, + isFetching: false, + }) + expect(observed.mock.calls.every(([result]) => result.data && !result.isPending)).toBe(true) + expect(client.getQueryData(otherKey)).toEqual(before) + } finally { + response.resolve(after) + unsubscribe() + client.clear() + } + } +) it.each([ { name: 'document', key: knowledgeKeys.document('kb-direct', 'document-direct') }, diff --git a/apps/sim/hooks/queries/utils/reset-organization-search-access.ts b/apps/sim/hooks/queries/utils/reset-organization-search-access.ts index 00a2c91cb97..53f7b3a5cfb 100644 --- a/apps/sim/hooks/queries/utils/reset-organization-search-access.ts +++ b/apps/sim/hooks/queries/utils/reset-organization-search-access.ts @@ -1,4 +1,4 @@ -import type { QueryClient } from '@tanstack/react-query' +import { matchQuery, type QueryClient } from '@tanstack/react-query' import { resourceScopeKey } from '@/lib/core/resource-scope' import { knowledgeKeys } from '@/hooks/queries/utils/knowledge-keys' import { searchSourceKeys } from '@/hooks/queries/utils/search-source-keys' @@ -9,12 +9,20 @@ export async function resetOrganizationSearchAccess( organizationId: string ) { const scope = { kind: 'organization', organizationId } as const + const adminOverview = { + queryKey: searchSourceKeys.organizationOverview(organizationId), + exact: true, + } await Promise.all([ queryClient.resetQueries({ queryKey: [...knowledgeKeys.searches(), resourceScopeKey(scope)], }), /** Document keys carry no resource scope and may exist without source or result caches. */ queryClient.resetQueries({ queryKey: knowledgeKeys.details() }), - queryClient.resetQueries({ queryKey: searchSourceKeys.list(scope) }), + queryClient.resetQueries({ + queryKey: searchSourceKeys.list(scope), + predicate: (query) => !matchQuery(adminOverview, query), + }), + queryClient.invalidateQueries(adminOverview), ]) } From 849ac6618603287f3f45cd3b630f099a67357046 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 04:12:19 -0700 Subject: [PATCH 7/8] chore(codeql): exclude integration test fixtures from analysis (#7732) --- .github/codeql/codeql-config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index f50b20410aa..6c93954f998 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -16,6 +16,8 @@ paths-ignore: - '**/__tests__/**' - '**/__mocks__/**' - '**/__fixtures__/**' + - '**/__integration__/**' + - '**/*.integration.ts' - '**/e2e/**' # Deliberately no '**/test/**' or '**/tests/**'. A directory named `test` is a # routable Next.js path segment, not necessarily test code: those globs From 00095441bc27ea46320c578c69821863c7c09700 Mon Sep 17 00:00:00 2001 From: Waleed Date: Thu, 10 Sep 2026 04:15:17 -0700 Subject: [PATCH 8/8] fix(search): verify Atlassian access and clarify source setup (#7730) * fix(search): verify Atlassian access and clarify source setup * fix(search): close authorization races and repair integration fixtures --- apps/docs/content/docs/cli/reference.mdx | 4 +- apps/docs/content/docs/cli/selectors.mdx | 4 +- .../atlassian-service-account.mdx | 14 +- apps/docs/content/docs/search/confluence.mdx | 37 +- apps/docs/content/docs/search/jira.mdx | 23 +- apps/docs/content/docs/search/slack.mdx | 2 +- apps/docs/openapi-v2-workflows.json | 2 + .../atlassian/admin-scope-picker.png | Bin 403842 -> 141218 bytes .../public/static/search/confluence-setup.jpg | Bin 24808 -> 0 bytes .../public/static/search/confluence-setup.png | Bin 0 -> 45456 bytes apps/docs/public/static/search/jira-setup.jpg | Bin 33178 -> 0 bytes apps/docs/public/static/search/jira-setup.png | Bin 0 -> 58681 bytes .../docs/public/static/search/slack-setup.jpg | Bin 39338 -> 0 bytes .../docs/public/static/search/slack-setup.png | Bin 0 -> 67494 bytes apps/sim/app/api/files/authorization.test.ts | 72 ++- apps/sim/app/api/files/authorization.ts | 79 ++- .../[id]/documents/[documentId]/route.ts | 6 +- .../api/v1/knowledge/[id]/documents/route.ts | 4 +- .../app/api/v1/knowledge/search/route.test.ts | 117 ++++- apps/sim/app/api/v1/knowledge/search/route.ts | 18 +- apps/sim/app/api/v1/knowledge/utils.test.ts | 35 ++ apps/sim/app/api/v1/knowledge/utils.ts | 12 +- .../connector-access-field.test.tsx | 25 + .../connector-access-field.tsx | 4 +- .../connector-settings-fields.test.tsx | 25 +- .../connector-settings-fields.tsx | 2 + .../use-connector-settings-form.ts | 1 + .../slack-search-setup-wizard.tsx | 15 + apps/sim/connectors/jira/jira.test.ts | 2 +- apps/sim/connectors/jira/meta.ts | 2 +- apps/sim/hooks/use-member-enrollment.test.tsx | 246 ++++++++++ apps/sim/hooks/use-member-enrollment.ts | 118 +++-- .../payloads/materialization.server.test.ts | 33 ++ .../payloads/materialization.server.ts | 4 +- .../integrations/credential-display.test.ts | 4 +- .../lib/integrations/credential-display.ts | 3 + .../application-acl.integration.ts | 208 +++++++- .../confluence-identity.integration.ts | 86 +++- ...bedding-processing-recovery.integration.ts | 4 +- .../filtered-search.integration.ts | 6 +- .../gmail-member.integration.ts | 4 +- .../google-calendar-member.integration.ts | 47 +- .../google-drive-shortcuts.integration.ts | 15 + .../organization-mcp-search.integration.ts | 12 +- ...rovider-processing-recovery.integration.ts | 6 +- .../read-indexed-document.integration.ts | 10 +- .../search-index-policy.integration.ts | 2 +- .../search-source-progress.integration.ts | 5 +- .../seed-source-access-fixture.ts | 11 +- .../stored-document-recovery.integration.ts | 4 +- .../knowledge/access/confluence-site.test.ts | 459 ++++++++++++++++++ .../lib/knowledge/access/confluence-site.ts | 366 ++++++++++++++ .../access/predicate.postgres.test.ts | 164 ++++++- .../lib/knowledge/access/predicate.test.ts | 25 + apps/sim/lib/knowledge/access/predicate.ts | 86 +++- apps/sim/lib/knowledge/access/scope.test.ts | 77 ++- apps/sim/lib/knowledge/access/scope.ts | 94 +++- apps/sim/lib/knowledge/access/types.ts | 11 + .../knowledge/application/connectors.test.ts | 68 ++- .../lib/knowledge/application/connectors.ts | 41 +- .../knowledge/application/documents.test.ts | 89 ++++ .../lib/knowledge/application/documents.ts | 8 +- .../application/knowledge-bases.test.ts | 10 +- .../knowledge/application/knowledge-bases.ts | 19 +- .../lib/knowledge/application/search.test.ts | 2 +- apps/sim/lib/knowledge/application/search.ts | 4 +- .../lib/knowledge/application/tags.test.ts | 21 +- apps/sim/lib/knowledge/application/tags.ts | 12 +- .../lib/knowledge/documents/service.test.ts | 43 +- apps/sim/lib/knowledge/documents/service.ts | 11 +- .../search/queries-github-discovery.test.ts | 8 +- apps/sim/lib/knowledge/search/queries.test.ts | 41 +- apps/sim/lib/knowledge/search/queries.ts | 25 +- apps/sim/lib/knowledge/service.test.ts | 89 ++++ apps/sim/lib/knowledge/service.ts | 86 +++- apps/sim/lib/oauth/utils.test.ts | 5 + apps/sim/lib/oauth/utils.ts | 1 + apps/sim/lib/selectors/manifest.test.ts | 9 +- apps/sim/lib/selectors/manifest.ts | 6 + .../selectors/server/providers/jira.test.ts | 105 ++-- .../lib/selectors/server/providers/jira.ts | 17 +- .../utils/user-file-base64.server.test.ts | 97 ++-- apps/sim/vitest.config.ts | 8 +- packages/sim-cli/src/generated/v2-api.ts | 4 + 84 files changed, 3013 insertions(+), 431 deletions(-) delete mode 100644 apps/docs/public/static/search/confluence-setup.jpg create mode 100644 apps/docs/public/static/search/confluence-setup.png delete mode 100644 apps/docs/public/static/search/jira-setup.jpg create mode 100644 apps/docs/public/static/search/jira-setup.png delete mode 100644 apps/docs/public/static/search/slack-setup.jpg create mode 100644 apps/docs/public/static/search/slack-setup.png create mode 100644 apps/sim/app/api/v1/knowledge/utils.test.ts create mode 100644 apps/sim/lib/knowledge/access/confluence-site.test.ts create mode 100644 apps/sim/lib/knowledge/access/confluence-site.ts diff --git a/apps/docs/content/docs/cli/reference.mdx b/apps/docs/content/docs/cli/reference.mdx index 22c00ff4e27..054a8290273 100644 --- a/apps/docs/content/docs/cli/reference.mdx +++ b/apps/docs/content/docs/cli/reference.mdx @@ -3008,7 +3008,7 @@ sim selectors get [options] | Option | Required | Description | | --- | --- | --- | -| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | +| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | | `--context ` | No | Only the dependencies declared by the selector, such as oauthCredential and channelId. Missing OAuth connections require human authorization. (JSON, or @path / @- to read a file or stdin). | | `--id ` | Yes | Resource identifier. | @@ -3028,7 +3028,7 @@ sim selectors list [options] | Option | Required | Description | | --- | --- | --- | -| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | +| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | | `--context ` | No | Only the dependencies declared by the selector, such as oauthCredential and channelId. Missing OAuth connections require human authorization. (JSON, or @path / @- to read a file or stdin). | | `--search ` | No | Provider option search text. | | `--cursor ` | No | Continue from nextCursor returned by a previous result. | diff --git a/apps/docs/content/docs/cli/selectors.mdx b/apps/docs/content/docs/cli/selectors.mdx index 4a9dda8556d..e728cb93a0e 100644 --- a/apps/docs/content/docs/cli/selectors.mdx +++ b/apps/docs/content/docs/cli/selectors.mdx @@ -21,7 +21,7 @@ Get Selector Option (OAuth login or personal API key required) | Option | Required | Description | | --- | --- | --- | -| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | +| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | | `--context ` | No | Only the dependencies declared by the selector, such as oauthCredential and channelId. Missing OAuth connections require human authorization. (JSON, or @path / @- to read a file or stdin). | | `--id ` | Yes | Resource identifier. | @@ -41,7 +41,7 @@ List Selector Options (OAuth login or personal API key required) | Option | Required | Description | | --- | --- | --- | -| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | +| `--selector-key ` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. | | `--context ` | No | Only the dependencies declared by the selector, such as oauthCredential and channelId. Missing OAuth connections require human authorization. (JSON, or @path / @- to read a file or stdin). | | `--search ` | No | Provider option search text. | | `--cursor ` | No | Continue from nextCursor returned by a previous result. | diff --git a/apps/docs/content/docs/integrations/atlassian-service-account.mdx b/apps/docs/content/docs/integrations/atlassian-service-account.mdx index b0dbd6d5b3c..cf1c15f2711 100644 --- a/apps/docs/content/docs/integrations/atlassian-service-account.mdx +++ b/apps/docs/content/docs/integrations/atlassian-service-account.mdx @@ -33,7 +33,7 @@ See Atlassian's [service-account setup](https://support.atlassian.com/user-manag ## Choose scopes -Start with the connection and read scopes for each product you will use. These cover Sim's account validation, pickers, and common read operations; individual operations may need additional scopes. +Start with the connection and read scopes for each product, then check the scope requirements for your workflow operations. ### Jira and Jira Service Management @@ -65,17 +65,17 @@ Add scopes for the actions your workflow performs: | Create or update Jira issues | `write:jira-work` | | Create or update Service Management requests | `write:servicedesk-request` | | Manage Service Management customers | `manage:servicedesk-customer` | -| Create or update Confluence content | `write:confluence-content`, `write:page:confluence` | +| Create or update Confluence pages | `write:confluence-content`, `write:page:confluence` | -Delete, webhook, Assets, and other operations can require additional scopes. Check the specific endpoint in the [Jira](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/), [Jira Service Management](https://developer.atlassian.com/cloud/jira/service-desk/rest/intro/), or [Confluence](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/) API reference. Include the complete scope set for that endpoint; a classic scope does not cover every API in its product. +Deletes, webhooks, Assets, and other operations can require additional scopes. Check the endpoint's complete scope set in the [Jira](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/), [Jira Service Management](https://developer.atlassian.com/cloud/jira/service-desk/rest/intro/), or [Confluence](https://developer.atlassian.com/cloud/confluence/rest/v2/intro/) API reference. Use the **App** and **Scope type** filters to find both classic and granular scopes. Scopes and account permissions are separate: the account must also have access to the project, space, or content. Atlassian scope picker filtered to Jira classic scopes ## Add the credential to Sim @@ -86,7 +86,7 @@ Use the **App** and **Scope type** filters to find both classic and granular sco 4. Select **Add service account**. Sim checks the token against the selected product's current-user endpoint; resolve any error before continuing. 5. In your workflow's Jira, Jira Service Management, or Confluence block, select the credential and configure the operation. -The credential appears on all three integration pages, but adding it only validates the selected product. Check account access and scopes before using another product. Sim encrypts the token at rest and calls Atlassian as the service account. +The credential appears on all three integration pages, but adding it only validates the selected product. Check account access and scopes before using another product. ## Troubleshooting and rotation diff --git a/apps/docs/content/docs/search/confluence.mdx b/apps/docs/content/docs/search/confluence.mdx index 308ca638a00..f818dcba9de 100644 --- a/apps/docs/content/docs/search/confluence.mdx +++ b/apps/docs/content/docs/search/confluence.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' -Search pages and blog posts from selected Confluence Cloud spaces. A Sim organization admin approves the provider; **each teammate connects their own Confluence account**, including when a service account supplies the content. +Search pages and blog posts from selected Confluence Cloud spaces. A Sim organization admin enables Confluence; **each teammate connects their own account**. | Method | How it works | | --- | --- | @@ -16,11 +16,13 @@ Search pages and blog posts from selected Confluence Cloud spaces. A Sim organiz ## Before you start -- Use **Confluence Cloud** and a site hostname such as `your-team.atlassian.net`. Server and Data Center are not supported. +- Use **Confluence Cloud**. Server and Data Center are not supported. - Each teammate needs a verified Sim email matching their active Atlassian account's email. - For a central source, an Atlassian organization admin creates a service account with Confluence access. Grant it access to the chosen spaces and restricted pages, plus permission to read space permissions and the user/group directory. Admin status alone does not bypass page restrictions. -On hosted Sim, teammates authorize Sim's existing OAuth app. Self-hosted deployments must configure the [shared OAuth app](#self-hosted-operator-setup), including when a service account supplies content. + +Teammates authorize Sim's shared Confluence app, which also requests workflow permissions, including writes. Search does not edit pages. Hosted Sim provides this app; self-hosted deployments must [configure it](#self-hosted-operator-setup), even when a service account supplies content. + ## Set up a central source @@ -39,10 +41,10 @@ Open your organization's **Settings → Sources**, turn on **Confluence**, then Under **Indexing account**, select a service account or [add one](#using-a-service-account). Enter the same **Confluence Domain** as the credential, then choose **Spaces**. To enter comma-separated keys such as `ENG, PRODUCT`, use the switch beside the Spaces field. Confluence source setup with a service account, site domain, and spaces Open **More options** for content type, labels, and metadata tags. The default is **Pages only**; choose **All content** to include blog posts. @@ -52,9 +54,9 @@ Open **More options** for content type, labels, and metadata tags. The default i ### Sync and connect your identity -Select **Connect & Sync**. Setup samples permission access in one selected space. Each document's access is verified during sync. Then open **Integrations** in the main sidebar and select **Connect** on the Confluence source. In the new tab, authorize the configured site using the Atlassian email matching your verified Sim email. +Select **Connect & Sync** to start indexing. Then open **Integrations** in the main sidebar and select **Connect** on the Confluence source. Authorize the configured site using the Atlassian email matching your verified Sim email. -Each teammate completes this identity connection. An existing authorized account may already be connected. Return to Integrations to check indexing status and your searchable document count. +Each teammate completes this identity connection. Existing authorized accounts may already be connected. Integrations shows indexing status and your searchable document count. @@ -90,7 +92,7 @@ read:user:confluence read:group:confluence ``` -These scopes cover Search's account check, pickers, content, permissions, and directory reads. `read:confluence-user` is needed for the [current-user check](https://developer.atlassian.com/cloud/confluence/rest/v1/api-group-users/#api-wiki-rest-api-user-current-get); `read:space:confluence` is needed for the [space picker](https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-space/#api-spaces-get). Workflow write scopes are not needed for central Search. +Use all 12 scopes for account validation, pickers, content, permissions, and directory reads. Central indexing does not need write scopes. 4. Review and create the token, then copy it. Atlassian shows it only once. 5. In Sim's source form, use **Indexing account** to add a service account. Paste the **API token**, enter **Site domain** (hostname only), and select **Add service account**. Continue in the source form with the same domain. @@ -102,11 +104,7 @@ These scopes cover Search's account check, pickers, content, permissions, and di height={551} /> -See Atlassian's [account setup](https://support.atlassian.com/user-management/docs/manage-your-service-accounts/) and [token instructions](https://support.atlassian.com/user-management/docs/manage-api-tokens-for-service-accounts/). Scopes do not grant space or page access themselves. Before expiry, or when scopes must change, create a replacement token and add it as a new credential in the source's **Settings**. Select **Change indexing account**, verify a sync, then revoke the old token. - - -Personal OAuth connections use Sim's shared Confluence app, which also requests permissions for workflow actions, including writes. Search reads content and permissions; it does not edit pages. - +See Atlassian's [account setup](https://support.atlassian.com/user-management/docs/manage-your-service-accounts/) and [token instructions](https://support.atlassian.com/user-management/docs/manage-api-tokens-for-service-accounts/). Scopes do not grant space or page access. To replace an expiring token or change scopes, add a new credential in the source's **Settings**, select **Change indexing account**, and verify a sync before revoking the old token. ## Configuration and indexed content @@ -114,7 +112,7 @@ Personal OAuth connections use Sim's shared Confluence app, which also requests | --- | --- | | **Confluence Domain** | Cloud hostname only, such as `your-team.atlassian.net`; omit page URLs and `/wiki`. | | **Spaces / Space Keys** | Required spaces. The picker and manual input set the same scope. | -| **Content Type** | **Pages only** by default; **All content** includes pages and blog posts. | +| **Content Type** | **Pages only** (default), **Blog posts only**, or **All content** for both. | | **Filter by Label** | Optional comma-separated labels; content can match any listed label. | | **Metadata tags** | Labels, version, and last-modified tags. | @@ -122,9 +120,9 @@ Search manages the schedule and hides item limits. It indexes published/current ## Manage access and sync -Central sources combine space permissions, page and ancestor restrictions, and group membership. Member sources use each person's provider listing. Sim admin status does not grant access to all pages, and permission changes take effect after syncing and processing. +Central sources combine space permissions, page and ancestor restrictions, and group membership. Before returning central content, Sim uses your personal connection to check that you still have access to the configured Confluence site. If Atlassian cannot confirm that access, the content is hidden. Member sources use each person's provider listing. Sim admin status does not grant access to all pages, and permission changes take effect after syncing and processing. -Open **Settings → Sources → Confluence → Manage**, then a source's **Documents**, **Settings**, or **Sync history**. Teammates use **Integrations** to connect or reconnect. Invite new people to the Sim organization through Members settings or SSO first; **Accounts → Request connections** requests a provider connection, not organization membership. +Open **Settings → Sources → Confluence → Manage**, then a source's **Documents**, **Settings**, or **Sync history**. Invite teammates through **Settings → Members → Invite** or SSO, then have them connect through **Integrations**. **Accounts → Request connections** only requests a provider connection; it does not invite people to the organization. ## Troubleshooting @@ -134,6 +132,7 @@ Open **Settings → Sources → Confluence → Manage**, then a source's **Docum | Space picker is empty or fails | Check the domain, account's space access, and `read:space:confluence` scope. Manual space keys are also supported. | | Service-account validation fails | Check token expiry, site, Confluence app access, and the full scope list above, including `read:confluence-user`. | | Content syncs but Search is empty | Connect your personal Confluence identity. Check permission/directory sync errors and group-read scopes. | +| A new page, blog post, or label is missing | Confluence search can take time to update. Once the content appears in Confluence search with the selected label, sync again. | | A restricted page is missing | Both your account and the crawling account need access to the page and its ancestors. | | Embedded content is missing | Index the referenced page separately; remote macro output is excluded. | | **Reconnect** or email mismatch | Authorize with the Atlassian account matching your verified Sim email and grant all requested permissions. | @@ -145,9 +144,9 @@ Open a missing page as the affected teammate. **Share → General access** shows Configure one shared Confluence OAuth app for teammates' connections: 1. In the [Atlassian developer console](https://developer.atlassian.com/console/myapps/), select or create the deployment's **OAuth 2.0 integration**. -2. Under **Authorization → OAuth 2.0 (3LO)**, save `https:///api/auth/oauth2/callback/confluence` as a callback, preserving callbacks used by other deployments. +2. Under **Authorization → OAuth 2.0 (3LO)**, add `https:///api/auth/oauth2/callback/confluence` as a callback. 3. Under **Permissions**, add the Confluence API and its full `confluence` scope list from [Sim's OAuth configuration](https://github.com/simstudioai/sim/blob/staging/apps/sim/lib/oauth/oauth.ts), including `read:group:confluence`. Add **User Identity API → read:me**. Sim requests `offline_access` for refresh tokens; the service-account list above does not replace this 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. Connect from **Integrations** and select the configured site. After changing the OAuth client or requested scopes, use **Settings → Sources → More → Refresh connection settings**, then have affected teammates reconnect. -The callback must exactly match Sim's URL, including scheme, hostname, port, and path. For `http://localhost:3000`, register `http://localhost:3000/api/auth/oauth2/callback/confluence`. If only the app owner can connect, check **Distribution**. See the [Atlassian OAuth guide](https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/) and [Sim deployment reference](/platform/self-hosting/integrations-oauth). +The callback must match Sim's scheme, hostname, port, and path exactly. If only the app owner can connect, check **Distribution**. See the [Atlassian OAuth guide](https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/) and [Sim deployment reference](/platform/self-hosting/integrations-oauth). diff --git a/apps/docs/content/docs/search/jira.mdx b/apps/docs/content/docs/search/jira.mdx index e47e217091f..b793135c408 100644 --- a/apps/docs/content/docs/search/jira.mdx +++ b/apps/docs/content/docs/search/jira.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 issue titles, descriptions, and metadata from selected **Jira Cloud** projects. An organization admin approves Jira and defines the source; **each teammate connects their own Jira account** to search issues they can access. +Search issue titles, descriptions, and metadata from selected **Jira Cloud** projects. **Each teammate connects their own Jira account** to search issues they can access. -Jira Search uses **Member accounts**. Service accounts are supported for Jira workflows, but do not provide a central Jira Search crawl. Comments, attachment contents, dashboards, and saved filters are not indexed. +Jira Search uses **Member accounts**. Service accounts can run workflows and populate the project picker, but cannot centrally index Jira for Search. Comments, attachment contents, dashboards, and saved filters are not indexed. ## Before you start @@ -39,13 +39,13 @@ Open your organization's **Settings → Sources**, turn on **Jira**, then select Enter **Jira Domain**. Under **Account for browsing**, select an account or choose **Connect Jira account**, then select **Projects**. To enter keys such as `ENG, SUPPORT` manually, use the switch beside Projects; this works without a browsing account. -**Account for browsing** only populates the project picker. You can use OAuth or **Add service account** for this step; neither enrolls that account for Search or enables central indexing. Each teammate still connects their own Jira account. +**Account for browsing** only loads the project picker, using OAuth or **Add service account**. It does not enroll anyone for Search. A service account needs Jira access and the [Jira read scopes](/integrations/atlassian-service-account#jira-and-jira-service-management); Confluence-only tokens do not work here. Jira source setup with an account for browsing, site domain, and projects @@ -64,7 +64,7 @@ Select **Add source**. This saves the shared scope; it does not authorize accoun Open **Integrations** in the main sidebar and select **Connect** on the Jira source. In the new tab, authorize the configured site using the Atlassian email matching your verified Sim email. -Each teammate follows this step. An existing authorized account may already be connected. Return to Integrations to check indexing status and your searchable document count. +Each teammate follows this step. Existing authorized accounts may already be connected. Integrations shows indexing status and your searchable document count. @@ -73,11 +73,11 @@ For workspace Search, start from **Search → Add source**; its source-creation ## Manage the source -Admins open **Settings → Sources → Jira → Manage**, then a source's **Documents**, **Settings**, or **Sync history**. Settings include the site, projects, JQL filter, and optional issue type, status, priority, labels, assignee, and last-updated tags. +Admins open **Settings → Sources → Jira → Manage**, then a source's **Documents**, **Settings**, or **Sync history**. Metadata tags include issue type, status, priority, labels, assignee, and last updated. Teammates share the configured scope and do not choose projects again. For another site or scope, add another source, or use **Connect** beside **Connect a different site or content scope** in Integrations. -Invite new teammates to the Sim organization through Members settings or SSO, then have them connect Jira. **Jira → Accounts → Request connections** requests a provider connection; it does not add people to the organization. +Invite teammates through **Settings → Members → Invite** or SSO, then have them connect Jira through **Integrations**. **Jira → Accounts → Request connections** only requests a provider connection; it does not invite people to the organization. Sim checks Jira separately for each connected person. Content becomes searchable as indexing finishes; issue changes and lost access are reflected after later syncs. @@ -88,6 +88,7 @@ Sim checks Jira separately for each connected person. Content becomes searchable | No source setup controls | Ask a Sim organization admin to approve Jira. | | Projects are empty or disabled | Enter the correct domain, connect a browsing account with project access, or switch to manual keys. | | Connected, but no issues | Check the authorized site, project access, issue security, and JQL. An admin's Jira access does not grant access to teammates. | +| Projects appear but issues do not sync | Ask the Atlassian admin whether a [data security policy](https://support.atlassian.com/security-and-access-policies/docs/block-app-access/) blocks Sim from the selected projects. Project visibility does not prove that an app may read its issues. | | Email mismatch | Use the Atlassian email matching your verified Sim email. If switching accounts fails, sign out of Atlassian and retry **Connect**. | | **Reconnect** | Reauthorize and grant all requested permissions. A revoked grant or changed scope list can require a new connection. | | Connection tab does not open | Allow pop-ups for Sim and retry. | @@ -100,9 +101,9 @@ Open a missing issue in Jira using the connected account. For company-managed pr Configure one shared Jira OAuth app for the deployment: 1. In the [Atlassian developer console](https://developer.atlassian.com/console/myapps/), select or create an **OAuth 2.0 integration**. -2. Under **Authorization → OAuth 2.0 (3LO)**, save `https:///api/auth/oauth2/callback/jira` as a callback, preserving callbacks used by other deployments. +2. Under **Authorization → OAuth 2.0 (3LO)**, add `https:///api/auth/oauth2/callback/jira` as a callback. 3. Under **Permissions**, add **Jira API** and configure the full `jira` scope list from [Sim's OAuth configuration](https://github.com/simstudioai/sim/blob/staging/apps/sim/lib/oauth/oauth.ts), including its Jira Service Management and Assets scopes. Add **User Identity API → read:me**. Sim requests `offline_access` for refresh tokens; Search's three scopes above are only a subset of this shared app's permissions. 4. Enable sharing under **Distribution**. Set `JIRA_CLIENT_ID` and `JIRA_CLIENT_SECRET` from the app's **Settings**, verify `NEXT_PUBLIC_APP_URL`, and restart Sim. 5. Connect from **Integrations** and select the configured site. After changing the OAuth client or requested scopes, use **Settings → Sources → More → Refresh connection settings**, then have affected teammates reconnect. -The callback must match exactly, including scheme, hostname, port, and path. For `http://localhost:3000`, register `http://localhost:3000/api/auth/oauth2/callback/jira`. Use a separate development app when production callbacks must stay unchanged. If only the app owner can connect, check **Distribution**. See the [Atlassian OAuth guide](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/) and [Sim deployment reference](/platform/self-hosting/integrations-oauth). +The callback must match Sim's scheme, hostname, port, and path exactly. If only the app owner can connect, check **Distribution**. See the [Atlassian OAuth guide](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/) and [Sim deployment reference](/platform/self-hosting/integrations-oauth). diff --git a/apps/docs/content/docs/search/slack.mdx b/apps/docs/content/docs/search/slack.mdx index 42917bc7438..2b63bb88e82 100644 --- a/apps/docs/content/docs/search/slack.mdx +++ b/apps/docs/content/docs/search/slack.mdx @@ -40,7 +40,7 @@ You can also open this wizard from **Settings → Sim Search in Slack → Set up Return to Sim and select **Continue**. In step 2, copy **Client ID**, **Client Secret**, and **Signing Secret** from the new app’s **Basic Information → App Credentials**: -Sim Search in Slack setup asking for Client ID, Client Secret, and Signing Secret +Sim Search in Slack setup with placeholders for Client ID, Client Secret, and Signing Secret Select **Continue**, then **Install in Slack** in step 3. Approve the installation in Slack. Sim saves the bot connection and opens **Settings → Sim Search in Slack**. Complete any required Slack administrator approval before continuing. diff --git a/apps/docs/openapi-v2-workflows.json b/apps/docs/openapi-v2-workflows.json index d25aaf9460e..b557a9b373e 100644 --- a/apps/docs/openapi-v2-workflows.json +++ b/apps/docs/openapi-v2-workflows.json @@ -15882,6 +15882,7 @@ "wealthbox.contacts", "jira.issues", "jira.projects", + "jira.projectKeys", "linear.projects", "linear.teams", "monday.boards", @@ -16047,6 +16048,7 @@ "wealthbox.contacts", "jira.issues", "jira.projects", + "jira.projectKeys", "linear.projects", "linear.teams", "monday.boards", diff --git a/apps/docs/public/static/credentials/atlassian/admin-scope-picker.png b/apps/docs/public/static/credentials/atlassian/admin-scope-picker.png index 27b160adb1610f423bdfb98e9640dde5c5a19930..120db7118c5a80da8a0b057bede3e036fba01659 100644 GIT binary patch literal 141218 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 z zkbKr!5q0$aZ&iWT0fT=~mB$jDUD$xAo9yh#(?W!Ie{DNw9pxFPs1Jm&61}Y_5sP&F zba9Vn)EvGDzIGwxz%_O((;$6$klw;**wZaC>vB|670}XAj1Mu+^7?P8GRfp5ML(e= zZ#<*3_qF=LQ{sE?T3?Z4(%hR~@>ZBV_(n`A5@^uE8(a7A=}{HhC3)krp3azQ!u`b{ z>tvxzy}rI=H;& zi8T4(Xvuu;Wa9Vvx;!Q$JIi8St8#g2kQHMq{f>wm;WrWzo`)X0Nt_agK*dk zVGSnW=BZ{uo#gsO_V64wA}$G+81u8Q{#r1+8`M<@3n0f`pY6Z8#}8YUtb;j40&Iue zFl@YF)P1EZZnxnQoPP@gT$V$0-xdqY&u$=ysd9u3nclNnOneM{t}4we$@Xacq1dH%f-;inf*Ag-EELmehuCRq;D~c!7y840+{l} z`AE$-YdRHh2cg1uKUkJ?bv=t?)v`FTWBgR3Ci5y5Fg=vD7>9P?eSodG<|vSIsFWr$ z1FaXT_n<_)dfffib4H6*#a|S@TWkQkZxC7kUKMIl#(vfx^oqrT4=AU`revX#pOYMWA zFN->8)h%m~goMO(`8R&#lA5~u;3wjEHS}+MWdGv@fEooPWiN6^V8jm^Z!a4$F)+XY z0DT?carg;|9o%3VFJ4s7>_E5z;^R!JOH2-itqVJCXuNz$;#4J1UnSHJ6*7g}dpbE_ zk8Q^aCxKE}F2ddU^+6uWR~ELq9cK>+|DWP2^a@5@Httc}A4g>$h73bUp-36Z#LC(- z<96@#F_!=EA&9iF2)@@2#&GarWe(%HZ0hPsHoh&MzBOYc<`Y6@CulSf1Zrm8KqQD&{onrx|(By;j&NM$OYxmMVz|ul^_>TM4u$UmZtNNHTi6rvBGXwaLkMhjX z@d#3ncKpBF20$S{iQ$hClh<-cW))Pz8axt)RA5VOFRBLeW3*(>Zndw*w0hJE7Xt(Q zF%i_yXl3XCsC;ri`Q4>M2`R6D(^L=Z0#VkZa_TJ?NyF`p2b=J{Phe5Sc>4@5hEZ8Y zI0bOrKME*Jp~kt*CajMGXy^COna?Z&jsF3X3Y|eCB*}M!YG(9;Bz2G9-zE;{|z{PXXTi#CihHFbU(0NwQLd_dnjj{*b)qbXP%LQXWNQ+UWCfd5W-1Pc-u2M3}YJci55xmy?>P?`=d zAnV$ID+^G4LHr&c?EE;&98?C9Xq zDf5?FM~u<<8N7e~blL|AD_VorU14v6?ds#8?xD-nH(#O5d7&e!y81Jm4mabC%*CqG zjvlF;#51lb@A-v~r4PD_?6w4sDC=)jpQy$$EYBib%UCn<+1S~CH@?i#?(QQIZdEQd zz@3Rc;heH9x3^o-benD^qBonYz-gB>ex2FV+#;Jfh~tdU!$Bgv{oHCyG8s9Gu_T%M zmb}|f3DpKAl!}YKKe%Ky)>7B(bt;`_GHu@^v9-ta+b!NG1YG&EX2O%z?ZNLtc0xjV z0TY97PAE%8NFKiJ+?IC3J-*}iN*FVW1+8PWs(IcocSVIZd4NbSV8=@yG@iKa2NCozT;fTdGQltkt&GFqC!C7Bf?_4H@~`e|HXPtx6nrw;|Er4>{X-GK zV^<+9%;Wj4ZMIENv$2W0^sy5s7eJ=ZJ<{y;_Sq?G^Sj>qC3{~&NL`MrauGs;E4r>F;$1O0Y;1}V> z8U~~Y3K&cxK7;rJ7?zydEPO}{Mj>qv=PE;u2=piXAPBB-sG?v;?AP&G4B(B3!jk@y zW+kbti!t5WGOOI-PGuO1ln%Bm??1J`wmc zLZMW#N07e#`g>2M5CY916r_+W{`qksu!G#3!{Tr8fdUWjyYsdVv<89V2sHfg9B`;5 zP$_{)k%^NtjrXmNg+(4n)&i-ZD}y^*Tzv4KaX6abg%A{p?$EUju#177{`zQG8SL4p z@4<+KL&g(Kyp{Oq6_ct=KSCxG+>Z8+4lNB0$Qij1ox!CuRhz)X`;Uxh=fan08 zWPNFsLs+;T?o`*t&I15lebS3ezW zU?|ek)qTU83?-MK=h+^lo#}er>BifpwKWn)PmnO9R=PuYyN@@Yw)`S{l?x$O;`M6{ z@0$(qZUP~anK!gxCj?G#h?#jg8^`W|EXgS;mGsjGv>U-N2;CfY&`bfc{fS;!+rM=I zwlH8VVOST;j?IM>$z<>(NdZ(AIB=5*KntapFB1()a;Iut4}qB2nk zq#aI6kZQco7J{IIJ_o#yP@n^X0xzi_H6J;SsAwZJX?}ZVRr=Cy=0hDuuP5*^7rrQWcN`l`!YtO81~{ZS}t00bQvn^83QV6?=Oxl}9ZrCNL;jM9q_I5ple9 zgfboQ>xd-gXI?c@Iv7oTegJR^blLPTHZNaJ0GvP;=L0*E;q8Ui29rB1K_=C&lv;M& z>^wY2u)csu0n+OHWXhINA+f2gfH3kYc4ZM22` z+~3xQ+n3fza_?UBmoJgh!r%kFy7K(S5HuT{&#f}T)AA5=Y8whrcu*-25Fok$>;$R- zKJZS03=q%C&!4*kBMve{)@!DxwRnIWH)iWETY_-m&@&+RgEI4-&10pD$j9dvl%9I1 zl3{HCSOq)D5?|lz$B=A4e(Qp=JH40uCaeb@aJluQ1DN!In1=QXGq|N6yNQX2J_LLm zXZsI>y#q?Y?aejpH8_FB^S=*zM&Tm?{29D_`BGoM-eNFwxAFD{cn@$_aC39h(ERhH zqxc(7mYMzwi*q8dRKOGn-*WL#;B9smPj?yE^GPA}!D*jvO%eifB_|K}YJ~jS!rljlEQYyi>AwH zFcBAThVmTPxsh~nq*$iO?GuQgr)z^t|8yWw>mnlFju)pYUrEG@!8ojY-C*~10AxNe z4^i<1#BcE40^@B49}msVjFC$`WQqVU;ZXmaj&Kve1`AxtywMo!Ar$PZzddqrt_Gzv zPx<(G7|rSX!*q%oWTPhFfd}ErTUnK(qlbVHw92;w=o^R)h^%0dgLWPjS64ocXOJs+ z;Ah7c&Y(Zk;yZc>+M9-oIvUw=MXhG0#3$t6>FqZVY4HM&y1&Vbu5K5jaLIF-&aQkK z#^@6cpsi%%e%D8zOUar~pTbH1_Pp?_zAB>xal*0e>*`uPE2bXq(f3nuTz5xk-+d#7G{)ZIG~eQ&50-_B^;c+zA;Xxw+8`}WfI!gTady~Oy>@CysqjOl-~eh>fr!on{4iF7G;&27r1{6*)Yx!ny%Yp(U@ ziUWzFo<8`|Z>IR#Vo)y?HD*gYTc zSbU6$fvxI#d7>YG{53mVQITG4Xmi{a5Pn>OmV3S5IIBXM2rUnf5D!nC(tuf~YF@V=Fis4J|FG zW-&1__L6qc%>{g`Mqyk`%prL8=l^~kUf%+h7*spBPw+`=QyCU?TwGj2LRWA{I#ROY zM#0>C{rYOJ1s7cK**7-8zu%*zyfM5zHU#Gw)E8Ma%2p4LATy_VU!b3#0(<}}Zjid) zq!ik=ruzG%+}$92>lqo%&)wdf!WJ*ouhpEqb65PkP7!#*@$vCN?1LN*^@Q{XTh)7S ztgL|I_-7pkah?j2AGB?rjkUG4LHQ3S4>Sl=>7h|kl`q+TKZfoJFfaU5oqxX7O|jME z&~kUb0CGC-X&eyljw*T9W*Zdo9K00*m#KN12vrF*>!+2DbY57c6i5q%DOpTcv4GY3lP z*W?F|o-Jn&SWIM3Z9pb{J(;apr^HZ0S?O0wdkud<@p-oLb z%&f`LEbl2*vboqi*(bY3Os_JYU@LH`3y zKeUU%Xf_mNWGPu$7}i3lHKJ4W6NuLlT}|+`fehm8xj`m@7XXc1R~MTlfS9czp#hf* z)=4&EOyV0r9wsIxWIPslWMpLb@Bc%Eu~euiD6@?|X~e-GJRBZo4T&Hm^4XgJoeOsu zSSUq7d;-&Z;Tcl=JUmxTzLG+mIz=Zy#R8dYTq#J84p#|Ibq!*rQ4hEfXr}4q>H$#| z_KIcOL&o-R**j?EI@_>LU==jNv7mXr0Q3)VOtoHMqoJjj^=xffe_NOLhyfcv;7Lg3 zu>Jvb^Fm6X>w@Qwj*V?tVWntiw>EckqF7>JAA~b{Zb`~x@yy{MvDrU}*XrKZ>U}PE z$C>XiA^-$@z)BInq;nDplWUZ6K{Xfhxe>y)p$T1t#RaT9T>k*96>zHT2}R8;!#V?a zvUhk0K_V5hIXputkjim&*uz?l2o65msol-Y$^z$kAiXA- z`v?fsbaX;@Bgt@}xlSZ9MLC6U5bT7FS1X+G!NEYzyx9ff3KH$v`8j-^DkaGFzQ7*d zD})9Y$o8-kcc*L{-_A7%7r*;1rwsiYV(n3)H?H$dh-^t9SMl1;3V{j;h{u(_w-Y*h z{``FV06Zs906>+YCVdFB)$-~paB2rWx2HaE?*V^UqPgT8UIqjNeE(!k*WKXQuK*95m_894eXN?Wi3Oc&D z771H-U*e-ISl?@M@zyPJbZj3YK7?P%E)8)u;G+!->!P&~o}@Om|DnrUG;-+s5Hfi; z&L9&6ATqTfFgPo@&LIvh-S9aKU{Ywb&_6cbrU&koFdS(pgsc#cR zDd-+bvA!Wno)8cuStn`i zNp>}$^H+u=Xrdn(Fpag$w>|wF#XmxGKL7pb*X4@JTYsI9y=uAYr|#jCQ%>_2g}tL8 z@`gQ=riHQ3c)bmLs;|$82)Ug{`I;X3jp?t}zP)5_*bVr#*6LrMOG%pMvG0p%5K4Dg zU8_(pL$R4!N6YIr%IVf|RQAo09(Db0;7y&6 z!~RODimc7w`W?3Toduc(?1iGMlzf{C1sPL+a7FoFz34r*ayV$f3G5dl5_W%;uwUz; zRA;wlkeXnURfw~IaPV2)<-vurVALOcTZFzB@4VV=!>Q`CmeLi~6XslZXihmFN#3Sa z?o=C%JJ1D5o8d{`CID+)a8Ts7$+{`tVw zbK(fIlI8c3!X5j)jxdM47*6R}FY+jLe&Ptig{8ApW0HCUWkyx22R1xp*eL!(y1me= zu9~G)Fv=2wrY{LK<$x>A^Hi-Zt&xoUC|SAb8BHawuBy*Gbi&862D$}@u6$X8;Zeuv zs|$o^v4MR1A=ZvCrDAW-E&ZE9rmt-Wb`Cn z7H8IpEZ0R)4^A_`tDWf@2ow?5jeYDoT`gm?KyrxBp>9&mSU~j#!2#v{IRNF@xL>)E$_|>U%0tQpN3|<_7WpGDC#W+tE6_FhP`yw z;MtnUg#`^uOAm{#2Y{X;GOO2;RJq}O(k=8%OL1o!Po3Dl#Uf-h^)t?6I*3opH>VkC zFO(^gW@Z)^V%_ch9d2JRVnp37k7b}JAG|6JKL5cHmP(5?bJIGa^4B>4;sV)7ooxOh@z!MgW<58}j(608MP*lduza-IFOkoiRT^W>#dR#^mo9f za;cGrpknCaBf)bvQvYVLoCl65%^59>WULYL66~vM*j^G{!-$6G&Tt4AVw&Gu6220$ z60&IALjvK;*tYcLo|DS3@;OEqwMthW)tLpk2fZ8yC_#>EcpNv-%T}h&y7Y7CQpII{ zf_JT{fc({d^~gHL+uL#!ipO9l5^esu@uTVc)OHs_K>0XWfLRL=-1s9at0vMcJuM`qAEv@62#X0){=I22tvgMq*!iZ&@H_$ z)2E#OERqNzM=$kJrug46A{w_=T9jhlU|D=muL5KlPR9p7OxF<=|)G+;GiM~WG)A5)rtB*00NXhJ|-j4IYtFoEA zgPBpnTBGZ$UkZBTaft9ji_Q9vSo^xQI1xh8ULtI5KbNdemg`pmZO>MXa$GRo33bBP z&Lc&_I40Ka?#4)@p@j+c505g;YLlve>{^e*);%vN+ws(4rYDVUup^I}ZH|4k%48Y; z>Stri`1(QAPLSHujXaxTEW&ipyt2JG&rg3!J4Q9h$ZWgfp0v6qP( z+=`8~jZ@SoZJK0cp{%ET@P+yrxEX-?d||nc8Lk;2j=VoA6G{GI*4wVi!=v!cDi{jk zixA&>cl}Q7a>CIU7;2{C4*Vrw_eF*`XQ3fZn9MN3YIlI7`%I5Mqg9s~^-)@B+qUzt z^}vgoev>$*ry{#~;kUWS&O9qRpLq4l8M1rP=YpMOsJ!Yve#ARM%5!8nz2Pg_;+*(m zS%2xsN;cXpdmUx={wGyUrsnflOL@r*r0v9)?{{&TkH~aXY=fQ;ZlAPvoc8wiO0GZN z7IzGcqicGE>h^;g4aMJ=jA#IL@NxFn?eL&0ql*+Gd;h=fxY|N&{N^eWN@>2(mtOLW zBw5gIIaJP>8>vKYc`8k{C<5D@4(NGA3o5+jL5qcI@Z+)5_iKEyNftM~Z5r z-`U&xfy=m8ZXE;pQ?*eB6K@@5rf$OAqo&S=*9t|{4{8}Ww&OoO@jQsHYK_~MtF9;1 z!unF4(~%ciwg4I*< z#_U&%erwA;HgayIop0Rfi+4VKoZ_~3J8h*e73GXl>RbCO>JcT5aguGY~fut?5M7xRD!M_Z?*2fIjY9qNN6^$KM;(3Nt{;4;Vk97yX;ioQL_2eNiug(evx6t zMXqb@laQ!c>y`+d5q(e8gM>+Qhn=XFRou@F)h-fBy9<+EvMX5EZZl2xZuVL4OahB{ z1WfdE#W8Cb`?k4Fl}<~CQ4~6@#%+~O1Fl4tezr#H6Qw3jS{_AziFr50&=W@aBX4RV zd;&d85IYG!A!YE@@~^2OLCP5)uwg|OWz1}Le1{Y#6+)`tPR=6vSQnzu89ECQuOX6*`gic z$D-cLUEb*3?zl;%-W`u*TIWaWf&yy2%>^#CP{~y}7E4!Ex=qve{X&J;%(qIrs)i>< z0p!D1rp|LmsqOMQzRuoxWw)gnNT0>gl80Y8WSl~C+vsH0!z-q*EHn~1AAwlm0Egy?#tUOJ?u@hCVNvt1TE7at!~PAS$4GP~%+QLTBG zAJ~g5(olW+IV2fVM&tQbN~NVhw1(9GNe8)$4E)ay|3L@A_E*O1MI0{M}ua%WW(Nv>RXr$B8Au+cv%NFz-VdSm zPhfr*d1<*@`EsMa!<<`uoof5~MP_CL+S1XZm)XMskC9&1xl;Yfh()?HLz7h@W?Jt^ zce+qJLE(P7;{~miY}f+%=K)rypMIYuUNC1h48K7ZZ(3yui=B-rGhWG)pDAW7z(ti2 zSY?@F%qbcvi}{IKbFwp>I|u!e_QrvVn?;EsFL8%EyevFv+S<6V0`I5iXjP`xWeS(R6JXVweQ{(qw_JM6Pa2hm7d@( zS<91Gt!4^1ky5_S8Q6(pJ3Wt$eh{t_xF(^B?Z(p@aXS?g3EA+|@NgQ1TV(0a?yNT3 z#ARXlSs!-9q`jPxdNI!W@z9TL*Acz7;Ir;c52CB|L4$L9H{$;L_F$tJpWh+#W}TO{ zDTPvtVlgRM8@vsitcXhwU5J;TI$%01n?F`1O~O!kBxWfRgxyH!dZ zyeAURw3dHt8duR&r1`zJ^O~Xz*Ybz#Pt)c3@uP^T$eHgRD?{fK>3_6+(xB&+UQ8f`oH@Y-u3ugtu@(YnPp zE>@}9S#6BdN_ViW@!$-N{g5!WH}m|=6o_lhItS<$oN=N3A$BA4FJ z`HwCO^rl%n83)>Hb=A7|`noXJo`^(S{;9DjIZ8_06Ta*69j)Y^en9YoVYnK*UyC*4DNU<-xsJl)kR^Q^ZZ|f0&m{Z}8K#F0k`DC! zf_Dem5g!%?WMyPw86fx~8X*s|qZ#0>+zxyWUy+V1T1r^Paah#GtD86OG}PXb`$F&A z(c2Z-Q|BiZkRC0jd3U+ekFG4*6C0_H&=rqd=(jJmKAZAH5t@|sa|zopnpOIM&vg}7 zJV_Jog>-jNcctl(4RAi16TBqcwf{8LKwq+qwE9r_6N!Y=oVWDz_f=|Ua&CtlgPRO# z($V};VJaSdZJ0u`J3C&w7Brmp;a38g!x4#6wcq}gL`+?`mtyy=&1X0_v7l>h|3aA6VX1LkTlY%YGz1$ zz#wAL$U7@^?GBwi&`iQrt^V3Gt%?~pAdsEyRKETc4<#J&ROI8{m93VEnjUq-Ves6^ z{yytfyojIoaUboh$U-HfcaQm`2dV37(1HAId|IW?oX50aqnh6B3I1B}&fCB^<$MqP z>J+b?y(z)ah83~hJtbeJ;(g|Rmmf#E>s?s4l`lRoMg+KQkllvbwoUF9x5wG4CN!jM z{MWgu{O2TZRaHXD{&TMX^*h!3=dm!{_kS+{K_j#9zb^(}Y(q^aF#UI7|NRCLggB;x z|9!K{K4PAf_Wyl)D6SZN*Z;j)!xMq!|89*+#v;=H|3e2bG15zY{7tnU6LXd{yxNQF zY4xk)%K2|Uh$;3sqzBNtT5)l?BG`{HxV}m%FGe8!N4PxexAWfSc_ zN3=@_9_NkZx;&g$e4UfrS!#!}PrzQtdW=oqeiQlxml$0f=PA{J_#M?{dOTsur!7^_ zRtbE|ne_zaqQ^H^m{uWwD5!53tO;!Pi=T})Ni94U>6QsPIhZeMMz65bzIAxiZvnQC(~VieNZQ9A_m$T_84 zEXh$Te7d!k#SiJ&RZesC$&VcIJYqsK5PwZy*3-nDIkkaYg3#0z;^LvlP@CikyBnX;Tu`n9LYMS11??=rb%Y4MM&CB?+j-=|WSmv!BK zboBD|I^+2serG|yR7XH>O6Y?HWJs_2*R;;ZK;^w!O#eqYB9A+t@qQG;qr>Mv@{l74`518;jZ3BABj&b1I6^KW>~)|n(w?{xY)|p_FKNl| z=gW0^Dg>lR!F6~s)bgpMV-dH1wl&#=leLNIy|ayOk5|qs=;bb!kJ=6k6*7^r-lM)p zqMqr*EPPN$={7Ddvi=ZLNiTXdf6=wxz%(dli1y{p@;7`D?>foQCZFWBI@QBQu4AV+0aR!=i{y)=RDk zfk=UOaba`Py52#GUBr&pRG3FuTt3*^g`_~4Qk6z2TAWa~$IXsp(B9Qy#BN}f#WUhS6 zhm^)F>fUdg)+=N&Lr2Q5CdGz8`!SQ&s{3_E>grt-y2!&Cbk)Cf_vJ%l?{Zc7u=e}d z-`q;AE9;B6<5)k|az?DGGjjU$I$cFt75}gVR-L068 zs2&C+2UG2hb?JP@C3*t0h|Y~q%&DkiulyzNr-dh$IqzjFB6SpnDQgoYRF$pfrA&Nc zb*C#_6J~kJ`)GWXDYtGm>tK;UWPIPh|9WB{cRBYouWq6hH@j+i^t!`#P1IYmUzPP$ zAP0N`x8-1nX|k=JkClCAo2lc+xIpB2=gIeL^d9_U^qpmH{;9zv@?8}2;}n~sX3}Yo z3NCXBBbBvBpSlqVd*>fqbw!@-u(~rAp9#xGi&S_n%X0wA{Qk{A-w`Cs)p1#Fwy&BV#dARpmqj4l&l(_s)@a3wKF?e zB!{HWf-#70iKR$uQJ;8u-CUiElVY{F3Q@+J)*Eo{^yN{=wQ1dr)j;=~KX%uShcCQ< zxeWqUw*$@BoX-uB2I=h%@AxmiEC$J6F$gV66*!>s&Xm zXDYjf#$0WjQi?vhC1cd!Td2l=UZJvt5QOHAI?YkKBY1A~tMJ7GTmxyjAL=wxlk3i% z-+CK;jY(oUvxnEiWtJMB-`8pjGUg!z3s~oC6OzB(*bD#mLU5Ub;<`h%QkTl9iN+Pb z8@DPJpVQ)U{?h8SlH-WjRuw#~3HSK$5b2nuAY$Od;JHl018f2yClDy3s%BV~9CVKJvVsT#%0n z!3iwPlhnw3EojFQRywr}ocW4_*LsG;UEl7N$7B&Oqy7ntXx_stiMB>z5&rq#{~Swc zB8s;wZj>H4qo+QG`)M(VX;d(ZJxhNj5dWH3lxby7qd@9-?tC{=0JYOx$)H-*6?OE@ zO1oJ2QAn&j9YKj7w=(yEvQ};S7&Z!O;`XmgIrD==>$*|qq;0?1o(%=cANqD&Mx`MR ze*KO-Q_?XJG8I8tMG*cYgEDIR4@I z95@f0eRlWWy)NPQhJsPVS7^mt9?@DHT6LXWI$5~SHVtT6#layaj^PZMXFqmKoc$+9 z(%B4(Nk0`fp~`SsFzm2-Gx_K~P%BHMvf7YKrP@{v55Dpg((x9ZlS2{Xc-tf=L|wq~ zc8~U1y~;w63=_B)9GAr?f>TU{ME)@@jucMEPuXA29Vkm+BgAe+%M^5Pba44aGtD)T zdY;yT52ltBaTv8YHlQ5cZuX*qgGI7TOWBJ9^p~37;ywY)F}TUJ%!}kKPa-c7uXONV z@bcL%x`r(>Bp+16^OKI?heaEfDQI?_kn>5YT+Xxq{rZCMTH=&=XRsUcd$1EXNGuAi zye6PM1~v))D?z7i(0GQD)&->Y^`(}CW`$j%66Ijws=N`D>~DdASsFzC-&D)_>`EYdOHsZyI^TBSci&{l$@=-L-EY8{KtcY2cR)pP_(bLvm8kO?*jg$;_K>^I9FYRIKJt zkifoHs@RsbNa5$++L0GTw&BkWj&S+e9_xqjvmw2o0e;HwmSF(Z+wQ?dVM4RyR*d+c zT0S&A{eYHYmtW<_(Tnf5T)qGf{2J|(vfJZ+gjLbGvfCSmp~7p#flrD3?w2rH63IIq z#ORLb{Vg!BVn1n^1Sud*Harp$PA+t=)1eF^U0|_3xVGHY(zg(Dn@dn;!FhbHkCQ05|qKhrPfyR6|J5! z&+HO^WJD-O%nhWSgF~~`+A%s)LLGepz3}x~PN9E_Mr=|lPClGg*2{U4ra|e5k8*2q zQ6I*KgcF>X5Nm_#u~Th-2^?xM!c&)ESmvytj`=bcUg?!CcS=bRtlv;mQYc_d^)PFDMph`ePX9O z_;yha1do54nT6=a|8b8KMd|&B4#=6od_2WW_$J)LLxv@=Kq?h+EBi`~>TNQjk8o|U6)P2}56 z=J57!QF&`GJCzc>ea9ZPZ9j+1yU|*QwLnxiRhSS{(-B2JE$UvZW&xQFI=!;i8Xj)e6xrHw; z{9O5ea<&@9tbBgls`j0xFioq}0CFq0d>=*Z?+sDQZrS#(s24L<^S?OJ*?DxgHxSnp zrk57UZ3JAzZnH2=k0qFL7zTmOcXH)qkZ<8Bc`p-RV^Gl9G}1e1lGbmMM%i?t;VuMb zmBGE0A!mGzc3w-~nQNBtfy4zmt#$LMO#U%U>dtwm-~6>TRD~QZ)2;0df4N&!kKoi$ zHCu!RTQi+RGFHy-cHd#N3dFB$fB3TqGS51_!R6owa`Ya20iS0O5@U_tDri@bNm|e5 z;ztXrH$^AWeInP1rdwdYXwPx?E5-*m&wZsX>DVblk%rWe z{Kv4~$5JVsUcdO*cNgpUtXfo0y|KzJk5`^gU`Q4KF#t9K4h{}XDFb4eTGC+fntJBK zII4Ay>^K;;8Ou%yVjiyfN*iHJ6xN-W?Dv9p@nbVe;xe+wvF2L<{xIKwln#=xss;!D z!YfK53ZwOjI~kg0qcjDh-e<{YJi2NM^=$Htd!fXEnouA=Wv#NgylE~?0kZeZa^Y+ZTbYR z2jz|o#rQvAb!+^WzW9OVkpvhg8a9J?#e7ORhJYJveR)`IiA0^Sej)3}QfpR?w2pP^ zuT5j?BlOn#1{K44hqyNSpHq_N93jV{UONp1bF7%3*juibwak$!6en7=D-=646ziM@ zuUuXd$DRCNZF-HB8521rS57ucJ5?{~9h%z^ze<`NwT>V)Q7WGu)o2mHD#Ku`Z2x^e zqH7oCe3N}FqNiQzY`L7@r%Z%`g4yNHgRVyy-xVTIIqVM|&})5S^ZQ;`=8SR+@l0Qp zf8!OmnE0<}xMt~xTX)||Wy5LN*?_{Jls3~jdN@&=+0$4QB4gdos|oE^nYg_#)bZbX z$4Lk^T5|g^?AaWyB5eA9OpzBWREj#b*Z7Af_{0c^pC*!{x4ZlUy~({SI04BETD_(O zug~NOei%|eex0Pq|7dR0j&mA((UNsBlXzpq6a6bP0QD8iGGymx)M1`2%!QA((`&*X zPk)a z@=ZTPV?J*LRo4Ea0Sk|4nTwXd9SNp2f60}9>JQdFH|q~$(aXALH&DU-&~qx8&u{Xc>c`nD;g zvqyf7=Vy|HR@5Ev5UJfX^!LJS6k9y=V{+2ylTeqBT} z!3}%9jZ04-{%qp)5FQEE5{Pkd)YR2!^0_#6cpRwX`!j3bx+l#p``+2^%U* zAhL&mjj4sXu&UIMQxr}_PdXAPzke-b%wXcCE?C0WN~b0*Al6RXeO(w_=5VgjC1BCf zuDQ~+RS^F+85UZY#qJ^z)4TPx1>JSEFR*j;qi&itqlUnM1sYO{`Q#C75PqpLWW(VP zDleBDhf=HpQd1^=?()eW_oI3W=a_zNt2se&Zow7Zq|qY>G^*M8udfCjzt;)dxv!p> z6rl>SeQGi3*}iPCkDhrGfY8R}9|F%RNAhbyBL925>5W84_Kc7;7d#KaugTtnqv*~t zV)DS*kwbQf3EgUJ#hcBGhQ7Wu?cEfuL%5O#{!cJw^{$y88M00b1$7E0du_<88rH9N zyY0i><1KR%op#NL+mMX#q!eC*i z2py_MzDy8JWJf2_7ODJV4BvE^y3X%b(kYjR|poWHQMck#VJvV5ZRs*ffYa-=rT9yeYfKOP%{inRQL z?g^hhNDOc;5hu=4VTU?k4E@$;34VMG+aCd_68#wsMuoXNr#1-d1|wC3{j6!nT20yg;yu(C3z-K^GjP|c;daU z_Izf_-z|rQ4K>4O9kLqrW%=U1U||z?KPe}JVnD-C=P(&QCQC;>A_ql4$ioh%8(2U8 zV62XVcP3p(^#k=4ZsAj%irmDJiS+A7HJx|4qvKAfB&2E$(?J0i99avzQaveiG_I}Lm>DdOT`Dt#_2O9Vo@vk;SsaAnM zg?>b}Q;D%E6boP*ikgBBCFUcyw_&QLMc8fn7-bavXqyN?1D+ARd#V~{-Mr|Srug}Z$^f{m_Au@7yrHs4ois9-?p#~ml|uM z5qPI2CkNipBEzk+XRmL5LkJR&-6B&VYmwMaR=B$v64~C&q~v!i)<6k-SwPddK$ zzRqD^3531dQGQ1=gn&kel6F`e)}*;!(u`r4ByPoAN3W;xMAWfc!+Ntc@*s?`_1ACB&! zGdAv^CXT^{E6&=9tg41fJuph>Rp*3@AzvV78kIR1LR;W-Yir)lsm@3^@JiYbr-f94ey4hcZi_iQ?t3|yA9(C$P6kwUG7~rjEh=0 z(S$_4hhiFBjv+4(_b8RTW-2vViZp&8P6|Pu2-63edwzF#OB7+_l#iXHsqn`1T~y41 zU8M7s(XWy76S~u>)oy6=mm9AvNlV`b+N!uZbo`$$Y7{*vKG?*!oCsD=bah*)k)d z<6nO1-+U%43TUJ40_r2Qs373h@n?y3ZzjEfUek>(nzYPUC1u=K+dMC|0|Jz{juZOQ3gi$MakD-aT1cnRe z3j*Y^I1lnaN@Imk4YRNhP>Z8*N`A1&j@?B*z`eHavR)NANQl*O_NYZJfcNx{|)Ufe5j3>L~^A-4~*aaC+c zP)o#o4XNZH7M8_#PMxFe#r7@JfzeFHB>ZTYBEgNDZDq5X_xYTk9W`@s`f1UnYT@cd*7=c) zUtsBW>RAf}V~^t3X`(L`#%5#g$qY~n%6@B@s#W^f-&FE6*&)SLse3Iq?M)*yA~ z8;2nv>@;?D;Q#^1XCf8s!US4HvAaSyUtePb1JU6NP{vXSxkA~>wBLyMKAP$*+=7q{u5!?(U){o#j|PRg9Ujq9wfG*8&>ZXA22rQ*PBOs1Q~ z2vo>)|12V@NYwXY8GqP)Y+p)Ye!`DHO0* z%m=o(dwO~RbqoO4TJIa|2`j(lvmtl=xBdrk{ZML5`<|qakL>zD^rdItc6HV1U9GdU z>b@0|^K@jf)fcl=WgJ9>T&7jw3Fv%#K#2svc3=Yu7yyw}4*}lczF4fS-dy=^EUN|B zguJdF5!$^EXOF?clOGX}^<|A2Yht3h=jE-5lM_oU&tor#ubP%tQK>b!ZD1d=ii-_+ zVZeDEi~}H0fL-=EzlWtYfJgELgc>8x+gUw(&>H|dSU!OAd)oRhb~wfGL;eUYA6)a) zKLsgloU+<4^#(Xy40VxJ*ZfbuV*!qb-BBu?lr4t{G;;*BgGkC9i3~O(CW7-k~ zuT@?GxhT<>7HqatAAH@3{2TKXBh2DF@yQ5zVNs{hEracIN8-&@sbe!Zxf)_ii_5`nM!=+K5))0cge<;vM~ zHlLWqcT!L4JUdIbokh&kVt4Y2ruazRb1?64hABl>4^QB|1XP7Z*MG~K>}L6pT$i_6 zbm*Qg7hOX9<2#I*LE zUB>Q@#mWoqo6&oo$QiH{&S(C?*06S=c@~4`H>j0#s+ArV1L?3K-=g+b%Qx1w<_C1V zH|%M#dX-zQ3?>(R3w~myJ3WcBe)gr@&brlGO))4KyCLz}?0(C*MqF*bzl^5oTUgGa zz4G{N?FDaA^W@{lS7-&6t^ySex6)L5_Z`L5UnlDK`>CiNzhJ~jmx z!dpqkdT3Z;8};i{tM;AL7;kK}TaYU-wWjf0?1rIuJz$8P3!~PH@;i?H zCUT*8{+yRt5KE`7Df@yDh%bj@-!hr zdGXD`E6Pg>IWzM^e~$7S{$-MY;tK3FpE;%?w-B37&|$>9S4XSWN{WkTjYA!EF01M;u&*fkCFC!yIpl||IT+_?_>hp5| zh!T$OT?a-Ce1h0C5wDYI;{R}dglxCy?P%jsX%(WLmvlm2a`J;E0OAJ_$#1Bs4>o&; z6Od7jDS52FT3g>k1^xklb4o%2Kw%=p_1`R5L^(T!g8yoFtXtR$KqH5M0AoS))lt}a z_mh*;Ul3~n=QlaWFfBE8a(>=6V;~!cQjAHg-C?ng7*Gp<2r5(5hhaBCGIZPA)KpW$ zHjU3-TtQ(G1d6wDZi&jqj(-7N8{j~JxA=i5%MLw60>Ca~5gyuDhCu11qB7`yyU*;Z zGZD?nPi?k*JJ_1*-rAY`XC$yIv3`ftDGVQ7MXt&9SP*8p%}eakrYH7LvxZ;01&ti2L8$LB`4=rm?c0h>WUhwnq<(%@x5dh8f=a?e_ zz-A%m<#7)nX5imDJ0F5zdb8P76ud=UStO@8*bV@$=#L@2 zVSkwIRSja&GlpJCYzO6sOE!AvFT4?_MVrBqV{duhnBZDE?K;4`&D|dKx+ARoMZ*{J zEodXD5{t~Q#ocWBO2!>GK>S0)4QY$x)pKYudHkpQ$D5$ok>#g4#C2_+%aN5ii`$>h zs(BGXgHdtcRMxcb1_+JR1W=&r-Tg#`vEGO=+#0nGn*!)$9=>^_x?oSJ9t>qFA{Dm_P=ETa%B1kuyIg?(=m((zqXyC8~^7vWC}CS$^A z9g!j~=iPA_S)cCcP~%VrvcH-bbsk*xFJJmgzjk(+L_wP$;c0+G9CWsfp20SbNg0aZRo*t3;l}5@G;*rN6#F`21E3iF{z{m zglVVCXSxDpC5C=-pue77e(^dn=YYo$)pm{+d?M?D;X9-@JDR~kE2Efp*p67VxgFa< zDzV1Z)tGmZX`e;FKuu{?d~HU0QuHjx_)R-|FxOZSF8KOq5h z)(R(^J|B1~kY>Wi{@!EqUSwc<)|qzNtIFSHfvCOD0TjX=@7otTS@$nz~mK!tiavUo9cc4i&E0N0BF z`y3yy6YP8NWT~q|-wT7M+yFFY(A>(|`s4B%0I9gG5~+{@((vi&)GscMn9`dGPtb9* z2XHe1%d?8)sp5X9S2dUkEz1KX5SJ2<-h1OF(p3Qg@n@@lT#X7knUBRDJpU973YYHc zV9V`7wsj6%1vOK)>s~?EKSkBQYVQ~S^&H=9_MPgq<`uCcwAE1F5TCEZqKxA;_P_so zSw=|+gbCSb@Z9Q$h6d#Udn8e-fP=7-8g&b4E^=kB0-1vhvfhmu%Xb4J9R=&I4{of_~*lKtgy2-El&j zIi0Y^Kj}|%+|3s~B^m~K61aZy_w}$)AI9V^jpx7f1;e@o%!`?QlieSb~>cO`Ism#9;_4kA&A=0iI zTjIJJD2(Cxg>uVu^XK6JiPAIAAS5udv>hnO){nLr(4k>*V+~k#g$xny|M%&{Y|QaUtv=EV&7#u2A^6X~o%3o^)XtjnAJ(+4QS- z_GwMW8uV}1_|*C=?d$-o>LQVT7-Ur+)TaPW)h2_}dG`n)90WU;V{Zt{hR1AxmQ2*$ zVKbd;k13K^m><~RBivi8BtT)h-WfqB?{~ehSy-4X9hC}@+rUg|mBiqa@$DOMmM++d zn}7L24gj>DYKvOyzAC*u!|#rWvyA_pu@QT2{5E%Zx@#LN6%M`{(5Dk}Edojg(3xw` z{U?Aa`fhf#TPZZtT!u)G`! z;C(>l)DGgR;RT*_cSGcSnwJ_LI9dZ*N+Q&dsx2BoJv%d|gZlXtHJk=Bm1Q{IkA(O> zA(@-)fj^kxszgw*DEIlb*0-d@>00N|3hgG>gBndPi&4^yOfgFc+;tuJiVDigIf5?t zAo4n5f&Tl=At9f+(n1CgfWK7&fVGFZ`VipT0Ty>s0I*zN2%pNVwz%&E-hqz&1mKVY zr<-7>Yd+KF1Bln2TQPjsC(`X`hFG#O&pRA`9{Us2k516+&yTm~fLQ`u7`y1C;COJ( z1yETRUY^!oDnV5YQd&?+-p%UyHTgW)@smAmQNDPeZ<;+O_5a)a?`OG%B!J&wro)R4 z>Ri&(wi^S$Br?+(92|Vjm~S`;=pZ20i8;rD?%r;2NA^ ze{A)*SkxOQD$$JhbKCA3KD9U=fqL2hDGHs6EEVk~b^COVh*77tN-(2FZh}eon#5bz z1X(@^ujAra6}9hJ%rjz;dA0S};fr>l7F_RCgunK?p~+C(I^+Cu>QjV=W8on-CofXo zL0;xQIyHVO1f8=Qhl^Ox6Jo)Zy?4vB#-lnczqda<4sc;G6e{rxyAL!C-{gjb62Mv` z({cSGis#zt%BB9sccgZRf()Yp4Z;eAzR~?!As*sZ%kjcih}Rrr?4bo zBh-FQcR5`4$a#97HnSnmnlq~X@bzf3-LK%B=5bH%Zm_ zY@Z7_zcU2de_HB{HeL`S=B!ZsUjKteUW(XjLXCQulp7>zbu`hc82E}{N_LHi_aJ-R z-&M^DIgH4k1v8bR&Fl8QRtqSemT#-R>II>;*w^Gli(dL3Ox{Kmr&7LtH+1qnMgRmR z2J)XXo%aQKd0TN9LrdSdAE$=05?x zafM13)1EE5qkxZA|BjmlBAM6m8Zfyb*SpR@2vup zm+9SXfvV&?R8-r7iRs_=`O)xKXFkeYM4_zA#32V;$;{JLbC`#}6ASm7e=sd>4}Jg* z8*t2~ba{Q;a&VBY%|13VlFj?&RqRMD+kB0g-ltFAbP~X1!A4DOb-wu>P`3X2JcB5A zwBVd0>O-&v&kG`9c4A^`O3DYdYU8<|BH(2}XNr5Yq+~umJDWN3U4yY)Vjw$B0&)V# zpu7d9Jn7^Y>Z}x1#vtut;cb096H=7NA{Ha_2>Si1ysi5PZ zlAbQ&u)dz3zZn`@1dbKKy8&uU5O;K&oUU3u(7=en_30WG41j6^0JN9^cPvj}v%@*< zYcsZKK=J{Q#&*Ed1_Ln>J{K!3ZeExB=bcED{FP6oE1$_p{P6#4d4a?3?AzyEzIFk( zpU&jUiF9NmjFA`rRgfS#?rir2sj&A}jG>rUD0oO+-fk7=sJPSxgPAAbwAjcpdGluY z0ssrw+_x}})W*ig`}4g1GlfhRgwYBE(B@5++iK@jO+FJSw`pafZ?$}OHj5>aXG%I` z5Gg#IkD<8XtZ3^yI7xD3zEn-ymud8>1Sj?xZND6MPvmlNEVd$5vVSAR7&B$N+^r;j z_)hwCj7Jj~@gc_#^3`$6Kvfauo0MBFSc?P>g}^XCKkSqIY71uxs` zQ@&=H48{qPF{E>hc_*6@?t-XXw9*&aZnai#2@g9;U8fiLmJVYvh>f0Fttmz3bDnH4 zd)QwjbB;B~y6PYqV*D=DTgWO3%6BCKI_SuJg8>m!2Tt{|y?n9&{g5J^4ORXK6{*a; zO64q{m&%(z1P4qhLs%yL#wZ8LCS`N+gc+n@hwY+{lGOZmqz>M>d1T|6Tr{w^bWX zxi{f1Hdta`5^^nPRop+l>yMno);iP(THD8F)^%`fSWW`$SEbfXS zoDh3*dfsk<_1{v}8xszZp(yR*l=c-Plk?d8-6WQnY0l9(9_bsQzMyv@BxzZfJ@dnZv z(|>6b5I+9>yQfmq017%NG!LfATp3tZe9r4TxHneYkiZl9qo&W(eN50R`t@%{*TjT` zemg@vFre%K>dH>3S~QSF#j5U)OeuA!2n zlgA?CcYl5i(Z)|T;{ibtmG~+@1)if~p4J_J#n*3k?9kllEN9}!UzaC6g zG7h<$ZZSU2`8~~nP9&7W!`Js&meS`dI9UWGt=Vwu6$sR;BBsi|H!C*)Gy7+8(f8qc zMLY<1)%%}Y9OXyi(0cdtDFBGO0U~t2^L$|0K@stM#Cg2~t_S>cAS8;}y8{LP?$2~DOOcRi(+5f)V1*;oNOG_Usbg#n19*qa$ zsb6$Iw%qbj4>kYL!{+n;Qh-2?PIa7QA+OSN)tCRt!XpX>>6;zv`2l{A6W<>x$j@qP zy{X|G!-cZ_`E85}7j!(f=DV^yq!)Eho376<6X)YE+>c{Iv>Ypz5;EIv7vpW|F7a z#$;rpPED3WLp%!Ed3NnItGb>S0R!Q3e4)x()yD;UGOJj8fKBwB?Nm_PFQZYNfi$Oo zNzjVSxP~xkDJ7J}eC-fpkH{_gY>;F^q`s@R(nL;J)8}SM9rgFqG~nSy#~0G*=;O77 z*XTnlSv5cT2SrMw1iQKnX$eGRtPqpkRS2ctd>| zMQ?`cF765Z+4&@WWGEl2&dy5eUAhT{kA;q`uY+xr1)=3==3^o^-|`-6351CoN{T+7 zFZ`B%;F$e8O5&{nd6-)+ii`YdI_?L3_vYrxT}*ezpN{aU&msQ`I?VBUSotAU8s+@{OCv9 zn_c-Sna<7d^YB)0_QVyR7fQ9I5I3?!xa`pl)ty}ByD|2jJoY4aUHOMj)Ku(lFmu9M zWs7yG(DKWaaT%rKY~0nC+jcm#wrZCt+ThO=hs8%Tj78(h@+)UvO+I9Y-z4|wE7^SK zyC+;#-nC*p_QT8g7S@YW>Jp0%$=~u@gAYT4zubv+Ncf9W=Y2uAsPSSxo3=Db3kug? z+5Ijhz+`Cv%Yw=GMQHZ95_<=zF!pwL=^2ZGQu_8{rwr6d^>b^4+5`$;)F6=L^mLz{ zp?aSOOyEAjC#2mn)Yq2;r?8Ur*qeAygKmE~k2hz!8# z>vyso0?uBUnXOV%`1n^Y??tUN~pb(AFn53P30AcS!}G5=7(aBE^Q%Z^~;NWDkWJ2JPw4 zMBcmUAHPnQmzr!;)t&x=^T>QP00Vz|y6*)r=I4`@2hdF;=Vr>Qxd>$|17+ubZ>~sL z4;0$%-giTwO);{;*>SYI2Uoq?_8A#?4~ z97Lme$7+X-F0tqHIFP*E-=C%>@!x?A%#j8iofNp?z&Yj^seSADZl*nji07Z5cPQXK zJU_I*tm)Z5?Nt1Ft^p4X!>7M~rDZvK1Q|PEXl946-Q(X)`)NXEW|*I(qr)n={w>hV zKv7QI+8?sU!+bArU%x)@1J8ix164mKiBNiZ7Iyak4DB3#cf;TpA}|o{qndA4#Jl{j zc)6j_`jUD3w17LsHyFg#9v6YM7{(e56{*1lD6`q+r}{PDKMr2M!U-K~yA0dpDsYo` zyxZHnQ0Z0mYurzq`dNV8;fAJy30>j0BE0&w+;)nwq*r%2c0kA!GuP%y>o!uej59oD zczp}k5xE}oUJ==B&u0q>ySb!~=(dJ#a6Dy!i?}!aIkKL%aIQ z4k?Na)foReiw0@u=pem~!)J2`D!+G8OeW;8dPonU$233)P0>y@<4@hx9!UX3Hw&hE zIE|N(PE82fl{DRfq7-pN=UOUL!KFjV$ND$2D zuQR}7iwOU!q{!&FceZXpR+Q}bRnW-F)*jFDPjQN9^OZ#xKB&N6*P7GKGmpi1cnF`W zh{ho^x8H5!*?B*$UcX)R1}2!kkeZh*wH7UC zY0I?norjU>nGC&pXgnN#*rJ$Hxg61NubHv_Q9O72#;pJ>w9{5TASnJaa}39gqXmzV zG#lncsJWwh$^=zk4i*Iw5q;x1U41-;!l$~3QlAVbF4QayNv8Vh`ApXPXBbvcXLD=F1t1@nx7#=X8~5v zwu3XCop8`p6QS2$`54oRf$*04VwzX_YkN^+wZ!uElq-EP2q_Nu*Z>jTABZFf31T|}%v4~|VSr8ultt|yD@7L;BxPdR z$OUS?f?9UISMB2*r@4|2$OLCYflwgQ&xir`eug%TFPQ3-qQt$Y6GJRw?)Z?(%;p2h{RYI`Lg$F@9)dZ!?Py zj5r54(TDR_n%(syYGkT$yK~_@dDT+ovSl-vVoEF3gcE0(FeGp^JT6|5r$=4ek5*TC~k*zLOq@bFEaiK zcL79*WMB*@T7iz1Hh(0yk8^SF4Kk)`)U!a1r^YF~NkG&q+K;Yah! zJ?f16p>H9SAr=Pi8rDWvI}7^slJUYs8|vXTreDX@9p%LMrkripsQKfsD9p^ z1-8_%@L4>)lEJ$YY~66J$OZllvgAyC35b^A9kd*mZ+_3z?#~}E`jSww4Ii^b8+cY4 zZlqT*UhOgo|9el1Qjado*hwpg=il$Yhrk`0TZEx0c7CzXPfEKV9Y`m|6pl+(MRktN zaLHMadl5#0s$CxQUXsYeOYlg2PmMy@IG4xrBEZ(agvQy!hqVqVJ~>KZ=4`#X1IfI@ z{}pPsdx{n&N&bXXL463XX4&_3D;SD<_V$2H2Ad}Zh*VgQ_Q10mDGU}ohIq+=e}*f4 zN8TqUV=c>@1cVCC@?eqzNOS;_e6qN6CU%Gdb?9*@+62|R7zK9UQz>G2FF$(u11)VS zO_#{eM4?G^h!)I!OFW~wOrb?Owk93XykHQbH&XMKy4#`gG3?)SWd0=gFeezmniq+_ zIUti{!rSneWG>xX?yS6e2vU(}V?)_`!0R=tMJj5Ym-hd)B?N{_PXouJwt}@)qTIe8 z7E#Gnj~{6TZqtkTuZ14@^39@=Czu%ELF93&9IElW+iMwe*qAehqTqTbGA7fjQ3*BG z@Gw;Apw2zBgsD4i24cTA`^|d_m{^F=H-%n$@<5Yk<+WKqTu9iD(o&Vr&hm+D!%oPT zKm^e)iuKk2w@bRvq&+6B3#_8gv-niw$Nl~kHE<_0$$j`}%`dC2qmvGWE(6b;_ek}X z7kW1YulH_9AS_^Qap7c>hj!@Ipmq4T3(HVLv$->(J&YP_pzKWEQ?&lRHm4j+PN_7E zfjhN**Y6vyxud2r1p2cog<5ig*`sL@SUF0^pX2fR9Q>A$GzOhR2(_g|m}UJ`;2uxWO%`nCYC%+R2%t0lBUo?hwMFPn z2%f=9*Z6dDN$90c(aVJ8#Ji*M2;%zxbWJl)tmYOUW#~%4z>?Y$Cx&n0^=se69Xt#v z6bWN&Qw=m)Y%RE895eq!h_aNJ4ezalFRYAG+XRP=O$DK2Jtj_iyZrk+tBsOPGzIe3 z13pMbtE<+PrPg~Sd#Nq$ucMgQ3GucF-0lo7Bu%UNh*FYXpmBf6?Y1$g3%8!kz~81*fE9~CeXag3 z7|~QzroM=tm8R4;<6KHE5MN-y)P0ngF`UWG=R{6y7pf4$#Pm9S?3j&73`VVitq0FU zQN)Di@bT89IRZ!Vi-*CH480?wtv;U#8f|;B<7SYPT+=@Sclv38Xgh8~#zJS;O@|%3 z;(dpkdD_!!vSEo)PByljt#+WKDLGg{wR}0e{aH@fNSwN$v%Jc!q5r`pxeb0zaQxu< zl`x0kX++DIN4U_?fokj)G#Tb)N}$Ez+{d&nTr-)x`9OHvu+zW zmW&!?9$FGG@;;ZiFQ)08_0c&&Al4zBl{Ilyn^}?yr_XDZF#f@N~r)1 zjbrtys*HO#VS?Pl$`cN&6db*Ou4McUX{+d}l*MMm05ypRinm%8UM^3#HAL0}`K=(c zwzvX{lsj}8!{TRE1SW2Z+B?*-LVj|-z`3k08Wm>II)w3!P=$CYoqtO>W|_PTT-flA zUxjX@gXiD^iIUB7%H06N!vX;j-i&0!1B>-eKwqs>!#}1pA)e^75|){}CATI7e?pTg zzm>1cgWqzGZ7len*K?$hmR1pqTbN)6*#W&2u)Xg%8PSB1g@gG;1_t1)h5}FUg~i#i z8BikT&@tp9Zy*_}a5=V4FopRu^*FSBKUtxTUslJ4rZsA3rCUO zXhy)`h)W@UqQjdYh_z;m`}33wN6k!@K;tW8&FB$_hheD!N$tKi4cZDomSi%T5bkGT zyKnTkRI9;tmu&9mP(ycMg9P_YF~|~=nGMnGqn@FEp7*WnQV)MaDu_@JT!=QwM2V3e zOo_o|U(0;HFPmu2FCJ|9$Byn+(lc0H2Y-jc3XLf`n8{w2DCNz~w30so6V42Ao`8{* zh*Fh1%Z|5tqn*G#f(I*&wi@gLJM!;;@X|9YeoWF$|46^MsD^Jie1bk8i^)z$&kv2e zldqj(sieQFXl?CU2y%9GyzX!e?3OY?;Vx>A%-=YS{r6_2;IJS6_EtXT$K%bNoyp!BV6q=6K(i=H{!y8*dL+^vAa59o(#c}>`?<7xRlZeo zW%*~-P*}QgNr;2VPp0vDSOn;RF?2M1ziB!{MSR{tSS zi`bN^bz(KPXB~!=K`H=8DNu&4s6sMd+ejKMW!QYeRYkn8mDW<`7|{_2+Xn@QrZ?aE zODppK(e~c|SoZ(_xShSS_ue67j|dr=+1XoUWXs+=D|;)FJ<8r>Wkg6uh>*R7_&&O> z>-GK%KHqNraCUZ_$MHO#MGwQ%)u7Cs^ zl-?}Gu0m$?34_Sb&t@Cz%+O*L`A0I#7d9%f9doFfhZE-&Q*vgm>tr*`vBP%>Ux_d> zC`fD6@ZX^uejXXlRv{}K^x+s+Y5!7%0o@Hn@1wbPzMB?mkMc%WwM-J9TwQ%RAsPy_ zrX}UmI|)e#$%l~D+jcXNEvWGcIK9Q*X9~5=FqKQ>6-iJ1KKhW4Gmua00P$GT$bQS7Y6k4G59-1vhk(JfP^Yb~5WgfELPvSgdj z9%Iv~)wO5Ut-&lqvHUjpixnDiQ89WXO4s^JI!p#KzFQ6`=u&zNZy7?7Ed{zUs8*(t zums|iFdr)3k*NuemUIlzimPT*Hhma+I>}X*-@Qpsh@@eeBz?q;#zt{Z9AO{0nX2FZ z2*+))M|Z#8ykr^@=lPhVU>Nm4`^3@liILF3T0W(p+iBbgUVQorujx8QO(EY;%Xbw4 z{=YYP<6JlRxGi@K1C4zU;)lCM96mMS^mN~=zgy9NMKig@!#NplHdxDnp5#h>MX@F4 zP<5RkOa7)#-Eu*IN$z7PS=L?WNo?xdw*67d2#+yJZc!bOA(vct*2~rryzugJ{}vXb zE2puG_KDra+|_|6e&Jf%`Pe`|^}xA-i*uTEx!R^5?GAd<5wh$gS8ml0r)WBbbJBII zj-=GOTm2SyhHI%ABiY^`S;b7%xf^*_kXEs3$R}Q7KOaY97Gz77?!x{?zS7;Q$YGE` zpoqwX!ytgtt&oG0AkO@2hhR}zT0ypbf;VP9+l(;bbA}m;qNVqfIg5mXLgwzvkfcrq z$=3s&eEC_O)dOuqm;=oe43_e|-Z%=*?9Isi?kKNBg23a|*shc18IB%Xs%Rk3t&WuHgwVjJ3 zcbnGemO0heu+d)CVsV$CQ=}Q%m#;@3{EbnXBX>gJhb?QFj9|N_Co?I6=tV0#H?9?g zX6lYUPWYy{3XMs0xy z2(ROdnFWvws>$=+R1u9(M7b`y-6G{$Q_U00$kr$|j&XCH-nh})T(I#C#bgH-i!x=# zZX)U&Ya-R&BrUO)Bbdpehvg?QW-pDXr&!2RE6!kE4ESd6zCZGANG5r{q<25k!0*Ku zN*xRmS?a6Lwt*~OIKsqnod~GXIxjJwmaz_D7Sl=da>&}|5?LvI&h#}?LX(%~zwe}l zQAbi$G(~9gwfDDi^_~9Fgh+X1eBI@mCwkR8B&Q4y(uG30@m{laq|`m7n0U&Y*!|_U z(~SEheP)ergq|3mKQW8V=&57zs@}r4rWJ*xmDl%oi*Jb;l2^HUMCIq*5c8WxXa{8A zew3WO`@EN;w1e2+>*e!u>sWTa>7;`Ukt;nNV$~%athKi5TB|;nLa}yBuCH^nZ$6JO z{l51u8;ev*W*X~i&81z+YhWcJy3kZA#7bW^dw!;~mP@?dVq~OI+^^hm;h8q)^sBXU z-{tQVtOIzi^IsFBTOULuip}L@vU@SMTablkwOy6SrR-Q|*y~iF693WKvOQU(p&`*j z`$i(=s~;1&a)d7jC116&;C?QfkA~-26$Mk!1+9#0y7LzDBVk@M%Hj+cX4r~F@%_=3C7&(wqtc>s{OVEImFwwd+`y}$gW!?l zrRTq`8k3WXyVh8Zl}2Y#HWHFp=&&c=O^1<+Ux9E3l|9Tn$Sg2chL?*Esc@7U1;y6V z%}no$#egv9J82!K63f@uhnk@eK3eIA$K&7DO5_o-ynlP7zDzS~Ah|h=iol=O+f>`O zVAfhQmLo7_ySn?~eN04BB$~D`@+2l1-By8$^!tP)iU>VLTDE2wD$&98mR#{*@o3DU zG>I_XWxz*yUUQpD)-I04GBwFgnjSUgc7iok@n?noaisz7ThyyTQ}6MIQ51V+83p)0 zs&nAivXkK#kKp6fW5)(6kri@$XH!)zuqEWEz)c9wIH1Y z<$g82a?2UY{+}mgg;XTr^T~4q3Bly=7>ywspDFkNMN}Yjt2!sjsxc$1{t) z-cyWRf8jryhG!P*Obf?9oHP~s!eaKq*u;KD7`1rRaBY2Ay!;s>%x!q37fD@65@^1W z&BRC5Vn4&JJlTaLy_E2pzQDfVU5Ksp>~_T~p3rdg=1&o1=o9h@i9OkmqSJwqnzHg(EZ&mYp)-Si+&;oV|KdO%Ngig9k z7S!PmtOrEj)#`2Km^Ry<-#gCrK(%)Fxzmg_7)x9j%UfX)mrPWS{xXU6+$;Tw|Js*0 zT-5swyoh|y+VDq2Dv?BH8u{r=ypfD`2}ZA^{~Y_UJLb)YtJ%$4_i-Jv(&m;!!bf(ho2C~X$1t~(<#O%j z$4y-DOmE@NWNaWyjVwkHywEx)V?!fXmb~E-Rlzc%jz0^LnoRHdp{L(0*){e8nU+=3 z)T_nAjRUK&Q^l z5A(XGU@tv=jPVx1?7l3)n~_igd^5A(2d*<&?&89a1k|Z~9!|OmQ1m^G8Fu$~TYA~a z8*3}@OTnlHQGwgAmF1iyn(veq62ZszN}3k#v!KOqEkxL+y=}GmzWDA}Npmq2RyvT1&c`6v6@eDnom&a3o8u=Lm@tHS<*l)!KUi&4IwL3B!+xR?T zNg{^6Y*z7l9A7VL9G?*0doZoihj9NOh9pH*|3zE$QItBV?BUf*e{RQ1<9GMqHWwpiytM(@qYO#j)tU|BtF(sJIsmX03_}c`or#06r@%3 z?d%#JNerCPwNO0`(bQ#AVOF;>cnhkpaz(!=q$e8oq`tNU>;qqhi{4q#k7Dx5<10pOT-#4M;{i>HIT~4y+Lmn*il_bB z-8zrFmbD{(Hn|$dIRl6H<67?Zs^tjTEgE^LQc`RWu!7!c|B%G4Wm&xAD0P9+yd$=W zSZ*AFnnF|+5+q1rHG-w!Toq3t^hnk=gvTz2JGsP(KLdJ17IiC@i2RjMOuZBjo1Vf)R1R`8nO?-3uoSQaSM+&qDZR# z+5c(*&25Eh9H{zKRv65^S{Ri6{R46XX1@akpSi2NqnzgGyOiyFrA_wy z5fx)(#)*kf5(UezPMTDP3||>Fx_Ax7*PE>&Cy}sPS5XPAoe!OO?rKf4+2sVItEcEZ zqB^n^N;&&tEr%KSGO$Et`w(ZH??^}F@)2z__dU-$?S90gpWFVBzM$jx)HayTZtd=q zW7M@=A9<;klP&J{v5}lo*HQAtx;}c`ZJd$fLTsmCvjX2c%~pP9`kJX$;ZXhN;BinC z%%m7@W?r^qzOdZFLJ#tlDUvT&UDPhg#WDKp9^U9-T#-tE!^wD9%ou?fpOo4!_N@Ui zPIghgCtnL|t%56qP#K2J!fm#O!ZGvp22|L87JhwCH9nu7DHUhgB{lbdP|Qk6Uk9T`oVXjX(R|MfW+eLgury zrpEhcv$6#>*+GOp!arm`q*0FxsjU-d^l;*RC7-IGc^5-VF#2$Or^sb_#l1&}VW*T1hJN5SBcT5OM5%k_k0fTH;q zKSec3^CvNtz}+Xt4J>X8i7iy5(!qBT1Qxh?oDeZr>s%>9gHhshwKRgQ@`-OxS~dJ( zdVzq0hNY6Bbz6ncs?IfZAaH1n4Z%P70Vj6x5GGS#;bsm=4$q91tId@Zx49IS(0XRf z4Egs_pJiWfA~|on3z|=I?JYgfy`R^wTt~t%VIBO|Lq`pDvbKU$^l9;+e32>|w#rUD z*WCML_jy?@TbWd8*AK0d6?6K-Z9FXcl0FHnFQAG<+Kuq5lrQz zALc|EpZlCHtF@ORWadc7H>}HXgw!>ypzy+ge8!KiSXRS4U^mJywQ8hgnFZS z_mlB_OiRoR$@j{oNG#HuUFV4&cS5Tyt~na3x@2y#F#P5rdNS3!QVnh8x0<~OIBHJ4 zNds!|Tz(VG&pTczp551#rfqe!NVX{1G@%q&`SULT(L@gKu5*Lq_L(8oQ&f zjC}7sdP3Bjft}!g#a9?x*Jo!m!YnVPZ;Iv+Xf3pWVAOyi@UvgFhuN+fEgY(E3|pI> zqiSPjaCs~Mkn%$spHzci(5-+dHqWhHN7>n(wmfINd_04i`_);NL6-RukpgpD7&+Q8 zMvagg|Bm|4)0a89r*eY)?)L7+$j;)bxH_3kAg4M`n!LbiE3@es@5wRxb|TOq70_*g z@h2IEixmIAm{QsX0aWl2JI;P zZS|+68uFa5hHC{>Tt#~YR8%IpwzMDBR=s=LfHzuQu+?0LN-N@Tu$@rNg(Vfc1K4z2 zl+Bft;RJISHJ4ZI%dI^Ak4ugY9!v_LN;}6-dn;~7wPxm}{Wq|cDb19-LC)v5f69O7 z+|(dqPObIDF}eB4i``@PNebJU$B*^ajfAvD%GZcmF3&B7;aVcO%~O4g#j1C|(i+O% zeTy?$iF^0%n)fl$EgruXo-ssAeH|jyNuTurW<^cylUw3?|4mn4hlqv;jp)kV_IudK zM-_YOK{0Ra&v&kyax66Xb!N6d9PMH7SbePGGD@`~A1=dn|M(~Tl4`i;ysCzX|J1Gd zSwA&R%g?3xo10lNysEdA?{97hI!-E27CqM%d%bYXouU*gqoU#jdp_~{ZBV1g%4S9~ zm?Hx2M_`!kb{v}rD$xsRJIyz0V*Dl7)B6cIuD6oxpU2%@{>_!P<@`%>UA%70Q|fYd z?5CW~WgGn-b&5penBraGc>at><`&Miu4Pjfjzdv&=)rUYdH0SBOUmi(d;O+69_!vy znN+pfK1PNZE67IgUm~Y5eth6b-;TP^ zkbEfizG%@Z5^e{71I!B^rAnIxaul**w!XByRYJ3KLwN9hF`6;;hwz4FfQ_ROx(I^J z(=p+tvs-0Tn86d4d{H6Y%R3?Yp{mI0sg`e&doA^+pT3VqeM^=#a>`AMp zEqJ73P@%*3D<(1u3Je>bNdAKqt{A)NMABkzW>Yu2s4^qfgc)n$YVi9S!3k%6M?#xR zWs)UXF`F@XK4$9aJ&HKzhx-9l@vdZ8=)*ZVIs1g)^|yI!-4tGQ*KPw-Z;BGLoQ6&r zz#o(VU$VcyKW13>%#0^kGtird__(0iONdz(AI7t)#+8zD6-m_(^s|3+@lfOm4Jr)= z75RC>@h!jx?d|>h373hxySts8ot4#EKoL)r*bx*qN&&qybPK}uoLASKKWg>3@LH<% zxb~hk*Yv-nRm%~bGUc6bc8^goi~qqzqO7Pmn8^50HAmDP+K{`uyP*iZ`{*^>FK90Y z+X}#_7}uKuZv3G@33y=#l@bQ_J3iaCdhC3I;<3fGilDVXQ5$^^cp71pEPm+kqjhDb zq`<&H7znMnm-E`tD`194L_~z50VZRcnhtW9Y3YRak6At`QL69txW;lN9+zst>$`e- zLMQo`G!uXCKNs!^Iu;*eMZEUuqDF|%Y?F<>;(v5zvF%o|N-96s7--mE9lT9Sng-Ti z)O+0Fq+_gwOHVgpZfPdA*G~hb?3%?Knp<0a=Nnz1SUp|b`#F%?Lm3D*_k+f_$@r{c z5kavDG(o~DQHx=%`08FY0Ip#WA_XMf#i}`&y0h=?XP~yUH}N|YQp-$dcy1Vxm@RpD zjX_2AlqH`Fl`eqdWMn7~VK6iGC(SVheRKA7baY%?T!i9yYHI2gvbEFGQ&<5!a=z6` zH7V+UiHUW}^$_W2p!f|+{BQbc1AO5v$5XIKxXA9B_rhEMhTieN_}1IAbt^=D`%FfL zhNrs#7CV~@4c(r*hF)%~h)I;B-}962C8?}*dAH$;yJO}=TuOND=WCWi_hyQc6?Ai< z-Chyymukro324XvkU0{si*dvF_k2zWc~2fY(^=gQwtfH2spHRw(o&3%)?uNczSqCk zm$?4~-0a;@OZjJ?FZ+a7dbqhISPguV>n6N^)>+$Vat%mBL~n#A|*Me-+cANXY#SeSEd^=HLVLg`QAOq3otC3}8ThPX7#wn+NR|>5v7AZ8KPHlXKb{GcL8Y)s! zA!rhX0zLnW%@QCDr|Opgp8?94A!|s4Qt;*tGXsMROLCXC!rfST3vX|cuboi(22|yb zH8iAmiDVdiRfr}87)s{{&NU9IHH2jy3|0_}RbAV+7g}@+)X~t;Oqy02*;Ch^3EKL* zWlciKqc+C~R3Di#eFvqIMSnPf`T2C7o@Yx-OF+FoDX=g-otlu~{QJ;KT@b#&!@&s~z9%36 zeBsy7Og1$&)!yFT;PjmYggdLSkWLgprA9dmwRdd6jE8Ep;(2KK}RNu*=|J zX@gT53L0A0h)%+=kwO3RCtO@yNzYv>Hs0hx*rNG=F3)1*=*Nyg0H~^|-2ff-m#6NI zj+J!i0G$bkI5#(!o}S)W_^;;${L@wK7aUAXt5B;zHv_!cXWO$6Ugvh1f^7h=|M~N0 z;DHaO3yp|4+xvcVG$u8(=?25qDRYNk!=U*x9N=Yvka6`2{~8MmTIJ3T50jMMK-Z0< zy*+={h=2-o&5;lhRddZPE;_z92nh*+GDdHp*skih_5qqZ7!eR#ICHo(Z>eMn4qEc5 zsf~Fb{gig=1q25sLdCxjelKZh@$ttO7gY^pLF8VXY~}eLDn5Hw;Z;uA!wda1?3|o0 z0QL%eXAq0b=-tp<4xHP^$D5D8+RWBkLCq>%VYZb%eywQE?n++_h)-HEkMfw9n23me zU`i(o-`v<37#RT`U0~Gi3Pv3dCPeA_{{04k7Wl0{k%@UYfT*BD2f2{ve_^MkMI;;5 z=?C?pJiNT>Wm7E7%mihOKZF%^(d0B>G@qZIm>G z7#On+PI(<2H|u!;*Za#4r18;ksTxhYkes#SDeetTO%ZF2LTUc>X+uZGh;{Pd>dK0y zp&=J~uuK6NY>MN}Nmy7?8X9Q$-hhrzY5ZKNfV=)z4bPj#rYq)d-%d6(x^=cS)1llX zsuuAu_&!vDPfyBQ-4zXyoroN*X(e?Y?z!vu_{i%%sJv~?o0;`w$D{b& zJE$aPNqM!vS|jm~Eq5%vsK6HUCpef+KtKS_@JpB-kXh{P?9kDVDmU@@^IZ@aU%qH1 z0G0wXoanNuDpC})iPwq+1qIHHedY(y?H?Hl6A454?tgiwhZmq(;0%AZ^tfI9Ig%Xw4a;*l|3?2zgLrCrC>9gVZxadX};6^=^{x^_S@ndP34 zQ1ZE5QoSXt5?~@$8&t^2$-%ZnIfDI2F6zdHu`djr&2Ke|?g!w}O8No{&He_63^)w- zU)RB~gLMk|ISt31k%8fpQLF!-3lJc(BQYWAHxkrd4T0g#SR3B>`pWjs&bHEB1o4;b z`_%tga#fKUESp%J%4cvAU?R3oF0TJvvNAJwIfBUfz1a4`tf{ydpn>iRInHlvY>@F; zDi|BnWF*~zHt`sq_9gG@2wMNY-#&Y`18!wcPfuNK?R@}$p3;Tt_u!>(FC{NF0KzDk zZsX)aE{23)lkwG1{`Yy){g{_(8ymc}Tw}FYpm_}q4aviQc=w~J^D4Uan=e;O8E0G2uM)2bzG1Esf1}xKDQvuR@c%x z{``u0Gq6NnKR)7wo58*oclgQ+ z;s*@3g|-*ER7<#?h-u-v^Ru)1CVL7`r8PWw@rpiw;-$jS39l&-%_)FVWj)1zjnEk{ z#)3zo6bHk>!?(k8Dj+)q-45X3VfS1CyoZ#>HW^zI2rE4BVc?Jw$w4FjpYNcRm-OO) zKm*ERM+c*5VMWC=*iBHsynl2A(%VE|e|D)WWN*HSAH*`cwHKIKUR9ff^0!%+yr0EftpA;zux% zDwzUNmi0^C{-6cm;&93!wx>(UYLcLK(Z`P9L?a+_#JBKfjihlKQGi=zZ_kO5jsYMt zk&%HjqF~u7XwvWAMUW=St7bg&ErhEFBgmCh!`E z&1(Q<`V=nYUE#lTXJl*)Pf63nWDlm`a822Ef46I=% zmNoM8*RQ8>@}4)>4{DHhw?k{*#aqRMaqt9e?(TZ8$1`H0-#VfP?W2&lrrXOFGSAM# zlQw9%B#VOa7e)*A?R~O?eCZH6LP)PGq&ou%K-rWi9J`bhqND{bZf+pA!BT~8Z+u$X zyrwCl7XRnWCSPv4cjm9^T6*8vc<>0*#86`sOcK4yrGei zn5d{%ZU=}2kVo`w7j7Em6hz*S;lk;z+5` z;Y25BS*XFK)<$w9uVr#+Nq~;FJJ0%yaE@vMvu#=(X4QP#94~11G|JoWL zm3wE?mfiD&UChDAfEjOb-y%VAuF|UswoDA^Ob6YE8Jv)ob~ebGx4OETE%D+*dHExj zWU%~g*rdOr>0LIKW(z;S4BZVAts`tS41QDC&ZU^6+Mo{7cl_-CeSrVU2GJoN&a31_Z0Rp zYex7Dh)Zf=XM}jZtP!wk!E9urnFQSr7=968iNjINN3GB)gSZ2)DMFMUG#);L12NcG z38+5c5C4L8BCtTg`32Zn<~NzbE{D)_X!ap;u0dHwraMLH1f&jtmI_*bvf)j~%eQMT zD*EyF;Vv$l5ESYJ)G-`NLG#{7P&A1m4bpS~y6g_HrYl;uAcGSJEolR;T)?k|rInLI zjr_2^y^SY%ZVK3n5a#*{!7i`+DlCuh-|qyo;JA;}FVn4&+2Mx|GvBoxH{;65P=I0Ay*W#i@Upo%L#W#&r$I3svbm8UHhXqo9gG9 zHNsvhoBFo8s+Il}SolWPvnDW#o-_;{jw>Jc9R;B zAo?hq6Gqqb6HHr^mK^pwZ7t8{;;XCC-y2X;QDx?|?e8wUFz4a>sUiPQjQbO$C>Ydx zkI-V=X$aVQ8L{jYK7}`OQjOB>l9#Y4l`jr3_hx=_+@nc8`@s@nf=}fyNZDpH)($9o zODij)X5Fs=QZPL-G_)DTWW8+G^Rzq~%WS#^c^X_> zNf%81k~z=dLbih^bU&~Z?NL~eNgxIHIBozeHV}o6boF(mxyLExt^?7VWxXIvdLtm@ z*`F7g_2l0;0lUB42CD2ul9e9a^1Etm%y2fE6?(KFg;m_oW|oE4HK#~_P(pt9ip4C1 zn!l_iW3XTH<*h=oWog8ZO50%9O*IG(s%_dHJNv;p<9rvgulG zrJrzXX=#*Ye#i?Z5{A>r9^?r9aYc<0YyRHQP9%{!VG(L^W5PkkcE1D16)b|f-&PKS z6q?;NTx!ov^tj?9dU&Z^m>ND@PvqbK$0E7@)|#l!60Er0W&3VfqT%R_<$$3+1Qw z#%mI?BMy>eU#tvPi;w46z7gJ*E^q5qHRK~3E`35}Nr+C}l0)w(6TZ1S$;uy#FU7gN z#H2X*NAwQD3OYXDXFA0+dBPB3t9@oi-4ZWzAl6+a^LU;jx@mXd9cj#@OCPMaZOmMR ztvK7OMo1&h>dvU8uvF1sPKJNH`Ms=r+@x|7{>R{C-mTBB+P%ZdVdpp zs6<2mUVuJ<#g_7qB>)ngRGsY~rxb3&ldt~w$o`!a};J!thtm!q>f_mkZ_HB$S#- z*S4z^a2b=B#QqS@EC!&ij7OmP2etO4B&K9sl2GpP4nx^%bW45H9+B4k-jMmKkEA9{FX_Sd}c< zW)_2ML_t9@pp$B~W0a8dzaQlw5`J-Pm~#-UF-PlntU4fYQemqz>Xfmuu~Al5e)1%1 z!O?T#N5bXG2+zy^cJGaZ1Tk+9uTI(fqN1XTiV;h`pr_35E}mgRx!2M*L^}bW7V>g2 zCtACEl{hWk@0}jAg&^?o@Z40zME^Iwy_Cbl=eg_B z)9q&IhktYSZUH>Tt>=4~|5PEs;Px^hGn=3HL2Nii|(cedyFAlv|x}%`u;;hH9A(`#=UBN6I zlE@U&F}(p7s^MBGp%Ecf&huP^sy;{0R^d!*yKe`4gA}Q2eS0`Mgr;azHD!Gnf2Cqu1Y}Vb`0~A3~v7( z*9ZQbhA#u!zTlZgSmsRXXfj64Jjk)An;pPHRi=v)4;V!o$Wyf+=v8xG>L4A{kUYp+ zses|(hT4A?z(MtBo*y$hTMwip_)gTrYZ)|u@7s|W+IGTM;?{iQozzx}^qj8EWF?RA z6Z4jx+S>=j-kG~rhD2Hmf>|mK8m8H+lsHn^xh6-sa={Be{ufby$MP zkp!@sdXSW?%lO;v+cRy|sNVDhWupJ$W3^y;1wII37^awTl=54}7pgV5>PGl4=qQ4V z?P?Mu)8^)=*$MPhZ{6E=)2W+PN~vEMjV!a%M2P8=i6yB|)RPYkCf#zc?~yWOOa7Ms z{{5ftS&CBHq%aj<9;o?o86&@nopoRleP4p)!Do8Fr>F4n;X_Xs5!`nz+;jYoiI{W! zqQ5wh#Pod&n`Ai%V~Y;%PMC;p5S@xsjofKnPp0o+XLS#|S`6&!GX+*>(@mzIW_BDDwf>U~_ zaN%prFzQaXWiAf|S7HFc9;-XQo>%yV78Ju44Da4AwKw_uBA_{qA6*~TDiB05X|mDpit^TzeL z9da*vA4ivBcel2GC1z3!)1U)aTdi`HkufJOE2>7hw2!#;tq_NYWl00xmw9ZDcp^M`StrQ^ug%@2hK}DjmD^>Vz*K`CX7Ke{YQ3A zzxek*c-~H%Ph>J8DQka%2fq&72#|mOY+DbtD#%xOlfj3C+OxIU%5Au!-M1HGg#|D{^O}Mg3uBL_1l7%yN(K8(fQ*kyEJe2!% z)SA4fZs-{@&iXJ>p6;+8(<*CZ+DarIP}oi(LkfVjeLwCU5ZuXL4kB zlU_;SV5=${9GZ(L}OUoC)!F% zmE=C_M%_8!JBOsf>L=BQiQ~qEA2>bk z#N-U^mr6j23oh)P@i}_AH+FK7bl;n|6>0>zo_vUXbWVqBaoc;A`o_~EbLkNTK8teIqa!ih-W@+>w&bU2^`3wbM~sh8mo^MjhG_3ovGqHk z-;Ori%;z+eAprgLX^_8!G(O-v5z*!?{rtJSybM>b?$I{dj7fg&FTEWoOiwqDLsw~4 z6U$2x$K>;Jn+3OkQ39K;Urdy0v37mT#L~*@d!vgoe&|fq6H~RfLW)fCy7N!YX8P=` zyc@RRBkf4<|ke0aRC)3BK zQ@CVD(lFWC-27;UUSP-Lqr-<&3cID%XUweL#~X=CZ!-C9aAgT&;>csavpW~s1Vt&v z*gNRaeSl<&Oq{&y+7L0J=_b)8N{}lcI?vbJVTGFc-u!Wq>IejMYOr-W*U?UcT=}tQ z*5X;EWp4xr)VB2>7F^{{HiYuotxIn_eet3s&m>U3D2vx@;#0<;b=|A=mXHKfqR|e| z(JK`4b|sm3=cQjSkT!eFA*dsq6*oFGl&WL}xz={C8mJ&adZome=mj=}ks?_+9MlT?dar5 zRJ=~7wTg$=wh5cF}{R+Wq9P_f(`?ZgP!y@-^ zK0V0(CU>>)hOK2pK86|nz#(d+yyoB@mtMt(+^&>Wt?}lNp1ump@skw zl}(2J5UedPF9$v*D5vxC_FjXisjlvgAp_E?=bN`1(P?Q~WmAy6Ia%o|go*=iA0+_3 z&0ggC%_7QN<;=%w9>J3QMwh?HF12u*>g=%u`zhyx9J}}5$imAiD$<7iCMNj@s*sUr zdZnnI(6RSqMIfljk=?b==>aT!%6oWKuMj#?CQWUko+1sFyD>JpkVv zNNM~4!*a6fkuOoB+<;u4MPuK?lgtZbZ?%mlGEKvzUw1C7^sl=@9y&VGz=~&!@Xrn_ z8yH^`3TmWCNJ`Q(S~!|5_m!7#FD;D&4@-9toKe+BkD%sZFP^$(<;QI(&oge^M}D_@ zhB6V)YQOFAaqdZ_I@{J3rP*Ws**_3EB_>Vl#)ZH*U{g+Q`GGX_1QbucY{+;CaB|L# z@z9BgoB+%mZ*x=m_I0^_ozSyyNqGT4IJ0?hfYBfC?kT(9s&0J!9Pl}Vg1Ug1Hv*UV zemhpC^)kQnwXd1FdSq2qhwKV9Ik}3)X?^{1WF%V>S;6a7Rfp|*;KdOX5a{b?oB*Ny%uEh+88fp2&C*9oN=W_mA3wBNK-p5c*1MUCIfPV;y3deAGienj{QzDX z#2h)<*qC^Ey@0%;${4V&KYpCKJX?>5c!-7?28g3Oe>Ir9avFCYpya`jbSe$+q+Nov zFNCus&|I!F2jm-&rDJ3)s;eVy_tCz!rD%YiX`Pjs>H0hsQUfCy$=*Ldi8Rf#a&l6B zi-XYoUl3_qTQ6A8;9$l(cjCE)Q`byd-+pa&e*u*bva(;U|NO?mQF$FYoLa$4c4cn9 z0;R85_l_!_^p%#@!K-AydPPl0I6Z6kci(;~tpTLe27_mto8)$On~-8QZgj4Jr2{=} zChn-9kgiz@r02MJFIzz(0jBIKr)k}1IABkzO*LQ`Zf=kKuc2fsF0P87?*+5u_izDlL8K236POIDAlrm?-M6aN+~un_k=r{o!giz_&d#E?){I9Pq?&v zeS;es#5p-HA*{Kw$la3DTJw}dyuo5+xY}2*Tk4_UcTfI5z(%g zR$^L=zzgWF^@WNXEegh9 z{rl=Lg-UNUN(J^$3fW#ffBr5j>!JL|`GEmjC~kndf#@Pt4dxC!8S>^_Z(}%oXQ!!S zSwbDv`wR{YMc|0<`FJb7(FC-%XoHF=TQ{g~DzZDBt$W_K=sEG49S)5_g>iv8pwnuE zFYnH?hh#o1)#~r-N0^n~*7mu)TedQ>@Y<7D3>du{+rzap3;V)kX0|Nu5 zK?sy393E)cy}vj<#*UM>;XNndAvXMCUSMuf0*eM078EQKMl~4j@;fd1j&DKHn9>_j zdiuLSl+wgw6_Df#ijf&`pO^x*L?U#Q5*@4Ol+EV2j=mVq37Muxs1 zrQfeF#?72fbA4<0UcF;?i%($FYg1QKDc^+qK_ zUBUdUozL&uiJ2LbHxsR18V3OH2jl&`!NFOk!ZM5}1z}Vu5klgzttrGsmChrZma1dwW{#QhTrBep5z2K;jhqnaWEQ1sQN=ZT#dN^JjuZ&vtENj$3 z2DP_eOG>^23tY@|hzRqIe9?=;)r=AOo;f^BOac_Mn`>V+wLuWY^gH4TOk?3OaNRjmI#<`@g`T-QA;otIpPS`dTxiBf!+k>iq(c zs=2CGo#9}`;G>uw{jAU|b$~a)Ux9)_DxqC_XO0KX;wp7?mM^J(x7XGJJ;)(!-%>3! z?&Sv&n5wzr&jd0>R3oFJj!si&rl&pK$XL}pCO5Hnc5(zMaV{vifmCJCsUt@?;2KF9 zAL?h>vEV+o{6^D;A)f*;bek*rgBpM7;Wey44( z#SsTq00t4%51tCy(MK$gL&L*E&fG>a-6`T6A;(3< zdVjqK&|^Dsi;671Jl$z>B{g_52Swwsyd*Jp1P!tY@Gjqcw*gDK9CHop@N5P`2|SkC1_3 z4_SRVxGCdNs_Qzp!}oT6Ha6Lc>G1GysPI??1JxkTN!>KPQ*2v$3H95kr-z;c5$7v5 z%S9!xK5^Dhg9C@oX~r!+Wv?3_Z5HLc61*k&*<N^oUIoqXR7*}` z(DN{L3B2e#rDTf);f`F!^;#7Z59K~`4~&AEBcrB%#!L2>?m_o=)78j8%S(-7HcZJk z0wcLnCXMzpG~kq^m0tY`&J*VjxL6G{EY75msQB$J*1B>kc>9YW#~W1+4PLjivOF=H zc7rz^E^UqHr$!kK&#lehbz*V-_$pvm*dkN;Q;*)?piur<`YSra{b8_>+|1e zIZ~bks@<;fH_6t;oAv%{W1P$NUDC^%QH2HV`b%NcsiVlhQCmEB@-otY-8o5ABH}U8 znwb)``x0*F!oU6hk@l8xU3N|1uaq=W(k&v=E!`z0EuoZj2}pORAl;2LNOvmTAdON2 z0)n)HfUw8=zOH9KulM$IzBmowe;jMASrfnc4quE}uom-tX<{qtdCr2}*MxzsI6ThM z$8{(M@Pp(E_)JH$o9Ny8_Ro~WR%xP_RGoLzHw=9LeEgd#G-zH2suD9()9?YE+ZXY4 zn{Hvm*<$5`6GB+`(;tBQ!AYLtLm=1hLR9xV)@aw*2Pt)lbOFrd)Mu7 z>E0f-h&Mw@se1hM7=yloQ){oH@6{Y7M@#$PFiobhblyD$g@Zv;jPPyUdPeZ+^x4jz zDk>6(?N#VC$X3oBeDS&y)8SG#Goq2q=|wewv2Hx2It}ZRCS>93?-#DJ=XUe8ZyaZ2 zX2;4Yjfsnn;faOEdI%kP-)C3RhXTvfJy%;%)=`TpUp)Bpmix0rG)UH{qU|JV;Ax#wjtD^+8cXYkAqetW+g2~v$wY%Gk5x&_x~~} ze8>03p6?I(A4VRD0OKr5e%Y&csDakKHiCk0-%*Q&81aU#vk)-}c^Qj~Pd3^KF)@{i zJ4@cb_YKLQ=|$0JE12#5!ea^1ejI3GPjY)Oz`OYow@NjUL z4C>wBag~V|?UuXWWE4}_^+g^%*c;E{;!5nbZOj&Olb}0ZX>}2L+XmMe`=P&HrHJeP zzgcb#dVf1=2?OW#Z!N7Ta78Dt^ON%VRAieKE5&qRp<~ zXfj*I3(D|j*PmpYf+70-y~KXas-c`GJY#b+GooJK2l-HFQx%<_Gj9I4ZtrR8F}9^6QGTrT*oB)wgP2{f)p=<6k8YF`5xdv*PD?>>*U`+4kLXB!Jr7!k zL;7xnl5}7@xj|=%uhz7IU^}15n%f=Wo`fSBcmK_`PydaDOITthG@X^s=U(_2ARe=t) z#(b=Gbd-e=$r=4%xy`UtlX{TdzkH_CI#Gdex9)r3L)43~_w>c=FKfAMRz5v!VNTxs z(0tKzzj_pQ&A(TlQaZ!rAiK78i6O>?zcKu3qb=~2dW6YgwzoqxdV96& zm~6<4m)=(&x-l_YmL{H{{XVpO0x!BkjhqHMQ@vE1X_n*WYG>+|bpw&`Fj@5Y1Upm{ zDD$;pa5oVJh3Af{gp?Ev(`5qevoHh9+ejQDoaCTUaUL!B-|UfNf9l&rI6Y@m2a8#5 zJ8N+rUMFrpzZTD4{BXHZj;=&x->LT{YgqptjUVdjo@=(EKppZO78RCKJ>t_mF4}mi z{u9LpGQ$?7t&7a?)~h(N$PdV;EbW-dTO%WeKb%9Go83Q8uGU*cDHQ6qI=9fE9oWa; zxsAPSorf*1HD^9Pw$k#dsv8rw8d*bL{U#OKxA3FV1cugm&H0pNAI2m`#A_+*vON@o z=I6iVcMG)2&k)%wbUOQ&mDSzz2Cef@4BSteuWvdA*7)wm^`1(C^U$EzW;Vjdh(3T0 z&f(o4Lp{CLk88vvB%^O|(pF{`eiTezF!Chbuj>AYl~ewkZ#pkXE>Uy|%stNiJ|V;c znD4=!twC8_?fXo4I5tJK@H3>DBwjF#oCvw?CwVYGvHNP?Fln#RekSN=iPpg5W(p5c z??^s^ra)b(y>YeaD8M*VJz0Xjs#5x)4C$SdyaRITULW-b_^C!-0#PYL?Md?=R=(-T zZT-$~|8bCoYMy}oLonI#T2UpvaQ=^&_feu5#eF?f>9;C-^DE}V6GALWj4BjjJ@EOd zC@Nt@L_7^*1KDSGfpD5!C$<{L=-nv2AAdOp|NXdN$T@c z_6AL^33`RA^^O@m4|_5Hc!a%ygLk>v=Y}#s==2ND{Tlz^7eD#pU;6b9=mQv5rKEb% zhd;FTBr?VoG72=yx~>i^t#)5_tUTd$AwpBgi0*X#DQjmZLONyK#J%d{rkST&R5bcs zAgsk+r%MJrhA3rR_prwb4PwsdD-8ujI>_ zSw2?%R)zB8kjR&7Az4Dd*=ep zYop*^74Y#hZ4O&Ug{U*lVuavlu0lwSb+-%JiKMX3pR6i1`?MjOltW5KIeTAQ$GxVr zQ>}7tJTndJ$<@X2w7)-1coUID|Ap4mSFvtNtN6oM%gaT=j@P5X&^uLVj{7cZRuViM zcmm9AcJ%f&zCJ}Z4VmC)FFUM#+;!?DsPA-r&Um6gZ{QTY!~x0KubEqV(N*sx>+JT} z1-FLcL1pa)~B1Ytms1T{jbYKTC5=2mHdv_fc?S-x`j3-SoJV6y8iTV(thYBiPr*wH5;d9~b^#yizSFPx zulEy^JTBHsdle7X*_5BEthSn2NMC41FIAhJ;sg*MB(9vRS)K{r!qS5?V{}6Qu5@ZT zHy??X?dTJn3Aj+!Q2dK>B|kK#{#?CJkuaiJ!#Q2`q7y;zX#pSX9$vnBI5LTwXLHFa z0mOXv3rwfl+S={4Uz(ruVlx%8@tF%s33+dMph zlx9O~3_3$7w7`_ZJS#Hu(NHwHqv2PKQ*E33X_8rUhkI2FEPBnR$N7a*YK~567~im> zv$Pu&4tLi(T*vxZGu#+Ats4|pmp%`@iRtEuNb%l^Y=FBxQB?1U5xqT@|AE;zzU;Te!|}?95`Qn%gXq~8LH2}Xu6)S_oCb1_31vBd-efL={zoYZ|X0#&hy(9 zs!rj(&Q+{b)4PSF6tf7kw04X+|NOxU>$4*jTC{v(R=&JUzoz!vA>|XPtL^H>A@Ntr zUo#IajD`0=;u{sE$o}Hu4bmrjX?rO4uiDi43vPIUWg9hTPUB6S z5miQFw#|qO^c@QyL}ZRN8lPrQs0JMs+{HnKDa~K z6c6U&77LLzAlD(4RX*G0zD`m@j}|j7)bdrX>fFxWKIF8W(XBT)I8>V9(bx$ua#><4 zY{lWo=aczueus`amWdLFBrovs@ETqlo^L+xEqIHbbnB3(l+Fy1=IJ)Oe?2~=1FX;L zg$mCF8ruwQex^r5@M4h7<@RLgw_RIA$#T=VzxD>EXk}kiGMP|i79|mh949xYi}q6H zP=YY{Ki^GF8=BJAVn<}=e+l{(zSCw>la}jy+2NFsN9l{Ou(W6l;U_B`iuMYGDQ*$p zBF%h%wB6B`MFr}gi9^}k`0)f5@0GGQ)pU=`Al%z6co=YkNxbRlF&xSElE8f(yaZ7U zY-Aerc88xoDvzoysY4zhdYPLr@vr;pG7`9FTj=sZvnMFuH%}k%8BI>VzU`px=)@U6 z=G!nKaMly6?0-)CeEU1g6IZ=F15bzBA&5or**zejHQ4s6+Q%c&QFig^-}m6qdmzkm z366b?OLM@qI=AV{FjzU*Ku-ylH;Ny|M>chIy!p~d37Pi7&y0k_(9k5Mg?=m5nEdVA z=e1mikQbG+7aw#xXnE+JBwTUo&*1Y|7tr>8iI?VG*RO1f!aqe;#Xz!U%UCQz^N{3OwC zxmJTo4gTzui&(h%7P);85-d3A=#ZUx{iShZsev4hN1hZ4uBrF_0=ih&ox#*Z$fbDD zLXTpFx|R7@I`&;(NJoJi)o6<{L~+O1ouuembb26|>w-)|#$~zU0e`8Ycn_IedjAKH zQut6^ez_Y3COl0|X%vMA!wv?n=Xp&{-f%Kv(7%qkhH=$>eDNz4_qfA<=apqe)KwjX zKOCWY!uP{pDTT(Bm6p0Vcf0%&;QvwaAxKFUe!nQ|@=)?1(wFVAt7(UWdkRWe7Jn_x zUrPa;*AnxIGuXezVxA(T84OSR2qg5`HpbuUfd=lNK*@g}UEeC*uH<#{h);Kb+Vd}_ zeEO8j=`Z=d9}PGsy)SGjXlc$WjF+tl;oS$7Bc`1os0QefoK;n-F}qyuc}q3*SS#84!4WdjkD86U)n#cUcHt-PlpF*DZdXoQ#Fh#bjh< z)4TSoo!DK3F&oy_)>=%nkizG1zz%rL)WZR?iTfBbuD?HZDM_J~y(pMU1rc0!_DxC) zJ91|d6l9!Q+CO~AV{RJCDIG{E(v9ei`$-}g(#^H1zZ=+&q{@i-?GKsJqAlM*e?P!h zW;vCwx+bt*03RSV)qSlSfgiaszGZ*4k6h}8A7({y!VL>0`TC}&s4wzeKcAmN>w=hA z*WlpbtAQ8^Nly8PUzV0Y5rOe0DKD&<9f@Ej06Q@`xxcs9cDeNzJ4Z2AJ!=G4qJ$Ac>%*=qp}-CRi3?`%NgN5e-qo5%Q$RO!>`pcm_r7_ z;zTU+lT0)}eECWMk&KxKwUR9x!()VST~~XxTDxbvUD|PAz2YIGy`QpZ8|wOqfpjM* zHvDE)`-4)33ol3pzH885)LXezM}C?m9tX%C!k8LqZM~z zO`L*;v#w5~;@vIc6!E5kd{^U``4#3@Vnk@lIEl==d-bNzD7+3`mxV|bai@A`#9>E` zsJPw1Q&5Eq#q@Xrh1FPQb>9EU4S9XVv;~rMora8(N|b9z?7MTrg4;+C+i3~?jkxCZ zUuhJxLLFrH-iZ@M3zJOi=D<=G;^K@bNbEgDiXu-}#q&>>D0ZR_;3-+_NC;Wo&paUA zP`P9?Dxt;*@5Is}PDR$_@{7J>=6L!JnLREC>BK_Lw*39y+eg+LznnAk9Dh6V|5qW3 z_L<=S{ontOBI^H3lYH$csf!y7aIjUrXwv`6dcAz>!vEfvBrPc`Gto`XXUrVMC2!7@DTySkFv@QZ^C`g%J;J=?L zOnekpALPVc+UGacdDlN?%MHE$S5%7@cwKXS7w?KWn9IEkWEVpmZnX4Co6Pl zfy?$5B;TQL6Ib!N4b2Sgd&!3n{bvsU`!5D_LRMK!{IXQPdq628e$(#18uW9D%(Q#| z5!e1-FYW)Yq}?YAx(}05x=eKkyfIitGL(oUaG@>(L>$Bk%qIK$DT!Z=b+d~W*>)#I zP6Nlx>vSl*Tq*k^ElhK*$i9Djm^x;jx{Y;XN^;jVNNUXi@IPE>y}-n>t?s(86`tt9 z38d-1(JsG#L%;Qyk`MKvN$2m5Y%nwF}!77x|+l&y71%#)UvPI;e$pG&GRTCBFx}YNN4%u4`qC zXCD-^X}?~;Bzi!87@JvGJo5106iD!h8}dvK)!%>u`r^!t^z<22Mlmok_4W0$3>d%C zya;dS3)#wMPTCk=1>Ay!*2tK z|DJF2z{nypU;fyZkNj~@70Uni7@WBfVwfo@QJ|THB7A%#Prm{Mb{aH=LeI-H(&|TX zvbo8Y>E^o0#w56bEF&kv&v+tdt?%1BrmGhB>qhM1FcIjhWf|11;s5SIl^j7sgsH(F zYpK!v4O*O`hR?bpoyca?umq}?&Ohdo+SwI zSeWK@Y1{Olkz=q&@~Aywf^bKMTOtxtuaYl}aS#fNpPuAZkh}sRy#MnNVEp z&M~QRhWM9{&(%n0Y(&4qE~EeGankT=*C9|3(w@9Fu(aHP#?mb(fv55RNIA^RNT(~% zGAku13HpWZw`5R8)Y6j4kt$|n;^f5J59HW5JUmk6 z!JPt*m%sm=U{%220nJ0ZQqK%{0*8msaC_k$b^uOfEL}@oJuu@8ehc^xV6{l*9RWf{ zy|li*ex|=a6g+^dD^OHDCX56|UJejl7+-sNd6}5xr=$=Yl&Y7)14&6q0i~Mq{(WAT zA2UhJ(DSX3rgV27oB64v)IV|oGBI%fpyAXS2m^phg5F)*pH$@{cQTs9X<&38x8x2` z=R`$CtHJ#4^hOZG#l>k9DFvhheTQ!d#q7JPfy?Ob&g}W1WN-;T~S&2#>t6{ zoSgGr80F4`%r4|mM(%%m3F)qw;CposRaFOZaop>txbG7Z6s@fVQ#GX|Kh@SI2Z*rI z&{$rcrIGX54h|33Ha0?y`;jE0EGGZl;-Uwjd_XTq|MUci2m}mDcjgfLWpcIQFo{7c zFryrL;N<-LKLigM851L8byL%7r_U8kV}y(dm`n8U{m^p#=kgLX4uGX`1IhsC&!WYy|z1T z*4X%aYO1Eq_2=&X{=dzYl%#BH`xSJI_yh^jZ~1w78PqSx(Oh{`1ts@(b4}rauY`xnUK6Zn8+&&0hXs{D`-Gq_0lsk zfKO^^Yz*RtWB9#7p?ZM0!|#3F5Xs~HMea9mPC?@XC~P1bXc+zkj=y&>oN&KGHA`=K|Op3D~qdSz>;1eI{L= zzx3Fice+m*8yV?5KR0qvEg%J$jA0{77|o#F7grMUjBsgc^WRaCkxI(SA7ia7Eau_Y z>}=l#*w1_?C#SopsPLDWSy>-rmCnaZ>Of#*fc#sSgCn=9%5OVH_Tm2FAvHNU=92>0 zWZ)qZ%GfPbe_USfC@x0T87WfE01A;N(=1pu58)Ls2I33ixX7;9@Y<^D>X5DuV13+$ zsaANvR6q+tM4x)R^v92RK>rAs?(0PZleF43pBX|kcy@*&D$1RxkY8N<%rFOK1EECR z$S5}_hdNc0nTZKb&9cJ>LNr<$6+uc|uyT&PH6`sgVa zE$#ZeA@7n~n$qvrx4&P5Y@?qQDTontemXk*7UL8;0vsGiIWU40pb7zE_bB+gK{~Fm z1zCWos1b1Q1OCF*4)73PxHTLC4DA&E-`%l>6dEeK|C18PWODJAvt`~E7SAWCu&|@) z85r1g;|obwKe(!_tV*Hi|MV%k>JX5( z*!AkeS9+}*(&?WPMY+IV8*%*o`&aDm*)%M@v2V`A_5?7);M#*u$nI{Sh{BGH&C2Rf zkAi#T9Zb6~E-uc?16j}^m~X*;NtzH_zP9#uif|_f2Mz^WR!!vMo0#0XJhu(7iP^wT*U!l1yw?lZQO5%|^eg3Xm{dVXHa`vUl5px|d^0u-!Qb>BnCSLz*DWgHSD2{_S6p=u>@5jgfJ_?JnJWXFsorXu zK`E6(P!NNKlKEdYfpJPKF=re#I^11n==S~N*Q3>gcHVsV;ga4DK&Mct45$IRiK{e~MSfk9aT z+BzF;bzNOSEL{%h91IMM9a@e4;dIjc(SMg4SeFY8f6IFiaB38*NTIc~wr+1#_H$By z>UluSGANE#`2PK|yEzm&KR&;*WX`MSom=qb`6LuF9(TRVBPv^ z)`3T2XFUx4T=)^8{1o=!8uCqp?urfQLgVg0WP-i3FASpkdhiJ7g2AZ(+X(cLPUD`? zZ{JLy(a&`fgy}aM)VJMZ_SV*VYHA3W{EbMGCGG97p3?OAU`wiXDh>|ptEp3xlEBBO z2*>W3oIDyOjqVhF^yrbWFvUPacub6nfbo`5C@2)xEC> zx-8mIoRd*=m;suuF3VgX3g#U6`ry-{6EOH|ksmyEe|8rc889{7e_7{aP~WRR-mmuk z>j~L};D4VG88HCvn0%QiBc3FXtf!2~(19;C_0IvAr>r(jQqa=T2~VN|CMhgDqzVJ6 zpjW?p`xGLCxuvDy?NcyXK%#{HoD}f)laf$Q(a-ov&hD^asliy>|Je-Jy5hEBmzVuH zepGJ1ez*`2Ov}AX?`|y1(t0;OG^JyFdWy-yS}9&3%)^81NaEiBa(6S3D*{=#$$nYA zd=?x#-A?b8xH!Cp)1CF?r}6a-4a@ab1V^d;{j#rKZNP%j1p^BR9!*CduAb2?Cp?%( zR|V&?uk7o}ib3^zK0ZEhhhQoS&KJ3WnvaO@29TP%z-I%%op&K1n;~VG%2=hB^h}Lx z&q-chM>A2@9NYB_BGDsvb3LSD%M;Te=oeV?HRfwE%8I~QKzqKFl)l19EnO{72 zaB%SU7RC`VHaBmC*Gn@D{#fxqwa}aIZzc0m1>O{?GWI5o4iBe;Z2>eO081Y!rQR8T zgO)cutN=S(>6tOCBJ41@`wJMMvUDH7I(=Kcusz?u@8;5^qD@Rqoe_qLT2d@5!h^^c1ut z>CTT6hIAfCKLn@Bkv|h)yg2vn?d|UV!w3z?TiMu5Po;UkwB?sA_&-+QP9O~&ilKD} zxTI?YJWQoCIo9y*L*RYynkupY2WM_VJ~tG+@;=H>_iqDx;4PyT!doEg7~o{r7} zgg^m#pvX#1O+EYlTap&gzu*+BGbKS=9?1PYL4yx1@c_jGN|)33(KKKuL6Yj|&ozV( z;LJS;_64*nYzFyvCdS4!&byzJlanC>j*g5-GY9P&wG9m@T|5nXK1XX3K zg9^YOxX|Hx3dn_C7J2&ki;D~RvyEBu3WSy{`F&Aht2gkBRUqvHIw^7JLj5?}hi ztqG_eOEo(kH_V}vWi6clgM-nU_v8s(@WD!DU6UJl9&pz}0RZ5iz39^L%-t*s@upHz zL6w!Py(U*WH^oQY;C4VT10jtt)gipQR7QxAzQFkaVCKTY!u)(wK>-rU3N%=PXS!g^ zmooC}{QR|z4b*7>>J2fM`}qN7Of#1G5-j4)jV}Nm;JBC1{(!v(A;h{M=!yK17AGg= z-Q7(MR;=ZvN`9FO^>1g8lR7FXDSZr#!3F*N^e0J&?Qu$@Sa3ofJb1v&jCs=zEv-;t z_wy6u>$P93MWMU#^zy3HVPQ*wW>-nD+43xbxaklviPJz}NcZ&f=qNlO*3u>bwNzA8 z;6nfkbYg4_CG-+Fk?VXY8w23j)a23v_=Qg0;vS@%A^y&dhj`1VZn3%;HXHcn)jg|#RA<0N14txS zB(Z+-G(MP-)ZwuC1|mzA7sZe(Nxk>2(;Y@L+& zc*L;R%dJTh+ZkzT>#1(BmFCXQ&Y-%dz_9=;2)(w@Gz{|e?n+}*Q)FpCr?Kf&cf8AO zPoQ3jd=oT{oQoBh z`+`4ujtU7XN%9(Iuh}=70o(i3;Xf->NhwBg4vP{TaUV7H1Uxnp5qVBWi7c^J7nF<0 zhHaC$UNrrfoiI@O`x%$9g{56Xt z@>^0Q9n9~7-N77INOz^4^!`wNc>QQj?N0f04T=dRBA?>k5qG$;FkdOMj?S($#sWD* zfi*8mn#K+?KKBNML6n~>J_oAISF=-gsxKg@$f*(9hA88P>TaLp#S_XHzv0)sm#$W* zKD9Nk!xa!laG_T{j3WGa_t9+LGDM}h!gDQ@v5Ck}3S!tGx+K1MO!q3Z-Wp_)Z z`^fUHxzUFscC0X?Clri9zSFy!Buls>-*$!8^6)Bx(NQmVJ2CT>{zj~dp{So;m4{dk zbo*Ugal1Tv+|FJ2_ttOC>0d4a@~gL`Mj6LCb0x65X#H2oC1SgU9q8FFx2dKHU*MQO zPt92$^1QT<{TgFG-kaf%H1+6`Q|^73MgMjoIZX}K`G$;7ESu35XK;7V+cbOI{xQiW zGv61trJl~%Y}#l>4}->W&IBh%@-RtqA98XROslruCnD+&Rd`1#H}5@7Ze78EyjM(X zyQ(A7Pt5x9>}37N5tnArr1{fcmm8C-4buSkCz%ErD{GJ*wm9i2U~lD+vhZt_Aw6gN zTDEhjoERW#ayLS^B>i_#8y2!~J%i>A4$!3=5Sig&R(u5JQzs03#-sk`2 zv0)s0CKWh))bzW!Nc4K`S>bm%TzLuFkRtI0*Q6gXhVg%MG)G-`TW=|{Xm|NvMc=2J z-o-H}BCupxS1p|pN8WL=2sgd{lateXH&tM=<$);ghe!J%%4^O>Dp(c7hqEGHRw0^wL%z2bey;s2O(k-hYI8>yerSq)I;Bx0%)Ukhn;b)h}?tYZqObiFk1neAE zI(P0WJ!&=-W`BA1*7r{ADz4hiD3hXZ0Gr?YsU=pj&`aX9@7vO8vcolf&r_JE-_2fg zJntve?TMe&OMV-{#nSVt>L!!1d{h@3eTk=P5XnACze_ zwXTsc(nwfdZ(9~?1nQ>)0<}IVpU3pFz~q7e9myneLdGq-;OA)?5}k~dN}jd`ZWkhX zL|&~^3j@NijwB+X_O>UdU*BvuD+~qM2{w@P^?!)V&)2tof9?g!OTWO%JO?X>LE<4s z`jw#2**L*TIhF+r9P+m{{KmF5f)6rRh1fOUiH2WV&{h3qJ&MNLdS*&^s#e)>{RTUT z49}W%cP5hbMp%^SrbQslJU{eQvXHktVB;Hx4;RVp_`A=VPeXZZQ!jddH8|^DO{-cn zUQ0>5Jq!Gwh4bdlZ5x1FKJHhPbijc;YUWAQCb}yEc704cLSrCjs{KnU^3RH4bV$qZ zLmVe5Byj1oc#y=j88w|+)aA^vH(%S*2ykcyxsmyZI7m|_G{)FazHBLf@EdL!7#x9{ z6JUTwadY|0=F;pl`jb1}%SR!5;qfj^0!1D!>=ZcA7!U4*yI-7qaDl7$al6hEg5LIR z%#6>yi^lL1xjmM=zoqqJI&->JG_m_R4~JV_U$K;5beol~77wh-50h3bHa008&N8Zm3zoZFx)cY> zh3Ze~@v~HW&vY;Zh2z;uNXYS#zihaWQA4VA_qf=lgipkQ{N>nN>}ys2My2VX+K)eX z_V%VrxnHWEcu8Cyc?`%lT>W_K=11%;C7qUEN?b1%KRI|G4Y71btoosiUl~jta~QNx zI`3g-P&?vdnHz0NKBfhb~9gY)1bzn#QJz}d-qjVW50HyCt5FMMO$#it6ABUi*%Vtah_mW$67 zmvpjVPC;fHYiomc_hXrxGVUM#{Ps*q(D^0@wO&#(vLAkLzB|O7JTe;yaX7=t9IqM3O~j^1P_C{k!MRZyR(X5c0?&6L|xW*y(b)N2?tE zd0vOc`c>+sZ^5M;9qoN}N2go&yxNL%)v!>V6dyl6D=QioisIbd+y#as3#Xr@+SkPi z3@KQAo?L{6*SbEh99SOkAkgE$2+Y^_-u>Y2*GWcwMovv}XemuPI`k^M_Pb$(wlwV= zoA=Tg=|t#leS;Pay^Q>g+G0gz9hRD2!HJwgr6d33{sV2An)LtN&THh|#JmkTHsn0Q zO52PLdaQsSwyjYm%>Fje{$qb}7@gqEA0tXy>MVF+f&5w64C3`CK{TP{jKf z_Xz`Kh#g8andTjLgRG}1h3LIH zgI0MdxfXB6`MZ~J7X=r%wy#s_? zkRo5KHtvCc0g8!SXeZ$4^daBBSfYLtb3Cu-qEfIyle(%DC6& zpc*d4$QCqf96-9z-P04|IM7P?RMaiO;2_A!ZEkFAeE(i!t#z|gf}D!=G#@A{fBuZU zadic7!=L>{R9?skLsh7&%g-O^t{@Bd@)D{@8QJ;=+CM*sX5C9DIdF_nQ&5bKje(RT z2C}qJJPPnsppOT_`TO_uKwF1E8$v(9L&6AY$V+&O8q(k*qoM}!p2JavzG0|~9v>e= z#VtUjMk{r^1y2%YxnN>p1=C8vrv^Me%o~Cq4)ra4eR9z$2-1N_17QMqTo4Llz2)QJ zfKrxfo+|W7^NWghHZ>7jIs^1pS{m7%F`gb0{5xA)TZe~!P_l$#B((i0RBA)9RTLn7 z7`H*ER4@vIpMT-Y7cU?y!>bw{87X)qaeX81t1qp~Fi&ErCC{og?c5=5YWCg=F7iWumqKj@R9eT4!e0)?y=!i*_pTGtE^m7jtjxJ(Zo?HP(i;gC9tA) zlgw<4wDP{|hYww-ynKB9Hy*(5269IA5X@#_B>eZZ%*-Qz1A!_#S{}r_ka&Q}9FUu$ zp`q#i^ywR)`Gb#8oe(vr43rmfj<3}KSI_c_$#NiFVVjZo2&d-kqoc~h02lLZ> zm<9luO6Vg0{P`8^Q*KU97=?pIBJCk;0MkSu8LOv91{|3`ClC3K1OK=Js|3o#P-cNi zZq-pyUjk7`bDMRV>^sDbI&5{vVeTBHz_K!5Twd~E#42YrLS7M)GOUjuAD^DW#ta>> z0E-Sg5t7i?FkxZ;=TDemgPNWIYE78-1j!rNAdtd@s;zRV=1Q|;P|rFn`47kf-rU?E z2Ke7pU}IrHnrR8zbp-@k>gx$p?L6N=g`@fcCUDPlfgkcvTwS0D2~cvdcZ`w8?(%Ig%u+Pw0qh3X$<~iLyLOdG|1O)PfH> zrNKWBa5v}0biQ5W@vVJUDdA>g^PiPHaw(Ts$Ks2Yx76*y1l(U z+G;&z$|Ry6Y1X7A7YtiI{8*_z(Jr57$vW_8%40 z);hsVf!svUE=&v!1uTO)S;YP;e>fd6CFRepEtH?RnoKZD0M45k-2Rl59Z;YFvkQg| z4LLA7o2o<~iX%A_)F6?$`dyipwwNvAwbt=Z6Cfhe0eP!WJA-|FDE66gacZ8Pf+Y%I z&Mho0(U53?o&uk;WV^fDA4Z*xrg3*2o@4!C#WPC^)r$8a8{w2u#ZA!(2*M>GRF}Um zrI2)%Gs$T4$+E;Hyp~}rTS0kn=KTxBqBzYA;`jP7-%VfCM3v)7uhc8rI>=jX4e*eL ziGAx8<|Gp3e(U=w!iHPfyFbFmHht1G`Feq;@#Eu`Wr5>|>^pHX?m>&!Z-%~5b<*&- znuUZiMt#)5VGGAyKX{k*XXp4qO?~*s`G5mNE`I)SRH}u8r~*Wvm;26HF@Jr!cuB4e z1GC-tqo}wAN&9vps5(7o2G&q}!RGxs<3Tjp5rFqpUt0^s6i9MHVj6B8K(2sfjhuue zm(kkD$bVqN!^^8`#som}EJVyu6QzY|J8+RAv1?^o;LMOcQpq%_;gMCI#64VU80hQ6 zPQJRl%fvL!YS7NZ#1uO5r{sJv=>~_#thY3A<$2l*`t;&*KCH0w7%l=|^mQ zJfP#CRIvKxi{IXyo#^WI?zF`Pv!EaoLI7&c>zm&{y*z8}LnPJo^%%g!6 zC#VL#EG*crw6}mod+;D=VjGB=hhLiRWuA6R+S=N}e1LYSd4V~3LFg^b7#TmZB~0}i zrcF3_@?}7Y63Y{u#ukeSDj4ts$;eCxX}UP0v|9C281I=L5rLj)1q@!$XrP_Xt*)}; zqJ1#vh{XMN`Uey^xnlbczd=F)(^rBg0hbTND1T2FH3%Clxo4dw7&am=?9|C*uwpQ@ z4XP$>xw+z%+J~SvfmtJW7a)%htsoR+WQZSZLAU~=iJ+8)6ZQr&@3z+l)kYtImNV&w zeUd>pj67RK7|0h?FK6*m&2| z6QKPzTk&tz3$~yM4!%OBBlMORDsIMq1Wk@*2u{v_qKvNH-d(UQBG5>tGRDx4b4=-v zpiM;}4-$I^>%o>%K8a|)PDx3bH-e3W1Lw{SfIY%g&uDOAoR~O60?2?+P*ApPYD|aX zVMra6JZOWtxVZsl1x*i}!y^;WHc+OS&f=qYWfliIO39MSpDi6751aAkzefqu00EK%|JUEH(Y{i7s{W-~<>-&$!iT8iMTaL0hP2n#o`doZ=yTEZVSFMK zN`I`c8$&&IXOcEtYkq1f4yH@J>c;}#VtZR|q6YQezv6skR1^RO*Vb}D^#b}`2O;QM zxPf^Tf)o5NUwUi~;x!Y47NXB2z!&LLe_CoPxWTBjrgnC4)7zJ7Vh|{ce?$+&#R!2H zWZiHH$$U@={hKLjYi3pmIv#4w8HoPs|6_H`SGgo#e*(!5htEp zStR-&52u6>f6lsDc7W3D3Z@vRz#nY)w2k>vH(6?4kS9iJ&(^6eKW zX(>3Re=W#JbG}{Sbd0av;$NI{H&*>H#p)k96Rj93?Z#RlxfTHKS9H(1e;t_)hD35C zuC<*V%(%`|ZHFeluV015#B%b%XDqL%VEOt8Dr&U0FFZXxt*x2(-VE2@VQ(!f!xYXY z#rf7~+{5tvxm)n$a8fx73$l@(Hd6%D=>dortIzY~NsvT6D0lk%%|U?R+!PBEF>da< z@88XL09JJH-JzK)Ex+S$VRZCz8uu0mNX2aM3)jAz%|M zy%C^*do&3+ZxCA$bv}T~bnd@e6A;9S_jT3Ojv+XHwJqjO0@IgMMnH6e$oJaH3cb}h zR~Kg3fFtqXDgJ)L1;T(v77Xxob8zraqQC*+D0g*dTU$n-iHPsDPN6z1eF_^6hyq>Z zcHNK*I(Lp0&?geqc?a8Xy+DquPwlt9aa()V~8 zH!6^%{->`LKtRq|&cnx&ww7x2)7<%m!7-k?pNxLiN`qt)6xNU0OT)l18g*0|qYnY0m zmiCJT?OCRGEAfYA+Fr%Nn954&oA2Rtu-IGAPOR*(KPI z-Mn6`4H?+b)zd4R{Q>G(koVaGWD)Kwm;s9zum)u~LK#W{Cutg73K7pUaK2y)opIeF zh!$kgD)kzMVTNi{o%Qy(*57%*zh^b)>YyTTs(TZwum#LixU*Zlnm!b6!N4akaPUFx zP`}@pIKtTI%jLuFo zz)gXq3dF54t#T0HeY{+OIjq#w_m(X8-$Maz0<6&VGiovgz=wjC2r9y1aY1=`v<|D# z>Eh*e1w$4glzoF)W*jXK2Ka$1Y#Fj70@o^3d13UL7-%d2$O~WAPWpW!=e3E+ zXV|LX+)PfY;)KOFneBF)p9N^h{EcD^2SnZ1R z0=>KsoxGwbk>k?RKm$5pUI#L`(PaYUe_92QWqd`?Be&T; zo&-AwlHj1AbQs;Z2r}UI4&Hv)6;u=yWyMd@CZ53bW0j{*p~?;HUJwX?I|Wr^2qWOT z8$Hy#)9VDeP>{n6x2Yg|w9QSOe<&jZCl z7?cX9Abwh4LE&5mooLPkDk+=f&h?*D*dY+k^Kf$mnemR)Nq2WQ5Z551qsx+XmYUl_3dT6Mtt1FzW;D|A>q98_wd-q#+ziI-!T$m&lPGtwR z^g~iEok-^aHuxWwtDTDZix24rLs9ooFd*lIEr!^ym8OAmZKEkb$;_jQa01 zmqWMVj8O6h)xBcjXNc1rTVALhaJvpy^}{G$c;&x-{VIlDP~%U?pa#Gs=CRUz9H|Ey zLeNZUGx@z#dg5&pENQH%IWyma#AS5k)q(ld8Cqn>2?>KcLX14?J35v@Z4a_nw7lHh zTu8vRZc}r2n;$(#K$mtlr_b%ezIX4H7W08QNU1<2jg-d1hF}ok&WCgpJUMvgO@}K@ zI@7cEdVaME54&8`T0OyYU*n`5@^|uwVMC1V<;DvgbjKCj zBn80oeUy!E*Y;E}Cyo51w!VW=BSyWV1iPAuyk1pn3n@$28Ug4$>Q%2faTOA0k zQ@;Sp`x6GLXTFg8(XLBw8{HZi+zyZlVIssh`rXrA@c*#(-tk=a?f-bmCOa$H3893{ z$Vd`GC9+o`WhU9OXURyil~G7Wl)aK9E0S!9l1)j*@9Dbl>;61`|9`JP?r|mF&hs^n zVY-FRbw^E=U@#drgw2WM2Wtd|Zh$I*-R4c;^{x<>!Wg2`yJ?1vLuPLxPp zC-bBDP(l}H1*P*A>IH!XSI&56JI#J;?TF-I*Khh{plVEMboC=bA(m*lHaA zh8IjxU640=y;!7n_y)T+Psg;b;@f>+DssMMln+_lUA33==lWZ4*wR8(pAGUo|w-R@rSCYip)AwN{B&A2q?J2xqkbW{*fpSmylfOhi zyga@Objtg3U%0%!WX{6q=hjI^vu3-O+V`Hc{~~qd$cm6DCG$q2UyEjjc4TyPjnAfx zy!_UL<=L&~ky>Kt%$F7x_=SZFV39AmdKaozxG8Gp1%#HqaJ^$KDby(Bj5(|Q#6YEF zvip<5A#rCWxilKD5uvK~gL%CtCb|c%Wv!AL@LsswBEP7Wzul(7GW>Hu&E@jm;J(6* zj8C@CNi=F)T}iQjX`Js$oA2vsh?*9sauAKU{!-J&f~RVxI{jA|TXnX$#_PM?75m-J zbb0O@aC=>IHiPRO59#gZ)Z*yEvUA^yB5#kh0}cUmS{-anEAPIklcYWK%#0kPC}}c1-*BiL(1BP%U)w8gKBPVVC#P=Vy5R>JY z^tcA_ql*mIJ&FEk(pqblS`ldOt&%#p_+<0W)WnqOONQY^E#L8dfBIXu-}Slta0@(c za=Nf~xGc(RjM3+`(k3;%wS?|&9pZ>$>y^Dd)2e?>)AXB8IG(XxRr8r&**AY zYrM~uwaTefn=(_i$*}rXTqpLrQnZV*!$Yz(^1!|94Pu*@|E!Wk6!+ba6eH+icT57m*M0>&#RleRqf5b{;QqwG61Ppi^c)6% zUp(}3`_D=`3`0Exd<_tj1K75=$B0b&Fcolz_%;GaEQHhymtO8em{x^_gcy&QAR-`K z?5GaIBrwbIaYVtFIZvung`C&PaLN+l=TAK0d0bA7i;D}_Gs@roQrp;)5*K~_M6LU} z#3Q2Vf2GmI$;e!>vcmjX_~GylLOZ4~5;i_A&fU{fS(i9WMc2p(?Qk9tGvx+yvmmFFnz zDs(>0_HaBp{b@n@LuK>DFCS#T9v(y+gjooVZ19L9@qYHpp*L_T z3Bo~3yL(ACbT1*mhHTF-#2UR+`3eco3kYR*hFm>aB1L zV*2{t#iyWCplGBDkh#wbWKdF0j`H~kIvI^L`2#-$7$eB;pjl&PVZk&B?iifNG7=K| zK4j`W!vXlpu2=B-uIKT;enqE0pPpyx?X^921ix3?`}a`mG6rVgI5U6IfBkw#ym~`x z>p?+5@|O1v6UwT`+x>Q@F2}V^>c_80a=+s})6G+;{-k@}6BFFQkoSGoitczVqCaWR(#ava4`^vg-cXxaj1( zT;KNtx?W2O<5vzjtGzy?cH5lo@1Vw7=PCWIFn-^+4ohMD%BCFqnI!}<2t|gKYvtFh zA*?h2vY={&sv2*pyT^5Bjy<3jOzcb&wIq&cewv?8=(PEJ$a>rG9&cEQ2ONRGRu{)l zdB{o0z`cq#iRiBauDtRQ9~f?Ql$7qA@Zww+6<<1nZxHw1- zDG`ymw=q2Kb9iOKyu5@OZMf82joX=eGbwA%j%skgss{ygNc?k?>SLm!XW$p8a5PV4 zL^lAfdgpK0R;doiFwoP3hPH(D10yYDWbCe7A=Y5^astUqKtSNCAvHRWa}O;ra85J6 z9}ppsvKM~T51N{zXLnpT-M{xW1AhgbzUX&hJ>KJq}<`cZk}Rs-ucDHw=ZeX%WBY>81TwFM?IVF z;S;Ubq_AfRExt@&Yao_g4g1x(uK&(oi|e=^P~7F6hUObiD7 zxnob*70daod0>!ZxlQHP**hPu;E=ayCJ#MH_6Ysl(`U~x0Gmdsc55BVf8J9%=-TkM z@LF-QLz#|Ya|n6!|FQ_rHb&F~j{ZI~gLcMZd&aoZP1vXcLG9Q^1g&r1zYpABZqtpC-rVgV>$~ake8Ls1{^mNYkkB6-8Kx+sQJ1;4>u<+iYo~*cnk}?Hbe>x^d`Ty_P4#C*3{b)?IM~&)?-$y;+Pn9F7j+M==AXw6DMeRalVU7 z_^6~}^?X|S6;dJON*CkKT<*^ zZOL@WlH0ymeO5K%-x&UDab1^7+F>V_VxvlZ@OyF5px7$xa>3m9 z@4F{=ow<+V^Ut3@kjQlgd&$=p718|i-CQrjD*!sQAT&$;$a+_;hxp=Fsm6}y64^uC zTYijHB_*+qV<(kRx3YysaWFBFP|$^8K7@z6`>twW?8p=)nXksNu%Cs+xW?;YW-gTE zG`44W@3V+qX=-i`YaZXBxQU5z0ORUmVP@WOiVugum^ON2bx8Ka(e$aUg{38e-PB%c zYhLmjAaI*47GaF+wJW6U%8*j0k&-kfJi3#4N|DsT^(o1;e<^ z+~{a3`7~<(%kXPKw@*4B3omn{JbqXBUnIoDJU7=Rs#svzl{<05Ny&a)_91VpsqdzQ zloaz;oEn^+d?>6qNiE#rf-N`YW#vAjIS>j-lS$1_SQhynwBZ{>=?lfT#ghlA^FoX` zseVxOT3<3a>QNRkRi}DCf2xJkKO9Jcly-lI?_d zE=9|X#~EE?_UMqV?%=NaAUx}CuVXznHg)ay(1G4L9zJcem73RDD~uThQy=FVSf`p~ zCW^jfx6b~2d?_~Tkw%t7WlJg}*Iu2i-1W}X(H&84?0>9W5CWkZ!9@d!2ucRr8<#8H3cy;^Ok$J|t{w&)>c62ZAZruQPD*-Rsc-lfMKJ` zdHtGI22M{YueAjjcyVN*ct_DeHi`4Ef$f5??>00hKw#B$E~u!en3$yM3)Miz5YkxB z9R-jKB})qAM>r#Zl}$OnN~g$dkqJx@2p_1tb>vaIJnD3K-LL@vc*##c#nDudZ=aL| z(^u-_oFk6T&fjNeA+t)A{WQ|sy9q8BRSf*?Z|U+4)Uj$ibAN+h zeK~=diVR*O`5!8LtE~w{q7^1&$oCa7r4)qo?YwFba?kuA^8%1de%%0?y_Vh3-Tyko6A;t zF6volG$<6Zd-=v$-I3nqLZT(}NjjC`5{Y|m+F4yYJvY-G5mnEmb?6c8Z$nuzU*H58Eejx+;Y zGjvaR7ch{0C*MpU+rrWk&^$U5&IHg{>v(4X9iyT&;k{`o~avRsf;vc4`vPk;XK;YV!`BtFNeo<1mcWer3# z)37C~^WhDJ{E)?ww{>BSL_a8>)DbHGmL>5!p>)W8d;Zj7&Y>!&DpMH$AAqVR&o$jKGun^4c@ns+<^6n-Z$wzSm++pSV=zi{ZG?gam zoaSx;*BAB%+@8|3ETphFQu+8}zlw=Vbmdgy+FOx~X2GiFkMl1r-!?D2FJV19YfA8k zMQ7`tF!lRZ!6-3~pbLR|-lFR14_~wtaL+qsrY;2uGde{bZ>R*8n;lqNlw|PBhNfC| zS|V()G2%qvKCOnsTCLPV7C+iEAGMFm3Nh783A@|IE`H=*ud3ee(;?4OAP<+%lav2S z^ce2j6EBFUKAn6nk>7N88q(o>$aHW75?>}xF%gV!$mTeozCl8BZTHrz&Z-4RK%s*J z3*0k^$N1tw7xoqHm0&#iEwekEk9EK2GOmqf%%41`sN}mU#yUCAE=7LKs`81#UEMra z8yhtt#))&XRw)ON&+y~NI`a1yB=jrc=X|xe~HqYgKtxn4+SOu=`v1!u}N^}McvZqDCfrz z-ZPw5G6csrv^z`2>yLeqTRr8Bx-282K||;*nIqZCi5F*g$+guL9Hb-L{L^rim(&6P z7rF-03^0ROGfa0yM_mFAQ!-JRI(mG&or^<)G^FvB=Wh{t2_Lbq-@Y|`JSbqKke@am+pT0!4VHh7&q8>l@yun66H|GG$(v z8O#EUxAey=H(p<8>yzDunuD47XN*wyyB6y*JTjKOM)iux;9o7k*r~gZk9B+%n-e`W z$a79BOwc8w(D80wGM$s{71xV;ikg#89+axYn<~aBWXA^|Y$qo=(<;8r#d|+HIgdL*1b{DVYEY=03j}dZAX)5tS!N=J2iM zW@65*Xo_m<6rT>!j0S~8zYXOz>GnUpp&Kf33P}&ilwxlaQs*F+L91V9@XG=T^DWjC z2B(#Jaj~{A(c@1jZipt|-ZyNqqV?C4PcofWrkz4|;(@#sN%JvnVg-h24%_twve-TL zajdeujlblAloao76fElyf){M+=(yW4r7W#4@2`-HW%wp!g?icd%OP_T4>e~}WdX*s zT+$=@+8;xNniigGl`S?lP>$AGzb)(hZmEBoLXvj)$%=h+e?`Pdlk2bjGdC2876smxv+C%E-_NDZOTVWUnZP)7Q?tT>wX2ED;j5}dqUsPm zDTj1ZRcW-1W2mfmF_FaK7#FVs+qc$PMKe`_#EJtH%l&RX?W&=>Pd}1ck zQ*T+&(0}gsPY?HkPKR-hzgKAp7ri}6#L{J#{po1WomQHtBVm>wUWvD?UFnY_>X6DN zTHF0RHx~_EK5`02xa?yaAK(7TAUGtn>8Z`nuwcs&(Y)a2r6Yj>e%8l=^z-wm1NDO) zq`f}AXpV`l&HLSb*AGm6P+;Im4QM59LWPYB`Jr2OItsuOCx&`@&hsoS5v{oRG9o+_C9=(ef!Hpq3<%IhJr?4;*zbsqtAH))Pb3Y7%dH6gu zQ)DDSKGfE7$oRrO3&!?&?Usz?n@D6d;DSUvK*g(9L?k4aE?t@^^h7|@*RNIxze30a z=|QT^0&r!B{{RRHSe-_GBVxoLUY#ga5SWvjM6KK@V@czKOu^p`Z-jq9_mU=a;j(} zQ|4b1LP9nLAGw1Et>Kb4yM`%}k4|{LMCwiO-u*?d)^SlFjtapdnrdoN9xMDluVEhG z=HWpnh4K<*!r}~!(rqm*SKq~966Bx$aWP2gk*F6YM%&Yh#Trjz?4PiwvR`oYrX z2!Y4lYs-0Ei*4M0LrZ=wMtu-C(B~wa-Bq3+JM;5A`=j9A%cn63aK!pAt9Uu_$)-F(lRpeUN8_Y0*;rGatF+Z_U6Qi6ZpGEBIW7nX0T8o z-$5#0-PN@;Hns=(bch_lI6`*B1J4}NOhRtbP67*H4j9uBB8)^jNasUCNugQcyo~}` zj{V57W6rRiKzzT|qOb+kzw&+FBSsalrC-q2*4EQwWM-cJ`E#R%aq?6Il+m@7)#7-R-$B^7Qr1%GZAlb83FGDb$`35y_IYe`{EB zWj0ZCLPO&{=ixuUW{KR~sGOV@ajH>MnPB6S(n82_9H|(f>>;~>c(6f^1yKiJPNu$n zgIA0FHDR9M4nPga3lnC$moYR?OVv9G@_L z{v1F5<4#?>3nSZ&^!zB54ks8tQ$sgzVExem6ruV;G zc8HEHa1Fg}M(feY_te5(X?A*A@|#O)zli&6%z_D<&xqg;fBv5jXNvD0&$y`-Q^v?u zp3k`TmHFi%nZJXblr?UXvwU=lgjiZrqZ2>u?;k zaN8vOK?;{6CBi$E)R~iT!VUt{&{8P7Yz(3I>})~Lcfh0t`T3A(5Vb>o55DVkcqTR% z7153K<9*XzS%~8yZ}mk|``GLpn6KGcBzg=MTT_(om>Kf&1XT2K@Md@kX!byr#UW}z zctPu?qvP8TABatN(!Y_gSc*_E#GqN{^{3w1!Xz5_@bfI4GRms^UJ~J6%+`J ziH>46cLV@hmc*(sEG86renFebWo25lC#OSYCjc&zRpJL2o`n|$2x*nDy8zok=u&sL zE|jEzTh2bw#fEXe#hD{JD5(#S2caWgb)ce2bpGI>++~wq!ky^&6X@@qDjC)&;zG93 z%1NAv?o=FGv<$Aa_AF>C_+)Y{WUSh{U#?(3*!jGbt*D~QbW*t$kL zDW5SIpv@G)AYL269ysT9vdb_{pM>3ovQpxPZP`%f14gd9LdvPHy|+Jz7QYky@zD4q z{c_Oc%ZO`2S*-6F`wTmtA1IlQvivyI711Fg;I6IrtfwecXF=4_gnx#nV0XrQ!y|F; zYINs!^;?mAh^1j|&`*eOwQ9(v8zxA-MA7}nl=Mq z3oH}A)%0^NPYboUb&UL>Av0yJHaOxp{I~E{J#p>tehtd22mBO%Hlzz}70nFwHdBoG zF!0~>`YdF$xlG0%C~3Gt$3;=wP;bGta&Ur!wk+vyT>b2kvA6eL(JM2)6(rR&4%7w^ z9*V+$Y-Z+gj2dnax3vXx$GE4xc9@%tmynZE=>h^l!9)UG%CxH*HsG^<@l{hHOG&MAk2?Xv6_b1Y@ zj$uXd?*R|w46T~YOXw}YK8*i4l%*Q=8jYdaFq{_nw$NVffHd#kkv}bM7>-vzXk_o_ zdr3;V7>+{7^RT(f)qqH=h5S7FNrj0%1x~N<|$N%Qy3c*D? z1C>43%)vw#XjULeT?o{H(Gq)~JJ1W2>^TiLv8L%iFJD_W0 zpw%YmZn${N`>e9gTE7tUv%xu zYMk>pJ+y4>Ds0zNV*JU|F3!uA?xydYw8%2ip}2aF`bW!M&wKqDWSD~7JgfO*ObS`5 zFP(7<@=r6|FmL=tmcdD*Rlw}JvLesr(RyR0Cb~XEaPR|%WVPIw!o&9=3Pbu%7WGem z&r%Bz1nTbpz~OZ&NAlE_&KYxaZl)6y2}iA$rn+YIw=Y_ZqzSbJ#jdIx(U88Ar&hG_ z$(fWUm=9NJS!rog44xeUl4#tA`}*7#M(ZKiL0yb{8)&WClWv_XRa6@VMz5UlygA!2 zp0lI)C+x0(m+#DffVC2#g_kZ|s7nA!4bl=6W8jXZtO%*pkh}{DzI*>3s&|JQH&jW( zRJe0*KGo)Tc5$iy_NAwXCtf`&G7<`%P@4N{yeOIs5r73*C-?@?o(@zTuW)a*sCYG3j$-TeqrJ}&!;R3+v{?+;R z$&-F6+-DG^1T)Wv5A4#;yzdzx(dx%lWOeYCi%Wp_m|+scDLaB|>^VqQZ~;g_V1bTl zX?XnR*4Fv4SfUt9ep2dloQvEXp)psjth62;+v_?jIpVb^=JG2e6J1>kE2~mSfRGzo zXi&n3Ze(+Pm8K5`=}@h&FT`s&+EY>v@D>Ef{2H}AE-9HNc9lxW1{)e3Mh5}`-@ZkP zYWs%|K%XSu+JGrSVl61_0l>XqzQCw!lBlyQb@cBSq!>aU{uNSK1n<5?+kgIi50s{G zfIzv)6jNR<$(x=mZmWw(&{QLs?r&EtA7xNFtE|R9k!Q%lkquF1%HwBF9!{bre0F=R@as*N`6C<+2S;=DRutAkrOG|hIOiVS>St=@lm3l- zG5@2FVT33tFNc|6_p4W~-*pj+-FY%yvwnC2zAA`t60GriOWOCJ)M4NsMfkAayE9r^ z81T-eMRq8*6&Npvock{Ftk~9A<6CSI}RGA zC}2>j(y=8h{0!kB$si6#M%*#Vfb&I)DkZO8u{f9D4{#p%+w3qYMMdsQU&Drt8N4PY zaXMJMs6YU^g|7M&y1CVB;vi)n;qrYuLas}vrvvRdF)`ZfHK>wIx0W8@(biw-NS3y= zv4Im+AUsLtrk#liyZ#aQtXJ>1B8Lj?qUGrkVBPg+jC6Im>B4|QE5_jM48uyiep8Dh zqInz(k~ClG&Mzd*e|LS28Ur0hwfiDLHo-`(FCu(P3k#_X3(R~nRI_exZAkNfz&{}U z0)v8V#ghsPMRE<=ilI-wI>!AKvJ{-upn%p`E1x_$h0GmsV?#rVE)Hb4O-z*7ba5xI zQWJ9wG)mmp7kYE$E;yA46>hcP>EINlA+O#P2AfjSojj^<~ zLds|P=}GY}Pp*yhfNSu@^Cu%CL&~`J8iXpU&w5Q>yV{}#2f2-(A3}8i$=KSr@*X3A zEe3ii8}TGC#xl~cmwVcbY$>EVJaHlD5MjP zw{A%uKTbS>{LyB(O3YSKzo3ZR_gMex)hP%mAn~CdHo&UZe01C!0rAi}plgDIn&H$z zK0f?NTyx+<_;`4fxntCx=q6?3kbo9% zUHj+T{?J4vnXiZ|rS_u`u=;wm%9CRW#!fPi7_cD1={?8 zfGn?F+t0zVjoqOfLgoE;wwx|3Fq5BVv&ln|lLm`ti~`a;78);fUv2*cA5am7;S<8c zW`;of>1m8cjTYOB!*XqXJ(^A0xha$uBGL3KU{LFYc4HK!k~#D)dV0iT{rF%gY;Y|0 zht={;rX9f;m8if>`qdVED%x{zy$tPiRL$w9I=g{ z;Kw&YuO1wJ2RUJsbD;S^z+;?p(@;HSMfKL-hOUw zp6q{Nss7}?dEyQT=Xij80$w_7U8N_wDX_}J`S7CzF?*+Y=@gIl0x&`iCawv=AUv$& zKW!Zs)3y0gBwoSEOBaTlNl8g5Gb?K>6o)(hAEmp``u9U@FZ#Z_!ibEIiSm3WsuUU{ zH8oO=wvwWv3YRIW#-pR_JC6>O8lo=H^Sp^ZV2DTb0~ehNau)5Vz}{ ztD6zZaG>G@;q;mvO*eLMIHEzdXEtam40#^rEP*`-VCQ`+5O~;XcmI^%S$EQB#r{iv zztDg)>w8h@M(#~E6Mj!fRAvhiyiHQ@jnPeHJXJGaMPUq;e-*FzTtN8j_wV&3J&pt< zgT$9g=(Q4>w=K$pi*|(!YwXG`zcW982t^zXxD=!ujhyzpDay$?-O+dVnj3jeC)w4g ziRiJx+s7ViFb4(g#b>IQC29<%SZ`P*OI7zjyFDIFwp=eME&z3~DorW= zvDIB{QtTX0bn_nUC!y;fGj5x7mf|0zd~JRuGd6pQajciGrMAuH+9N)Dd?4WHc^(0%{pRDJG(%bX;RwNgOPPT_PmI}3z z$A<2~j^NzubYcJ1(cmjZ`RGUbyIAl1|PuSER_#7BOO)f12yEkbU0N zbRE;tP8V|-w_x+4nos*3gOs=^eRvdubjIE+673p%&>1n;7&9I_)%MMwQ|aN(LLzK9 z64|UTM%K($qaYF~PbHMk^D(P|ySQR5_~@qGFoBguz(MzkhKg+Md-ZREo`@`-)h`e)nD;IOMZfvAH}D9QTOz z@WIKoG{wMU|7;XfS(<6$*Yk82wE?Fi>8}V+ zT{1$he}BTXa$?f1BmRe!q$zFrU= zd^+s9coZo;S8T;G^XZfS{g8yN;4^Y_fdoIth}XfY z+vgGP12yYFsqMW>%yBnRLm(DIDfh(-Q4mONZPzg917IxCpT9%5Mm{eK=@*^M(C!pB z*3l7l7?wkfF3LcRWT##FJBLCPBFG(12V^Gxb+6q`RDJ+<0e&H^M#Qv6W06}Xez({ zMGsYAcQ>lMotzlo?JeMM!2J6@eWIX0I^ll&%nOaR5#|3aG?<~m#q246p_PN?L;+ln zk_}vSFeBcpxQ<2()q(b_Sp@!&2PyHzwoWcV<$@_Jek_eJgMcb9>zMxW<28cq?M<_~ z(02VCD2uTEjD`*)Tu^7`GG8(=!BhW*B)!gYgyb;wEd(6g>;-e40t{0%oHz?jIOnmvg82_!L|l9JZ;5e}aw+r7Kt9aJA=E zhy{^#geDdcimHkV607RmpdRDQ%-7~e{bq6F1{#Y}yjy&$Iyr^FPSl!>4Gqk}yE()N z?`JsL2>h!Bzg9RnMBMGKZAvX1GOD97Xvf%+UD<(0GmF$GHBMY zxO!~Fv6?C1+!1&P0jsg`feIlAgp7=hOG-*I_KRyCj#p3q@bInm|L-Hf(Ug{Eie-nH z02&&RP$yw+b6Fc&T4w1Bp^e-b(ZRs-%4s6_KYa@DVy$E;q@d$*622J214S^6g722m zvtIlHveMGk|HLc!fQ|*ycE`*G(cNei7YlFA4jg2R0F;XY|L??I1yBxg4<7IYLU~8S z$QZob`Q7>kAI+BJ|6ZFG!l$ujkgE^ZE2@8ZLD2|0^?k)K7v${>3|tc^d1kn{iDA289qI| zXER%T8I*=3)*FD=eV@ht^A$TEgK3Y7P+Kw0@}@EOJG58gnwaGmp2_K@`A?a&^KCTw z!;y<4u8Em8+s|JAmL#*zrJ@EDwejrlzh6UBBcw!on4x?-CG=QZG0r}yYIhny5Ei|? zH~;suXtGgoqiKUf5MO{Vt5tY-H`}(V3untjYry|~9ZBHfP<_&^t=~NF>d@{iY}J%b zVTjCsez7$+{faxGn-A7Bl?<4(g5R_9B9ZOCf26#t;bJ2DoFwbfEs4AMC}<4+y<<6P zw)pS8^ZMTp`G5HQ|M#tS3&h(6-qUK)Wr*7TXj8gonsCZ%mgsTskI{2BdAha>O72v? z4K69s&pzzB=qnI@=a3A$QKh1OWMn44er~UwQ-N86wYhXY(ey>S;3ydD*3M^rpCK~| zGH1?J$nSLy;dyY_seEi#uN}F}`=j1%v`Uyfw&xsGS<-$s47T;m;Jh zNrH8+iCT|1yYdF1o|OSM82OC!gv*}cm0^=Yhawfh*;!wDa|-Wy)_g#8zXjzJGKl}X zqP=Eq#0OlaM3PT<)>KuEzl*=Nx@r`4H0fJhv}%@hqI`V7&7*Hkg@Vn(H26s1Hm%OB zH1rs6I)@51J?dnmKYt)G!>Jv*timY^P0bVC_y-R#LdpDlt3!q%zd@Y(lgkBfGQ-W8 z;i-?yz#*m|V&1-2_grqt*e=^7|BGXxKYp+xl!)s2ua&oEgmLN;ZN;3bSpHf$jm~Td zqsYubuBZ>0E3Z7G{@J_>-QrQbKhj@wm~?-4WjF;^0@uN%tS-OfvmDorQ5pad25Mt7 z2Mw}2nar-!;iu2!DlT#YCDYf^VPLnKCS#+ZEGvrToLuxrjq#$OU@t302Vqm2Ma5S? zr(nf54>*)uWe)s2H9y4ifA^Et&6@>kR>)Za?qOwbKmPM4D;?dykZ=&^;a%pJlCFre z3Wst9DG_ytnETLbU&s?@jbdyF2Po+3=xAqS<9DpOVN^7s4SWWA>EIv$0APUAX`RGq zV%&{42wSub65`=zvPW@kLUbILUwE&=sV+xOhEvLfC#0o&+uBH0MCHG3O|fRMk=!J$ zE4;frIth|39&_q{YmvvBZgCr zQlgYHp1-_&wiwy8f)6<=2K_!r*-EYWzq&T3s;Z$|cjIfT*a9z7g^Yz>Li9~v^;CO< z?c_cg(xS+0e%8lRCx6WBuibQ8Ln-%yephYalYXFXFxleeHXg-jrTWFoWtXF}ifCf? z1*5)iD@G8RHk#4Ye<0OT#YVIW8*W08VTO9@R)B$%UIpV!e=%M3azs@)qqPay%pu z-XLRAVan#f7(DhOxNn9lQjje=DykjDlzsx1Yme+j{$UH`6pY0Q^aNg|kP>y=*l(yF zoIQW%-wu0vb;b@C=G6`pvvbIddzPc|Fk9EwRpwWH!0EFO_%xEfBBb#4_ST*PJ(9bC z%a9TWeN;!%KF7&-5>cuYOHfOT9&?VVtZV^;^xX7FNhw3E&nD~f!xxN4HK5so#sF4y z{~*Ag|4cXls&0h>7RhCaQcf05PNI!RvGM`10X@O}Di5sdOe@#$T<#1ptP&=;;;&h&TH}gq)hP3f0ZYbbjsnRZ2kgI?Tss7aqpz8Sj{z-Ub z35I&x5@@(uFHl{Cn?dOhkQ&hD0XM?+eGDZUd^(D^O`*_TDYo6Y zlY;+FlQ_&ND2N0qog7Q3N%o)cfN|QUFW(R6qLx3{Ld=mR@LsM}$m1vkGj7ILDsH4h%i?Cfv2n2UH44YLo0;k8;q zM{ll!H(OODmy`{g$BnC3CCwWGVL(Trj3RGmXep3IV8O^p{flpn*%^BRJ3&e;xFPKo zWhd$|_?hpgrb70>47oiYA>I#|2L!Z&YkR2SHr+|f!=r;BnQG6oeCJZfXJ@|*wSRv* zR2k6{eKW+*MqNEAD{C1eUpE#SQ(;UJF@DX^P>#MLUX2&BqMbxcDW^>AryYKOq*eie znRp!_JQETar>WV#VVfZ*1%7+<5-%|c1o}QqiiuL)u^xlagM4rkniwE$z>XER)_82r zqrwIc3y?WGCkM4GgiHvOrafJ(Xu4DWwzTjB3LZX;ZGtIdOL&*egnw^;$ zW7_?p=m9GZwcU*CYm`IiDko@>UklnTaQfzj3vqYvb|8vnd3hPs5Qe8kjU01V>M4cp z4}Sn=5125P<5h&DA-}3X?@@gGbu+WXv|2#2^gY?_%wkuPwOWQNZz=HGY^^P(f{^$= zmvCIXYQJcM*+41F-`^aVmIR9xSWAWhxrMlTE~5Y4#TWEy=)yF9&&q0>m^jV!rNqUF zpFh8>91@L7dTq^`f+<+B1Q|4#Px<65y*r80@A?3v=}QIK%*2o>9+r?ez*TCloT_g> zG$c&){b5>db6p+yO})fXCFV@G0N2}Gb z6s>YBk@=dxRL4*CxMI!`xMCV5oJkwlDe$%uG3^0UgvJe z-w|@qidCqeu(^=&s;Y{>Xb3Up^brLJj-pk^JH0?ICY z9RGF_oox@EYihiYjM8kfxTdUZDJB*%`-P$|6%~f~HN85p%PuaGg@)zBEiD}_E!4sJ z8Dm2`hew&9fRIo_f4|l2fKa@8Y;rOyGjrsL8Z6ZEQie}`eGP;X)ydX%=)*tB|%_9d%LjMv18zxN{Wji zRDup0fsuv=2DWx~Q2v~k6Qw$*Vp!uPO?WLstY5Ib*dAAwlamv|01y?CtCNN6WO(;#-2+H7z*j!W&R(JyeTJI=BNf5lLfB-T zDBfCZkCpWBp#kEqz&brjN-`V5QVt0WH2b8EaB7TrQbKygMIpwiuU{WSEcN&?9E>dc z_XC0C(^XX)AVSSg zyI;BlyR|1SiHOL^(z3E3_u8Y4Lo|W^cNt)AY(T*I+qZ-Co>h954}SdU_4gM+;`DJ4 z`1lUOrl}Qf*ZYF^-WCwBz1NbS|1%*Y1KF-F(3Qw|t>xamYl`e4C4O#h^3&-V4-vLk za&=H#Q78=ba8FMUI2J|!>z|982M5_$*Z%&UnwmP#P=@yin!8`k!NCE6iqJ&hB_dwn z%$Zi0r?}V!lBpl0rBQzt66&y0gS;;32=R5FvcG) zbMr?WKr+A!fX9#bYkyMVk55}GY2 zBml%6Cwz;N6n`D^ZHQULZM%7285Q>0353fyj@Ch4uwwxOg|>g^w1lK$`la48geHZ| zM6Im2f_4M?5EmB*^a=k1$2~U6Dm8761-66i?Io+^_JXpqUYJpiKe|^m_)Z;D!IB<4 zFx9WPhBWr)CKtQJW0R8PE#C-*ihuf8<>ctNBc2lwcmgXkvapZ|Kb+@JeI)M@OZ=d${_KLaX zd+O?vYl`8SMn`|3iP977_57WH`LrKS}MWlKb`zwtJ*#J$Ur!+SRKh zl^B`(WoKw~Zc!1k`(zV`GEwyQ{sy=K@+DN;GKeE*>^!!& zdILOHi$KLQtv+gGx0b(MKX>l=m-1KUBjxjckG|+jzcl)E)cqqrO4`}qfhvYvhQUzrB4LduCg|`C9hRMj# z-amXeBP866e1w96>tD*5Ha6$C`%A;IuA(xh2~|98#1GY- zbuU3g8-TW*RMgyDh)Y_bFWw0;B7Z+Lbf8=Ior9+ zMfRa% z!h3RZ6=`%hnn`1nT5ytI`H+k$1SL>qgwB7Pni8YLx@U*;(_Rrq^;R@DG)lOGv8Ry~ zfa4zz`yn(Cs18wstuF0t!E|$8UJM&Uz;{<~FEn2(J5}1J=jFx4NW<7z7z@DH;$}ny zK2%V0z?CaDqQ(0vf|>)Pz&*QL1fve@`j7_f2Ew9uL+(VfzHX$lI)zT zi4P4*%U!tMG&C4bw0K4{o159$)!67z#^uj^k0Bx^22YK$8xn95LN9bWb_g>)iln~? z^Z*tw%3i&ij6M)_{J0zL;0ibKz`!&l23fyjfc+*$trTT5M$CV^gu)t;ufgU!ny{Nc zF0k1^;xU2p7pa;4{`DHE7oX{oMSNXdSz%yggp6ee8pG8C||l%zWJB>*V$Pw5|Tsi!`(}woTIWNBsmT>fBJ@pw;G5<>RFna zahP5M^#7l@YUJXRhN8ac`|`z5h>=6qO(SvsRZY$C(2%hZ<6Tw>K`yS{8k{mIg%uV3 zEiHhI1a71DfQg9wFpz^rgwpWRVX`i`pKS=8cLX#|C0zI0k7|H|S(+T&2SotN1XgM1 z#|Y#CBnjRa=`|9pxQoJYQ=n(a%dFf;Hq}aaW>?yYtpVIDW6O|~xI|CqI2oJ+#%)U24y>%Yc?^d=gOvQQ znNCFK_3jAt0P4+ z0~K5iH{U{1yHm`^#)^s0EYtp%;P)^2F|PiRbMM$Iy=U~{X0MFGC=96CB+8Pyzw4(& z2MPPJH=okjMWe6J5g@m|w#dUzSAC4zNZ8&)%U^Gggh2jrk|gSvFOdOkYHDiZH0aHbJ%^1cFZ=&BSvRh zP|v@ispFm;RbRtvdX2iHR7DA@S^hG&?>T6l)4oH?B1zmDK_BV&?ahHVjTAh5`Qdj= z32e0%r_bEhr_EXQYyWkLW#i9a=iF+zB>&G=cDsK$gbeC< z^#E(proC`z!LmtJ&q~Hd#JIx*QON1HZWcpJTlM&-H z{_xC`D&+K1r2C;SG*6Y4=6JzG9AyEisK#=em@eTls@*z?0S$+Mn~+Bn;5@?&~AYb8A}$=l-MnGxZnaX!Me&5tmA)T(op2yENZJe@359 zhheX9hNiF8i{~1mTCaAUBquWGGrp(I$;=rn$UvR0PLl9@PkHds;s{B8%KAH$)&^P~ zik$x+P2U}l<=_5YBzt5=*@8SEhJ-)@J*b2Zi~@%iR5(L@UnqM&oS$Bk4-~+vh@7XAMWK zxA<4{iz_xWgOX%rJ+?&5V%lWaw>$GKC|9~>Dj&Z;pvn0lynOYFt?iMX4B=Ux2g>xr zzI?hT|09(~>*LfdiRDBW^Z*#*Fd3e{?cY^ z(**Un(xP*1|IP{a6B zJf?Cb;<`^^doBO@+=!mmE-DY9AhC8XqGzsjj9*Y`8E1~l3Zn)L_Ii^*~A6x`kT zG7=`<%*8NFNBQNz4&6)tW6A5-YAzbtB4kWE2jYb|stAwN~D` zcD`x;Uqi&>2ic=H2v-P167uRIVn?@&l?^EG_89T%Y!&Xjt%%;`wL*(&lP@o?alGuZ zeUdX8dVFA8|A6|ViHQR^WezQU#MCM&++Q%;(@OTJB6yRW@WL*s*2E6EV}JIh8h6qY zMs0ouZ?m9iH3c<6^DW-X`g=PjWFNdDw7RqN#!ZzE98BmCsY5T#yU$A}4*vW`HzQjc zKuN}Sx#p{EpEuQ+jP?z$Go~)h)yh|b#Djf2>wjMivd^%2tF<7}_E$vrrz7n__`F?=MdYCQEHjoFlbxS%M|?}!Y=o2usU_mT@xLe}nJ;v;Z$IybD%md?*=6wL-;pKPbV@ zLXIZodP4YwqEL?g3zhK5@ZiskG-vykRq1}dDpo2W6XUsc%W65XX;ISZKPki74IG;XNaGu#T1%ubav ztId=XG_egOuSI!{<)jMwi#-^ZoZG=x`JavBYYbOk6cf`^zcjJ z*7fjo)0suC7548Uq2esseAG|xhILyFDtP~yWGk)r9=Yin6r@c*lcA9m>-YY}MFWY& zxLnI!%H97g$y+0|_Q=aOS+j&}vWS`QR?LK5^^>JujeD{E;DaU92l8qJ7aC-{EM*)* zZ{8N!v^6u+K>y15y*p%EwECU5i~^TtfO-ep_3O(u-vi?jv^u}{GHa!1t1Ro`{v^11 zfytRgnuOh#Wp1Anyw90{&9UW zKz=HOs(c~Hjr{5nrNPYe5t8M(N!0zzrK!?Hg%kv@hYc6V*_F~4AF^umxi=Z-Yb|D3 zt}7OXE33R#+je7~SWRWo4E>f|H`|!0`eo%=vON2m^oR6=!jA>Vs1%=*WId<8dO=q1;qeQZ-6Xtt}~ zO*FG;I%vAA{mj;&|Fi_n-|mC05cc|F0ES>2QMEK-VOoGCT%cYC?1&@~(3MfX>hx(T z)!oBEGyN}SBO~*leKM&s`cTSu^!mar!U*t4X98<-cC&x-D+4xWH`h23B~S)bZebZ#La1hMZzDf2 zA4)2!I`4%aO=0AEg$6u>kd%A`wunVCBU>3%5LDTqpFoO~n63e=g6{d=QPrr($Xg}( z@)?MXufqx{oGXTn6*M0#L`GGNhik4i?L#3{zh3ck7uOi}ze25L$8I-Hr+Q2|KOgf+yVOq*Y93E5 zA~JN{`6)dbvf{8ArQRoI7itrJn$kU4_@Hh?{N2$vvu(QC{V`pOt>A$Ku`}XVb{3G4Hr+G83UWuBipMuCx!e5!^!a(h$# z6g#YSvxBIzL&AQ3AwDc)5%eT~D1$=yvdF%upeDuNJFOAPW(Una>JW^|o_|Qrc;)l0 zp7w?0JI$AT&y|Z1J+pb6#yNalA@%iZNo;JelI_MS@blXND~0|+GR+CAC58>Gq43GO zj@??0W(sn);`v%J*8l(|HPvXMgEDj+EEN06)~SuTq}hIr)lr4Td_5g(AfuxR__((`d9-eY!vBBT(!Ru`#o&lJP`v|t?W5acqxn3Y$7Cg#sB@u0;YCr(DQg=&S z`uz(IFgP2kmmKF9K{wP|*WN^x-mhOHW!vVRjg8a7!jwEb{(*S6~;a1O5Or1p+TAWu|dyBbZ~L${n7SQBboWn*bG?F|DpILi%L>!W*dI#A9C$N47~kC|&zI^D*mEshY@# zGwfyC{tg{sw+r0Gs**Cl7~k%wiI4Xa3fxLmI+l~E%YLc#Y*Oi{LwjpT^>Y1ldwDV; zres~sYYq)%`(4k`$#6+MRL_2?V#4RXBzY#XVEle9LB_xmpO5oB+ypHnW3ysbW9D;b z&VTp3E$FpT_vzSjvg1#MY9;Da3pN#bXMJHl&q)52+t2^S1pcX>%3Jixu@YEaPkz+1Iz^UEWDQFI_c(4F)O{H4cydmh_6+yt zAN74uy7>nKkd|jyI8>yI?+j;eCD23>i6%TR_0P*3N6r6EJ2CsFw;6H zRM2J(N*_yq!w9;2tkX!k{s@K11!npac+Ie1&Al}EgHaII8;E}Ha)T{g#PAKWFf;!d zt~V`y>1kwiIM)Q^f(vdf!8Uji&v7N-hHmJ`qYOdd;CQ%0VIhWU^}dRgl2RCeX`r$o zca=1793e@y&*lVXCU6r3ColJSczT|U{kqGp=jM_q_;?3`%1Cn#My-?ryHb2o@qPg{!`!o{pgcC!}MSxsO#m0oIh>M#Ks$*83jyaO^f=Z zJEwekSBl5G4@)?&SBQ%Gu0*u;Ts#;&LQv*wo%FbqxL#77dB<;ZF^GIsgZV@xgBi)E z&z~)AZKr?yxSO2p1D-p+1Pm~$hxDu5;4`|8(V#U^07nrtGcbf6+z;!V_1HVrwg-jt z3k#rohwH|FCPcJ^eoU!oIt9-W4{gf#>J9UB`Q!GOZ8bG%O=joj>XE=-d!$Z0xxJ%f z7Ii=*8R6mkanb_XZoULuA7W`>weg<-e4dlIi0*6St`l1`y#jay080;5_xGD968g70B z%Yxn8hU1i}#tAeM5}@iAEI=_xOh?FPl)QX7SPSlxj@S1Pe7=}&N5vJgG+8A*Ncx`V z<-xxR(;iQe3^drkS698kx0}C>A|kJBdk9euAz=uJC_D)Obt1-wj_zJmR20m6kb2xA zXk?9V8#gHIgYKoIBtF{~wTT7>b`B2GXbpu49QTg-+o#*s)0^8gn?v%+=`-(U^!L~1 zJC9#(+DtlPO{Dyi<%LSbp{eP5mm0}-cr+#Ry?#>@SAuMvP+@IBUd$BKFX=75Bc!AG7Q|?!M)Q`~8 zsA6ij1+y=e4+UZ`nY?~e>l&3`VWe&UawO60LgH1+w2S(QM_wzJP9^H-haK6BHC9Yk zc%zeZ`;bLudUa^sEAj$n_FnPpqXN~;Ipk`d7dG6adTw|BZHe((&A(>xblzmfImnrW zutlpaB$1dx@NvJu=8f%@r>6bm6v8L|1|HaUcahQFv>+sM2pjS>3)t)boH`+@wEx>b z;=!IhkplL8H`Dy7~F zD`3bjUOaZ?itxvesSN$i7EOJH17;yu?T`ar9hg?8aBYi>c30pJ4cbUOvR5C0hlNUJ zDeCHbOK~tzi1N5)a8gt>H!rVocmR=CyJ0x?#jv|S8GVM473smAUS0~s!X`Bs)u&** zw6^v_%b<-GCK42@BDjJ!a@SdKg%nYngD`}^{a5d!rDtqx@8pD3;loT!>1k6j zZd@@N6*f`icN(m$veWs5Rbpb|L0b|pS?3M2D!Tb#P>dM<$0sJX=bNd~-U@9RNe0Mj z5d9&xxBfFqTzM#p|3IjClpPx1dwx0GiIK-L z&8Re6yY;CFPr7ByI6*NBOoIy8|)p{ zrt0FkT2#{_mCxMj)!+4pi``bAcuRNW`h>lz`>dsq$~U*SJb$CEPH8odL?|z&-?o@B zeh}n#$Nm&~fK_#F>!}~f8!MePKiFdoJv{wCpGkkHHP#d-6_I`;R`3v$@tEjN`FZVH zub*R~lp^0eQ)@#PFPHhNCr`IIuB^RbTJ1RYz$hqIpo~+WN}KwrE2+Z1(S0)B;`8s` zHoOZ7e^4*cBoNfprI?}q8H~Y~F@#1#O#{a%d>$OMktQ`G6EDE{iBf3k=w$WUfyiM! zoZ68(x=AS5_R$$EuObA8O5GSvhhI5H7^ohjPkrw0%A6Koa`;Lwyp;%IK&S`WO^|+r zpB=*Y+2#aX%edl0wOA+o8t#Fyn!puH6U=(j?lT^`t`VRH*|9vn?m?17mS!Wp<89aA z+y2{|RWUJ?mp7X02p(9Ws~Qj79L+q)M!yUVQB^}T@C*^+m~JtAcz8ga$39|RQBZJM zkP$=9d11X+=Hr-WS+9wYmMNde(@u49wzrSq-PJKsK6vm0Vq572jW`^Dva+%yv!#Mk zxQG#$#}&FO=(Dg0Nx>|Fi&u=o9jYA^C^8;p(WFOrtpJkGA10)pAfhgqwl6Jp=L+jv@#vHvc#W{X#WShI*bhEa{?0@z8)A z5+ZB6au}&M@Gv1`JAE47A1?2N!{SLRV!r|i+A)l>*SL=rzU2Zt{d6BXLoA*t68XG161g6>kKxJudh2M2wJ+SvdQN)E;;0 zwyJI*jBVt}IK#l>^)r3_9z#nO>m?&U&BmOZ5&NYNYisVC9WF!;g7pRMI9qtQU7N*XvH<-O$?jP?-vHKPUEWo8M2*k2N{JakiE8rehVb zP#aP=3V3oxNBH}W;$xk4+uwKXsmSN<#Q9DiFp)Vq;lboAG8%qUK;`MJf9@>X85;#D zjE~``A8GjH9OOr`bK)0~e+}M}`RL2ekGGxoohSb+?MqG?8bn>dFro&MGErr;%7uXN z^J>`srZTFdp8^`^C?Pmab(Nr>V4{_2#>%e5)eSNdjviEb%z-#x_a1Eug9sH?b6ZEp zEnF*#T-~6w$KBS3x0h9K-00X?QN_H0Os6~1ZBxrPgo9!1dXUtzW_k|&Z$5U=py1>C z3~8&rK1qVXqih9vc^J3DJ6)iGgoqZaVPllb5C(4~#iHD>dBrX;untljsGpFq1gK+t zWMm#!Pi`F`Et1;iz30H9gEan(x%|^7=-5*qKJ?z%-g@+i1u24|q5HzkkSYT5u?^vb zj~>CzwrggpCjp>?9Jl|U?ud=a;@Y)6S4G_1PGQLT^R;YcYa<(2#>FG2l$5Fu$OFW5 zb!CPCeF@Yfnl6lutB%D1zQGd+OW#|jJ(6ixGP{36*@b-pGAr=1NYX*H3QYGT8MtMU zMFq>i>aj*n_i!`+fB;C@cKdaI^$Fp&iBv50J6&N~s2hE+&KNbe{Uv5Ng6$Cl4tZnr z+ub`}U>|(>aQ7jQ9<>_M=z+pI(mn+h7YQ}>c@kt%*+N=|U^UckkMDZw<>isXWAg~Y zfSw$+mE~n%uoIZd8HEf^0Hp2cxRQ3|H2xOIa%kH$=^5DAFxHtG8bV3Dg+GMT?3U6- zXTqu36~L#hKZW;#D=VjQ9()JS-*4iI(YYq4s(AM=! z*tN5en@vi{hdVO&1a*~l#ne!L7Ij*tla%7nf~o7D+E~N1Xg=#SlShFsnKY}!SXdQH ziNoWAG`Lcd-W#1cEBq!ut1|P8s1b!>WTi`akT+bxhIdPtew4J_o#(v~Z6c{$e#u*|>TUniZH=65^)b&J(`Y?GU9|zAg{xPOrB)M`rR_FWB7ft76$)eY3=N}2Hs$z& z8ohP{6k%nmNlu&^lieepEGQ{yz?Fc&ZCLNj$G}xzdLSrv>eQ#3j`8)|Iyk`a2}p&&{e8)K=JZ2Ig&L?! zJMKVo+#5cAj4p_|9^(OH`trpKX51wZOd>p%I4KtTdWdJki(SLbLK!9=%LLfj*^%W1 zLwO>|7>$k!<=Df!QEQ0oC^z{2^($r+8(Z78xS-AE|MfObFS48M_e*O)ex#wHO_NI-WG^hTY{k!gYs zJ#}#@L8r7F$At?Q4kBU*V5#jRVId)OG_*9g05gI|QqEFOM+e$}91d8@5gS@vRfU6y za+a`?guPjmnCh^LhsO!zl9rU*oT|m}g&TfhZ4;{rLeyo_=SD^#ZKk58#hicc+}UXr zs3#}J$BC+4JUwesit^qlPg^o@(;Hdw*vjyQiQh+o~|4xH4+M@e)|kBUeiPV#!rn&HH3PkSRy zup+j~D)C0A+r;-qGwVXS*{jND85E^UqpN0V+@172vbJ6>7Ky3VJQax=cI4!#5Ii<_ zf%kJ`$l02<>_IL2M}0p$94c2$<3hwU116KsXm z8k-H?%lIJj2RYozvL4j+Gh$nBLUZYeJD;py>El!^uvgBx@@wM=>j72SNpuBq{x0(R z++A^2ruB8sKE9Eb@I$2{l;3;wjSOj(-{j`zLI(C}Nm4Mp<4V>~x`r2^X% zNGFXa*<@6E@D@Q<1u-YKwvhdlZeCsyM$-S)+QrAy6kU8+eayf4ZQR>_#R%)>(Q0}n z)OSEdySB06K1bD`My|`feO#6xz;}G+=*5$j76>jZWbAf$%6iI2swPi2gmi5yn_cK0B|-flRFRG>4ASOsjui}0`ph||#04oRpaHIhxJck>HPYSah)l&`b{3~&0R$7)zyAf-WkzpxGPb^!_ma%m+_d60 zv{dlY3S+w8*F!oU;=0D$&&$ou-7i^NBn&EwAcN6Ga(Px(ZRd8@W5VugElF-IS#q;7HXZQQU~UMsotiP@*+ z6XS#8?>>%e%N8+Yee~aR<+#nM`@@VGL#1ED`Tso7NM`kYDdQ4vVg8w>8j;AqQdZ%` z&5+mQLR&^1Lc_z_N8q=jKG zLj9#YAA)Fkc!YbkMWReDTdAMd4bUOGVn(9h2Z-WFNRA3Z@4VYoHU8$Pc` zsF!Ob9N|h-eR)c9Pe=f>XKnDGEMwz2@V2_26;7E={LBx}w9}zd4-tP0iG-@K^LMr!}s-2)->auU| zbDgeho5oq1Yv1pr4GRpW4jS3>JRY87ebeq~yFuc6^p0BZ;lV%umJ@zWW`@cL23G#4KX07>1O=^{z@oS^{UHNdVy3_d!S?8P+-wQ3bmz*i~j`WJ*cJ|G# zeMRN%aH{TxqI{0U)LRB#jg#`3pPZwgvP&r$#dD;oEAt&I78FY_=M#`y2xjZGdh}$2 z`#$H@Ln-Z7cobMpEgY5~(vV7}Yg2U1iRh?wWOX0l|9d)VRm$S{Y>iy*-i)Khy$w{~ zFWu=X_ACDE^+LS%O1LslqEEI=No>K5i{3w2+)7lLI95C6p7P$M4w<}I#q;~cr9eCe z5Ety|D5TnhR3;;oMeaW1fB$Ba4ZK714MsTR&{kA<;gJgOeP!uJ%Vo9fq*yYi%UFOB z5#?QieFp$NHV>>ZEHOu+2ZJowqZz~&6rz~2&=SVscx1Ol7}>j+Q{fZCI1rj`n;ZM! z(IZLQPtV|3N2w*bU<*PbK6Z8z_deCkgX<>akp^_5dU{Ekc}Hxw1NV&-ee3Q{K*AnY zdn8gKGzy|a-8^lqHtyeEjvUh>xO-Rgu}oO&YnCv1r0phOyq8^B?T4T#9i10qC$2dF z?E-(jGC!}6SSdX03?Il%{+|{AGyv(qFsK7~JUHt3xwr^~caV*Q=h#DYO!RmvvZ6y2 zl2(qgX=p5QnabYyt^Z!=rggfD;=X24pvvGb<1bwjPJ(l2w>C7q6UKZ@IPhq2g<=A_ zn~*Sy4jUM@FfKRUc>Ve{pe^9DFz68y;GWSzfwHA%7T?Uba(hs9Quqyq*V|}hlDFG} z)o5u^QnywlO4^UG3ANhSAZWK%SXgl(vYCVHgT zcb^aayJD%dtsLf-B0N<{$EopNV{vuhI_a0+TF%kIMZQYfe&_304lGJri|E93{XK3F zvD$MgPtEaZ$8Aq5`6Co6AB0p}MFK_cdv^Q1yuzpDuuY*F_wgYfRPME1YsUY6#%6lR zCo}#E{d+starQ%mgGE~?r=A1%^WV)*5)q~@ltKeRX|_G(T6%IRGs$vC7 z`J@ZB zBIG-(;q3)FB@>gOm$nX!?Z5$|6`zibj396fsL{-)Hq&g|b=2yWm6yk$sHfJ?3kO|R z7S9_#EGDgAzIY*{gPc)NR7?!Clb~u3049*86wSL1kO-iYGMi|`xmw|r2Eg?9cr~dL zhyUTq{V>C!r0xEL2Z*lH#_F*C4{A)T>vx0x%s#%an$1G0Ao_T~USUAFolObxP84 z-85?#a{1UuUdQ9JfA3wnJfJ_usP#L=t<}oF_Q$t%Ym&m6BQMmxS+fLKx-{uj|1A4n zPuCjZOKx@Y)ANKVWtQbMS;kg}W9NQnN{gGvDfFLPd6sgcC;vOQ31wX6Y4P>e+aq*= z2O_)@Wn_cO@`^~yFZy!rykad9;dgSfQ0JDPCCw3PE;3X;%NTC55_`;t_rA{SzPtw6 zjql0R)e}m&R9Tu|ySi{KxnNmMzKno(Sbc0N9dF%Zd}wX+Xm)0%6p0-H>nBd%YF_C+ zC(H0#?1L!91x>&^QBh>8_p@!)MJ4v1!SaqHC%X`cp%C znGT0odOEvDH(GmcyCBju5%xF0Y&!fp$b_T+D2WhM*`2jcjDwo=S?YXP{_w(5QobIp zpjX0}pm_d#h*X3&f0z^LP=xx#X+goudD@Rra6B;Jhh$9iE`CTmwru6>Ax@! zi;gDu7CyJGgSi4E8MZ}uHqnPY(k6=chJ#}SG|H2^qsJDAQ>WKOo~jWQ=+V*&ypFnZk*qSg!`|tyGMsDq5`MwOE;7a>U#-ZAXt|7yh zhFz^AsdRDor!=L+cYHpsuIVX}P6m=m{Sp6V6o+Rw&)fyg?Y%UuubuiY@%>5_^S#@+ zR7vt{pFr+)n%3WXd_?9)BtsUaO16Z}a*WMq<8Irh7~g)S{Zz<$Dk>#+lh$)q`Og_^l7hgVl^C>$QyW z#2sZ3%gL5=bFPq|;gZB@(k#{W_8eEkM{~q1nwgo6)Lk_-t+!~QdM^OdOdNhIWXhtK z5u7~|Rj)M$@1iMhH4;@A*x6;THQdCx4gO~&FaP&%2Vgg%+SG?mQ8@Jbw%#NOn`1kC zd;~il>6-1MqWt`_3NH$>M~_odP-+SnP7=!@>JM#(BtuL<&X4h}o)mJ_MRM&0OTV8N zY`rRw*Sya<27nzH37UN3Ub>Nl;*5;Ojt;6)GZfu&!{#Tv+g6R>t4Jv?SbzW`yvFOp zQv}g8@Cb2+avTy!?>vp0LR7RLrC^rdN?*K~o|!?ByDHYGix-nIRbbvktTt@QCsN4g-~{g~c3Y@48UuM~!9#c8WJUTE0)y(fx85%r?+E!TQvN%ov;4{{ z@KbEvn_$lGafc=SIhmAVW`!c2rr%T-0qy$S=CO==Doi#l6yM;gV0u6xtRN} zG*?y@*_Tph)u!emoiFfJaDP5#5goA4N`{SPxr=}PXSVxPA{lG-(ISRSJ5sU>vg34K z9oIh{tH|9@pqo8&o;6{KwslU$&*p`??h8)exlr+$OMLZChO*O2SbiH@}Z?>J!c!J3*dA0LOT{!gF8BNbnn zH6yNb;+W%I5bsT%}TWpZRLNpP=0~XmgC6Mjo)m zDi#3^dQUW>VhZu5M}8sY?KPp#mop5`Ji71ujdwO`vGYrS z#ju20z|RLRoo8pB+)muNZ3&XVVo9braV9y=3isyw8WOEdn!MwHWtw=gvzNlcu6^`Ju($b%LdSIr( zDS^HgMJ^DD6>=QjixZR`kFG*8AZ4*<)Q?E2bnJ7=OB7=97QTuvOZN-S7Qfi*nmC{4apFM>w=gm{}GGYvedIz0nASu1XXHb_ZM z9zCIn&4gLPg+n?Ad}?RPY3kRK9!jYb1b6D_m0%=;-@6(8i^vm$VYK1qUSQ%hCUD zsEVHOKF*vc<}1(kYgm>mbx{t#Bqrije=nkXL!&}4c=k2VORBgT53-^c(KQl+b}fb{ z?F$&VPq<(7S&zzeV6*BQ*C!Oee|<}skKt49@R!ovHHG0Bu1C+#;rqI8oz$a`82n`N z`7AVZI%4Wu#(|Sm2fm!oJ{)c6Bj9|g<*90U8cDg0dc^*il)5!HO5d=qcV#x-?Pn^c z1YVhaaWqd)Zuv|>TK9`~C&jwI@k)5%oh_%F0)Oj3J(2ivkcqe*u?|*x&9PBPBVHg( zb+0iJtCmG!&)hF^ys^;E`->J45obdTE6gw-B&H}+@n*F zR^vKDF8c)d4m^7*koK^$LY#Qhu>mkOT2pHgaEr?yEKgV%k#q#o1|d{?y?Y_Qg72>! zBRcZbBHlxB^58qxVLa0TbYT-mP3w4TVth?)Vc|z4FhWZQQp#t3 zv$sBLpaDGIoZy5N>W1*3{qZKxy3-CR4c8qV-G96R1vWOve(=BnPsmVs)t+x{5h`&F z+@)RqE5gSIy%E2lAdJ{xb$>3d#XG7N>Z0~i;o|^8W?)pD4_8B_k(!$I!3pp_h%@)L zLG$iwfJr#80|K`2`=X--?GcL!FCfH;LEIR|jd_%9)nn9zA*g|3oqQ1)i6W>n3=BQWIvfe3aqd6T;&0hStm(aSaC*{m&l+uMP;uZqG##oxc9umWMJld7Kdru*5vhtSz zJz46Eh8m$uC)>90%6!!^_0djt(Td*{_8NUQS55bc$w&HZSh&TNPycRAqbMc+X2l$+ zMQ`eONY8@q@4);s>!w`dR~JPb@1_XKn-~z)9cEkn<~Ly+H^oYuc3L5a@ol>lePUTz z*!4?#WsFvi^`U>O&$FfdA|kO?R^lu);;n26XM33*_*L>pp0Q=2T!>MCSLl-y#zV>0rFnV#O#%4(@c zO%_^i$p4O=PKv2U6fveW2=$Nb@&+iKJ?NzHzibXL**Jvp#d+>`Z{I4NKi~YlFgyD? zXhnR5;MTR7&w04vCS&PB=MGBq@9s$8kZ#pwv{kEgCLh;3QpzgP)i5*!yLDE)_}c7u z{zHeV&6)=(DP!~s^iNun%yng$cO?O!c?ELlgpE3w5#&$<{`BC4;0jt@L^|hb+u7QZ z1}cIe)kh_Qk_Jc+l&m$GD;4UB7{2&7Y#}?Y!XG|FSfcfi59t0=V{W z-(JmFKb!xLH>BvZXbd3+z4D_W5;MTS*RMKydKOFZ=!*zg_s|c7JVB1*{l|}6PEno# zN!J$0@@~m}aQ$UA-J5i4m?i)8lv@drppO|h%_*|srcde_>NTJ;5q}B!J^8TAFYKkN zKl{je{Im}*RKkK_MF4N@>3JDGs&NsfQ zs6YlQ?Ib;MzR(S=S$Fk!Oyq};4P`24PM_5u84Gi6lq>GqJ7*DKs;B4m^Zfydc@W94 zhKHLWyfbjJgSCjH@6t`mGh*{0T@lqEs3Vr0>09kyw=8ivZ9l%9niaLAOdRe$^MXuc2J2g97_%r~=z#hpaD% zcX;geQd_<4_bb$o`5@s>w=;ET&$)6-+{5RNE8oShDegP;$NY)U%gY&NUA<2oCbmML zKJE|f@ykV<=T~DJ_w(2OjS+q0b>oHrJ%42AAA>Hl3~^I*3HbSSrV{#-B_XW40LOkl zo1|zRVQ%jX4o^;naHCpZhM~spU!qa&yb360efC^EzgP4@5J_#SuIP;)X-zrUbnp*n zWrYpob8<1qt*rV&X6|w|Ves~_xC`-^a=^4FVGZJ68OVrEpP($>zj7Hi;c70`p044N z#X}X`jwqbNkYUt({0le9><94cyHlv1#7yLchj}+CoBr#4S>-qJ*H{31&m&M91ENwM8NvDv-;mrJ=ELR_rT9!zOgCe*86v3 zRDPSG4&xqLv=XoxizO4Wi4G@WNTlG<4OQmM#A+4oNE*ffzqwQ zj=@6&Y-529%+t% z%bY4PC+M{q_GT0a#1U5s``)R3&7&MfQ>c6)L)q=5yf`J<9g!O`ug%yExk&=99dK(A zo2_%-R7iTy%jWupDY36!&cQofb!2Zuyh_S+g;2H(!{uVH+YXHTz8JLBzf{dT_1M?n z<6GE5g4EA{#9^f>jV8&1Zn`dMayeg8>KZft=|@a61cq3uDMkhGy&_E4FM2CqtbOoG zU?}@PKVp*RGZ6yB#o$%Dr{E@as-ot?-1O3r3#-^dZ|FT? zLjBf%Yw>$V$U{RHwkmE0d3AkU{Sq4cWk3-0x+|w-t(|+VeUq6M)eUO&z%dn#ExS9B zS|P^EX-UFq|Na{C{$qWQ;Lu?p+2?Ivd2!XH^7IWLXcxJX+7=d{L7oJP_!@-IQgA8M z38R$r&e3>Ew9%92sD>IhH_k8=PcU+Ir(7F-%wyz4$4(%e8fk1=nK)TBa7;h|=n>%- z;+je7je+)d%I@5WehkKOc5#2MwfV=j3IF@HX?qWbx-~u3D%h)-L@a-&i~NyLK+FC~ zu?u-hg)DuY89F(UJS63pGkm_sl8k?CE0&B%lsYw4{r}EgH*H(1KR!rM(Wd6mft$z%O>k=Y$ zi>{qHnc2!Y@xZY?VDi3i&cmZ^(%(BB}@>efSYfCY< z-u9W>+gDx3v-~L7F4>onWmb?@n3_BtRbRhD{}FyNb=nX5O3wRlU~=t2gpfm^e3+P zyI=a!q*qx;)O?&IVUD|UvKnGPNI98xkbco9(_L5;w3Si2A~m7&4CDjGCGn zF^hMX(ct>E)CxU1wYA@oc?)j|Vo#!LFpjTbNncwF3lEpyL;bI4IB>%eF94e&1e zqdorqzl8--3X0IfTE1y;>i4KeX$mI^B(@^a40UE`U$O$&UYUR#CP?xAt*juMDZ&^e z(0(GKvp#?KDaU{?h(#AuW+tKX3rrfmetxJsGsBM`B+bGGf!0{$fj zVdwL%(E`U$o7nd$5ikF~I%)m3WVVqd?Mvw_Yd}W9p98J0)yi332*($v$Y01%+EDY7 z2>VkOD?NSJZNTas_pd3bJ`HNtA9jD9vPmfp9%2dfQ*1pxnLDtYp!dhTh@7i9+MG>4 zLYAFn_&s&K{Q=h@p{4t(4c{zIKYQ-w>USdl?pGtv0{7cj_%03oIJXdxK~o}YMiefh zbg*_e6;@(@Rl&;b!A`e%Sq{uMeu=KE-(1#(ezUcBI(19kTU8URtI95gdg~y6!`JAP zRN8z?+RlI6d&;szBO41nh~8ObX$mEcwHRz&(#cT2^|+6`XRlnP+;B5hX1_Fo*L^#W zEm7s~G;b)Re`iyhbBliAo+V9nFZjj20;j6Qsv7d3<$9X>?!OYxT94sc9 zEzwA|7=(T%L~8CYqW6AO0r%9<5SwrVe)G#|lI2L1f!0>`mhNg+>tJp zz;pwD0ljc~$e>U{9weKD%O1}A$;qTeOjuom4;u9&VssT9HM@v6fJ6Md_`%z%tn&lo za|c@QhYP9mCY0@z+jdQSYFQvxo0aa}){Pm`ba?$ENpizA<#4xnpZis%7q6>~nPgWO zGpP2TJf53yJ?U4L&A@cgJkg{sqik^^C-Y%~j|{D^Y5Ummzjxl9-B_S z+C@0}@=?Y@vBQu2cCOen@7O6!{hwaUyX4btF{GQDaL3#}c1p$W*NtxjzeCm7DUR22 zbI#9&ev~)T;;B1Ev%#Y*a!a6(()arH!!3K3MK>8{#Z%oyJ4Wwa*7zL3U*keVd|&@p zOPIpym99&IDm`}$R7Y11o{~CJy{A+kd5!e^-o%>kU6=SCZ;i}cbDHx7wDl#8o{eb1 zlK!%dC`C{DQVmK$!JbwciRXXRX*vq0T+(0#NFDot)IXHME_B+%N#Cv-eo~ZNQmABC}bi22$eTO zM*a~mDcn4epULsme3EJSohpDJX6r#TA@u$;w{B{YLPFWvI8ONuB2BpTTMeEidG=1OcWd zCLK_Sy-v%X#?45+FBl=K;@Vqh<*R1L?fX3Pt6QGyI1JwvIALeJXSnD3%aJcV-R>({ z6RfHx-drAyYw?58d2LSZ1}J*H{yj6lS2DWTAUOWv zInBfeOEmX6JaUMXgzJ7u6b^FFW^1kXW+doI-*x&LX5tc4Id|C2OTYi*#&ph6%kN$k zQh(@uz6%w#0<#-!XLJveJJ(H!DiGQ%!Z+?ojl8_y$jR??3l(u*x>Ig++kk zY`x{*e}B23r#dTQ7EoOf#f4@0E{WMJs()l z`eOdk;7S!psF6>KcfO8(Tt`i+;)rhT-z6bal{gNl(YJk}t zRWNizn5JI5dIj@67lkq++14gycW?`={&-6c4;T;>V3$ZNMqvs#wT?$8FXi_lMw)_I z+!DV$B-r71wv9|xFQj!$E{=*JxPKt}0w{eV52KfnIc3XP+a!Tiwq`}lgJ@Ml!+A2e9 zKWi5AswO`%rM5lv5_TV|x=MZ}Yx42KWG}9hbD!G>-SI`u#VhUYBFQIsM)G_ zo+dI3su5X?`Nii{ehYnr+L8l`vx!y1}MVR?C`h3gpbQ-M_LY{^b&&T{a`eYof>N_5YbT{~H z85`5pO8>8XVlxJlDne%<$T%Y+;tV+n6&2OU#e!Zt05hd1x5Nnt$KY;JjIlC*BJ$H@ z`S{+$6vIISx&Nz|FG<3hb}b~FfzZSOUm(fwW_=H$3kA2bR)fF*{l2lQ9KjD{=nB4S!0v4SUdq#7S78yd9xQ)+5!gSM9Rx{5IeVUU)H<$+G@Mg%1v z04MpWkt*%X?!%HEeDJfPN8|{t4iv!S-y!Z7G=BXVz)4rvu0b}Q%$ScJc42asUA+aw z+&D2&In&kD#D$c(STRt}h?E9S8Jmk?`Rv&MoUBmE0tDQ9HH`2!E`M)nHtGCD?;5Bt z!p%_V>Md=euHJQXFCoWpl}Z+VX(p0=K$*XO{R;YM_m^iB^4+Y=VWb@`KF}&S7y7qt zsAEndlhJSC{nu4#*LqX&@ba!Gh6~Tl$-_%x-_mQ^aA+*d>A0!2Myt_f7wGmSrs|4c zc&=>DV`yTSt(0c>`C=xOklmN3y5XJ&Y?X4ACYhVoC3Lz3{}Si@$*~atXSFDng;nl7!4TSr7$!3mBD|%Cpl)hhCe`TB%)@)+2r&-8mLs$b z^z}|3bddKI#l=y- z#C1Vrct0Q@z{1?zW#s&&OVQf=S+u<#3UCAP zO0Sd#fd{?=f+{O8B`eF0rh&cQiC8~LWc{~*~`!x>w9 zd%_-1Xf+RGS8IF!{^n(ugNZ7*aQ27$htkBgKsZ9EN)f@x#AIz_v%0zF9@+&)ftZrz zjnF>AqjpZTXM>lW548Fc9rQc8uW|d^oL=0)ULU=ic@K;OP2J+w%`*xZ1YVE7G}0qB z;KAmZz^aPqAPy$tGSu`(qR~vO!F7q6%ItI)_g=4-G<9g*I>4 zXz+<}h2l>(i-Wf8u|R+ihHU|4%lP=X`b}G;y+aFu-qOmTojTAu=nB%!7ZMR6=DmfR z?(fz%=+fC3$?9N1}*tsU1n8FF?B$2;Ed z-D%0wa|tnx`v@8_l5=?9Pk9ovtID&?P_MM>Busckkv+24s`UCt7T`Nw{8;J% z&BHg6V~hIPf#G3xDRFGm3RT{6S(*rd-SzZ8kAWBZmRt#(6xh;XB0`^)py4ZuO)+pm z?pX10Qk9g55)%{C$nJ)AE-x1q6x8^yl_F3FyEqSRqLNmb05BBuX zal&o|3Azj_XrXQE{qkkEk@o4HojRvgp}!SZ?>8opJTOCVPk!%(LdEBS^)J7xoQg{^ zAdeLC)fUg{J;M|9LS6Z{ZWhI%p_XsO$DV21GN=?9gdOCOC({+SAHRLKRHU3f@8^a5 zu1H(;-fLI-PLdjB1r0w|bE5cP&JrU&SNz_n+5CUaUH2oE;oC>c4kaU*6=h~eMphXK z3CS*zO~WP`4Jkrar9&#&MMxZ*P=}BPAw*FmM-s>TIeOpk_g{GXDRnr<^W4vUU)SgQ z3>kTO;3r5QS+8_h11T zqO+^Z@#M+P=!1Q0(HdwGI#E%9f`RVwjrglWofKOwo~6NXfn&M7IiW}9{x%us)EY)w zRT`Bf1eL~Egh>+eouBV|9_N^-V0i9>RnuH*@i9wA>y%*Q-)3Lw$nrhYJ7lA|lPwDF zjS40W?scgB8E$6y&)RTPL{KZPVUT`RubTq%+xUsNjBm94Gzchr_d+mK=(Tc0#P8WNPm2F0RzYcG=ISmErS!XIY*A)}d?xQ6qUKdbt?FBJ`pTMmDmsvR9m9=9+%gXUn=#!Ypgw^L)#!f5))?9p0;hdq^v^McXAOsX-CGe=m;qj;1KsOEP3E~v1ZNRew2@;V#7;(Yc8i-EzK z$L8AN=jO+1LXtEL)1LfE_D$3jICA+G(Z3*Ic*DWs_6#3olrm2-p@B4^ry9CDn{Dr%C($*QeJeM zrWZOZgs+PG)RDG&Csw%^hBKAt2H0B(pLl6}t!>aGsKPEUtZg#1i|uxn)ihb*;&_F9 zU)WIZQ@SMCK$qw*Fa8A<)rX5HUyOrOKEtlougwLMbLWP6@6yJnR+C>@=D%z@+7aaP zHLuq5@m-acyWRJbdT(q`8XVjDV})3K^y_q#pS0(){@jk&;VUI!YZkpW9uOlciEip+ zqF#fg@>;SYg}LJCAAu+BVGK5&Z3?+`;i$ig*&=&}Pi6nzeW5I4Qit{i51>koLWgP3 ztW;t+fjM`3sz0rdz{>B?`m&AH6wUGZ>@knvA+p^-%^8I+Zcg-4OOf*-zGwbz7-=hMq2uC= zs)Y$Xgkv9LG$iSH3qeRrV+ViGUNV+< z;c%Jx?rrb^LYe71?<%I_2W#%bhe@b-yjZmA{Uwq#cyIqESgCck2$;Ui6is?>YeEbz zIhGNelR4s1=}qW|=lDMh=|L5AHcCoLu->4%!p6oXgYty*?z%X0FjSg=YW^@gVNONJd&x5(Z=dB+&4+wYedZ zfVebksG}2wG!0YyYig5(D0FP&nJ`QwcAPuq9o1O(q;W?)ba zm?^es|6rr!`C;_?cZ}wKOioUYk6W6U&`iRd34tAacncDV)ZU(V@7}$f9Ove1Y5e?l z2uhN+SDcs=6Q{kwFS(I{VXNx-5F;a-&}H%TQ0eI~p6l85i z5XM}ZwLO?nHMNMoeOq&Z6GSaJP@J_dT}9|t?A2!?Q41lzP-V+8XNh?N#y2y&X|%H{ z;Aa;2c?h%PGxYT>0ZIvBGV;!Gp-LXZfIbY8l-O9qprA#}*ij@o^ig{@C2u+y23X8pA$J3lvldynF0a=fD7-Yr|;&t@@;YwjU>pfi=f?Lq`wRT z3T`Ket7s7R`Hda~+z%l?NHLo@ZeEQwJoVa$i?IMIo7}F>fq|Rg%b=dJH!oGw2xq_H z^2~SSR8%J*Fe+FZ5E%G+Gv>)R5;vWekCk4)7iB|Yg0r@JqDdQ1t6h#<)a`X3nE;m3S@ z^9C7K>K^Zkk@gaK_OATtn^=elet<{-){F3Ny0lFLR3(c%=nLR^2nUgm@S%g>J21Ll zm8Ion)XWfm&QA{lJn(^u1_~URF(m6y#V?T0fMJXK18wPe`Z)#OR~W{yFf&5{+v`RK z3XE@tVyn?<&!KKiU9ha^35PNiF>(R7o|DrvQ+7u!?tAsJq}HQ*Lze1;{Vgt2=?d%m ziUxJ)S@>LiW=Bs)b$)I##9YxhQyoV4M~@~$ZFDdnC~ih-D)>;I{S_docfxQVZ%0o6 z7K|K6Wb&552Lu2KdH?`C)zx<#Q$d4;kpp=BOSA3LxVCr}1bgqBot}QwDA4Uxu;bq{ zh!VJsMhXpI=UUKEK$QZnqC*di<_c*XV=Y8@z~+^QrxMc=8M~UWfwOb2dlf<5(r_ey z0~82{q3hR;y+6&FUzL)Q0{gW{FB@{=I88w);Az(ZzuUZZE0f-#2+a#D9oRak!7%M} z164qsZXv;emqjh4V*Dy+p2MA(m_C>efrhl79xSnn=g;@cBh)4XQ-3i2RxJtzDkDHns_ku`{Jf$??YP!02eP=NAiS2ZIh(S8CAMKVm6E1m{CD2_yU31|^! zAfLPU0*&tF!w_=bLz44!M;lnj?jvnZYBkM_*uF7Ske^R}`M({?H=l4gFdR>`H-wOwn4C-4Bm7A$S-92}H6{LziP5 zfoMK?`hFUoo&e|Z7NcWhLQzkiJi(|MO$wpM(AD)3d<_m9*q{Z3?mTQlI;qFos)J2a za%+6+bW2hz&403@(7(_B7|4Ka47Mm2m-4XXpd7QnuWxps87w9UN9jQ#;s3)Xu6J}!P(j?2^hLQ}VV3%9WqC0C;r;t)Ik!WIVf;D-fmKUOx+>9& zzp``CS6@WVQzx)9!5h)l5RcVNi*8x?{&SZ3K259B>Gj{k~Sh| z^Nj)M)zxvU!NkQzf$=JuT(o`lw`L)Q237^lpkw{osbf-!FConY ziVqz_skNt;)`a;M{0^wvr&+NQ<`hO8$@2ju+f|VH}NN|tZMr+Zr+qV(ab!fQFHd| z)dFM=y8lfS?S1fIX=tbuT9(3NN8&SyVyeNP5=3&aEVgdVOiH@wKmPSA17!{7y)trg zi3T|iEXdr%oC;$GZioeIBi6v}md=ljYxeTBYZyTR(E-m3f{YRqF%K`VTkT`0I4I;k zd*8WX05U=>w@t*B#!~EyyT4)k1-XH>jYHyxL5>;01cR%HmJ#rhkBeWt&Hoyb22Nd_R-ys6zlovZlJidio*`nuRI7wapz~M z%5z_U4{Y>MmIUtmgbmu~OB?`a{luL@Q4fsLAh4zN-ksbA5(ZQ{IGGnDkq!?zl#Q(| zw(PnI)>G%yT+=Cg5<5>{F`<^Obi*4&5$QBlu{+s7Dn(UUd1-O7Xm|2A0HZ65eZ=Bj zd-m-M!Kl4>pZnV>9D8*hMyA#f%V9sHCyb8rAWM%fu~<)ABVcA?{(BWY0meP3*?i(P z>EW%bv3@<>@ zsD?=H+T3lGrWUAAkW}l8C@s{&EDHSQ8P~lnK+s^>f98N78BqCm` zgIO^Sjex(m$ehhv*A_^y(a-;IR?`PUg!IoyC0S%KV*dDX3IixOV^Z-hY*d0#ZSC!$ zAt5`BZzJ*3T8078IOgpU?^7S}Ank8qK_{y7%d6urst?rbsi*?AXnXzIvHL+iQazZM zXm1Ngb;24ga3478**d}{rKL6{PU{+Dc5P-vS%mE?S}P$b37a7qaBe_7nB26zi1I?^ z!ouR^?#{%(K=mRXXM~0L$A_POHU!zb{`by+h$bU51N;<}2^>y1wel=VSnKeWb__EP zA%B>1S>)Y8G81rZSl8v7KL!{&H6$~)NY3ycJdbM#iJ8%1l1W}J78v7Ni(R{NSy+lN zH+DI3V#E3`U?V`9Gol6!g@~Bgla-_FMO;^tvB=X-c3kgm_&g9qb7*PV;rR*`M}N%J`qj?7z*>> zD2EyiMLlQ~jes4mU(XUNrhqbsaW?1)R0AT6m7yzugw!FOJUa_^eIvOL z!%`O~IHIpfBq|dHgyWrV67r|hS(%vR6clXBy|x|d26_O0XymHmrkIea7;IbHx0zuP z(%s%KqaFA*VsN>^?qswqFWcRt4032kRCG@R5Vx_mUjHlv^ErHUb+e0 z1Efw(eft)K7)`L3sR@5@O??qynqyWS@&^WN=dn8jFw|ciQHH3mpdRCmYlg+Jx;h1d z>R<>C5cdu?iH>lk-LZ`DgySn2O=UOIhpIu z9a~hcuR0`9wpxmrGdJX;Q~_3Ap@ngHUM)GRvhqFV3)rhVZvuNpI;f8#mVV5^lgBMv z9_;OQo%o#48%sm8{<6N#e)DxqvjO|$3=Ih;uGJxX-Bo(sOg%h85PjPqV^aU2rNsp* zi{f11;`n69dbyf~bK4z|v%5RYTYy4?CroY}1lnE7wy4c5FDe=jr8T> zyNC@gzrb@nGxtgFX)9A-zWjFdJ-=poX}6m1?ls5>nlKr^c{AH=SKd_kpD`}1Z$PwA zq^^Sv6wKEiG4u#?yfh(MNf2flCr{Nw>t3-S%rw-7#po zYRlbtPIu@Xrs$d(B~Mlrm?8sJI3c%pnrS3-udS_9u6d!^>BTe;3#pV7 z+mL!*RaK>7H+g^68^)0^d#V1Q#1>e*fEpV8-WwjQO-{LHx$FP_bZL;e20IxPGoXHK zkV4QNzVN;fGl=b$y21J$`sO z;X5Au9|;r!yXkbtkay@5_u?n%svXtSp?WO)@tX4As4!9VqEFAat$OzOu^Vi}(D>n` zYRV}dE?r9Hk)*JN$d;J=Sh?~IA86a={tWe^HLJlAnhU=c%(q%(itKF&x&G|07RBe` zJF$hY$0zbm75>Pp9|1e5nE#txM9J5=gr)tE^ ztNJB=HI21}=SK}xUUbNKT$fYZaHS|u(a~P8WyPnxbLdluYiNAWa^G$r;|tQJ$_qT% zB+)oZw<`0s2d9$_)=g`xvENS5F3)_KBGBr;K3f&ipDcLxWafo6e^}0>Ow%Z0VG%T6 zry4d%4Sm@Ra1UlvQ7(D&J?B9_((hAT_UdSzU!*l*P&-N zMH~tXVw+-T1?pwM+2PtQQ};99{*YM1vmt-8-N~4k2>55M#^^-M*zeEW;#|#1`Fv_l zkL0v??Bj|&VJTO?QN1{!Xe6>u=9*r%X|8!c8;%31nG-v2jZi>!0$a}4d74tS>$jm; z!^SnoAvAJxxG50x@3CM^e^8k%XZf8x|2EojTSxQsC&!g2rOI!An6@zl{mMPwP%z9t zBw)Rk*tq}CuPE6=a`sKkMd&-j45XA5__xQb`M6`gVj*i=I8iLQ4SEX+=atO@&R!Ju zG$XxztDrOWeFg<>wn-!$JSm%YSI%GK4!yvX>zsO<$}flkMVbFUT;&CgF&&Vu7qBz*OkCo*5nT0F}@;Se1@+?w6L zHNFX+<2w_v@5!U9g@p=^N-8|L`s#2Y;7bsGdAPYzf2hgx8wW>=(#W4hwEk#M{`XZp z%Uz}6VqO|Y#D2S+$?P)t_suBn+UwGuu9#e(w|^2=b3^t&zw2i10lFWa8KSj|9|hR zx^-W@^H;5|-QBxu_3H2Y*4n#jSM3-r4Mj{eQZzU?I80?FIUP7Slo>cUq&rmPzh*wu z3r+uZf%ni+l!0r2kstjv5VA2;wpCY$WBIF(3I`wM0EhJVlD``1Ukwfpp%~%6XHaH} z5&yf7bocj7cK@hVI5;UdWjSd*ANbSWw{4XMMi*V0>NQ}D3||dYq(OpkuIaMaP*fgN z9;UU9-t%6p6Yotw=`%n1wGJ1#*`@Xd6;`ZH&vpZx3~gJa6s|}vI;8MPM4WeTm4RT5 z+dqGT3hnxzpJAWC8a86eub)^hzTWd*Y>MVv7Tv#Q{yuK~)AXsP`D~=0-t~Q0a7!%Mf|x!?!;*oIAZA4UN~hVl43nR^A3h7=oqJtCUA<1a32$Pcmo~wDZa7 zXDYwiU20$AmF}%qjt}>64bYEe#|b#Hpy$!iUYhjuA|RghPB6V~KH}|&H@KpQ@&A_J zXftTG2DZEaOsO_mRatpn*>+EGPm;VEm^%(+pSD zE*~lB&Zx<}x!XjP@!P?yz=8tgk6={G7By~vAIaH(<`-dGLxGB2-{8YK&9tce0PAH5kd3@fAo3&|Gr?@IHa`64uzl(b7>>v)k*t$h1NgVu(&dWu6TikvD& zn&gVGy0%=>-R}M+`7${S%0jnJ`fw`KlAmuIXL#mJS_hl91Xib}GXhhxs7rIB8-nLe z=*zi(M@WB(RJtN?QXr_2Hgt0+?~=w7IR#1@NilNUyg*3g#M>~jmByp4)Ye!jPoQ0M zoPFnGhTM(~ged|#!{bUxQu5Rrm8K8#5~;EVUe$T~+73d~1aELte|1}9MOqf%xJ~Xr zt+kn-4{y78u%b#5gsm;T3dag~6hL%cTCox*a;2DLGB7xCN_N%{KBK7b!B;<4Q(AcE zdGL3n8%}vf;X4gwLO2v!PCKBgJHUPodln2>G_OZ8hO}P|G})KW;AzIm9*4O~uA0hQ`3)M=8)WW7 z&QH(>&N`?*3yU@18W$O)WWIWvhw;fz*dUt=d1@gh<%aJ>tXlt}D;sQ=Tk8)HMU2#p zY*?u?Xv#L1Zg1=w&t-_MkG_#Yw|WXhcvXVO%TX2R!9FIf6&XqzU4W2C8wosZ=W6XN z<8_WW&x{jw0f9tSgXS-hL$Bk(Fw@FcXR0Yap*bDY%$muTDwlY7R_S|oDqk9{eo5_+N^)GBut_5guxP)ARF&mYy>ED{6<6jt z1y?M2Q&u5aght;#A%y#P42Hxcl5C;jK`~=UC_{^36wqA;=3{gUAoF*ZVtI@ ze0hkI^3EN&(lAr+hiHb{WF%iIxp!KW%|b}ZQG#{$q(_}ZVzml9!G6rNEfLJGM#R%D zH_Yaw4Q~^V^2|YdL+XJAhY(=mdXv0Akd)d^PES{j=r+JgY48h7syS3%4M;f1hTs?l zq9X$guhW3{W3|LWGYV7qXDp`>0CXCeGr(09K)NUFS0Cy2BhZ;ZFrqCqN;w6gG81F3~;%l`W5&gY>Q{~4oNfhwL0d!z#4PvZk+ zUdKjo0LBylfU%J#DYw~Tq=al{ERl11^T-hsyEP59u{gY}N;T1x?znyFXtYBPe|Y%it*Gcgn3|O#)^fNt31jRaoHy`& zQLR-v2l>;z&_^x#J(Tw2aS+wzq3GS;FV1=q;eVTuR>e;WyCNG{`4g$lfjgnc5d3N=0+j(Lt|U`UT}kHxR)&R=@M zdVjgSt`)A5yBwZ~-Lq24W=Ji@tM~EAAs;{46fmRe9Xmxi5oyXE}$5uG}EiwCJl~j%)!c z{M{?RYXrTxAPKcyW9EA5va2Uw;4kTF(E;2$Aqen*65F!mLP&_+U#gtmXVS|$`xhKa zipeLl+2-m-H?xc1JJ*G{txD&0VF?*5;gjC%JaHPtbj_CAiEJ?rjT=Ma(`*%@tM~~c zl|;`f`<3u z^{DcplT~^d>3(fB`wt=|DtgfiO1SM2E=+uqOQV%ShoI>eLp+e}%}kZU3a?q<1@#aZ z@e2Gl^68vqXT(SglJQoHHIZ<&b;M1+s!zkZFQ*YdUjBRkD1u0V5L#eOi9Hijoz1FX zx0a!`T(v1V+ZZ4Ga5NV;w{YwC`E=fJ8yZ|eW>x$|FMypMiSv??!?sohHy&&u#Z}zX z`oyCeaZIX3naGV)9o91ttGgHF_O7Of#b)JOmRb`iU1bH5PYu!{uH=dJ2$|!U+>z(^ zP$y%|Ee{CmM223C@PW?lfPwt5Pnw^!^HYUo7mL1 zSq&2PSk_$Z$c)I;Jm+6(VKd$3ooE9yT(Ft%4aH}|y|(%${Lx%ZXqj0aiM2MDRaTQ@ zi*=SjfkBPp61idTz4TnvEibo+cEx43ZNoHzo?j9Q;*-7!RxR2{m^dSYnRGXmQ+G3W zrnh!u2oyWMAvWy}{Oq!&@pX80~*<w*u35_}llZ5p5X#kMw|W8$ zMLbjD!VUAT-MVY_x(pUu;UW4xT^BsAW{p}UBhTvELE0dSp_^FKrMFfhW?q2Zm^Du% zQ1SuNSvH;w#n&}nlUt`E9^Ya~UIPrvC8M&&lUyFYngv~f8}LkatzNo5<{^ZN4$6ld3r{j*zDm+IU&>7_) zDOv_!8u(ZzJRxRBb^Z1OG$s5GlYX2=KD*u&#d182?gR6uEbioRas70)s}W{=8<;G_Q|C zImQ!xKXTisAJ)YM0*oB53+Yjx7Qg>|<7IB8|Js7|EY#E%E0jyzo$F@<}+HO5U+ehfPFLas%kMD*NWiEs&zbs43wno*3mf$QCNs?t@g;k!D*kE^#W@lG%T)I0!8X?ojn zy^I7}5|=ZI(~XQh@)$Luaw?{lqpsH&VTPJ+zAQFMMlcd_tF^gW&q+R@t;JCDak7$RHFVdxSd7sO6Mip zmvycFs(FDCX;Wq{rBEL$#0wd3h9;u5YAg~E7%XHWM4UKGsN~QAktu4GN1;RRV~EoE z25FUb0Hvrm<0?e@+GJsb@3+$NM9TF9<4NR&pQwp~q8-MT&a42T(!|6%D+V~=iKIvO z2Jto)4#d%VpSlVY+OgBqmfy1(KL8$y1aT1zVi6QhA#E7CYCm$!RjLV#T3*Z;uWN`H z%6hF=A;C-SXIol|W4@S*1y?qO?l$J?@Uvx*g;-N%0?q(ogT3KSss@aCi0A1Yt~`TH zl>h9AK&<*R>5Sc}Cg@3fNS}bWt`r%Yx$3ESyh8oaZ637itAlpAR9tFRTy8YI!dWGp z6X_+9E*kbuj^dz@>gjNTwTp`jvXHQrs)K)bny?W~)W@pl;Zg8q&yWElyItcxv1UBQW=wIbCk;+%jk}1DM<9{cF|8tJ)_~V- zDvLR+>r~F`nRroDK0DN1BSBQmbR^^>ATb(+-#e_8NEMM2qt@!WDvieE(Z~1F)DwWq zSNSP^f15>13q7xdmi%`vkRII(rI0R;v-&)D08f#U+}n+;5hBv501Op+_MCp>BVk)} zcF~qRac`iF8g-&>{s&xL$mi;M$C(!%mnn6g-L!0pSFxBbm4=@$t%%S$0WmIU*G;z# zkF$)nFVv4K8nB|E4n%+bNr;c`aW`A8Z8`t$c+^KF{eV@Rh%W-GVMJG7+t zx}+>gs4kDYbo&&fbtNQ863|(hO@(KySSF=`W81IyycYNN)QbviPbhrHd!Rh6|9C}S zDR#ZoMXkN&@#WXkGF!2=W5op4^CGy86tp=ti#;zwWJ!>b#bI67_BjVbcI>#v<~2Q7 zSu>|4ka8-#I%FM(0rtmz=~DLH$jRcQo1 zW^z){o&o_+v9YQ1?wGg@t~xkgFkOn1k4Z1cvo`r5PEbS}_5`Ndzey+9hRTv$-=~F$ z2n-+k$l$#nX*mCgz)ZYaj^(|WRlcp=8BGyyh*+>&C3ZxBUn-Aup#S-F!bhu~%S!!a zuf$mwJtt6#=q7p59C9m998Ig9|E&#rR3Qr(v(;0=DYT3Z9AtB#EYMjA?rA#u%Gfb_uT6Sjwo)UV5gk(YOa|+Ez5(NKDuHviNGQ zoUq;2sdSQjbliptVO!~Yw+*Vfi|%S^P5B5G4X>Tv^r9f$&~XiL-IvLqgAXaz`NSTX zE_W6Nn^p1*W8(z3^E$v5vsVli3Ob(fghWkLCLN9aN`vlF(MKhQi7{$~wqQ(h&tA7; z04@_uJ+{ScX(atd`Tg6-mAS!Sex>|AKJ#@J?GLd) zZ}gL!YCH(b;_Ct;qD3keDrGQnhbSL~@1^)ur4viE>b-ssNG}5*u?Et#x}y>5u%bJ@ zcnZ-YR5!4U9?LGqCf5|3W&LMBk}@NvV*DbRu60lHl<`fERwe_iy<1f)HqzKva?50h z$C{rCy1SXgKSlFdA=z9m0kxpTaq=2bUw7xRm`pD+mu7DkO}Ap85{rXX`n)?y6;pd_ zNhs~cymbD}pBO<;G{PEgD~i1l@$W3~s)%2~YAb|yOwu{w0co{Ep;_8%jR4oqa5E%Mw#DFQBoB5NEHO9Kl>BPd7tirp@! z0{iu=8;XH>VhTk~HI2{Y>IX+FnjCAFpC_yQ^sJ9XHaj_-M6|k~%}6 z{GwRq5A;*cH#QAk> z9nHmZSNyExN9qmM zp3sMC8_eaxdDbbipFuupKt6AlIrD=b{ZW5?ej)=dD7NYHqU^&`DO)0@05nL~XVBW#3xs>@fo z!mJrZ`FYHWugCcbUv=o}h1#(lri2xnYoB96GsN%hNp(^{Zw*{++29o|OIl^!BE~$+eP2*okGBi$J)0XTrQnBT;#A%G1HNM7PIsR+m<0J45x1-o6ZRuRTg`3n)I~|}gkEYeF zhFZ*B*W+1bxd|14Id$eGPivR&4|f-K>vu*5RmMDmfBY19lIyINuR=W?LKx+X+Lx zB4L|_Abh7320X$gJ}%~(^63x+)^-62+;fHLRo?pnY_q&Zsm^S62jsTg>x@5N31Nw& zVtfTh71s9*YIqWg8)e>G6ZQ(_&Nr7}^TCU+SWA{x^y$`if-2I2rjdEwfSR(eIB8mz!DCn^YyA?EV@!k9}lOx^FAYCvB^1Z3yy( zG80<4}3XO%eh5rv&VwTn0JBz5zk;mU?QhBqff+KpFR zot%w(>$_o?2bE8jy0<#S9vOs+IrKE3WMNQ4MZxJxoKGsf&`3q=c1@W2elpLtwr)pF z!6mAu{)E6Ifl5i3GJ~Nh=iC2mqC0)!s^5}y>z#~`NaJC<3=~b#y zW$vuD2wj$PGZ|43D+b8=1OhzQ&9AN)5e zJHXsX3?i;7QTiw4)bTtWtiy;riW+Ehk!wXHZCPf0Qy1-tZ=QWiigA6tDfva^biXw* zAGO)}qUHOM8oXIl?HDic8Ik|KJHfTc)&Inx*ZlnQGwLy#Fe&HCs&QuockD{6#vRZI zON$qmga}0$;_NhYbStVuhqBQC@Aq?UvV84Q72d{H2kQ<)ar`RcF`aDB9JS@G6aBq{ z$X9Q>9DW~#nXU{AvQAh<&6FtIWIOdEvozivi7m`flwhY(Dj}HRr>m*!12|R`gJ&{C zVieQ!S^ILVdiiQ9>+lli7FdYj;AJ^<*VOeVnWfia3hJ06xnvX)@YL_GmDC}8 zP(b&cmj;*Cs9jcq#!hXtEb03k{hk#k82xec7;PVn;H$svC4oycA>poX$aq|VN{B*p zv$8jJGS7h~*MQ*jqLirXlw@Zxq^K*2r09;>+?_Z|&xLoY9Uh@t-3R|Yws75d+TP$8%O>{t!gjp`u zNb({3gs-ZuYr1)KWyq`$i0I;D@)mgMs90N4kt;v~4{a96ZviOurZM`7xbT%Eqd+kX zQCh2@wEAKe`p%H9QBH4OO(eZXTx8%o^TyIoE!Oe$H0XOr<7Gp}HoQ|n{$$bLael^= z68oZ0yzU!zvwK<|7J@Gh6oK3ZmnB>zM?xn~R`QIs&an_Tjp#Y_qE$cP4zS(oA}4JIwg zZwIotRTMpLJeZyVK=Rn?dSTr{4ZRv0^}{HeQ(@3=>*-ODi7~|q2B)t`2Im>S;{GWv za|F4>agHd%N8F}x#mz0@QhwyVis)!KhDIU2?$##8u1@K zVDrE_1-%Ic12y6|x3vgN23@a|ubC{BNHBDZLywGn!C3KMIc|Zp)HO-H>p~yoZ2H$x zh;u%w+5A4QmQl(I91tTHjNN zTudb6>1aFMDGv=|j*NW>sbVCC7B;(n6FTSLiS;s!qF&)NglGzv?4`PP#; z`vLU%bc9Jau zglU(N!qw-=w}#}V9}lL4~yxpyUi-=Zx4M;b@uh+dOi8H zy0xc2l;NiwzB8)9vt>vm@FuBg%Zk?s1(*iAMOHgSavv2KJ)0d^E>)&;LD?M4X@x;) z@m|RQh1M}22mF}gyz41T@;$C&-6>MAL}8i;V~gwENj`nt*cu|3!!}8_v$(R$D56BH zoAZFEUEZH^StM>f^upqe?NKzz9~mqg6$)wplg)g|xxmejSY=tRAqRJbwtRG_L`; zIj6VA#Qgpi-fCIvA&uxvlMI+%Hf3m=$g&K#|L`|MvoO|VHRx!3}72kZcD^vH#%q&v@I%-?ZEZaV6%;keDT6P{F- z>Wee;UP1?m&F6|Qxu^lJJyfkB>;ZZomdfN-shluqMLZpB65(!Q1VoopAsFSfoO^21 z$vz_F& zYP@=WnsutO&Ze$L1Cy`yu|AV^-p{Y2flUfj4!uXN zD#Z`;s5Pc%vq>WBApCOYtM#;QHxU9P=c6Fok6qhdVK#pQ4M;8_d87UQK}!Mt&!u5? znT|tl^dOU-O}>K#ov8kR)OyJ@_KO||#W;?v-X@|dj?V6wdHTFOH;?v`u}A$Hqj`p@ z5xp&;3uj`$Q%mU)Lc#-oVq6q5-$8`h!AGDuEIl4AQI3U$JulZOS7&u~q=2>e3NTRE z;2aNuc4jaq?}-4vycKn=wb?EV$Cc4<_o(Y)K({Rgwl$k`H%DFH3<2t%4Hs=tmq;P} zbFx)fJMRJ`^<8g19hlI{G=a=3QOkrqOxUY3MYFl7#InOQR8n4SuUJ@aZcNsBLet$S zXT(m0^*IuDgqW=&hJsltb|uiX#dAIMNG^8)t2D?R`G+{F@*mm4n$3Po_5aLOisG^p zdl~v5w3Fq6K{3F(t_BVR{%2l6K_ZP z>!+x(JiWTPW2v#cK1=*Or!~;dCc?ANwH^nYTph$^VKzwk3fkqz-jdG0E)MT0v zh@BM>u-trOWnibHVx%Y-cT$+EZStBUj!fPVx4S8|@W_{=lB%sZN*E7oaTIzNuN3HP@y{*-kg18V?xh7Rd1I+ zBgqr3jy3H<`P%6O72VR_1la_L=}!&`_39MtwiS>b-~-3F9MeR~PaXBUYf!^ZTjwbA zj2Hw`c%7{#NEre~3YRnd!AT@JLFY3A!5u~;Ga0BLM*?2|6J4&BOkq%ssSaJyKbt3;e6>@`!d4;Y@%ZsTZ zP+Q(P{?SM}!h1ettvKOyy=A+zLi5#^h!5Z>lYr_ z_4_mgMXa69raC^n%?)sx_iot*V|ti?GikV{30raoN4HU>+Kv>(5plw6wfZ)HuEW%bBeUOSI&&VgW8<#(<^J z*&Ih-WsQdOAue0h;mwgxy82Q|*0|^EH?x4Jl5wOwKA_qmFi$O1s^F5KqH3K`ro#IcvetS8UZs~5e#%{V_kvS9dJgy>RgPh8YVbr^b52y}9v9;VFe=2FqX-HtWR@5Py zIJt}wHQmp5rH-m(8{311&2t>~@|f#T35=h^$2>YqiI%9meD0BRxZ~d>6h1Lny_pbs@+UpTM4cX>Pf4cYPj} zp_@M4?7D=-vt?V_a;RZi)}u7pd;Sr}vKDRZh}QC9Ubfv$sF78a1d|L3lu1E1HTi>D zwb`sKFdKXEHq6xU9!e{@Ex!n03Dl$sc=^F>vr?l^*dRkg*D>)x@jg9s)jl3U$4U2-4{M)*9?#xCkb zC{raBTnay=?m;%1g0_emG111L0C`~uX4oY?ck4irXZh#^y>4*-L_rR473)R|4R&LZ zo8j)Wr`C#07Zz;Ot2r+BIh|+FT*#Fvc;B+`281Ks{=)~Z&Fs)Q`P6KK7rCy3$FXh| ziKEa7Q2f@E?(1TY#GNx{zSE;Qt8ji3cil%*o^!)Tja`7%H2-0(5&`f=WfbB}fDNJ# z!w40N2h$={1akIWSd+JlIJ$?^Ic`hn04+$90)!z9aU9c3g%O&^V+O)=pX58^;kxvA zJ@)c_lU|iRD?AAt8!V^{2)fa9@v455kaqu0F#pe>)V3f5;A@#vdS4KY2oA$(eEc;8IK5Rmx{RF7Xy-s zk6cQgIJ{V;#VdPTD8G1Y{O>?T?Z0x9&Bup=qkxyGrWAJev(=N1gg9hpH9PBEx{0f) z8TK;zu15v!o{g51$MLu2@Q-&lTuyPHdma?CVu%L+ATAkC1`YFv#{AE7qWlYdrjcPQkzOS$* zj2qoDtS8Z_PF0Q2b^AmrvkNY9Z2e+@vz&i4BsOdcE`Bm-#Xin~_OFlVO{n;bDx`NC zN~1FaU(mLcw!md&r33GZ&@iVQLG)9>@S?Q0_z`nL5qk1p5_oAMcMfuv5fb;c2J~0& z!Kmfa?ZxZ{^KzKc+3mZXYv&z{#u%bm-oP#Qk-a`A+Fc51#b! zl{#f?JG0djvk)IMJ&rV**BT~s5n!1!;NC|JYpk}F1ky|e#nAC~s|&@Kb=1&nv0c;G zV5!yS@0hhk6ML)-s2=Qu;TC8ReyBFuazHa(DK0~lR`*d9GumgMa4h!;>r0e{Ke=R~ zae<7-_Zgwcg&=#!DoS_Wo|3l${Ug+9kD5vvj2AN)aI-EQaAdr=!Q^5MFT{}S*tV>A zFj^*eG1WwUCzs~L7I`tc@t$?tQJ`uQH^(+%>e<$(;f(Jb-GSq&)u-Ae*_hU`hTz9Txa06AEj)i$^vXVeNim>}t z_l{Jv+e@ecs!bZC{21szYQg1lnB=p%oOn6Ptq#CQ*f#6OQ<4I9G|gm6SLPWnq4JJE zg9E&83>QKR+CFM4uN6!Sc}pMe@h4~nY1QsyCV!wN%v}D%?#_QbL1qH z%@7PY{%W-dhZ$E~*iK-WV5!RgbdvThO3Nm$}rWAxmUum z)5NDHZ+4$~#`9`ajBtxiKK zRLMq^gHB~~vFa)yGPhRZDQQ?OW@gyDSwSHY$9ZnyN$cDBRt;cP${1q|iT z?xk2(+fCk@Wf5hQNdPKW(4A>W@6>?IYfGY5X8sg#el+QmQcGpm(VDF>=^c$6`{N}~;50amF2_2V2psbwbeCK4^9vfl_dg!CuF^gU)MJroiHu{H6L zmv1a!S9`M5XeA~e+^Y>s%591qb7gel9VVp~)5*i!G%4^Q8qY`H+oF+78>^Q2S0~!% zEWWw%=S;j~wPcC6TVd)C{}_i<0@3Ot36?%G-wetSy5G=qtsuXe>mOckmG8C~YrYvv zq`6f!I5k2i+|&71t5d+lQWwgLlZ&x$T{7UE3h`2ww~kgzY0sPX32#$8q>vjUd#`~` zFE^QMUxaz^hBncUolp^_+LofL(g|L{>zZ69$_aUfW2dqjnw?G4aAoJO5C6Thka-Bs zciWE`%ZUNQ5ECB!qK0$CME;#z8@w~YB(lYAbRRrJP_N8-a?WE4*&s^8p%? zE54WJ8UxKzkVw@t#%}2uFW1V9jWnpDt1g&p8=~{;0`6pqx-n)xfqq`GklbTLB`~ZP z&{f68Y~M?YC6*+COeEG1rXoKJN0@%J3TkNCCCPC-$A13?Q( zK70xAGNa8Fr{J!I?gM7Vv#2!^1O=nj1rn9)=0;C6UeLlsHkLk#L27g0jrIq%-WCI~ z^D3gbww(S%d;Rm%xU+Wz9&+C#3!G%_6ZX~]eo@}7sCvpq=xSd5bEmh`^=}PU~#I&W_g{D|O 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®1oMAAC3qg{);+s~o-B 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 diff --git a/apps/docs/public/static/search/confluence-setup.png b/apps/docs/public/static/search/confluence-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce6c182f59e8913ccdc3a645981a30df32bf865 GIT binary patch literal 45456 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/static/search/slack-setup.jpg b/apps/docs/public/static/search/slack-setup.jpg deleted file mode 100644 index c9ee55a27df97705a2a5925ea225a03a3c9b03ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39338 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 Z60O}S$zFSejpOV1R|JFgg<;#h{{d|TXwLuu diff --git a/apps/docs/public/static/search/slack-setup.png b/apps/docs/public/static/search/slack-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..15b28f24555fc4f8a178cb087813a98e7ac8ef58 GIT binary patch literal 67494 zcmc$Gi93{S__k!3kgdUxJuxvdYGhwS6tZN^zQk0v?E7oa*g~NpGD=d`Bw0g3vR6a4 zP$6aC*YEPazu)&Ce8<;OM}zS^_jBFXeJ$sCUK6LUcj-7C7aau!#c^#dbwdgYN;3+I zBX<#$@Ez9vW3uqyF%K~#IXkK*~#h0unDob0tp=V@V+5EBWLqocJiZj$#y<~Cjw+2~F+MxzM| zJzm^xD|ML8bf;GP^18Y@p>P#`W<*%*kDotV?Ik-a9L;^H8SSUf{T&XoGdD>U8m>AK zr*3CwryVmnXR56AE@+@u{1Nwy!=#DOw8!{ zHEnI}(9lrH|GoP3bjJPr)g%)$GZbU2lsi~>U%gfh9*OZS5Xc#cGM72yzPEL{-o<4ob#>VDB>)b_rkd>8n6_!rbJTCC| z?b}y3x+09s3=9k`Ea;w!ojuDK+rrSIkCaNBk})<;>-h0!=v8NDr*lt^6)Z9%gCkBI zr<*3Eo$i!!`210g7ah&hg|r7MwS-bLGEB|PW(Zd29$qtkFjb8wkks=HWFmh4{0R#+ zvyGfpPnvQ(TrBgx+k_0`71eS!QdwD9T^)Cc9gfQw=|prgho^FrkxJ2;sX42i`r>I# z$-zPi^}og#r`AFtbyJ0`$Y4LQ0C;1%lWx3bex~001bZ27cB=3xnPA!l>i=%Q7#`JB z+Ybjn7FvcAnu_KS4{X`Oi_`2(!D8}=>K^PnWPr(yrQB(eRmX1 zdMlEhJv}}B*Uz82V3M<9Vq$1?VPPRw_e9Xbl9cX%N8Um4`A7d6KKRmOdwraC>OJW$ zTo-{rh=_=&sHgy=<9~9}(b4_t$t^7s-MzHiaf4aIAWdDP`(?d>qrgh4qj9RSxe1&0 zm-nBpq)KUQDy<5 ze_gALnbQ3JHG_VtGpGDhF`}d=y@YlYo$K=>R*$cx_sN*pqt3P;s}p*G5z)tqT_(JA ziQtbTVJ^?Q$E7xR&T>3^VpI3>?(AODf6lE-mxsQBFHS`o>+9&zNgCc|)3Mgq2q*iO zUUt4!**1y3?x+)PBx^n45ckrhCNMiyBRVYq>5jyol!P+_MX9G>1Qy+K z+fZ@a*`C$VP);n2?ko}|-ui4Q|BhDZ;VU84e01!T8fMxfyTj|-!6Ku^!!#kms6(@E zo@7^xyi&S&Unts?N^=U8`14x2sf_gx+~~TOMenCuLvJbrSDtU30zm7O{;9nIS*IHnGo<1Ug&Mf_BKu!UE0B3BhaZ}zr-PrgkUhdI-elKcc zV*?2S>E0-XvMY+lHw0n{vUI{jMnpseNf$>#G0=#2s?p!k?nHbX)J8eR*xBBs zQdOxysWRWA>#D%S*o7|sJz@5{Lkz!nrSbl%+*RwZb)iFy8J9m~=WaTiJ3WdlwHjOQ z&QA@`a9-e@Z47q&G1-&BGlCOW)1BH^ZGYu*@%?Xo*+&JMY5fvb_r0yZ%IIY(hwTr$ zH-_x*ZpFpL89mc`ke*Jm$G%2tyxn#t7Vsm|ouXUp2&Bi?W9(G$wh=sSDNYXy@Z|gX zQm0bxjxY3dbezFp;E^jZneGEP*(5Ph(e0t0(DkhG-Cw`IyjZAP=`J#U;cd0yuRzPl zjpE^v(oHMCqxmXznWJp6cXz`1q7x=!nzr3XYu3KKzC|vzIan(VQ&dn$NGrZ({Mz;8 zn|sp%R%EX`cW}Bb|4^9HQ&AE~DqH&Wxjk(w!8k4_^RIJjf*O?F#@#(V2de{D+dh2o z@K1k{yj5CX^r#UYjc}F0R1r1S?6~u&5&+sQCzKlkmjp09EGO!()wM2RjRm5(vtk z74R?VC3$a4%5bdDcbV>wDg!tS!%NO6ijvN&q01*^)XM6WXV#BJT^zWgcv|+6jVAkP zgMQS|lY}S>OYscp=#w;R$FrXNHYmB{NK|^Z>3r&uDU(mOe6NS&K;=;X)p$oA)%~yw z=+ZM(-f{g%i!Uz5&)CuobuGSltt=}a?5@DFlai9wH#Tx*y?*uOUxKe=lC=!(^CNnN z(w*2e^6)j~<(|{skMw9zPMKDn6%kF3d!`*wG&jf#8!e@z^Y6%?y1O-7RO#`=?#|Ag zA8A)htZJ*m4)*){`uxTMobB!Hhbo*R__LKlwlf-cPq$z_@~BijxGynNwP3#oO_29O zmFq4tTvsXL!%Aqk zpUl-16)k@9(9y=Qw`8geRBmr?zjE%euJOkE`}+@9xxR55t?`&pGcZUI()L>z`@66p ztvle!jSz6VB*eNDSdY}0tkd3Y|DIMp*aGMOODCeI7Or;!s;I^*81|jn zt6`!9*lk%^S%#K(Jl;LDINgB?Obd25^uVu7B&?jdndSZu?>i4axdkSs>6WrvG;X|0 zk+=VH+b_KQ8Ci| z!n7oHW67pZSLxi5E(RC8fF-$p0*n^VE*@c;p(9*s`L@Dm&V+%^KS!G36nnfzzCqNE zT3+vm#FOsh4T&FztGciWC3A~gmxb)C z+hU@t$N0_V#c?z{(9%Q&Sw*7u@kXcT>Xo5#?r|=GH9Ie=hkmBc7r~ zQ4BF^0^a#5{QqFjMcrKa)wMA{+R|}9v{9KWQ7Le>@WqQO#$T?#aeMvdO^^bw3zqb} z%C#lyef!b+6V#E0^W%*NpPw7a^ib`i^$FFUp*v3KtklCRua< zTIgG-3SJx6%-KJ)Kbb?|ASdRGzTRu@sYyDX)j1^*8u&fhXs0dt&+?#ZX~%YAr46c= z?eYNH*cn-0{`@Bx-@(BlQ^UwuiYrm@mOq9)Xs-B8iA`hZ)Q7|?8E1>FYQJI=PF+fZ z!{c)2&hq--Vbc=JrYOGMvYm~EQtNt)0UVf>FgaT5S6f@l8MF00l4;C;Dlz|3vYwt^ z==zZJLj8udn_G#HHuhtx5R}I|5Cz~YToFz)H#f(wraLvA8hPcMJiegpJ<}V@7rOcF zR_WdZQ<(qe;zXxJqosvK;N<(bwq!n=T3=Te7qq~5`WEQ~7$ZhQ8jkDN;_DNLn!teN zA00<&8TFAqKiX5$M6U8Ghwj?NNRJ1f=Sr-Jb=}(AFDWT`b~X3Hg$pq)c94ZrjgV~d zt-MOXgJiM@Lha(k7O=XAurS0i-^usKAa{6q$tJyc{(Nh5D!FlYxf52wC+~}4jk`JT{+ZSQFZ&hy{=y=ZD`& zNK2a{HQGG)xzy0l&cAT#Pb^4#ai-$2SH&z@?R?h^DX&Yu$J*a#xvwEER$?Tm&TqNn zw@nBxzsNGPv^1#PlPrJI$TeVVE$`^U!q7o?PE3-<{n`9A{`~R;Q4hlXj?#jqiW}zL zu$8$=A%WYgvk*>uvZR^VRs!o68g}L%o_GE>Jly&5BO{L-PEu0RZ+--Js}by(Az@?P z5FBvv;?c>dOrE;HwcqXST7oJ6q*~Sad(M3=CZTg6lEZ;*OX9iZ;xaQkyY=T)4;<1^)c_pa+sv@td)t;^M?sd$VjqV`CrKeeh-p zv$Dr;-)=#P0It{5-5m<&;;ePu;J0sb?qhYZ@7DE!(06XFOkdT}v4jxcnJx~=jTeQg z_Wk=UUZSDeu_JYCYzz_%BNNk#LKqwF~GI{`0)eI8&r6Is;EdW zS81>Nk^HT%FZ+Dh_ntIEm_&&2E3ul3bm zim4~uE12c8L>yPzGo;pFm9jn;(81n%?^CRUrh(;Ioy9F}Uz7WU({D$f$Xq#IVRtJ~ za4UB*Zu-X0o@}G0w#lJ@fcy9x&p+xIue%uPpD@?`ac-N)Zff<#zTC{&d3xxT^I_cp z(IsrLi8g8KiQ)4XrlpLGj3y=~MMW0+`W|b)znEGFM3V{=PfCxy^`h-guPsz3ufa~% z)z+RI2u*hytqbsSacReOL0X;$Ou@;?DYS7M*Y)AU2f!A@&B`ERs4|oK(7FTMZN)Z? z`|smUWI!x{lmcD~F_<$3s+CV!?hUhRfe=Zc+Sv0~=&tw!B~w}~6CWIT%XFvYHlyp; zcNQmFzJ0U6?7v^uGC*1-2CvTat<8~5i!E9!{v1ZLIh%uT6)(+S-S{~@?GACz-d=5> za(#XM>6Hw7Mt2X7Mexcc|GKg=<`U6gJP^+|I&Jp*t6bBaT!+VMeCFWqgSNQ4)x!Apsd5&7`8I_;kZ;fZj@D_KqX7Td3m-t>R|{n zRq&~)zdhwu@|t4M`UtFhYdY86#ibfHY~b0|QrKD89+9g#BMl)tUrcSJ81idtci^Q9$nqK+&>(~5X`4k)px4W5BGJfGDBy>PPfV|&) zFeIAZ-h1N;?W-o)_H+qzI z{=j!&vEmqvcdW$00q+TL2nWqipM34g(SLk#T#EjSwoXnz=SmxS+q``a6my(0l z{|rH0(2EP1>CHRr2fShtEztPfBF30kc64;4r?dMReP90BDPdWyZ)iB_CT$6DC>(64 zR^ZtCZ7$k}1AN#def)U&)0@%yAU|@66-s(h zK^aof?rt!#0P@-wGC6ilognq4Xz6(w@^m#Dbyx0 zj-)e(xpKKv;$mapH)*#Ke@Jgss!(&;UA=l0!=9Cy`HnG7OXwUH3z1(@!+^QXSK7Oq zDD|SQ&XPImVl1Q8+dEH7O6FH*2Oy(=;GdVr_z5#3jA(OvXb-4r(;$dKqb2pyIQzVF zH@!rizP>&`B7!{E)z#I?xXfpQz#AWPjJjuZpZV132*W6r<-O(=r?rL8#X%0Loiw?7 zeSbd4e>v$UZWh*iESXJjr?e4&uweQ%EadIn#M`8UxlVFJ^;-XW9(DR|w!l{ZkYj^v zCN^X+596u4GZZiFK6d-oEhsS=T7+2R!gkxjpsjcUut2Fz*v6=zB+pHA_9`<(MDOr$ z5S+w_2ufpP$!By^LBBpdY>8!>t0_TWc6VQZEDtT5x!eN$y z2C1C#Ja2N?QY*(`;N9U1u#ey(WSg-1%F55vD|XVYPzaFvW*|89WXl>E7#yKp?ajN$ zan_QVYGP@sZE9+2apkbK0vEo%_M;=Ms7TbM|D=0ec&2!Ik#()_-}aPK!~!cQh9M+! zXh=fU%pBF3A>mNZa6?5lsTRru*cE<6GbFjKiCDg7rULx7GuV!nFPOr-HL1mB@3$$` z%WG?E1$Y|DZ~*$Ddbthd(?BI;zzb4RuPZARg4Qt)E=w|`Wn~4;_Mg5V=HcOS=MEs! z=K!Ee(aM(boP^`|+I0t(&KI(pg6X7Z$5e;zZTE!jd%bkoQ{rWZXfY)uElq}JrhQd1 z7ql@ie)jAQ6wQ%3fVUeOlsYS*p9CjsY*}k;v47~zj^h3hwWVgQEuz)Aac(X9b(A!R z?g~$*Rq%_VIg{3J(#8H(>y>OB_z?PiyT2o0GuH(rKIK{~W_2e!W-WW`cAGdgVg~LA zU&jl(p1Fnk_SS299y$YP;SV49uw0xUdH(!)xohp~*HCD@0Ovle{0^%uh?=RXtVvVp z81p-SzrEgovLKqnT1$x4Js~#nJC|SYQ z0np39AJ^fkw=4=8288%{h%GX*vH<|`h-4D?- z6yoxqXfp0^|I;hbntb+otJ>fLlPUz6u39xO`roK%1vtjzR!GQ?TU2qz+qI59o!fYq5|vEOWfvfp)!pt|k=Xp7`}D+YQR#uh6RaL-HdQ)NlWO zA)=S<@r(&_L&&dBoYE{uGz@?kI>g%!dj+U-4uc%n32Igi4UM8AsFWdfqa`H%y%AKX zgM)*`*WbXx?`$nQy^Mn*z8&D3@t}ozu&~`kDyB1*ktYx~r)<^R!-IM0%L4O9U^9$p zFTDDEwDuL1YI{#l&&Q93#%yBTOA<=COf04P=+zdwJYg*si@09A`28n3B~s?gPu_f> zH_+&K7OkdS+b+gk>eA5Q((+~5IJV`L-kM3sdS`df_^?^-29vfgkuCc|=koa+JW;{O zxWcJbzItr~*2z_bF{ z#DcZe)oaGaoH5}cv8PU*f_~9${T#6%h2#X4L}}gfM<|HE&66|~2d4oE`33z4;23Yp z%lohifByW@5`x+#9qOw;gXQ@}MRX_9(w!hGJh*@V9sY!dC(tdE1{^SShq67;V;@;R+PQ0&$DV!s6mCE5&$kSy)j^ zOA8bshZP)jgHT(Vn4}lrBO@chV-$L(fBvjr1w%A!P6AZ>`}c3SQ~6sgS7K6PVmV%e2@!Ht5RDZmHWc(r@;t z#qQj=)RIB2Qmn6A*o^;6y`4~&so}i$tU0Rq<9-5F|LloC4I?Cp)s)}!ZB6=^f9w;X zO!15FSy!$r<@Qv$zK?JnjxoRFX87d##mUP**ji*L={4`%xw9BUD!i(+oy-{=naR<}I8vsTkY%~F?un9#K>>!~)7kBw#!R*Qwv`ZJD z3*wbN!EFC|6X=EfB2h!Z_x6&kT&I~42S?0=Bh_!AUe`W!y2mh7fx)o1QYy~It|Rg* zS)UH58t8D+thz__ic$Mq^hKUwalG)Od&~Gr&vPfMEc>`oSLzcSzRC@Oo2|OVc17pYA`)gTbt4+Rune}#L;2XJ5~ zNqp?d@S#h(1NTad$Ug0PSvklFN^eH6Gj-d{X*c3B0FewdDc2dlsFrXdF7$ilUjcwr z3opa{ff<8h*xn0$`HPN2?Jc`KDV(-N1 zf1W)*xpm(8*PVlapOba-Uo`~6S@({7=zM?in8E$?9ku4xPXnZ;ke7+*ZzPvX&BxGG zj=3Ea$;?MuTyVrkkN(Oqt`9an5gf`Sq3miz1QJ^7@%1x@9Hd{l>oAXVOGDGO=ESBMZWEUHv8Q}8WEYFwb8)u)5-tLz2oh$7 zC@7iGd|uMZOQxIT5^LAO?OdjM=@(V5>9qPKA1V_T>cpv^pEzV)@(O!7$=DEu`kv{? zY1*B;FTZ-k^fGHn6M74S(wVuM6*nln^jtX5bgcIbk9uqEO*M^r%aRy{$g`e* zNBeMtIZZvqKc_7~6D7w#Nx(|H?-~6>ODhMm0oFKvJY)84^}H1M7&}yURJ6ZD4E219 zp$FZl!xLbqj+qonxt&PI3{@pEJ(hE!L!Jy3ve=aPTTMl2_xqib=I=5CtbL{fB+Mbc z#*p4IzxKW*o^_Ujmb}XJb!yN1slxoDI)Q)D-Q)*PRt_YVn>AWEB)?TQZ!K}q+X-LtwLna;6iE9zGLl=jmi1LN*&5<9 ziU??8#p7oyeNRNFBT1|}u@~9S7DuG!X!jR9yO>WWUc_s##_}J}Z4WkyI%9plQQ8jyR|rPX-ts>OPLT7-bX-2!qvop0cRdLW;`qoGTx z|0*49;u>Yh==4udrn2qjt${K5yJV6!9=HarMgmf!vAv-jo-N^>Nl2TfNeT zA~%#opE0eq&aPM63cunK>kKttda^-IlLhD&^fPQ*XNN^}^eU=XPa^U#1#3)dnPXp4 z^rX}D-W41pG~q?vuc)DUc9FMdv$oWvU!mi7Z&q;c{yHtt%J3ia|02&oDnFW8ElRWe z6?2|}uD%W!Z5$yW@tie_z0MnLoJMW*)AfP0v8s`V>H{-l(m)u&aGQeeY_>1ogv=px z9=>QgQJa0~?o45=im=z?5-|dy>Dj|KD3V)BgHtH`RM|jxmUE^xr zdtOwl+XYetXn_7r_X9WqZ&@)$amOv8Hu5z7v=48%D6B%RoU9kEwrjxrZPl!MQ+Opzh$(%wD zeS|GhSa+bNWQxe$c7_nqxvX$?pc2zrQ$io{7)>ZDLMw!xWkzVFJ}D|XNXsRzFn;shRpjA1#ES6g?Ch84(tA5qqIwq7QDmxy?g$2>nE1A;^`Osl<}HK?Sa@gQRpRQUNj&)ruc`w&R_ z76wRx3&3asG9K|#4dG-S)BmFAHyw=-Gn=EiiLtTiWeo!yLkmuKxGL{wlP#7R0T#tF zP<426w_qO|NAQ2jmOT;p>+&6d&HpIjlGUwX{a(Ju$t-YKJ~KB1<`0TOfFR%n zi0v908lVByFklzA0L)h4*o21}QiDL^ZVQj4OEry!}*&`jgU?*E-trkV^Xvh6`0J=>7G!6`We%yM!giDD%7O=BY>Cn?!i+u zp#X1MkJCM`dmc&G1)v4lXSfO^C_gS48xu&RJ{REJOib8y2hyFOngKjvdpl5fpx|n5 zQvdIo?g~uLN_90q0xZ>V2QW8vK`ALIQ1W@)G<|6nej`pZAI*CiAoa=C__^P|q4^0P zmtr`|`-5qq>o7jhA?!3XTA|-zq4(i-o@kB+ChY!wZ%4Cg4?ADq3vHgD;DcV``8B#5 zR>oh zJl6No1i16w-X5^r@JxvFA1f@)%^zwBfjBdsK!A&WPmFGvfGytL-R77Hiu(PM<>QlqTVYBo#e+7jeAg`Ypo*AynA`*Yk z&EbiR(Q2T!G&VLy(=;Fc2MsoGAg52CPIo#Mp>JaH^~;wpBO?m#V+xJq%Ff-{aOdfq zpzf-_aQ~vBBH&B#iicYPTEM`-P+3{Y zABZ<+7Ys@j0?Cu1AqmeVJQfohd*#ZNGX%9@DG7=rs3s~HlGqVc|rbtLY zX6aILay2)<6oHHfqJisB#nZ}49BUlLss;drLtY6)H7`txEz0ewZ%pz3=x{v5dBE-f z2*EV~TxlSoVI!|s-G+|+5Lz`dG6J|1HulPu&Y0sT^%F`;&RX7Vi8&4nhvqsTeG{7h zkdTm-=^mS^+vf0Oc6NCsbMQ29CusU%iP!4`*T9dUe7kh%QeJe5))PQ|rKP2jbUwbm zq#@H%YsIkr;GAjjdQjqucmAH8#Y3Cz<~COC=>TF7yBf~JTz5nONtFjCef`=8h(-vG zAW~>iO8{MIf4^bUlwe9btPfo03?WtMd1GTExLb9#zqfZK5Kp&MOaNuMJ#;RLTXHXE zOT4`WFecrB_am7?+JM)>QZs`ho9!mc8XNh3HmRZ7Jk<@L!CHU!?j5W@L;QNoYX#n9 z5oUyKI>76Nk4flqv)hi2LMd8UhVwEqfI$M7VQd^N7WWP>m|_ONF+buk;JUl_bag#& zl6|P->*FIZPtdLf*a^T?P{&r>_VHO8dF$n4wJE|asB461LtCiB7o12R~Sv(hb>((5^h*K%;o16Zk56&^1LNTnbuD*MEcoC5h zC7ZCYFpxaMGAbO8{gSzL^QOi1>(r_c-d+|Jfq~~{W&qK%E`{LmcFBJ?cJ>AoC|K$! z=JUSXZ31V3)CTC(Fvbp!8SIFWB@CCe0=OQPWP<9u?N?H z-Qh~4iBv5mcdi60@VdLY{{8*CnMxqNAMod)AwW-V=S-({JmE)V?w;3uRa-018mE7# z7?4To?C6kWXj#~ZCuQmggC~sk_WnbCCQrYxx*8Q0JugZyw6Pf<9=>j2!4=>7wZv+8 zY%FQ$bxKMKi6p2a2Zs$nWMaY4;9zy|)*WI&`R`|?rKJT0!XhHHO`m{01!54oQ1kS9 zYj+`5Nd||}8Xv%7dVj&*zWh%D0=|3n=+WcHkApj1ukn6fRFoO_5*z}E6m>xmyo{FF zU4%dgdNg?bZDiy&@fW-vWjhN95Ja2`OsQ4vg$I}IK6?23SJ%~zOs_n6@BpIVaUgWz zstgRMm~!CBsp;9zF zr0d$-iKHvl%z1irEiHMz)a2yj^Lrx))tIGaoqa1^aP(9)Fu-qKzn+j|XjxPMkd8vc z7^$IQKtoGQF1}9g>np#}MFja+Vsi4Od;?YHn3xziRe4Qt^KX@LcA0EqCZE52fqG3Q zsQ{mtmp2F8VPCi?kjDVYUA@XAn4L7`?c>vxtE~J`2Rx^g9RK

KwO2y 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 z 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 ({ isUuid: vi.fn(() => false), })) -import { SYSTEM_ACCESS_SCOPE } from '@/lib/knowledge/access/types' +import { type KnowledgeAccessProvider, SYSTEM_ACCESS_SCOPE } from '@/lib/knowledge/access/types' import { verifyFileAccess, verifyKBFileWriteAccess } from '@/app/api/files/authorization' const CLOUD_KEY = 'kb/1780162789495-secret.txt' @@ -392,3 +398,65 @@ describe('organization connector cache access', () => { ).resolves.toBe(false) }) }) + +describe('KB file live source authorization', () => { + beforeEach(() => { + vi.clearAllMocks() + resetDbChainMock() + mockGetFileMetadataByKey.mockResolvedValue({ workspaceId: 'ws-1', deletedAt: null }) + mockGetUserEntityPermissions.mockResolvedValue('read') + }) + + it.each([true, false])( + 'returns live permission %s after an ordinary file lookup misses', + async (allowed) => { + const scope = { kind: 'user' as const, userId: USER_ID, tokens: ['reader-token'] } + const getForConnectors = vi.fn().mockResolvedValue(scope) + const access: KnowledgeAccessProvider = { + get: async () => scope, + getForConnectors, + getForDocuments: async () => scope, + } + queueTableRows(schemaMock.document, []) + queueTableRows(schemaMock.document, [{ connectorId: 'confluence-source' }]) + queueTableRows(schemaMock.document, allowed ? [{ id: 'doc-1' }] : []) + await expect( + verifyFileAccess(CLOUD_KEY, USER_ID, undefined, 'knowledge-base', false, { + knowledgeAccess: access, + }) + ).resolves.toBe(allowed) + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith(['confluence-source'], undefined) + for (const [condition] of dbChainMockFns.where.mock.calls) { + expect( + hasMockCondition( + condition, + (node) => + node.type === 'eq' && + node.left === schemaMock.document.storageKey && + node.right === CLOUD_KEY + ) + ).toBe(true) + expect( + hasMockCondition( + condition, + (node) => + node.type === 'eq' && + node.left === schemaMock.knowledgeBase.workspaceId && + node.right === 'ws-1' + ) + ).toBe(true) + } + } + ) + + it('rejects a missing ownership permission before resolving the reader', async () => { + mockGetUserEntityPermissions.mockResolvedValue(null) + const get = vi.fn() + await expect( + verifyFileAccess(CLOUD_KEY, USER_ID, undefined, 'knowledge-base', false, { + knowledgeAccess: { get, getForConnectors: vi.fn(), getForDocuments: vi.fn() }, + }) + ).resolves.toBe(false) + expect(get).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/api/files/authorization.ts b/apps/sim/app/api/files/authorization.ts index a847a5748ac..618b4e9711e 100644 --- a/apps/sim/app/api/files/authorization.ts +++ b/apps/sim/app/api/files/authorization.ts @@ -6,12 +6,11 @@ import { and, eq, isNotNull, isNull, or } from 'drizzle-orm' import { NextResponse } from 'next/server' import type { ResourceScope } from '@/lib/core/resource-scope' import { resourceScopeCondition } from '@/lib/core/resource-scope.server' -import { knowledgeAccessCondition } from '@/lib/knowledge/access/predicate' import { - resolveUserKnowledgeAccessScope, + createUserKnowledgeAccessProvider, WORKSPACE_ACCESS_SCOPE, } from '@/lib/knowledge/access/scope' -import type { KnowledgeAccessScope, SystemAccessScope } from '@/lib/knowledge/access/types' +import { type KnowledgeReadAccess, knowledgeReadAccessBatches } from '@/lib/knowledge/read-access' import { getFileMetadata } from '@/lib/uploads' import type { StorageContext } from '@/lib/uploads/config' import type { StorageConfig } from '@/lib/uploads/core/storage-client' @@ -494,61 +493,55 @@ async function verifyCopilotFileAccess( } /** - * Whether an active KB document (non-archived/excluded/deleted, in a - * non-deleted KB) in the owning workspace references exactly `cloudKey`, matched - * on the document's persisted canonical `storageKey`. This is an exact, indexed - * lookup — no URL parsing or wildcard matching at read time. It is a lifecycle - * signal only: it reflects whether the file is still part of a live KB, not who - * owns it (ownership comes from the binding). + * Checks whether a readable, active document references the exact storage key + * within the binding's canonical scope. Live source proof uses only candidate + * IDs; document existence is checked with the complete access predicate. */ -/** A reader once resolved: a person's or the workspace's tokens, or the system reading its own rows. */ -type ResolvedKnowledgeFileAccess = KnowledgeAccessScope | SystemAccessScope - async function hasActiveKbDocumentForKey( cloudKey: string, scope: ResourceScope, - access: ResolvedKnowledgeFileAccess + access: KnowledgeReadAccess ): Promise { - const rows = await db - .select({ id: document.id }) - .from(document) - .innerJoin(knowledgeBase, eq(document.knowledgeBaseId, knowledgeBase.id)) - .where( - and( - resourceScopeCondition(knowledgeBase, scope), - eq(document.storageKey, cloudKey), - eq(document.userExcluded, false), - isNull(document.archivedAt), - isNull(document.deletedAt), - isNull(knowledgeBase.deletedAt), - access.kind === 'system' - ? undefined - : or(isNull(document.connectorId), isNotNull(document.contentHash)), - knowledgeAccessCondition(access) - ) - ) - .limit(1) - - return rows.length > 0 + const conditions = [ + resourceScopeCondition(knowledgeBase, scope), + eq(document.storageKey, cloudKey), + eq(document.userExcluded, false), + isNull(document.archivedAt), + isNull(document.deletedAt), + isNull(knowledgeBase.deletedAt), + !('get' in access) && access.kind === 'system' + ? undefined + : or(isNull(document.connectorId), isNotNull(document.contentHash)), + ] + for await (const accessCondition of knowledgeReadAccessBatches(access, conditions)) { + const rows = await db + .select({ id: document.id }) + .from(document) + .innerJoin(knowledgeBase, eq(document.knowledgeBaseId, knowledgeBase.id)) + .where(and(...conditions, accessCondition)) + .limit(1) + if (rows.length > 0) return true + } + return false } /** * How a KB file read identifies the reader for document access. `'user'` is - * for a session-authenticated person; a resolved scope is for a caller that - * already holds one (an execution with a principal). The system scope is for + * for a session-authenticated person; an access provider carries the principal + * behind an execution and resolves current source permissions. The system scope is for * a background job reading a connector-owned row it is processing, which in * members mode is hidden until the sync materializes its readers. Anything * else — an internal token, a tool running with the workflow owner's id — * reads as the workspace, never as the person whose id it happens to carry. */ -export type KnowledgeFileAccess = 'user' | ResolvedKnowledgeFileAccess +export type KnowledgeFileAccess = 'user' | KnowledgeReadAccess async function resolveKnowledgeFileAccess( knowledgeAccess: KnowledgeFileAccess | undefined, userId: string, workspaceId: string -): Promise { - if (knowledgeAccess === 'user') return resolveUserKnowledgeAccessScope(userId, workspaceId) +): Promise { + if (knowledgeAccess === 'user') return createUserKnowledgeAccessProvider(userId, { workspaceId }) return knowledgeAccess ?? WORKSPACE_ACCESS_SCOPE } @@ -559,9 +552,8 @@ async function resolveKnowledgeFileAccess( * 1. Ownership — the trusted `workspace_files` binding (exact key) names the * owning workspace; the caller must have permission on it. Ownership is * never inferred from an attacker-authorable `document.fileUrl`. - * 2. Liveness — an active document must still reference the exact key, so the - * retained bytes of an archived document or soft-deleted KB are not - * downloadable (the liveness document is not an authorization signal). + * 2. Readability — an active document must reference the exact key and satisfy + * the caller's complete document and live source access predicates. * * A missing binding denies (the ownership backfill populates bindings for * pre-existing objects before this path is deployed). @@ -589,6 +581,7 @@ async function verifyKBFileAccess( if ( binding.workspaceId || typeof knowledgeAccess !== 'object' || + 'get' in knowledgeAccess || knowledgeAccess.kind !== 'system' ) return false @@ -624,7 +617,7 @@ async function verifyKBFileAccess( logger.warn('KB file access denied: no readable document references the file', { userId, cloudKey, - accessScopeKind: access.kind, + accessScopeKind: 'get' in access ? 'reader' : access.kind, }) return false } diff --git a/apps/sim/app/api/v1/knowledge/[id]/documents/[documentId]/route.ts b/apps/sim/app/api/v1/knowledge/[id]/documents/[documentId]/route.ts index 7ad5558439e..35a7a1d1a9b 100644 --- a/apps/sim/app/api/v1/knowledge/[id]/documents/[documentId]/route.ts +++ b/apps/sim/app/api/v1/knowledge/[id]/documents/[documentId]/route.ts @@ -14,7 +14,7 @@ import { performDeleteKnowledgeDocument } from '@/lib/knowledge/orchestration' import { handleError, resolveKnowledgeBase, - resolveV1KnowledgeAccessScope, + resolveV1KnowledgeReadAccess, serializeDate, } from '@/app/api/v1/knowledge/utils' import { authenticateRequest, v1ValidationErrorResponse } from '@/app/api/v1/middleware' @@ -52,7 +52,7 @@ export const GET = withRouteHandler( const doc = await getKnowledgeDocument( knowledgeBaseId, documentId, - await resolveV1KnowledgeAccessScope(userId, rateLimit, parsed.data.query.workspaceId) + await resolveV1KnowledgeReadAccess(userId, rateLimit, parsed.data.query.workspaceId) ) if (!doc) { @@ -116,7 +116,7 @@ export const DELETE = withRouteHandler( const doc = await getKnowledgeDocument( knowledgeBaseId, documentId, - await resolveV1KnowledgeAccessScope(userId, rateLimit, parsed.data.query.workspaceId) + await resolveV1KnowledgeReadAccess(userId, rateLimit, parsed.data.query.workspaceId) ) if (!doc) { diff --git a/apps/sim/app/api/v1/knowledge/[id]/documents/route.ts b/apps/sim/app/api/v1/knowledge/[id]/documents/route.ts index ba403a072e8..8ee583d3640 100644 --- a/apps/sim/app/api/v1/knowledge/[id]/documents/route.ts +++ b/apps/sim/app/api/v1/knowledge/[id]/documents/route.ts @@ -29,7 +29,7 @@ import { validateFileType } from '@/lib/uploads/utils/validation' import { handleError, resolveKnowledgeBase, - resolveV1KnowledgeAccessScope, + resolveV1KnowledgeReadAccess, serializeDate, } from '@/app/api/v1/knowledge/utils' import { authenticateRequest, v1ValidationErrorResponse } from '@/app/api/v1/middleware' @@ -79,7 +79,7 @@ export const GET = withRouteHandler(async (request: NextRequest, context: Docume sortOrder: sortOrder as SortOrder, }, requestId, - await resolveV1KnowledgeAccessScope(userId, rateLimit, workspaceId) + await resolveV1KnowledgeReadAccess(userId, rateLimit, workspaceId) ) return NextResponse.json({ diff --git a/apps/sim/app/api/v1/knowledge/search/route.test.ts b/apps/sim/app/api/v1/knowledge/search/route.test.ts index 54c23374a28..7be0518423e 100644 --- a/apps/sim/app/api/v1/knowledge/search/route.test.ts +++ b/apps/sim/app/api/v1/knowledge/search/route.test.ts @@ -12,18 +12,22 @@ import { getErrorMessage } from '@sim/utils/errors' import { beforeEach, describe, expect, it, vi } from 'vitest' const { + mockResolveV1KnowledgeReadAccess, mockExecuteKnowledgeSearch, mockGenerateSearchEmbedding, mockGetDocumentMetadataByIds, + mockGetDocumentTagDefinitions, mockAuthenticateRequest, mockValidateWorkspaceAccess, mockResolveBillingAttribution, mockResolveSystemBillingAttribution, mockRecordSearchEmbeddingUsage, } = vi.hoisted(() => ({ + mockResolveV1KnowledgeReadAccess: vi.fn(), mockExecuteKnowledgeSearch: vi.fn(), mockGenerateSearchEmbedding: vi.fn(), mockGetDocumentMetadataByIds: vi.fn(), + mockGetDocumentTagDefinitions: vi.fn(), mockAuthenticateRequest: vi.fn(), mockValidateWorkspaceAccess: vi.fn(), mockResolveBillingAttribution: vi.fn(), @@ -81,9 +85,7 @@ vi.mock('@/app/api/v1/middleware', () => ({ })) vi.mock('@/app/api/v1/knowledge/utils', () => ({ - resolveV1KnowledgeAccessScope: vi - .fn() - .mockResolvedValue({ kind: 'workspace', tokens: ['pub', 'ws'] }), + resolveV1KnowledgeReadAccess: mockResolveV1KnowledgeReadAccess, handleError: (e: unknown) => new Response(JSON.stringify({ error: getErrorMessage(e, 'error') }), { status: 500, @@ -91,7 +93,7 @@ vi.mock('@/app/api/v1/knowledge/utils', () => ({ })) vi.mock('@/lib/knowledge/tags/service', () => ({ - getDocumentTagDefinitions: vi.fn().mockResolvedValue([]), + getDocumentTagDefinitions: mockGetDocumentTagDefinitions, })) import { POST } from '@/app/api/v1/knowledge/search/route' @@ -111,6 +113,7 @@ const baseKb = (id: string, embeddingModel: string, embeddingDimension = 1536) = describe('v1 knowledge search route — per-KB embedding model', () => { beforeEach(() => { vi.clearAllMocks() + mockResolveV1KnowledgeReadAccess.mockResolvedValue({ kind: 'workspace', tokens: ['pub', 'ws'] }) mockAuthenticateRequest.mockResolvedValue({ requestId: 'req-1', userId: 'user-1', @@ -123,6 +126,7 @@ describe('v1 knowledge search route — per-KB embedding model', () => { }) mockExecuteKnowledgeSearch.mockResolvedValue([]) mockGetDocumentMetadataByIds.mockResolvedValue({}) + mockGetDocumentTagDefinitions.mockResolvedValue([]) mockResolveBillingAttribution.mockImplementation( ({ actorUserId, workspaceId }: { actorUserId: string; workspaceId: string }) => Promise.resolve({ @@ -135,6 +139,111 @@ describe('v1 knowledge search route — per-KB embedding model', () => { mockRecordSearchEmbeddingUsage.mockResolvedValue(undefined) }) + it('retains the reader provider for ranked results and returned document metadata', async () => { + const access = { kind: 'user' as const, userId: 'user-1', tokens: ['reader-token'] } + const provider = { + get: vi.fn().mockResolvedValue(access), + getForConnectors: vi.fn(), + getForDocuments: vi.fn(), + } + mockResolveV1KnowledgeReadAccess.mockResolvedValue(provider) + mockCheckKnowledgeBaseAccess.mockResolvedValueOnce({ + hasAccess: true, + knowledgeBase: baseKb('kb-1', 'text-embedding-3-small'), + }) + const response = await POST( + createMockRequest('POST', { + workspaceId: 'ws-1', + knowledgeBaseIds: 'kb-1', + query: 'hello', + }) + ) + expect(response.status).toBe(200) + expect(mockExecuteKnowledgeSearch).toHaveBeenCalledWith( + expect.objectContaining({ + access, + accessProvider: provider, + }) + ) + expect(mockGetDocumentMetadataByIds).toHaveBeenCalledWith([], access, provider) + }) + + it.each([ + ['query', false], + ['query', true], + ['filters', false], + ['filters', true], + ] as const)( + 'omits newly denied content from %s results and counts when all denied is %s', + async (mode, allDenied) => { + const access = { kind: 'user' as const, userId: 'user-1', tokens: ['reader-token'] } + const provider = { + get: vi.fn().mockResolvedValue(access), + getForConnectors: vi.fn(), + getForDocuments: vi.fn(), + } + mockResolveV1KnowledgeReadAccess.mockResolvedValue(provider) + mockCheckKnowledgeBaseAccess.mockResolvedValueOnce({ + hasAccess: true, + knowledgeBase: baseKb('kb-1', 'text-embedding-3-small'), + }) + mockGetDocumentTagDefinitions.mockResolvedValue([ + { tagSlot: 'tag1', displayName: 'category', fieldType: 'text' }, + ]) + mockExecuteKnowledgeSearch.mockResolvedValue([ + { + documentId: 'revoked-document', + knowledgeBaseId: 'kb-1', + content: 'revoked page content', + tag1: 'revoked tag', + chunkIndex: 0, + distance: 0.1, + }, + { + documentId: 'allowed-document', + knowledgeBaseId: 'kb-1', + content: 'allowed page content', + tag1: 'docs', + chunkIndex: 0, + distance: 0.2, + }, + ]) + mockGetDocumentMetadataByIds.mockResolvedValue( + allDenied ? {} : { 'allowed-document': { filename: 'Allowed page', sourceUrl: null } } + ) + const response = await POST( + createMockRequest('POST', { + workspaceId: 'ws-1', + knowledgeBaseIds: 'kb-1', + ...(mode === 'query' + ? { query: 'docs' } + : { tagFilters: [{ tagName: 'category', operator: 'eq', value: 'docs' }] }), + }) + ) + const body = await response.json() + expect(response.status).toBe(200) + expect(mockGetDocumentMetadataByIds).toHaveBeenCalledWith( + ['revoked-document', 'allowed-document'], + access, + provider + ) + expect(body.data.results).toEqual( + allDenied + ? [] + : [ + expect.objectContaining({ + documentId: 'allowed-document', + documentName: 'Allowed page', + content: 'allowed page content', + metadata: { category: 'docs' }, + }), + ] + ) + expect(body.data.totalResults).toBe(allDenied ? 0 : 1) + expect(JSON.stringify(body)).not.toContain('revoked') + } + ) + it('passes the KB embedding model into generateSearchEmbedding', async () => { mockCheckKnowledgeBaseAccess.mockResolvedValueOnce({ hasAccess: true, diff --git a/apps/sim/app/api/v1/knowledge/search/route.ts b/apps/sim/app/api/v1/knowledge/search/route.ts index 44b347c4160..b8209d400cf 100644 --- a/apps/sim/app/api/v1/knowledge/search/route.ts +++ b/apps/sim/app/api/v1/knowledge/search/route.ts @@ -24,7 +24,7 @@ import { getDocumentTagDefinitions } from '@/lib/knowledge/tags/service' import { buildUndefinedTagsError, validateTagValue } from '@/lib/knowledge/tags/utils' import type { StructuredFilter } from '@/lib/knowledge/types' import { checkKnowledgeBaseAccess, type KnowledgeBaseAccessResult } from '@/app/api/knowledge/utils' -import { handleError, resolveV1KnowledgeAccessScope } from '@/app/api/v1/knowledge/utils' +import { handleError, resolveV1KnowledgeReadAccess } from '@/app/api/v1/knowledge/utils' import { authenticateRequest, capabilityGovernedUserId, @@ -228,8 +228,8 @@ export const POST = withRouteHandler(async (request: NextRequest) => { let results: SearchResult[] let queryEmbeddingIsBYOK: boolean | null = null - const [access, { searchMode, boostRecency }] = await Promise.all([ - resolveV1KnowledgeAccessScope(userId, rateLimit, workspaceId), + const [readAccess, { searchMode, boostRecency }] = await Promise.all([ + resolveV1KnowledgeReadAccess(userId, rateLimit, workspaceId), resolveKnowledgeSearchDefaults({ workspaceId, /** A personal key acts as its user; a workspace key has no person behind it. */ @@ -238,11 +238,15 @@ export const POST = withRouteHandler(async (request: NextRequest) => { }), ]) + const accessProvider = 'get' in readAccess ? readAccess : undefined + const access = 'get' in readAccess ? await readAccess.get() : readAccess + if (!hasQuery && hasFilters) { results = await executeKnowledgeSearch({ knowledgeBaseIds: accessibleKbIds, topK, access, + accessProvider, searchMode, boostRecency, structuredFilters, @@ -258,6 +262,7 @@ export const POST = withRouteHandler(async (request: NextRequest) => { knowledgeBaseIds: accessibleKbIds, topK, access, + accessProvider, searchMode, boostRecency, query, @@ -306,12 +311,13 @@ export const POST = withRouteHandler(async (request: NextRequest) => { }) const documentIds = results.map((r) => r.documentId) - const documentMetadataMap = await getDocumentMetadataByIds(documentIds, access) + const documentMetadataMap = await getDocumentMetadataByIds(documentIds, access, accessProvider) + const readableResults = results.filter((result) => documentMetadataMap[result.documentId]) return NextResponse.json({ success: true, data: { - results: results.map((result) => { + results: readableResults.map((result) => { const kbTagMap = tagDefinitionsMap[result.knowledgeBaseId] || {} const tags: Record = {} @@ -337,7 +343,7 @@ export const POST = withRouteHandler(async (request: NextRequest) => { query: query || '', knowledgeBaseIds: accessibleKbIds, topK, - totalResults: results.length, + totalResults: readableResults.length, }, }) } catch (error) { diff --git a/apps/sim/app/api/v1/knowledge/utils.test.ts b/apps/sim/app/api/v1/knowledge/utils.test.ts new file mode 100644 index 00000000000..877c4d1e091 --- /dev/null +++ b/apps/sim/app/api/v1/knowledge/utils.test.ts @@ -0,0 +1,35 @@ +/** @vitest-environment node */ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const { createUserProvider } = vi.hoisted(() => ({ createUserProvider: vi.fn() })) +vi.mock('@/lib/knowledge/access/scope', () => ({ + createUserKnowledgeAccessProvider: createUserProvider, + WORKSPACE_ACCESS_SCOPE: { kind: 'workspace', tokens: ['pub', 'ws'] }, +})) +vi.mock('@/lib/knowledge/service', () => ({ getKnowledgeBaseById: vi.fn() })) +vi.mock('@/app/api/v1/middleware', () => ({ validateWorkspaceAccess: vi.fn() })) + +import { resolveV1KnowledgeReadAccess } from '@/app/api/v1/knowledge/utils' + +beforeEach(() => vi.clearAllMocks()) + +describe('v1 knowledge reader identity', () => { + it.each(['personal', 'oauth_access_token'] as const)( + 'retains live source proof for a %s caller', + async (keyType) => { + const provider = { get: vi.fn(), getForConnectors: vi.fn(), getForDocuments: vi.fn() } + createUserProvider.mockReturnValue(provider) + await expect( + resolveV1KnowledgeReadAccess('reader', { keyType }, 'workspace-1') + ).resolves.toBe(provider) + expect(createUserProvider).toHaveBeenCalledWith('reader', { workspaceId: 'workspace-1' }) + } + ) + + it('keeps workspace keys actorless without borrowing their creator identity', async () => { + await expect( + resolveV1KnowledgeReadAccess('key-creator', { keyType: 'workspace' }, 'workspace-1') + ).resolves.toMatchObject({ kind: 'workspace' }) + expect(createUserProvider).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/app/api/v1/knowledge/utils.ts b/apps/sim/app/api/v1/knowledge/utils.ts index 8d721d0ec4a..34fcc72784c 100644 --- a/apps/sim/app/api/v1/knowledge/utils.ts +++ b/apps/sim/app/api/v1/knowledge/utils.ts @@ -2,10 +2,10 @@ import { createLogger } from '@sim/logger' import { NextResponse } from 'next/server' import { validationErrorResponseFromError } from '@/lib/api/server' import { - resolveUserKnowledgeAccessScope, + createUserKnowledgeAccessProvider, WORKSPACE_ACCESS_SCOPE, } from '@/lib/knowledge/access/scope' -import type { KnowledgeAccessScope } from '@/lib/knowledge/access/types' +import type { KnowledgeAccessProvider, KnowledgeAccessScope } from '@/lib/knowledge/access/types' import { getKnowledgeBaseById } from '@/lib/knowledge/service' import type { KnowledgeBaseWithCounts } from '@/lib/knowledge/types' import { @@ -53,16 +53,16 @@ export async function resolveKnowledgeBase( } /** - * The document-access scope of a v1 API caller. A personal key acts as its + * The document reader of a v1 API caller. A personal key acts as its * user; a workspace key has no person behind it and reads as the workspace. */ -export async function resolveV1KnowledgeAccessScope( +export async function resolveV1KnowledgeReadAccess( userId: string, rateLimit: { keyType?: 'personal' | 'workspace' | 'oauth_access_token' }, workspaceId: string | undefined -): Promise { +): Promise { if (rateLimit.keyType === 'workspace') return WORKSPACE_ACCESS_SCOPE - return resolveUserKnowledgeAccessScope(userId, workspaceId) + return createUserKnowledgeAccessProvider(userId, { workspaceId }) } /** 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 1fca7ec50c9..3c23dda2671 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 @@ -89,6 +89,31 @@ afterEach(async () => { }) describe('connection method selection', () => { + it('does not label a saved method unavailable while availability is loading', async () => { + await render({ + scope: { kind: 'organization', organizationId: 'org-1' }, + value: { accessMode: 'admin' }, + lockAccessMode: true, + allowAdmin: false, + isAvailabilityReady: false, + }) + expect(container.textContent).not.toContain('This connection method is not available') + expect(container.querySelector('[aria-label="Sync using: Service account"]')).toBeDisabled() + }) + + it('shows a real unavailable method after availability finishes loading', async () => { + await render({ + scope: { kind: 'organization', organizationId: 'org-1' }, + value: { accessMode: 'admin' }, + lockAccessMode: true, + allowAdmin: false, + isAvailabilityReady: true, + }) + expect(container.textContent).toContain( + 'This connection method is not available in this organization.' + ) + }) + it.each([ { mode: 'members', label: 'Member accounts' }, { mode: 'admin', label: 'Service account' }, 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 9137754ea32..1f355ac085e 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 @@ -67,6 +67,7 @@ interface ConnectorAccessFieldProps { disabled?: boolean /** Existing Search sources retain the sync method chosen during setup. */ lockAccessMode?: boolean + isAvailabilityReady?: boolean /** Whether member accounts may be chosen; an existing selection remains visible for recovery. */ allowMembers?: boolean /** Whether administrator access may be chosen; it needs a connector that mirrors source permissions. */ @@ -89,6 +90,7 @@ export function ConnectorAccessField({ canAdmin, disabled = false, lockAccessMode = false, + isAvailabilityReady = true, allowMembers = true, allowAdmin = false, allowWorkspace = true, @@ -147,7 +149,7 @@ export function ConnectorAccessField({ title={slackSetupOnly ? 'Slack app' : allowWorkspace ? 'Connection method' : 'Sync using'} error={canAdmin && !showSlackSetup ? accountsQuery.error?.message : undefined} hint={ - canAdmin && !currentMode?.allowed + canAdmin && isAvailabilityReady && !currentMode?.allowed ? `This connection method is not available in this ${scope.kind}.` : lockAccessMode ? 'Create a new source to change the sync method.' 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 index 6006d640dc5..bb51c991365 100644 --- 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 @@ -102,7 +102,7 @@ import { googleDriveConnectorMeta } from '@/connectors/google-drive/meta' function fieldProps(connectorConfig: ConnectorMeta): ConnectorSettingsFieldsProps { return { - availability: { error: null, isFetching: false, refetch: vi.fn() }, + availability: { error: null, isFetching: false, isReady: true, refetch: vi.fn() }, isSearchIndex: true, connectorConfig, selectionLabels: {}, @@ -195,6 +195,29 @@ describe('connector settings service-account choices', () => { } ) + it('keeps a failed availability check actionable before methods are known', async () => { + const refetch = vi.fn() + await render(confluenceConnectorMeta, { + availability: { + error: new Error('Could not load connection availability'), + isFetching: false, + isReady: false, + refetch, + }, + allowAdmin: false, + }) + expect(container.textContent).toContain('Could not load connection availability') + expect(mocks.accessField).toHaveBeenLastCalledWith( + expect.objectContaining({ isAvailabilityReady: false, allowAdmin: false }) + ) + const retry = Array.from(container.querySelectorAll('button')).find( + (button) => button.textContent === 'Try again' + ) + expect(retry).toBeEnabled() + await act(async () => retry!.click()) + expect(refetch).toHaveBeenCalledOnce() + }) + it('shows the acting user’s managed connection for browsing member sources', async () => { mocks.credentials = [ { id: 'managed-1', name: 'My Confluence', provider: 'confluence', type: 'managed_oauth' }, 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 5d1719e982f..6e2f1c9612a 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 @@ -56,6 +56,7 @@ export interface ConnectorSettingsFieldsProps { availability: { error: Error | null isFetching: boolean + isReady: boolean refetch: () => unknown } isSearchIndex: boolean @@ -225,6 +226,7 @@ export function ConnectorSettingsFields({ onChange={onAccessChange} canAdmin={canAdmin} lockAccessMode={isSearchIndex} + isAvailabilityReady={availability.isReady} allowMembers={allowMembers} allowAdmin={allowAdmin} allowWorkspace={allowWorkspace} 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 495ede16381..2a172992b1e 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 @@ -414,6 +414,7 @@ export function useConnectorSettingsForm({ availability: { error: integrationAvailabilityError, isFetching: isIntegrationAvailabilityFetching, + isReady: isIntegrationAvailabilityReady, refetch: refetchIntegrationAvailability, }, isSearchIndex, diff --git a/apps/sim/components/integrations/slack-search-setup-wizard.tsx b/apps/sim/components/integrations/slack-search-setup-wizard.tsx index c584cb7d30d..9473b345fab 100644 --- a/apps/sim/components/integrations/slack-search-setup-wizard.tsx +++ b/apps/sim/components/integrations/slack-search-setup-wizard.tsx @@ -156,6 +156,11 @@ export function SlackSearchSetupWizard({ title='Client ID' value={clientId} onChange={setClientId} + placeholder={ + installationId + ? 'Leave blank to keep the saved value' + : 'Paste your Slack app’s client ID' + } required={!installationId} /> diff --git a/apps/sim/connectors/jira/jira.test.ts b/apps/sim/connectors/jira/jira.test.ts index 695239763c3..a2c08e7a0ff 100644 --- a/apps/sim/connectors/jira/jira.test.ts +++ b/apps/sim/connectors/jira/jira.test.ts @@ -74,7 +74,7 @@ describe('Jira Search member documents', () => { expect( jiraConnectorMeta.configFields.filter((field) => field.canonicalParamId === 'projectKey') ).toEqual([ - expect.objectContaining({ selectorKey: 'jira.projects', mode: 'basic', required: true }), + expect.objectContaining({ selectorKey: 'jira.projectKeys', mode: 'basic', required: true }), expect.objectContaining({ id: 'projectKey', mode: 'advanced', required: true }), ]) }) diff --git a/apps/sim/connectors/jira/meta.ts b/apps/sim/connectors/jira/meta.ts index 6cf85dc1cb8..43f05f39fa3 100644 --- a/apps/sim/connectors/jira/meta.ts +++ b/apps/sim/connectors/jira/meta.ts @@ -25,7 +25,7 @@ export const jiraConnectorMeta: ConnectorMeta = { id: 'projectSelector', title: 'Projects', type: 'selector', - selectorKey: 'jira.projects', + selectorKey: 'jira.projectKeys', canonicalParamId: 'projectKey', mode: 'basic', multi: true, diff --git a/apps/sim/hooks/use-member-enrollment.test.tsx b/apps/sim/hooks/use-member-enrollment.test.tsx index 6efb3ce8138..d279c8a818c 100644 --- a/apps/sim/hooks/use-member-enrollment.test.tsx +++ b/apps/sim/hooks/use-member-enrollment.test.tsx @@ -160,6 +160,252 @@ describe('useMemberEnrollment', () => { expect(mocks.connectionError).not.toHaveBeenCalled() }) + it.each(['existing', 'new'] as const)( + 'does not expire a superseded %s source authorization after its retry connects', + (source) => { + mount(new Set(), true, mocks.connectionError) + const mutation = source === 'existing' ? mocks.enrollmentMutate : mocks.sourceConnectionMutate + for (let index = 0; index < 2; index += 1) { + act(() => { + if (source === 'existing') enrollment().connect('kb-1', 'connector-1') + else enrollment().connectSource('workspace-1', 'jira') + }) + act(() => + mutation.mock.calls[index][1].onSuccess({ + url: `https://provider.test/attempt-${index}`, + connectorId: 'connector-1', + }) + ) + } + act(() => mocks.channels[1].onmessage?.(new MessageEvent('message', { data: 'connected' }))) + act(() => vi.advanceTimersByTime(10 * 60_000)) + act(() => + mocks.channels[0].onmessage?.(new MessageEvent('message', { data: 'account_mismatch' })) + ) + expect(mocks.connectionError).not.toHaveBeenCalled() + expect(enrollment().error).toBeNull() + expect(enrollment().isAwaiting('connector-1')).toBe(false) + expect(mocks.channels[0].close).toHaveBeenCalledOnce() + expect(mocks.channels[1].close).toHaveBeenCalledOnce() + } + ) + + it('reopening one connector leaves a different connector authorization active', () => { + mount(new Set(), true, mocks.connectionError) + for (const connectorId of ['connector-1', 'connector-2', 'connector-1']) { + act(() => enrollment().connect('kb-1', connectorId)) + const index = mocks.enrollmentMutate.mock.calls.length - 1 + act(() => + mocks.enrollmentMutate.mock.calls[index][1].onSuccess({ + url: `https://provider.test/attempt-${index}`, + }) + ) + } + expect(mocks.channels[0].close).toHaveBeenCalledOnce() + expect(mocks.channels[1].close).not.toHaveBeenCalled() + act(() => mocks.channels[2].onmessage?.(new MessageEvent('message', { data: 'connected' }))) + expect(enrollment().isAwaiting('connector-2')).toBe(true) + act(() => mocks.channels[1].onmessage?.(new MessageEvent('message', { data: 'denied' }))) + expect(mocks.connectionError).toHaveBeenCalledExactlyOnceWith( + 'Authorization was canceled. Try connecting your account again.' + ) + }) + + it.each([ + ['existing', 'account_mismatch'], + ['existing', 'denied'], + ['existing', 'expired'], + ['new', 'account_mismatch'], + ['new', 'denied'], + ['new', 'expired'], + ] as const)( + 'ignores the previous %s source’s %s while its retry request is pending', + (source, failure) => { + mount(new Set(), true, mocks.connectionError) + const mutation = source === 'existing' ? mocks.enrollmentMutate : mocks.sourceConnectionMutate + const connect = () => { + if (source === 'existing') enrollment().connect('kb-1', 'connector-1') + else enrollment().connectSource('workspace-1', 'jira', { projectKey: 'ENG' }) + } + act(connect) + act(() => + mutation.mock.calls[0][1].onSuccess({ + url: 'https://provider.test/previous', + connectorId: 'connector-1', + }) + ) + act(() => vi.advanceTimersByTime(9 * 60_000)) + act(connect) + if (failure !== 'expired') { + act(() => mocks.channels[0].onmessage?.(new MessageEvent('message', { data: failure }))) + } + act(() => vi.advanceTimersByTime(60_000)) + expect(mocks.connectionError).not.toHaveBeenCalled() + expect(enrollment().error).toBeNull() + act(() => + mutation.mock.calls[1][1].onSuccess({ + url: 'https://provider.test/retry', + connectorId: 'connector-1', + }) + ) + expect(enrollment().isAwaiting('connector-1')).toBe(true) + expect(mocks.channels[1].close).not.toHaveBeenCalled() + } + ) + + it.each([ + ['existing', 'success'], + ['existing', 'failure'], + ['new', 'success'], + ['new', 'failure'], + ] as const)('ignores a superseded %s source request’s late %s', (source, outcome) => { + mount(new Set(), true, mocks.connectionError) + const mutation = source === 'existing' ? mocks.enrollmentMutate : mocks.sourceConnectionMutate + const retryTab = { location: { href: '' }, closed: false, close: vi.fn() } + vi.mocked(window.open) + .mockReturnValueOnce(enrollmentTab as unknown as Window) + .mockReturnValueOnce(retryTab as unknown as Window) + for (let index = 0; index < 2; index += 1) { + act(() => { + if (source === 'existing') enrollment().connect('kb-1', 'connector-1') + else enrollment().connectSource('workspace-1', 'jira', { projectKey: 'ENG' }) + }) + } + act(() => + mutation.mock.calls[1][1].onSuccess({ + url: 'https://provider.test/retry', + connectorId: 'connector-1', + }) + ) + act(() => { + if (outcome === 'failure') { + mutation.mock.calls[0][1].onError(new Error('Previous request failed')) + } else { + mutation.mock.calls[0][1].onSuccess({ + url: 'https://provider.test/previous', + connectorId: 'connector-1', + }) + } + }) + expect(enrollmentTab.location.href).toBe('') + expect(retryTab.location.href).toBe('https://provider.test/retry') + expect(retryTab.close).not.toHaveBeenCalled() + expect(enrollment().isAwaiting('connector-1')).toBe(true) + expect(mocks.channels[1].close).not.toHaveBeenCalled() + expect(mocks.connectionError).not.toHaveBeenCalled() + expect(enrollment().error).toBeNull() + }) + + it('retires a first-source authorization when retrying its resolved connector', () => { + mount(new Set(), true, mocks.connectionError) + act(() => enrollment().connectSource('workspace-1', 'jira', { projectKey: 'ENG' })) + act(() => + mocks.sourceConnectionMutate.mock.calls[0][1].onSuccess({ + url: 'https://provider.test/previous', + connectorId: 'connector-1', + }) + ) + act(() => enrollment().connect('kb-1', 'connector-1')) + act(() => mocks.channels[0].onmessage?.(new MessageEvent('message', { data: 'denied' }))) + expect(mocks.channels[0].close).toHaveBeenCalledOnce() + expect(mocks.connectionError).not.toHaveBeenCalled() + }) + + it('does not let a delayed first-source response replace its newer connector authorization', () => { + mount(new Set(), true, mocks.connectionError) + act(() => enrollment().connectSource('workspace-1', 'jira', { projectKey: 'ENG' })) + act(() => enrollment().connect('kb-1', 'connector-1')) + act(() => + mocks.enrollmentMutate.mock.calls[0][1].onSuccess({ url: 'https://provider.test/retry' }) + ) + act(() => + mocks.sourceConnectionMutate.mock.calls[0][1].onSuccess({ + url: 'https://provider.test/previous', + connectorId: 'connector-1', + }) + ) + expect(enrollmentTab.location.href).toBe('https://provider.test/retry') + expect(mocks.channels[1].close).not.toHaveBeenCalled() + expect(enrollment().isAwaiting('connector-1')).toBe(true) + }) + + it('ignores first-source success while a newer request for its connector is still pending', () => { + mount(new Set(), true, mocks.connectionError) + const retryTab = { location: { href: '' }, closed: false, close: vi.fn() } + vi.mocked(window.open) + .mockReturnValueOnce(enrollmentTab as unknown as Window) + .mockReturnValueOnce(retryTab as unknown as Window) + act(() => enrollment().connectSource('workspace-1', 'jira', { projectKey: 'ENG' })) + act(() => enrollment().connect('kb-1', 'connector-1')) + act(() => + mocks.sourceConnectionMutate.mock.calls[0][1].onSuccess({ + url: 'https://provider.test/previous', + connectorId: 'connector-1', + }) + ) + expect(enrollmentTab.location.href).toBe('') + expect(enrollment().isAwaiting('connector-1')).toBe(false) + act(() => mocks.channels[0].onmessage?.(new MessageEvent('message', { data: 'denied' }))) + expect(mocks.connectionError).not.toHaveBeenCalled() + act(() => + mocks.enrollmentMutate.mock.calls[0][1].onSuccess({ url: 'https://provider.test/retry' }) + ) + expect(retryTab.location.href).toBe('https://provider.test/retry') + expect(enrollment().isAwaiting('connector-1')).toBe(true) + expect(mocks.channels[1].close).not.toHaveBeenCalled() + }) + + it('retires a pending connector request when a newer first-source request resolves to it', () => { + mount(new Set(), true, mocks.connectionError) + act(() => enrollment().connect('kb-1', 'connector-1')) + act(() => enrollment().connectSource('workspace-1', 'jira', { projectKey: 'ENG' })) + act(() => + mocks.sourceConnectionMutate.mock.calls[0][1].onSuccess({ + url: 'https://provider.test/retry', + connectorId: 'connector-1', + }) + ) + act(() => mocks.enrollmentMutate.mock.calls[0][1].onError(new Error('Previous request failed'))) + expect(mocks.connectionError).not.toHaveBeenCalled() + expect(enrollment().isAwaiting('connector-1')).toBe(true) + expect(mocks.channels[0].close).toHaveBeenCalledOnce() + expect(mocks.channels[1].close).not.toHaveBeenCalled() + }) + + it('keeps the previous authorization active when the retry popup is blocked', () => { + mount(new Set(), true, mocks.connectionError) + act(() => enrollment().connect('kb-1', 'connector-1')) + act(() => + mocks.enrollmentMutate.mock.calls[0][1].onSuccess({ url: 'https://provider.test/previous' }) + ) + vi.mocked(window.open).mockReturnValueOnce(null) + act(() => enrollment().connect('kb-1', 'connector-1')) + expect(mocks.channels[0].close).not.toHaveBeenCalled() + expect(enrollment().isAwaiting('connector-1')).toBe(true) + expect(mocks.enrollmentMutate).toHaveBeenCalledOnce() + }) + + it('keeps pending source requests with different scopes or configurations independent', () => { + mount(new Set(), true, mocks.connectionError) + for (const [owner, projectKey] of [ + ['workspace-1', 'ENG'], + ['workspace-1', 'SUPPORT'], + ['workspace-2', 'ENG'], + ]) { + act(() => enrollment().connectSource(owner, 'jira', { projectKey })) + } + for (let index = 0; index < 3; index += 1) { + act(() => + mocks.sourceConnectionMutate.mock.calls[index][1].onSuccess({ + url: `https://provider.test/attempt-${index}`, + connectorId: `connector-${index}`, + }) + ) + expect(enrollment().isAwaiting(`connector-${index}`)).toBe(true) + expect(mocks.channels[index].close).not.toHaveBeenCalled() + } + }) + it('reports a blocked popup once without starting a connection', () => { mount(new Set(), true, mocks.connectionError) vi.mocked(window.open).mockReturnValueOnce(null) diff --git a/apps/sim/hooks/use-member-enrollment.ts b/apps/sim/hooks/use-member-enrollment.ts index 75826480eb1..07eb32ba0dd 100644 --- a/apps/sim/hooks/use-member-enrollment.ts +++ b/apps/sim/hooks/use-member-enrollment.ts @@ -4,7 +4,11 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' import { generateId } from '@sim/utils/id' import { type QueryKey, useQueryClient } from '@tanstack/react-query' -import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' +import { + type ResourceScope, + resourceScopeFields, + resourceScopeKey, +} from '@/lib/core/resource-scope' import { CREDENTIAL_GROUP_OAUTH_FAILURE_MESSAGES, credentialGroupOAuthCompletionChannel, @@ -131,7 +135,15 @@ export function useMemberEnrollment({ }: UseMemberEnrollmentProps) { const connectedRef = useRef(connectedConnectorIds) const oauthPopups = useRef( - new Map }>() + new Map< + string, + { + channel: BroadcastChannel + timer: ReturnType + attemptKey: string + connectorId?: string + } + >() ) const queryClient = useQueryClient() const enrollment = useStartConnectorMemberEnrollment() @@ -149,9 +161,9 @@ export function useMemberEnrollment({ void queryClient.invalidateQueries({ queryKey: memberConnectorKeys.lists() }) }, [membershipQueryKeys, queryClient]) - const finishOAuth = (completionId: string, error: string | null) => { + const clearOAuth = (completionId: string) => { const popup = oauthPopups.current.get(completionId) - if (!popup) return + if (!popup) return false clearTimeout(popup.timer) popup.channel.close() oauthPopups.current.delete(completionId) @@ -159,6 +171,11 @@ export function useMemberEnrollment({ (current) => new Map([...current].filter(([, entry]) => entry.oauthCompletionId !== completionId)) ) + return true + } + + const finishOAuth = (completionId: string, error: string | null) => { + if (!clearOAuth(completionId)) return setOAuthError(error) if (error) onConnectionError?.(error) refreshMemberships() @@ -209,10 +226,11 @@ export function useMemberEnrollment({ /** Opens the tab inside the click, then sends it wherever `start` mints. */ const openEnrollment = ( + attemptKey: string, start: (handlers: { oauthCompletionId?: string onSuccess: (url: string, connectorId: string, connectorType?: string) => boolean - onError: () => void + onError: () => boolean }) => void ) => { const tab = window.open('about:blank', '_blank') @@ -226,6 +244,14 @@ export function useMemberEnrollment({ setOAuthError(null) const oauthCompletionId = directOAuth ? generateId() : undefined if (oauthCompletionId) { + for (const [previousId, previous] of oauthPopups.current) { + if ( + previous.attemptKey === attemptKey || + (previous.connectorId && `connector:${previous.connectorId}` === attemptKey) + ) { + clearOAuth(previousId) + } + } const channel = new BroadcastChannel(credentialGroupOAuthCompletionChannel(oauthCompletionId)) channel.onmessage = ({ data }: MessageEvent) => { if (data === 'connected') finishOAuth(oauthCompletionId, null) @@ -235,7 +261,7 @@ export function useMemberEnrollment({ const timer = setTimeout(() => { finishOAuth(oauthCompletionId, CREDENTIAL_GROUP_OAUTH_FAILURE_MESSAGES.expired) }, AWAITING_CONNECTION_TIMEOUT_MS) - oauthPopups.current.set(oauthCompletionId, { channel, timer }) + oauthPopups.current.set(oauthCompletionId, { channel, timer, attemptKey }) } start({ ...(oauthCompletionId ? { oauthCompletionId } : {}), @@ -245,6 +271,31 @@ export function useMemberEnrollment({ finishOAuth(oauthCompletionId, CREDENTIAL_GROUP_OAUTH_FAILURE_MESSAGES.denied) return false } + if (oauthCompletionId) { + const popup = oauthPopups.current.get(oauthCompletionId)! + const connectorAttemptKey = `connector:${connectorId}` + const latestAttempt = [...oauthPopups.current] + .reverse() + .find( + ([id, entry]) => + id === oauthCompletionId || + entry.connectorId === connectorId || + entry.attemptKey === connectorAttemptKey + ) + if (latestAttempt?.[0] !== oauthCompletionId) { + clearOAuth(oauthCompletionId) + return false + } + for (const [previousId, previous] of oauthPopups.current) { + if ( + previousId === oauthCompletionId || + (previous.connectorId !== connectorId && previous.attemptKey !== connectorAttemptKey) + ) + continue + clearOAuth(previousId) + } + popup.connectorId = connectorId + } tab.location.href = url setAwaitingSince((current) => new Map(current).set(connectorId, { @@ -257,20 +308,22 @@ export function useMemberEnrollment({ return true }, onError: () => { + const active = !oauthCompletionId || oauthPopups.current.has(oauthCompletionId) if (oauthCompletionId) finishOAuth(oauthCompletionId, null) tab.close() + return active }, }) } const connect = (knowledgeBaseId: string, connectorId: string) => - openEnrollment(({ onSuccess, onError, oauthCompletionId }) => { + openEnrollment(`connector:${connectorId}`, ({ onSuccess, onError, oauthCompletionId }) => { enrollment.mutate( { knowledgeBaseId, connectorId, ...(oauthCompletionId ? { oauthCompletionId } : {}) }, { onSuccess: ({ url }) => onSuccess(url, connectorId), onError: (err) => { - onError() + if (!onError()) return onConnectionError?.(err.message) logger.error('Failed to start member enrollment', { error: err.message }) }, @@ -287,27 +340,36 @@ export function useMemberEnrollment({ owner: string | ResourceScope, connectorType: string, sourceConfig?: Record - ) => - openEnrollment(({ onSuccess, onError, oauthCompletionId }) => { - sourceConnection.mutate( - { - ...(typeof owner === 'string' ? { workspaceId: owner } : resourceScopeFields(owner)), - connectorType, - sourceConfig, - ...(oauthCompletionId ? { oauthCompletionId } : {}), - }, - { - onSuccess: ({ url, connectorId }) => { - if (onSuccess(url, connectorId, connectorType)) setSetupConnector(null) - }, - onError: (err) => { - onError() - onConnectionError?.(err.message) - logger.error('Failed to connect a Sim Search source', { error: err.message }) + ) => { + const scope = + typeof owner === 'string' ? { kind: 'workspace' as const, workspaceId: owner } : owner + const configKey = JSON.stringify( + Object.entries(sourceConfig ?? {}).sort(([left], [right]) => left.localeCompare(right)) + ) + openEnrollment( + `source:${resourceScopeKey(scope)}:${connectorType}:${configKey}`, + ({ onSuccess, onError, oauthCompletionId }) => { + sourceConnection.mutate( + { + ...resourceScopeFields(scope), + connectorType, + sourceConfig, + ...(oauthCompletionId ? { oauthCompletionId } : {}), }, - } - ) - }) + { + onSuccess: ({ url, connectorId }) => { + if (onSuccess(url, connectorId, connectorType)) setSetupConnector(null) + }, + onError: (err) => { + if (!onError()) return + onConnectionError?.(err.message) + logger.error('Failed to connect a Sim Search source', { error: err.message }) + }, + } + ) + } + ) + } const [setupConnector, setSetupConnector] = useState(null) diff --git a/apps/sim/lib/execution/payloads/materialization.server.test.ts b/apps/sim/lib/execution/payloads/materialization.server.test.ts index 7b55b117813..cdcdcd225d3 100644 --- a/apps/sim/lib/execution/payloads/materialization.server.test.ts +++ b/apps/sim/lib/execution/payloads/materialization.server.test.ts @@ -61,6 +61,39 @@ describe('readUserFileContent', () => { expect(generatedPdf.size).toBe(PDF_BYTES.length) }) + it('carries the actual execution principal through live knowledge-file authorization', async () => { + const principal = { kind: 'session' as const, userId: 'reader', sessionId: 'session-1' } + const file: UserFile = { + id: 'kb-file', + name: 'page.txt', + url: '', + size: 4, + type: 'text/plain', + key: 'kb/page.txt', + context: 'knowledge-base', + } + await readUserFileContent(file, { + userId: 'reader', + workspaceId: 'workspace-1', + principal, + encoding: 'text', + }) + expect(mockVerifyFileAccess).toHaveBeenCalledWith( + 'kb/page.txt', + 'reader', + undefined, + 'knowledge-base', + false, + { + knowledgeAccess: expect.objectContaining({ + get: expect.any(Function), + getForConnectors: expect.any(Function), + getForDocuments: expect.any(Function), + }), + } + ) + }) + it('authorizes execution-scoped files without inventing a human subject', async () => { const executionFile: UserFile = { id: 'file-2', diff --git a/apps/sim/lib/execution/payloads/materialization.server.ts b/apps/sim/lib/execution/payloads/materialization.server.ts index 64ade013d81..c5eafdedc6b 100644 --- a/apps/sim/lib/execution/payloads/materialization.server.ts +++ b/apps/sim/lib/execution/payloads/materialization.server.ts @@ -17,7 +17,7 @@ import { MAX_INLINE_MATERIALIZATION_BYTES, } from '@/lib/execution/payloads/limits' import { ExecutionResourceLimitError } from '@/lib/execution/resource-errors' -import { resolveKnowledgeAccessScope } from '@/lib/knowledge/access/scope' +import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' import type { StorageContext } from '@/lib/uploads' import type { WorkspaceFileSecretProvenanceIdentity } from '@/lib/uploads/contexts/workspace/workspace-file-secret-provenance' import { @@ -321,7 +321,7 @@ export async function assertUserFileContentAccess( */ const knowledgeAccess = context === 'knowledge-base' && options.principal - ? await resolveKnowledgeAccessScope(options.principal, { workspaceId: options.workspaceId }) + ? createKnowledgeAccessProvider(options.principal, { workspaceId: options.workspaceId }) : undefined const hasAccess = await verifyFileAccess(file.key, options.userId, undefined, context, false, { knowledgeAccess, diff --git a/apps/sim/lib/integrations/credential-display.test.ts b/apps/sim/lib/integrations/credential-display.test.ts index 456332bb029..cc138c9d705 100644 --- a/apps/sim/lib/integrations/credential-display.test.ts +++ b/apps/sim/lib/integrations/credential-display.test.ts @@ -279,9 +279,9 @@ describe('resolveCredentialDisplay', () => { }) describe('getServiceAccountCoverageSentence', () => { - it('tells the user up front that one Atlassian token spans all three products', () => { + it('explains that reusing an Atlassian token requires scopes and app access for each product', () => { expect(getServiceAccountCoverageSentence('atlassian-service-account')).toBe( - 'One token works across Confluence, Jira, and Jira Service Management.' + 'Reuse one token across Confluence, Jira, and Jira Service Management. Each product requires its own scopes and app access.' ) }) diff --git a/apps/sim/lib/integrations/credential-display.ts b/apps/sim/lib/integrations/credential-display.ts index 0ecadc9e980..2ad42a6b617 100644 --- a/apps/sim/lib/integrations/credential-display.ts +++ b/apps/sim/lib/integrations/credential-display.ts @@ -154,6 +154,9 @@ export function getServiceAccountCoverageSentence(providerId: string): string | const familyName = getServiceAccountFamilyName(providerId) if (!familyName) return null const covered = getIntegrationsForCredentialProvider(providerId) + if (providerId === 'atlassian-service-account') { + return `Reuse one token across ${formatList(covered.map((i) => i.name))}. Each product requires its own scopes and app access.` + } if (covered.length > MAX_ENUMERATED_INTEGRATIONS) { return `One token works across all ${covered.length} ${familyName} integrations.` } diff --git a/apps/sim/lib/knowledge/__integration__/application-acl.integration.ts b/apps/sim/lib/knowledge/__integration__/application-acl.integration.ts index 142b82b0ae2..48d30b587e3 100644 --- a/apps/sim/lib/knowledge/__integration__/application-acl.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/application-acl.integration.ts @@ -3,6 +3,7 @@ * vectors and the storage root is temporary; no database, principal, scope, * authorization, parser, chunking, ACL persistence, or search code is mocked. */ +import { createHash } from 'node:crypto' import { mkdtempSync } from 'node:fs' import { rm } from 'node:fs/promises' import { tmpdir } from 'node:os' @@ -11,6 +12,7 @@ import type { Principal } from '@sim/auth/principal' import { db } from '@sim/db' import { credential, + credentialGroup, credentialGroupEnrollment, document, embedding, @@ -18,6 +20,7 @@ import { knowledgeConnectorMember, knowledgeDocumentObservation, knowledgeExternalGroup, + knowledgeExternalGroupMember, permissions, user, workspace, @@ -49,6 +52,10 @@ vi.mock('@/lib/embeddings', async () => ({ })) import { resolveBillingAttribution } from '@/lib/billing/core/billing-attribution' +import { env } from '@/lib/core/config/env' +import { encryptSecret } from '@/lib/core/security/encryption' +import { getCredentialGroupProviderAdapterByProviderId } from '@/lib/credential-groups/provider-registry' +import { encryptManagedOAuthTokenSet } from '@/lib/credentials/managed-oauth' import { createKnowledgeAclFixtureIds, seedKnowledgeAclFixture, @@ -56,6 +63,7 @@ import { } from '@/lib/knowledge/__integration__/seed-source-access-fixture' import { confluencePageAcl } from '@/lib/knowledge/access/confluence-permissions' import { knowledgeAccessCondition } from '@/lib/knowledge/access/predicate' +import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' import { listKnowledgeChunks } from '@/lib/knowledge/application/chunks' import { readKnowledgeDocument } from '@/lib/knowledge/application/documents' import { searchKnowledge } from '@/lib/knowledge/application/search' @@ -71,6 +79,11 @@ import { processDocumentAsync } from '@/lib/knowledge/documents/service' import { downloadFileFromUrl } from '@/lib/uploads/utils/file-utils.server' describe('indexed source content through real application access', () => { + const previousConfluenceClient = { + id: env.CONFLUENCE_CLIENT_ID, + secret: env.CONFLUENCE_CLIENT_SECRET, + } + const revokedSiteReaders = new Set() const ids = createKnowledgeAclFixtureIds() const { aliceId, bobId, workspaceId, knowledgeBaseId, connectorId, lockId, groups, groupIds } = ids @@ -94,11 +107,121 @@ describe('indexed source content through real application access', () => { }) beforeAll(async () => { - vi.stubGlobal('fetch', async () => { + Object.assign(env, { + CONFLUENCE_CLIENT_ID: 'isolated-confluence-fixture-client', + CONFLUENCE_CLIENT_SECRET: 'isolated-confluence-fixture-secret', + }) + vi.stubGlobal('fetch', async (url: string, options?: RequestInit) => { + const authorization = new Headers(options?.headers).get('Authorization') + const reader = [aliceId, bobId].find( + (id) => authorization === `Bearer fixture-confluence-${id}` + ) + if ( + url === + 'https://api.atlassian.com/ex/confluence/fixture-tenant/wiki/rest/api/user/current' && + reader + ) + return revokedSiteReaders.has(reader) + ? new Response(null, { status: 403 }) + : Response.json({ type: 'known', accountId: reader }) throw new Error('Unexpected outbound request in isolated application integration test') }) fixtures.storageRoot = mkdtempSync(path.join(tmpdir(), 'sim-acl-integration-')) await seedKnowledgeAclFixture(ids) + const policy = await getCredentialGroupProviderAdapterByProviderId('confluence').getPolicy( + undefined, + { workspaceId } + ) + const groupId = generateId() + const optionId = generateId() + const crawlerId = generateId() + await db.insert(credentialGroup).values({ + id: groupId, + workspaceId, + publicId: generateId(), + name: 'Connected accounts', + options: [ + { + id: optionId, + provider: 'confluence', + label: 'Confluence', + required: false, + status: 'active', + authorizationAppId: policy.authorizationAppId, + requiredScopes: policy.requiredScopes, + scopeVersion: policy.scopeVersion, + }, + { + id: generateId(), + provider: 'google-drive', + label: 'Drive fixture', + authorizationAppId: 'fixture-app', + requiredScopes: ['drive.readonly'], + scopeVersion: 1, + required: false, + status: 'active', + }, + ], + }) + await db.insert(credential).values({ + id: crawlerId, + workspaceId, + type: 'service_account', + providerId: 'atlassian-service-account', + displayName: 'Confluence crawler', + createdBy: aliceId, + encryptedServiceAccountKey: ( + await encryptSecret( + JSON.stringify({ + type: 'atlassian_service_account', + cloudId: 'fixture-tenant', + domain: 'fixture.atlassian.net', + apiToken: 'fixture-crawler-never-used-for-reading', + }) + ) + ).encrypted, + }) + await db + .update(knowledgeConnector) + .set({ credentialId: crawlerId, sourceConfig: { domain: 'fixture.atlassian.net' } }) + .where(eq(knowledgeConnector.id, connectorId)) + for (const userId of [aliceId, bobId]) { + const enrollmentId = generateId() + await db.insert(credentialGroupEnrollment).values({ + id: enrollmentId, + credentialGroupId: groupId, + userId, + email: `${userId}@fixture.test`, + status: 'completed', + invitationTokenHash: createHash('sha256').update(generateId()).digest('hex'), + invitationExpiresAt: new Date(Date.now() + 3600000), + invitedAt: new Date(), + }) + await db.insert(credential).values({ + id: generateId(), + workspaceId, + type: 'managed_oauth', + displayName: 'Personal Confluence', + createdBy: userId, + providerId: 'confluence', + providerSubjectId: userId, + authorizationAppId: policy.authorizationAppId, + credentialGroupEnrollmentId: enrollmentId, + credentialGroupOptionId: optionId, + managedOauthScopeVersion: policy.scopeVersion, + managedOauthStatus: 'active', + grantedScopes: policy.requiredScopes, + grantedAt: new Date(), + encryptedOauthTokenSet: await encryptManagedOAuthTokenSet({ + accessToken: `fixture-confluence-${userId}`, + }), + accessTokenExpiresAt: new Date(Date.now() + 3600000), + }) + await db + .update(knowledgeExternalGroupMember) + .set({ subjectToken: `s:confluence:-:${userId}` }) + .where(eq(knowledgeExternalGroupMember.subjectToken, `u:${userId}@fixture.test`)) + } const doc = await addDocument( knowledgeBaseId, connectorId, @@ -133,9 +256,26 @@ describe('indexed source content through real application access', () => { expect(persisted).toEqual({ status: 'completed', error: null }) expect(await search(alice)).toEqual([]) await persistDocumentAcls(connectorId, new Map([['page-1', sourceAcl]])) + const readerAccess = createKnowledgeAccessProvider(alice, { + workspaceId, + knowledgeBaseIds: [knowledgeBaseId], + }) + expect((await readerAccess.get()).tokens).toEqual( + expect.arrayContaining([`s:confluence:-:${aliceId}`, 'g:confluence:fixture-tenant:page']) + ) + const proof = await readerAccess.getForConnectors([connectorId]) + expect(proof).toMatchObject({ + confluenceSiteGrants: [ + expect.objectContaining({ connectorId, readerSubjectToken: `s:confluence:-:${aliceId}` }), + ], + }) }) afterAll(async () => { + Object.assign(env, { + CONFLUENCE_CLIENT_ID: previousConfluenceClient.id, + CONFLUENCE_CLIENT_SECRET: previousConfluenceClient.secret, + }) await db.delete(workspace).where(eq(workspace.id, workspaceId)) await db.delete(user).where(eq(user.id, aliceId)) await db.delete(user).where(eq(user.id, bobId)) @@ -242,6 +382,25 @@ describe('indexed source content through real application access', () => { expect(fixtures.calls).toBeGreaterThan(0) }) + it('denies a revoked Confluence site across search, chunks, document reads, and files without rewriting ACLs', async () => { + revokedSiteReaders.add(aliceId) + try { + expect(await search(alice)).toEqual([]) + await expect( + readKnowledgeDocument.execute({ principal: alice, input: { knowledgeBaseId, documentId } }) + ).rejects.toThrow('Document not found') + await expect( + listKnowledgeChunks.execute({ principal: alice, input: { knowledgeBaseId, documentId } }) + ).rejects.toThrow('Document not found') + await expect( + downloadFileFromUrl(fileUrl, { userId: aliceId, knowledgeAccess: 'user' }) + ).rejects.toThrow('Access denied') + } finally { + revokedSiteReaders.delete(aliceId) + } + expect(await search(alice)).toEqual([documentId]) + }) + async function refreshDirectory(bobCanReadPage: boolean, complete = true) { await db .update(knowledgeExternalGroup) @@ -258,8 +417,8 @@ describe('indexed source content through real application access', () => { group, complete, memberTokens: [ - `u:${aliceId}@fixture.test`, - ...(group.id !== 'page' || bobCanReadPage ? [`u:${bobId}@fixture.test`] : []), + `s:confluence:-:${aliceId}`, + ...(group.id !== 'page' || bobCanReadPage ? [`s:confluence:-:${bobId}`] : []), ], }), }, @@ -325,25 +484,36 @@ describe('indexed source content through real application access', () => { }) it('permits fresh public grants for workspace keys but expires public evidence too', async () => { - await persistDocumentAcls(connectorId, new Map([['page-1', ['pub']]])) - expect(await search(workspaceKey)).toEqual([documentId]) - expect( - ( - await readKnowledgeDocument.execute({ + await db + .update(knowledgeConnector) + .set({ connectorType: 'google_drive' }) + .where(eq(knowledgeConnector.id, connectorId)) + try { + await persistDocumentAcls(connectorId, new Map([['page-1', ['pub']]])) + expect(await search(workspaceKey)).toEqual([documentId]) + expect( + ( + await readKnowledgeDocument.execute({ + principal: workspaceKey, + input: { knowledgeBaseId, documentId }, + }) + ).document.id + ).toBe(documentId) + await db.update(document).set({ aclVerifiedAt: null }).where(eq(document.id, documentId)) + expect(await search(workspaceKey)).toEqual([]) + await expect( + readKnowledgeDocument.execute({ principal: workspaceKey, input: { knowledgeBaseId, documentId }, }) - ).document.id - ).toBe(documentId) - await db.update(document).set({ aclVerifiedAt: null }).where(eq(document.id, documentId)) - expect(await search(workspaceKey)).toEqual([]) - await expect( - readKnowledgeDocument.execute({ - principal: workspaceKey, - input: { knowledgeBaseId, documentId }, - }) - ).rejects.toThrow('Document not found') - await persistDocumentAcls(connectorId, new Map([['page-1', sourceAcl]])) + ).rejects.toThrow('Document not found') + await persistDocumentAcls(connectorId, new Map([['page-1', sourceAcl]])) + } finally { + await db + .update(knowledgeConnector) + .set({ connectorType: 'confluence' }) + .where(eq(knowledgeConnector.id, connectorId)) + } }) it('requires current verified identity and actual workspace membership even when source groups grant access', async () => { diff --git a/apps/sim/lib/knowledge/__integration__/confluence-identity.integration.ts b/apps/sim/lib/knowledge/__integration__/confluence-identity.integration.ts index b5714c3ff5d..ea7b12dc25f 100644 --- a/apps/sim/lib/knowledge/__integration__/confluence-identity.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/confluence-identity.integration.ts @@ -1,10 +1,21 @@ -/** Real source identity, directory persistence and protected document reads; no provider calls. */ +/** Real source identity, directory persistence and protected reads; only the provider response is fixed. */ import type { Principal } from '@sim/auth/principal' import { db } from '@sim/db' -import { credential, credentialGroup, document, user, workspace } from '@sim/db/schema' +import { + credential, + credentialGroup, + document, + knowledgeConnector, + user, + workspace, +} from '@sim/db/schema' import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' -import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' +import { env } from '@/lib/core/config/env' +import { encryptSecret } from '@/lib/core/security/encryption' +import { getCredentialGroupProviderAdapterByProviderId } from '@/lib/credential-groups/provider-registry' +import { encryptManagedOAuthTokenSet } from '@/lib/credentials/managed-oauth' import { createKnowledgeAclFixtureIds, seedKnowledgeAclFixture, @@ -17,6 +28,10 @@ import { syncExternalDirectoryGroups } from '@/lib/knowledge/connectors/external describe('Confluence identities with hidden directory email', () => { const ids = createKnowledgeAclFixtureIds() const accountId = 'Opaque:CaseSensitiveAccount' + const previousConfluenceClient = { + CONFLUENCE_CLIENT_ID: env.CONFLUENCE_CLIENT_ID, + CONFLUENCE_CLIENT_SECRET: env.CONFLUENCE_CLIENT_SECRET, + } const sourceSubject = subjectToken({ providerId: 'confluence', providerTenantId: null, @@ -39,21 +54,80 @@ describe('Confluence identities with hidden directory email', () => { let member: Awaited>['members'][number] beforeAll(async () => { + Object.assign(env, { + CONFLUENCE_CLIENT_ID: 'isolated-confluence-fixture-client', + CONFLUENCE_CLIENT_SECRET: 'isolated-confluence-fixture-secret', + }) + vi.stubGlobal('fetch', async (url: string, options?: RequestInit) => { + if ( + url === + 'https://api.atlassian.com/ex/confluence/fixture-cloud/wiki/rest/api/user/current' && + new Headers(options?.headers).get('Authorization') === 'Bearer fixture-confluence-reader' + ) + return Response.json({ type: 'known', accountId }) + throw new Error('Unexpected outbound Confluence identity fixture request') + }) await seedKnowledgeAclFixture(ids) const managed = await seedKnowledgeMemberFixture(ids) member = managed.members[0] + const policy = await getCredentialGroupProviderAdapterByProviderId('confluence').getPolicy( + undefined, + { workspaceId: ids.workspaceId } + ) const [accounts] = await db .select() .from(credentialGroup) .where(eq(credentialGroup.id, managed.groupId)) await db .update(credentialGroup) - .set({ options: accounts.options.map((option) => ({ ...option, provider: 'confluence' })) }) + .set({ + options: accounts.options.map((option) => ({ + ...option, + provider: 'confluence', + authorizationAppId: policy.authorizationAppId, + requiredScopes: policy.requiredScopes, + scopeVersion: policy.scopeVersion, + })), + }) .where(eq(credentialGroup.id, managed.groupId)) await db .update(credential) - .set({ providerId: 'confluence', providerTenantId: null, providerSubjectId: accountId }) + .set({ + providerId: 'confluence', + providerTenantId: null, + providerSubjectId: accountId, + authorizationAppId: policy.authorizationAppId, + managedOauthScopeVersion: policy.scopeVersion, + grantedScopes: policy.requiredScopes, + encryptedOauthTokenSet: await encryptManagedOAuthTokenSet({ + accessToken: 'fixture-confluence-reader', + }), + accessTokenExpiresAt: new Date(Date.now() + 3600000), + }) .where(eq(credential.id, member.credentialId)) + const crawlerId = generateId() + await db.insert(credential).values({ + id: crawlerId, + workspaceId: ids.workspaceId, + type: 'service_account', + providerId: 'atlassian-service-account', + displayName: 'Confluence crawler fixture', + createdBy: ids.aliceId, + encryptedServiceAccountKey: ( + await encryptSecret( + JSON.stringify({ + type: 'atlassian_service_account', + cloudId: 'fixture-cloud', + domain: 'fixture.atlassian.net', + apiToken: 'fixture-crawler-never-used-for-reading', + }) + ) + ).encrypted, + }) + await db + .update(knowledgeConnector) + .set({ credentialId: crawlerId, sourceConfig: { domain: 'fixture.atlassian.net' } }) + .where(eq(knowledgeConnector.id, ids.connectorId)) await syncExternalDirectoryGroups({ workspaceId: ids.workspaceId, force: true, @@ -85,6 +159,8 @@ describe('Confluence identities with hidden directory email', () => { }) afterAll(async () => { + vi.unstubAllGlobals() + Object.assign(env, previousConfluenceClient) await db.delete(workspace).where(eq(workspace.id, ids.workspaceId)) await db.delete(user).where(eq(user.id, ids.aliceId)) await db.delete(user).where(eq(user.id, ids.bobId)) diff --git a/apps/sim/lib/knowledge/__integration__/embedding-processing-recovery.integration.ts b/apps/sim/lib/knowledge/__integration__/embedding-processing-recovery.integration.ts index ab5d891779a..141d16eeaa6 100644 --- a/apps/sim/lib/knowledge/__integration__/embedding-processing-recovery.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/embedding-processing-recovery.integration.ts @@ -63,7 +63,7 @@ describe('embedding progress survives a processing slice', () => { .where(eq(outboxEvent.eventType, EMBEDDING_CHECKPOINT_CLEANUP_EVENT)) .limit(5000)) priorCheckpointIds.add(row.id) - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) }) afterAll(async () => { vi.restoreAllMocks() @@ -91,7 +91,7 @@ describe('embedding progress survives a processing slice', () => { const file = await addDocument( ids.knowledgeBaseId, ids.connectorId, - 'confluence', + 'google_drive', { externalId: 'large-text', title: 'Synthetic operations.txt', diff --git a/apps/sim/lib/knowledge/__integration__/filtered-search.integration.ts b/apps/sim/lib/knowledge/__integration__/filtered-search.integration.ts index 95c0409fd8a..6a0b41448de 100644 --- a/apps/sim/lib/knowledge/__integration__/filtered-search.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/filtered-search.integration.ts @@ -39,7 +39,7 @@ describe.each([384, 768, 1024, 1536, 3072] as const)( keyId: 'fixture-key', } const restrictedAcl = confluencePageAcl({ - providerId: 'confluence', + providerId: 'google-drive', tenantId: 'fixture-tenant', spacePrincipals: [{ kind: 'group', id: 'space' }], restrictionChain: [[{ kind: 'group', id: 'parent' }], [{ kind: 'group', id: 'page' }]], @@ -62,7 +62,7 @@ describe.each([384, 768, 1024, 1536, 3072] as const)( ].map((fixture) => ({ ...fixture, documentId: generateId(), embeddingId: generateId() })) beforeAll(async () => { - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) await db .update(knowledgeBase) .set({ embeddingModel, embeddingDimension: dimensions }) @@ -91,7 +91,7 @@ describe.each([384, 768, 1024, 1536, 3072] as const)( 'workspace' in fixture ? ['ws'] : 'denied' in fixture - ? ['g:confluence:fixture-tenant:missing'] + ? ['g:google-drive:fixture-tenant:missing'] : [...restrictedAcl.acl], aclRequirements: 'workspace' in fixture ? [] : restrictedAcl.requirements.map((clause) => [...clause]), diff --git a/apps/sim/lib/knowledge/__integration__/gmail-member.integration.ts b/apps/sim/lib/knowledge/__integration__/gmail-member.integration.ts index 05ae14ad403..a3abd7da45f 100644 --- a/apps/sim/lib/knowledge/__integration__/gmail-member.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/gmail-member.integration.ts @@ -121,6 +121,7 @@ describe('Gmail member ingestion and ACLs in PostgreSQL (provider fixtures)', () } if (url.pathname === '/gmail/v1/users/me/threads') { expect(url.searchParams.get('maxResults')).toBe('100') + expect(url.searchParams.get('q')).toContain('subject:Orion') if (cursor === 'empty' && mailbox.failSecondPage) { return Promise.resolve( Response.json( @@ -237,7 +238,8 @@ describe('Gmail member ingestion and ACLs in PostgreSQL (provider fixtures)', () .update(knowledgeConnector) .set({ connectorType: 'gmail', - sourceConfig: { maxThreads: 0 }, + /** A fixed query keeps this full-listing suite separate from history-feed ingestion. */ + sourceConfig: { maxThreads: 0, query: 'subject:Orion' }, status: 'active', memberSyncStatus: 'idle', memberSyncLockToken: null, diff --git a/apps/sim/lib/knowledge/__integration__/google-calendar-member.integration.ts b/apps/sim/lib/knowledge/__integration__/google-calendar-member.integration.ts index e81d086e876..f00ea34e458 100644 --- a/apps/sim/lib/knowledge/__integration__/google-calendar-member.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/google-calendar-member.integration.ts @@ -451,14 +451,14 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = it('isolates owner and reader projections across two calendars and follows empty pages', async () => { const rows = await stored() - expect(rows).toHaveLength(6) + expect(rows).toHaveLength(5) const expected = [ 'primary:collision', `${SHARED_CALENDAR}:collision`, `${SHARED_CALENDAR}:planning`, ] await assertAccess(alice, expected) - await assertAccess(bob, expected) + await assertAccess(bob, ['primary:collision', `${SHARED_CALENDAR}:planning`]) for (const person of people) { const pages = requests.filter((request) => request.token === person.accessToken) expect(pages.map(({ calendarId, page }) => [calendarId, page])).toEqual([ @@ -479,7 +479,7 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = rows.map((row) => row.id) ) ) - expect(observations).toHaveLength(6) + expect(observations).toHaveLength(5) for (const row of rows) { const evidence = observations.filter((observation) => observation.documentId === row.id) expect(evidence).toHaveLength(1) @@ -489,16 +489,10 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = const own = await content(alice, `${SHARED_CALENDAR}:collision`) expect(own).toContain('Confidential renewal terms') expect(own).not.toContain('

') - const reader = await content(bob, `${SHARED_CALENDAR}:collision`) - for (const hidden of [ - 'Confidential renewal', - 'confidential renewal', - 'organizer@fixture.test', - 'Provider Attendee', - 'Private meeting room', - ]) - expect(reader).not.toContain(hidden) - expect(reader).toContain('Date:') + const reader = await member(bob) + expect( + rows.some((row) => row.externalId === `member:${reader.id}:${SHARED_CALENDAR}:collision`) + ).toBe(false) expect(await content(alice, 'primary:collision')).not.toContain('Bob personal notes') expect(await content(bob, 'primary:collision')).not.toContain('Alice personal notes') const search = await searchKnowledge.execute({ @@ -541,7 +535,7 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = return chunks.chunks.map((chunk) => chunk.content).join('\n') } - it('replaces a reader projection with provider-redacted free/busy data without an event update', async () => { + it('withdraws a reader projection reduced to free/busy data without an event update', async () => { const previous = await rowFor(bob, `${SHARED_CALENDAR}:planning`) readerRole = 'freeBusyReader' listing @@ -551,14 +545,17 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = redactedEvent(planningEvent), ]) await sync() - const current = await rowFor(bob, `${SHARED_CALENDAR}:planning`) - expect(current.id).toBe(previous.id) - expect(current.contentHash).not.toBe(previous.contentHash) - const redacted = await content(bob, `${SHARED_CALENDAR}:planning`) - expect(redacted).not.toContain('Planning roadmap') - expect(redacted).not.toContain('Provider Organizer') - expect(redacted).not.toContain('Private meeting room') - expect(redacted).toContain('Date:') + await assertAccess(bob, ['primary:collision']) + const withdrawn = await rowFor(bob, `${SHARED_CALENDAR}:planning`) + expect(withdrawn.acl).toEqual([]) + expect(withdrawn.contentHash).toBe(previous.contentHash) + expect(withdrawn.deletedAt).not.toBeNull() + expect( + await db + .select() + .from(knowledgeDocumentObservation) + .where(eq(knowledgeDocumentObservation.documentId, previous.id)) + ).toEqual([]) expect(await content(alice, `${SHARED_CALENDAR}:planning`)).toContain('Planning roadmap') }) @@ -582,7 +579,7 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = .set(SHARED_CALENDAR, [listing.get(bob.accessToken)!.get(SHARED_CALENDAR)![0], cancelled]) await sync() await assertAccess(alice, [`${SHARED_CALENDAR}:collision`]) - await assertAccess(bob, ['primary:collision', `${SHARED_CALENDAR}:collision`]) + await assertAccess(bob, ['primary:collision']) expect(await content(alice, `${SHARED_CALENDAR}:collision`)).toContain( 'Updated confidential renewal' ) @@ -596,7 +593,7 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = rows.map((row) => row.id) ) ) - expect(observations).toHaveLength(3) + expect(observations).toHaveLength(2) }) it('withdraws a lost shared calendar while preserving the member primary calendar', async () => { @@ -652,6 +649,6 @@ describe('Google Calendar member indexing and authorization in PostgreSQL', () = .select() .from(document) .where(and(eq(document.connectorId, connectorId), isNull(document.deletedAt))) - ).toHaveLength(6) + ).toHaveLength(5) }) }) diff --git a/apps/sim/lib/knowledge/__integration__/google-drive-shortcuts.integration.ts b/apps/sim/lib/knowledge/__integration__/google-drive-shortcuts.integration.ts index 11a8836ba91..80b569631bf 100644 --- a/apps/sim/lib/knowledge/__integration__/google-drive-shortcuts.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/google-drive-shortcuts.integration.ts @@ -70,6 +70,16 @@ describe('Drive shortcuts through indexing and search', () => { let targetDownloads = 0 let aliasDownloads = 0 let enrolled: Awaited> + const directoryUser = { + id: 'fixture-admin', + primaryEmail: 'admin@fixture.test', + customerId: 'fixture-customer', + suspended: false, + } + const delegatedToken = vi.fn(async (email: string) => { + expect(email).toBe(directoryUser.primaryEmail) + return 'fixture-delegated-admin' + }) const principal = (userId: string) => ({ kind: 'session' as const, userId, @@ -114,10 +124,13 @@ describe('Drive shortcuts through indexing and search', () => { ) const headers = new Headers(init?.headers) if (url.hostname === 'admin.googleapis.com') { + if (url.pathname.endsWith('/users')) return json({ users: [directoryUser] }) + if (url.pathname.endsWith(`/users/${directoryUser.id}`)) return json(directoryUser) if (url.pathname.endsWith('/groups')) return json({ groups: [] }) if (url.pathname.endsWith('/domains')) return json({ domains: [] }) } if (url.hostname !== 'www.googleapis.com') throw new Error('Unexpected fixture provider') + if (url.pathname.endsWith('/drives')) return json({ drives: [] }) if (url.pathname.endsWith('/changes/startPageToken')) return json({ startPageToken: 'start' }) if (url.pathname.endsWith('/changes')) return json({ changes: [], newStartPageToken: 'resume' }) if (url.pathname.endsWith('/files')) return json({ files: aliasPresent ? [alias()] : [] }) @@ -198,6 +211,7 @@ describe('Drive shortcuts through indexing and search', () => { .where(eq(knowledgeConnector.id, ids.connectorId)) vi.spyOn(connectorTokens, 'resolveConnectorAccessToken').mockResolvedValue({ accessToken: 'fixture-admin', + getDelegatedAccessToken: delegatedToken, }) vi.stubGlobal('fetch', providerFetch) }) @@ -275,6 +289,7 @@ describe('Drive shortcuts through indexing and search', () => { .orderBy(embedding.id) const downloaded = targetDownloads await sync() + expect(delegatedToken).toHaveBeenCalledWith(directoryUser.primaryEmail) const indexed = await row() expect(indexed.aclRequirements).toHaveLength(2) expect(indexed.aclRequirements).toEqual( diff --git a/apps/sim/lib/knowledge/__integration__/organization-mcp-search.integration.ts b/apps/sim/lib/knowledge/__integration__/organization-mcp-search.integration.ts index 51dec08bd0e..8f8374ebb9f 100644 --- a/apps/sim/lib/knowledge/__integration__/organization-mcp-search.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/organization-mcp-search.integration.ts @@ -241,7 +241,7 @@ describe('organization Search MCP with real ingestion and current access', () => throw new Error('Unexpected outbound organization MCP fixture request') }) fixtures.storageRoot = mkdtempSync(path.join(tmpdir(), 'sim-organization-mcp-integration-')) - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) await db.insert(user).values( [outsiderId, otherAdminId].map((id) => ({ id, @@ -297,7 +297,7 @@ describe('organization Search MCP with real ingestion and current access', () => }) await db.insert(organizationSearchIntegration).values({ organizationId, - connectorType: 'confluence', + connectorType: 'google_drive', approved: true, }) await db.insert(apiKey).values( @@ -350,7 +350,7 @@ describe('organization Search MCP with real ingestion and current access', () => const doc = await addDocument( knowledgeBaseId, connectorId, - 'confluence', + 'google_drive', { externalId: 'organization-mcp-page', mimeType: 'text/plain', @@ -387,7 +387,7 @@ describe('organization Search MCP with real ingestion and current access', () => [ 'organization-mcp-page', confluencePageAcl({ - providerId: 'confluence', + providerId: 'google-drive', tenantId: 'fixture-tenant', spacePrincipals: [{ kind: 'group', id: 'space' }], restrictionChain: [[{ kind: 'group', id: 'page' }], [{ kind: 'group', id: 'parent' }]], @@ -582,7 +582,7 @@ describe('organization Search MCP with real ingestion and current access', () => try { const included = await value(alice, 'search', { query: 'Orion', - source: 'confluence', + source: 'google_drive', modifiedAfter: '2026-01-01T00:00:00Z', documentIds: [documentId], }) @@ -639,7 +639,7 @@ describe('organization Search MCP with real ingestion and current access', () => it('hides source content immediately when organization approval is disabled', async () => { const approval = and( eq(organizationSearchIntegration.organizationId, organizationId), - eq(organizationSearchIntegration.connectorType, 'confluence') + eq(organizationSearchIntegration.connectorType, 'google_drive') ) await db.update(organizationSearchIntegration).set({ approved: false }).where(approval) try { diff --git a/apps/sim/lib/knowledge/__integration__/provider-processing-recovery.integration.ts b/apps/sim/lib/knowledge/__integration__/provider-processing-recovery.integration.ts index 0e9bd56a690..98831b8765b 100644 --- a/apps/sim/lib/knowledge/__integration__/provider-processing-recovery.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/provider-processing-recovery.integration.ts @@ -114,15 +114,13 @@ describe('provider throttling resumes the shared indexing pipeline', () => { vi.useRealTimers() const ids = createKnowledgeAclFixtureIds() seeded.push(ids) - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) let connectorId = ids.connectorId - let connectorType = 'confluence' let lease = createContentSyncLease(connectorId, ids.lockId) let memberFixture: Awaited> | undefined if (scope === 'member source') { memberFixture = await seedKnowledgeMemberFixture(ids) connectorId = memberFixture.connectorId - connectorType = 'google_drive' lease = createMemberSyncLease(connectorId, memberFixture.runId) } const orgOwned = scope === 'organization Search' @@ -150,7 +148,7 @@ describe('provider throttling resumes the shared indexing pipeline', () => { const file = await addDocument( ids.knowledgeBaseId, connectorId, - connectorType, + 'google_drive', { externalId: 'orion-scan', title: 'Orion scan.png', diff --git a/apps/sim/lib/knowledge/__integration__/read-indexed-document.integration.ts b/apps/sim/lib/knowledge/__integration__/read-indexed-document.integration.ts index ac5b5ba01b6..a4cb6ff0afa 100644 --- a/apps/sim/lib/knowledge/__integration__/read-indexed-document.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/read-indexed-document.integration.ts @@ -72,7 +72,7 @@ describe('indexed document references', () => { const doc = await addDocument( ids.knowledgeBaseId, ids.connectorId, - 'confluence', + 'google_drive', { externalId, mimeType: 'text/plain', @@ -117,8 +117,8 @@ describe('indexed document references', () => { vi.stubGlobal('fetch', async () => { throw new Error('Indexed document reads must never fetch provider URLs') }) - await seedKnowledgeAclFixture(ids) - await seedKnowledgeAclFixture(other) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) + await seedKnowledgeAclFixture(other, { connectorType: 'google_drive' }) await db .update(knowledgeBase) .set({ workspaceId: null, organizationId: ids.organizationId, isSearchIndex: true }) @@ -133,11 +133,11 @@ describe('indexed document references', () => { .where(inArray(knowledgeExternalGroup.id, ids.groupIds)) await db .insert(organizationSearchIntegration) - .values({ organizationId: ids.organizationId, connectorType: 'confluence', approved: true }) + .values({ organizationId: ids.organizationId, connectorType: 'google_drive', approved: true }) documentId = await ingest('visible-target') hiddenDocumentId = await ingest('hidden-target') const sourceAcl = confluencePageAcl({ - providerId: 'confluence', + providerId: 'google-drive', tenantId: 'fixture-tenant', spacePrincipals: [{ kind: 'group', id: 'space' }], restrictionChain: [[{ kind: 'group', id: 'page' }]], diff --git a/apps/sim/lib/knowledge/__integration__/search-index-policy.integration.ts b/apps/sim/lib/knowledge/__integration__/search-index-policy.integration.ts index de11b572eb9..988ef9fe054 100644 --- a/apps/sim/lib/knowledge/__integration__/search-index-policy.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/search-index-policy.integration.ts @@ -69,7 +69,7 @@ describe('canonical search knowledge-base policy', () => { vi.stubGlobal('fetch', async () => { throw new Error('Unexpected provider request in index policy tests') }) - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) await db .update(knowledgeBase) .set({ isSearchIndex: true, name: indexName, userId: ids.bobId }) 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 c14ee7c7a17..5a82344815a 100644 --- a/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/search-source-progress.integration.ts @@ -27,8 +27,9 @@ const failedId = generateId() const pendingId = generateId() const input = { workspaceId: ids.workspaceId, connectorIds: [ids.connectorId] } +/** Drive models the mirrored email grants exercised by these provider-independent progress tests. */ beforeAll(async () => { - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) await db .update(knowledgeBase) .set({ isSearchIndex: true }) @@ -144,7 +145,7 @@ describe('connector document filename search and document sets', () => { const scope = { knowledgeBaseId: fixture.knowledgeBaseId, connectorId: fixture.connectorId } beforeAll(async () => { - await seedKnowledgeAclFixture(fixture) + await seedKnowledgeAclFixture(fixture, { connectorType: 'google_drive' }) const rows: Array & { id: string; filename: string }> = [ ...Array.from({ length: 221 }, (_, index) => ({ id: generateId(), 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 7970a713756..3c0749defc0 100644 --- a/apps/sim/lib/knowledge/__integration__/seed-source-access-fixture.ts +++ b/apps/sim/lib/knowledge/__integration__/seed-source-access-fixture.ts @@ -35,7 +35,10 @@ export function createKnowledgeAclFixtureIds() { } /** Inserts only unique fixture rows, and refuses the developer's ordinary database. */ -export async function seedKnowledgeAclFixture(ids = createKnowledgeAclFixtureIds()) { +export async function seedKnowledgeAclFixture( + ids = createKnowledgeAclFixtureIds(), + options: { connectorType?: 'confluence' | 'google_drive' } = {} +) { const target = new URL(process.env.DATABASE_URL ?? '') if ( !['localhost', '127.0.0.1'].includes(target.hostname) || @@ -46,6 +49,8 @@ export async function seedKnowledgeAclFixture(ids = createKnowledgeAclFixtureIds const { aliceId, bobId, workspaceId, knowledgeBaseId, connectorId, lockId, groups, groupIds } = ids const now = new Date() + const connectorType = options.connectorType ?? 'confluence' + const providerId = connectorType === 'google_drive' ? 'google-drive' : 'confluence' await db.insert(user).values([ { id: aliceId, @@ -109,7 +114,7 @@ export async function seedKnowledgeAclFixture(ids = createKnowledgeAclFixtureIds await db.insert(knowledgeConnector).values({ id: connectorId, knowledgeBaseId, - connectorType: 'confluence', + connectorType, sourceConfig: {}, accessMode: 'admin', status: 'syncing', @@ -119,7 +124,7 @@ export async function seedKnowledgeAclFixture(ids = createKnowledgeAclFixtureIds groups.map((name, index) => ({ id: groupIds[index], workspaceId, - providerId: 'confluence', + providerId, tenantId: 'fixture-tenant', externalGroupId: name, lastSyncedAt: now, diff --git a/apps/sim/lib/knowledge/__integration__/stored-document-recovery.integration.ts b/apps/sim/lib/knowledge/__integration__/stored-document-recovery.integration.ts index 7bef350ec38..80c4fcb7172 100644 --- a/apps/sim/lib/knowledge/__integration__/stored-document-recovery.integration.ts +++ b/apps/sim/lib/knowledge/__integration__/stored-document-recovery.integration.ts @@ -65,7 +65,7 @@ const old = () => new Date(Date.now() - QUEUED_DISPATCH_GRACE_MS - 60_000) async function seed() { const ids = createKnowledgeAclFixtureIds() fixtures.push(ids) - await seedKnowledgeAclFixture(ids) + await seedKnowledgeAclFixture(ids, { connectorType: 'google_drive' }) return ids } async function eventsFor(ids: ReturnType) { @@ -86,7 +86,7 @@ async function failedFile( const file = await addDocument( ids.knowledgeBaseId, ids.connectorId, - 'confluence', + 'google_drive', { externalId: generateId(), title: 'Retained fixture.txt', diff --git a/apps/sim/lib/knowledge/access/confluence-site.test.ts b/apps/sim/lib/knowledge/access/confluence-site.test.ts new file mode 100644 index 00000000000..543c63a168f --- /dev/null +++ b/apps/sim/lib/knowledge/access/confluence-site.test.ts @@ -0,0 +1,459 @@ +/** @vitest-environment node */ +import { dbChainMockFns, queueTableRows, resetDbChainMock, schemaMock } from '@sim/testing' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + CONFLUENCE_READ_ATTEMPT_TIMEOUT_MS, + CONFLUENCE_READ_CONCURRENCY, + CONFLUENCE_READ_CREDENTIAL_ALTERNATIVES, + CONFLUENCE_READ_RESPONSE_MAX_BYTES, + CONFLUENCE_READ_TIMEOUT_MS, + resolveConfluenceSiteReadGrants, +} from '@/lib/knowledge/access/confluence-site' +import { MAX_KNOWLEDGE_ACCESS_CANDIDATES } from '@/lib/knowledge/access/types' + +const mocks = vi.hoisted(() => ({ token: vi.fn(), decrypt: vi.fn(), fetch: vi.fn() })) +vi.mock('@/lib/credentials/managed-oauth', () => ({ resolveManagedOAuthToken: mocks.token })) +vi.mock('@/lib/core/security/encryption', () => ({ decryptSecret: mocks.decrypt })) + +const input = { + scope: { kind: 'organization' as const, organizationId: 'org-1' }, + readers: [{ credentialId: 'alice-credential', subjectToken: 's:confluence:-:alice' }], + knowledgeBaseIds: ['index-1'], + connectorIds: ['source-1'], +} +const source = { + connectorId: 'source-1', + contentCredentialId: 'crawler-credential', + readerCredentialId: 'alice-credential', + providerSubjectId: 'alice', + domain: 'company.atlassian.net', +} +const binding = { + type: 'atlassian_service_account', + cloudId: 'cloud-1', + domain: source.domain, + apiToken: 'crawler-token-must-never-authenticate-reader', +} +const contentCredential = { id: 'crawler-credential', key: 'encrypted-crawler' } +const grant = { + connectorId: source.connectorId, + contentCredentialId: source.contentCredentialId, + readerCredentialId: source.readerCredentialId, + readerSubjectToken: input.readers[0].subjectToken, + domain: source.domain, + cloudId: binding.cloudId, +} + +function queueSources(rows = [source], credentials = [contentCredential]) { + input.connectorIds = rows.map((row) => row.connectorId) + queueTableRows(schemaMock.knowledgeConnector, rows) + queueTableRows(schemaMock.credential, [ + ...new Map( + rows.map((row) => [ + row.readerCredentialId, + { id: row.readerCredentialId, providerSubjectId: row.providerSubjectId }, + ]) + ).values(), + ]) + queueTableRows(schemaMock.credential, credentials) +} + +beforeEach(() => { + vi.clearAllMocks() + resetDbChainMock() + vi.stubGlobal('fetch', mocks.fetch) + mocks.token.mockResolvedValue({ accessToken: 'alice-oauth-token' }) + mocks.decrypt.mockResolvedValue({ decrypted: JSON.stringify(binding) }) + mocks.fetch.mockImplementation(async () => Response.json({ accountId: 'alice', type: 'known' })) +}) +afterEach(() => vi.restoreAllMocks()) + +describe('current Confluence site access', () => { + it('requires the actual reader’s Can use permission at the crawler’s immutable site', async () => { + queueSources() + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([grant]) + expect(mocks.token).toHaveBeenCalledWith({ + credentialId: 'alice-credential', + organizationId: 'org-1', + expectedProviderId: 'confluence', + requiredScopes: ['read:confluence-user'], + }) + expect(mocks.fetch).toHaveBeenCalledWith( + 'https://api.atlassian.com/ex/confluence/cloud-1/wiki/rest/api/user/current', + expect.objectContaining({ + headers: { Authorization: 'Bearer alice-oauth-token', Accept: 'application/json' }, + cache: 'no-store', + redirect: 'error', + signal: expect.any(AbortSignal), + }) + ) + expect(JSON.stringify(mocks.fetch.mock.calls)).not.toContain(binding.apiToken) + }) + + it('denies newly revoked site access even if a direct space grant remains indexed', async () => { + queueSources() + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([grant]) + queueSources() + mocks.fetch.mockResolvedValueOnce(new Response(null, { status: 403 })) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + expect(mocks.token).toHaveBeenCalledTimes(2) + expect(mocks.fetch).toHaveBeenCalledTimes(2) + }) + + it.each([401, 403, 404, 429, 500, 503])( + 'denies unconfirmed access on HTTP %i', + async (status) => { + queueSources() + mocks.fetch.mockResolvedValueOnce(new Response(null, { status })) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + } + ) + + it.each([ + { accountId: 'bob', type: 'known' }, + { accountId: 'alice', type: 'anonymous' }, + { accountId: 'alice' }, + null, + ])('denies another identity and incomplete provider data', async (profile) => { + queueSources() + mocks.fetch.mockResolvedValueOnce(Response.json(profile)) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + }) + + it('never substitutes another reader or a crawler when the personal connection is missing', async () => { + queueSources([{ ...source, providerSubjectId: 'bob' }]) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + expect(mocks.token).not.toHaveBeenCalled() + expect(mocks.fetch).not.toHaveBeenCalled() + await expect(resolveConfluenceSiteReadGrants({ ...input, readers: [] })).resolves.toEqual([]) + }) + + it('denies an unavailable scoped crawler credential before checking any reader token', async () => { + queueSources([source], []) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + expect(mocks.token).not.toHaveBeenCalled() + expect(mocks.fetch).not.toHaveBeenCalled() + }) + + it.each([ + { ...binding, domain: 'another.atlassian.net' }, + { ...binding, cloudId: '../other-cloud' }, + { ...binding, type: 'google_service_account' }, + ])('rejects mismatched or malformed site bindings', async (value) => { + queueSources() + mocks.decrypt.mockResolvedValueOnce({ decrypted: JSON.stringify(value) }) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + expect(mocks.token).not.toHaveBeenCalled() + expect(mocks.fetch).not.toHaveBeenCalled() + }) + + it('deduplicates one reader and site only within the current admission', async () => { + queueSources([source, { ...source, connectorId: 'source-2' }]) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toHaveLength(2) + expect(mocks.token).toHaveBeenCalledTimes(1) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + }) + + it('never carries an allowed site proof to a denied site', async () => { + queueSources( + [source, { ...source, connectorId: 'source-2', contentCredentialId: 'other-crawler' }], + [contentCredential, { id: 'other-crawler', key: 'encrypted-other-crawler' }] + ) + mocks.decrypt.mockImplementation(async (key: string) => ({ + decrypted: JSON.stringify({ + ...binding, + cloudId: key === 'encrypted-crawler' ? 'cloud-1' : 'cloud-2', + }), + })) + mocks.fetch.mockImplementation(async (url: string) => + url.includes('/cloud-2/') + ? new Response(null, { status: 403 }) + : Response.json({ accountId: 'alice', type: 'known' }) + ) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([grant]) + expect(mocks.fetch).toHaveBeenCalledTimes(2) + }) + + it('keeps a full bounded batch without enumerating the organization', async () => { + queueSources( + Array.from({ length: MAX_KNOWLEDGE_ACCESS_CANDIDATES }, (_, index) => ({ + ...source, + connectorId: `source-${index}`, + })) + ) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toHaveLength( + MAX_KNOWLEDGE_ACCESS_CANDIDATES + ) + expect(dbChainMockFns.limit).toHaveBeenCalledWith(MAX_KNOWLEDGE_ACCESS_CANDIDATES) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + await expect( + resolveConfluenceSiteReadGrants({ ...input, connectorIds: [...input.connectorIds, 'extra'] }) + ).rejects.toThrow('bounded pages') + }) + + it('does not let multiple reader rows truncate later source candidates', async () => { + const rows = Array.from({ length: 301 }, (_, index) => ({ + ...source, + connectorId: `source-${index}`, + })) + queueTableRows(schemaMock.knowledgeConnector, rows) + queueTableRows(schemaMock.credential, [ + { id: 'alice-credential', providerSubjectId: 'alice' }, + { id: 'bob-credential', providerSubjectId: 'bob' }, + ]) + queueTableRows(schemaMock.credential, [contentCredential]) + mocks.token.mockImplementation(async ({ credentialId }: { credentialId: string }) => ({ + accessToken: credentialId, + })) + mocks.fetch.mockImplementation(async (_url: string, options: RequestInit) => + options.headers && + new Headers(options.headers).get('Authorization') === 'Bearer bob-credential' + ? Response.json({ accountId: 'bob', type: 'known' }) + : new Response(null, { status: 403 }) + ) + const grants = await resolveConfluenceSiteReadGrants({ + ...input, + connectorIds: rows.map((row) => row.connectorId), + readers: [ + ...input.readers, + { credentialId: 'bob-credential', subjectToken: 's:confluence:-:bob' }, + ], + }) + expect(grants).toHaveLength(301) + expect(grants.every((entry) => entry.readerSubjectToken === 's:confluence:-:bob')).toBe(true) + expect(grants.map((entry) => entry.connectorId)).toContain('source-300') + expect(mocks.fetch).toHaveBeenCalledTimes(2) + }) + + it('bounds failed site proofs across a source and reader cross product', async () => { + const rows = Array.from({ length: MAX_KNOWLEDGE_ACCESS_CANDIDATES }, (_, index) => ({ + ...source, + connectorId: `source-${index}`, + contentCredentialId: `crawler-${index}`, + })) + queueTableRows(schemaMock.knowledgeConnector, rows) + queueTableRows(schemaMock.credential, [ + { id: 'alice-credential', providerSubjectId: 'alice' }, + { id: 'bob-credential', providerSubjectId: 'bob' }, + ]) + queueTableRows( + schemaMock.credential, + rows.map((row, index) => ({ id: row.contentCredentialId, key: `cloud-${index}` })) + ) + mocks.decrypt.mockImplementation(async (key: string) => ({ + decrypted: JSON.stringify({ ...binding, cloudId: key }), + })) + mocks.fetch.mockImplementation(async () => new Response(null, { status: 403 })) + await expect( + resolveConfluenceSiteReadGrants({ + ...input, + connectorIds: rows.map((row) => row.connectorId), + readers: [ + ...input.readers, + { credentialId: 'bob-credential', subjectToken: 's:confluence:-:bob' }, + ], + }) + ).resolves.toEqual([]) + expect(mocks.fetch).toHaveBeenCalledTimes(MAX_KNOWLEDGE_ACCESS_CANDIDATES) + }) + + it.each(['refresh', 'site request'])( + 'uses a working same-subject credential while an older %s stalls for all 400 same-site sources', + async (stall) => { + const rows = Array.from({ length: MAX_KNOWLEDGE_ACCESS_CANDIDATES }, (_, index) => ({ + ...source, + connectorId: `source-${index}`, + })) + queueTableRows(schemaMock.knowledgeConnector, rows) + queueTableRows(schemaMock.credential, [ + { id: 'old-credential', providerSubjectId: 'alice' }, + { id: 'working-credential', providerSubjectId: 'alice' }, + ]) + queueTableRows(schemaMock.credential, [contentCredential]) + mocks.token.mockImplementation(async ({ credentialId }: { credentialId: string }) => { + if (stall === 'refresh' && credentialId === 'old-credential') return new Promise(() => {}) + return { accessToken: credentialId } + }) + let stalledSignal: AbortSignal | undefined + mocks.fetch.mockImplementation(async (_url: string, options: RequestInit) => { + if (new Headers(options.headers).get('Authorization') === 'Bearer old-credential') { + stalledSignal = options.signal ?? undefined + return new Promise(() => {}) + } + return Response.json({ accountId: 'alice', type: 'known' }) + }) + const grants = await resolveConfluenceSiteReadGrants({ + ...input, + connectorIds: rows.map((row) => row.connectorId), + readers: ['old-credential', 'working-credential'].map((credentialId) => ({ + credentialId, + subjectToken: 's:confluence:-:alice', + })), + }) + expect(grants).toHaveLength(MAX_KNOWLEDGE_ACCESS_CANDIDATES) + expect( + grants.every( + (entry) => + entry.readerCredentialId === 'working-credential' && entry.cloudId === 'cloud-1' + ) + ).toBe(true) + expect(grants.map((entry) => entry.connectorId)).toContain('source-399') + expect(mocks.fetch).toHaveBeenCalledTimes(stall === 'refresh' ? 1 : 2) + expect(mocks.token).toHaveBeenCalledTimes(2) + if (stall === 'site request') expect(stalledSignal?.aborted).toBe(true) + } + ) + + it('bounds same-subject alternatives without trying unrelated or unlimited credentials', async () => { + const credentials = Array.from( + { length: CONFLUENCE_READ_CREDENTIAL_ALTERNATIVES + 2 }, + (_, index) => ({ id: `reader-${index}`, providerSubjectId: 'alice' }) + ) + queueTableRows(schemaMock.knowledgeConnector, [source]) + queueTableRows(schemaMock.credential, credentials) + queueTableRows(schemaMock.credential, [contentCredential]) + mocks.fetch.mockImplementation(async () => new Response(null, { status: 403 })) + await expect( + resolveConfluenceSiteReadGrants({ + ...input, + connectorIds: [source.connectorId], + readers: credentials.map((reader) => ({ + credentialId: reader.id, + subjectToken: 's:confluence:-:alice', + })), + }) + ).resolves.toEqual([]) + expect(mocks.fetch).toHaveBeenCalledTimes(CONFLUENCE_READ_CREDENTIAL_ALTERNATIVES) + expect(mocks.token).toHaveBeenCalledTimes(CONFLUENCE_READ_CREDENTIAL_ALTERNATIVES) + }) + + it('keeps concurrent credential alternatives bounded while later sites still make progress', async () => { + const rows = Array.from({ length: 6 }, (_, index) => ({ + ...source, + connectorId: `source-${index}`, + contentCredentialId: `crawler-${index}`, + })) + queueTableRows(schemaMock.knowledgeConnector, rows) + queueTableRows(schemaMock.credential, [ + { id: 'old-credential', providerSubjectId: 'alice' }, + { id: 'working-credential', providerSubjectId: 'alice' }, + ]) + queueTableRows( + schemaMock.credential, + rows.map((row, index) => ({ id: row.contentCredentialId, key: `cloud-${index}` })) + ) + mocks.decrypt.mockImplementation(async (key: string) => ({ + decrypted: JSON.stringify({ ...binding, cloudId: key }), + })) + mocks.token.mockImplementation(async ({ credentialId }: { credentialId: string }) => ({ + accessToken: credentialId, + })) + let active = 0 + let peak = 0 + mocks.fetch.mockImplementation(async (_url: string, options: RequestInit) => { + active += 1 + peak = Math.max(peak, active) + if (new Headers(options.headers).get('Authorization') === 'Bearer old-credential') + return new Promise((_resolve, reject) => + options.signal?.addEventListener( + 'abort', + () => { + active -= 1 + reject(options.signal?.reason) + }, + { once: true } + ) + ) + await Promise.resolve() + active -= 1 + return Response.json({ accountId: 'alice', type: 'known' }) + }) + const grants = await resolveConfluenceSiteReadGrants({ + ...input, + connectorIds: rows.map((row) => row.connectorId), + readers: ['old-credential', 'working-credential'].map((credentialId) => ({ + credentialId, + subjectToken: 's:confluence:-:alice', + })), + }) + expect(grants).toHaveLength(6) + expect(grants.map((entry) => entry.connectorId)).toContain('source-5') + expect(grants.every((entry) => entry.readerCredentialId === 'working-credential')).toBe(true) + expect(peak).toBeLessThanOrEqual(CONFLUENCE_READ_CONCURRENCY) + expect(active).toBe(0) + }) + + it('rejects oversized provider responses', async () => { + queueSources() + mocks.fetch.mockResolvedValueOnce( + new Response('x'.repeat(CONFLUENCE_READ_RESPONSE_MAX_BYTES + 1)) + ) + await expect(resolveConfluenceSiteReadGrants(input)).resolves.toEqual([]) + }) + + it.each(['source', 'admission'])( + 'preserves completed sites when a stalled %s deadline expires', + async (deadline) => { + const overall = new AbortController() + const timers: AbortController[] = [] + vi.spyOn(AbortSignal, 'timeout').mockImplementation((duration) => { + if (duration === CONFLUENCE_READ_TIMEOUT_MS) return overall.signal + expect(duration).toBe(CONFLUENCE_READ_ATTEMPT_TIMEOUT_MS) + const timer = new AbortController() + timers.push(timer) + return timer.signal + }) + const count = CONFLUENCE_READ_CONCURRENCY + 2 + queueSources( + Array.from({ length: count }, (_, index) => ({ + ...source, + connectorId: `source-${index}`, + contentCredentialId: `crawler-${index}`, + })), + Array.from({ length: count }, (_, index) => ({ + id: `crawler-${index}`, + key: `cloud-${index}`, + })) + ) + mocks.decrypt.mockImplementation(async (key: string) => ({ + decrypted: JSON.stringify({ ...binding, cloudId: key }), + })) + let lastFastCheck: (() => void) | undefined + const allFastChecks = new Promise((resolve) => { + lastFastCheck = resolve + }) + let active = 0 + let peak = 0 + mocks.fetch.mockImplementation(async (url: string) => { + active += 1 + peak = Math.max(peak, active) + if (url.includes('/cloud-0/')) return new Promise(() => {}) + await Promise.resolve() + active -= 1 + if (url.includes(`/cloud-${count - 1}/`)) lastFastCheck?.() + return Response.json({ accountId: 'alice', type: 'known' }) + }) + const pending = resolveConfluenceSiteReadGrants(input) + await allFastChecks + for (let turn = 0; turn < 20; turn++) await Promise.resolve() + ;(deadline === 'source' ? timers[0] : overall).abort(new Error('deadline')) + const grants = await pending + expect(grants).toHaveLength(count - 1) + expect(grants.map((entry) => entry.connectorId)).not.toContain('source-0') + expect(peak).toBeLessThanOrEqual(CONFLUENCE_READ_CONCURRENCY) + } + ) + + it('stops on caller cancellation while a reader token refresh remains pending', async () => { + queueSources() + const controller = new AbortController() + mocks.token.mockImplementation(() => { + controller.abort(new Error('cancelled')) + return new Promise(() => {}) + }) + await expect( + resolveConfluenceSiteReadGrants({ ...input, signal: controller.signal }) + ).rejects.toThrow('cancelled') + expect(mocks.fetch).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/knowledge/access/confluence-site.ts b/apps/sim/lib/knowledge/access/confluence-site.ts new file mode 100644 index 00000000000..afd80d523d5 --- /dev/null +++ b/apps/sim/lib/knowledge/access/confluence-site.ts @@ -0,0 +1,366 @@ +import { db } from '@sim/db' +import { credential, knowledgeBase, knowledgeConnector } from '@sim/db/schema' +import { createLogger } from '@sim/logger' +import { isPlainRecord } from '@sim/utils/object' +import { and, asc, eq, inArray, isNull, sql } from 'drizzle-orm' +import { normalizeAtlassianSiteUrl } from '@/lib/atlassian/discovery' +import { type ResourceScope, resourceScopeFields } from '@/lib/core/resource-scope' +import { resourceScopeCondition } from '@/lib/core/resource-scope.server' +import { decryptSecret } from '@/lib/core/security/encryption' +import { readResponseJsonWithLimit } from '@/lib/core/utils/stream-limits' +import { resolveManagedOAuthToken } from '@/lib/credentials/managed-oauth' +import { confluenceSubjectToken } from '@/lib/knowledge/access/confluence-permissions' +import { + type ConfluenceSiteReadGrant, + MAX_KNOWLEDGE_ACCESS_CANDIDATES, +} from '@/lib/knowledge/access/types' +import { + ATLASSIAN_SERVICE_ACCOUNT_PROVIDER_ID, + ATLASSIAN_SERVICE_ACCOUNT_SECRET_TYPE, +} from '@/lib/oauth/types' + +const logger = createLogger('ConfluenceSiteReadAccess') +export const CONFLUENCE_READ_CONCURRENCY = 4 +export const CONFLUENCE_READ_TIMEOUT_MS = 8000 +export const CONFLUENCE_READ_ATTEMPT_TIMEOUT_MS = 4000 +export const CONFLUENCE_READ_CREDENTIAL_ALTERNATIVES = 4 +const CONFLUENCE_READ_ALTERNATIVE_CONCURRENCY = 2 +export const CONFLUENCE_READ_RESPONSE_MAX_BYTES = 64 * 1024 +const SITE_BINDING_MAX_BYTES = 32 * 1024 + +export interface ConfluenceReaderCredential { + credentialId: string + subjectToken: string +} + +interface ConfluenceReadSource { + connectorId: string + contentCredentialId: string | null + domain: string | null +} + +interface SiteBinding { + cloudId: string + domain: string +} + +interface BoundConfluenceSource { + connectorId: string + contentCredentialId: string + domain: string + cloudId: string +} + +interface ConfluenceReaderIdentity { + accountId: string + subjectToken: string + credentialIds: string[] +} + +interface ConfirmedConfluenceReader { + credentialId: string + subjectToken: string +} + +/** A pending token refresh must not hold the caller after its authorization deadline. */ +function withinAdmission(pending: Promise, signal: AbortSignal): Promise { + return new Promise((resolve, reject) => { + const abort = () => reject(signal.reason) + signal.addEventListener('abort', abort, { once: true }) + pending.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort)) + if (signal.aborted) abort() + }) +} + +async function readSiteBinding(key: string): Promise { + const { decrypted } = await decryptSecret(key) + const value: unknown = JSON.parse(decrypted) + if ( + !isPlainRecord(value) || + value.type !== ATLASSIAN_SERVICE_ACCOUNT_SECRET_TYPE || + typeof value.cloudId !== 'string' || + !/^[A-Za-z0-9_-]{1,100}$/.test(value.cloudId) || + typeof value.domain !== 'string' || + value.domain.length > 255 + ) + throw new Error('Confluence site binding is invalid') + return { cloudId: value.cloudId, domain: value.domain } +} + +/** Space grants do not prove that the reader still has Confluence's site-level Can use permission. */ +async function verifySite( + binding: SiteBinding, + accountId: string, + accessToken: string, + signal: AbortSignal +): Promise { + signal.throwIfAborted() + const response = await fetch( + `https://api.atlassian.com/ex/confluence/${binding.cloudId}/wiki/rest/api/user/current`, + { + headers: { Authorization: `Bearer ${accessToken}`, Accept: 'application/json' }, + redirect: 'error', + cache: 'no-store', + signal, + } + ) + if (!response.ok) { + await response.body?.cancel() + return false + } + const profile = await readResponseJsonWithLimit(response, { + maxBytes: CONFLUENCE_READ_RESPONSE_MAX_BYTES, + label: 'Confluence site authorization response', + signal, + }) + return isPlainRecord(profile) && profile.accountId === accountId && profile.type === 'known' +} + +/** + * Checks only candidate central sources with credentials already bound to the current reader. + * Site identity comes from the scoped indexing credential, but its token never authenticates + * a reader. Sources, readers, provider proofs, and returned grants each have a 400-row cap. + * Sources share proofs by site and Atlassian subject, with bounded concurrent credential + * alternatives. A subject tries at most four credentials; an admission issues at most 400 + * site requests. Additional site/subject combinations fail closed when those budgets or the + * deadline are exhausted. Proofs and token reuse last only for this admission. + */ +export async function resolveConfluenceSiteReadGrants(input: { + scope: ResourceScope + readers: readonly ConfluenceReaderCredential[] + connectorIds: readonly string[] + knowledgeBaseIds?: readonly string[] + signal?: AbortSignal +}): Promise { + input.signal?.throwIfAborted() + if (input.connectorIds.length > MAX_KNOWLEDGE_ACCESS_CANDIDATES) + throw new Error('Knowledge access candidates must be authorized in bounded pages') + if (!input.readers.length || !input.connectorIds.length || input.knowledgeBaseIds?.length === 0) + return [] + const readers = new Map( + input.readers + .slice(0, MAX_KNOWLEDGE_ACCESS_CANDIDATES) + .map((reader) => [reader.credentialId, reader.subjectToken]) + ) + const sources: ConfluenceReadSource[] = await db + .select({ + connectorId: knowledgeConnector.id, + contentCredentialId: knowledgeConnector.credentialId, + domain: sql`left(${knowledgeConnector.sourceConfig}->>'domain', 256)`, + }) + .from(knowledgeConnector) + .innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId)) + .where( + and( + resourceScopeCondition(knowledgeBase, input.scope), + inArray(knowledgeConnector.id, [...new Set(input.connectorIds)]), + input.knowledgeBaseIds ? inArray(knowledgeBase.id, [...input.knowledgeBaseIds]) : undefined, + isNull(knowledgeBase.deletedAt), + eq(knowledgeConnector.connectorType, 'confluence'), + eq(knowledgeConnector.accessMode, 'admin'), + isNull(knowledgeConnector.archivedAt), + isNull(knowledgeConnector.deletedAt) + ) + ) + .orderBy(asc(knowledgeConnector.id)) + .limit(MAX_KNOWLEDGE_ACCESS_CANDIDATES) + if (!sources.length) return [] + const readerCredentials = await db + .select({ id: credential.id, providerSubjectId: credential.providerSubjectId }) + .from(credential) + .where( + and( + resourceScopeCondition(credential, input.scope), + inArray(credential.id, [...readers.keys()]), + eq(credential.type, 'managed_oauth'), + eq(credential.providerId, 'confluence'), + eq(credential.managedOauthStatus, 'active'), + isNull(credential.revokedAt) + ) + ) + .orderBy(asc(credential.id)) + .limit(MAX_KNOWLEDGE_ACCESS_CANDIDATES) + if (!readerCredentials.length) return [] + const contentCredentialIds = [ + ...new Set( + sources.flatMap((source) => (source.contentCredentialId ? [source.contentCredentialId] : [])) + ), + ] + if (!contentCredentialIds.length) return [] + const credentials = await db + .select({ id: credential.id, key: credential.encryptedServiceAccountKey }) + .from(credential) + .where( + and( + inArray(credential.id, contentCredentialIds), + resourceScopeCondition(credential, input.scope), + eq(credential.type, 'service_account'), + eq(credential.providerId, ATLASSIAN_SERVICE_ACCOUNT_PROVIDER_ID), + isNull(credential.revokedAt), + sql`octet_length(${credential.encryptedServiceAccountKey}) <= ${SITE_BINDING_MAX_BYTES}` + ) + ) + .limit(MAX_KNOWLEDGE_ACCESS_CANDIDATES) + const timeout = AbortSignal.timeout(CONFLUENCE_READ_TIMEOUT_MS) + const admissionSignal = input.signal ? AbortSignal.any([input.signal, timeout]) : timeout + const bindings = new Map() + for (const content of credentials) { + if (!content.key || admissionSignal.aborted) continue + try { + bindings.set(content.id, await withinAdmission(readSiteBinding(content.key), admissionSignal)) + } catch { + logger.warn('Confluence Search site binding is unavailable', { credentialId: content.id }) + } + } + const boundSources: BoundConfluenceSource[] = [] + const sites = new Map() + for (const source of sources) { + if (!source.contentCredentialId || !source.domain || source.domain.length > 255) continue + const binding = bindings.get(source.contentCredentialId) + if ( + !binding || + normalizeAtlassianSiteUrl(binding.domain) !== normalizeAtlassianSiteUrl(source.domain) + ) + continue + sites.set(binding.cloudId, binding) + boundSources.push({ + connectorId: source.connectorId, + contentCredentialId: source.contentCredentialId, + domain: source.domain, + cloudId: binding.cloudId, + }) + } + const identities = new Map() + for (const reader of readerCredentials) { + if (!reader.providerSubjectId) continue + try { + const subjectToken = confluenceSubjectToken(reader.providerSubjectId) + if (readers.get(reader.id) !== subjectToken) continue + let identity = identities.get(subjectToken) + if (!identity) { + identity = { accountId: reader.providerSubjectId, subjectToken, credentialIds: [] } + identities.set(subjectToken, identity) + } + if (identity.credentialIds.length < CONFLUENCE_READ_CREDENTIAL_ALTERNATIVES) + identity.credentialIds.push(reader.id) + } catch { + logger.warn('Confluence Search reader identity is unavailable', { credentialId: reader.id }) + } + } + const siteList = [...sites.values()] + const identityList = [...identities.values()] + const proofCount = Math.min( + MAX_KNOWLEDGE_ACCESS_CANDIDATES, + siteList.length * identityList.length + ) + const tokens = new Map>() + const confirmed = new Map() + let requests = 0 + let nextProof = 0 + const attempt = async ( + binding: SiteBinding, + identity: ConfluenceReaderIdentity, + credentialId: string, + cancellation: AbortSignal + ): Promise => { + const signal = AbortSignal.any([ + admissionSignal, + cancellation, + AbortSignal.timeout(CONFLUENCE_READ_ATTEMPT_TIMEOUT_MS), + ]) + signal.throwIfAborted() + let token = tokens.get(credentialId) + if (!token) { + const tokenSignal = AbortSignal.any([ + admissionSignal, + AbortSignal.timeout(CONFLUENCE_READ_ATTEMPT_TIMEOUT_MS), + ]) + token = withinAdmission( + resolveManagedOAuthToken({ + credentialId, + ...resourceScopeFields(input.scope), + expectedProviderId: 'confluence', + requiredScopes: ['read:confluence-user'], + }).then(({ accessToken }) => accessToken), + tokenSignal + ) + tokens.set(credentialId, token) + } + const accessToken = await withinAdmission(token, signal) + signal.throwIfAborted() + if (requests >= MAX_KNOWLEDGE_ACCESS_CANDIDATES) + throw new Error('Confluence read verification budget exhausted') + requests += 1 + if ( + !(await withinAdmission(verifySite(binding, identity.accountId, accessToken, signal), signal)) + ) + throw new Error('Confluence did not confirm current site access') + return { credentialId, subjectToken: identity.subjectToken } + } + const verifyIdentity = async (binding: SiteBinding, identity: ConfluenceReaderIdentity) => { + for ( + let offset = 0; + offset < identity.credentialIds.length && !admissionSignal.aborted; + offset += CONFLUENCE_READ_ALTERNATIVE_CONCURRENCY + ) { + const cancellation = new AbortController() + try { + return await Promise.any( + identity.credentialIds + .slice(offset, offset + CONFLUENCE_READ_ALTERNATIVE_CONCURRENCY) + .map((credentialId) => attempt(binding, identity, credentialId, cancellation.signal)) + ) + } catch { + if (requests >= MAX_KNOWLEDGE_ACCESS_CANDIDATES) return undefined + } finally { + cancellation.abort() + } + } + return undefined + } + const worker = async () => { + while (nextProof < proofCount && !admissionSignal.aborted) { + const index = nextProof++ + const siteIndex = index % siteList.length + /** Rotate subjects across sites before revisiting either dimension under the proof budget. */ + const identityIndex = (Math.floor(index / siteList.length) + siteIndex) % identityList.length + const binding = siteList[siteIndex] + const reader = await verifyIdentity(binding, identityList[identityIndex]) + if (reader) { + const siteReaders = confirmed.get(binding.cloudId) ?? [] + siteReaders.push(reader) + confirmed.set(binding.cloudId, siteReaders) + } + } + } + await Promise.all( + Array.from( + { + length: Math.min( + proofCount, + CONFLUENCE_READ_CONCURRENCY / CONFLUENCE_READ_ALTERNATIVE_CONCURRENCY + ), + }, + worker + ) + ) + input.signal?.throwIfAborted() + const grants: ConfluenceSiteReadGrant[] = [] + for ( + let round = 0; + round < identityList.length && grants.length < MAX_KNOWLEDGE_ACCESS_CANDIDATES; + round++ + ) { + for (const source of boundSources) { + const reader = confirmed.get(source.cloudId)?.[round] + if (!reader) continue + grants.push({ + ...source, + readerCredentialId: reader.credentialId, + readerSubjectToken: reader.subjectToken, + }) + if (grants.length === MAX_KNOWLEDGE_ACCESS_CANDIDATES) break + } + } + return grants +} diff --git a/apps/sim/lib/knowledge/access/predicate.postgres.test.ts b/apps/sim/lib/knowledge/access/predicate.postgres.test.ts index 286d8199904..0cab491d968 100644 --- a/apps/sim/lib/knowledge/access/predicate.postgres.test.ts +++ b/apps/sim/lib/knowledge/access/predicate.postgres.test.ts @@ -5,7 +5,10 @@ import { readFile } from 'node:fs/promises' import type postgres from 'postgres' import { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' import { createEnterpriseSearchMigrationFixture } from '@/lib/knowledge/__integration__/migration-fixture' -import type { GitHubInstallationReadGrant } from '@/lib/knowledge/access/types' +import type { + ConfluenceSiteReadGrant, + GitHubInstallationReadGrant, +} from '@/lib/knowledge/access/types' vi.unmock('drizzle-orm') vi.unmock('@sim/db/schema') @@ -82,10 +85,17 @@ describe.runIf(Boolean(databaseUrl))('knowledge ACLs in PostgreSQL', () => { documentId: string, join = false, githubInstallationGrants?: GitHubInstallationReadGrant[], - userId = 'reader' + userId = 'reader', + confluenceSiteGrants?: ConfluenceSiteReadGrant[] ): Promise { const query = new PgDialect().sqlToQuery( - knowledgeAccessCondition({ kind: 'user', userId, tokens, githubInstallationGrants }) + knowledgeAccessCondition({ + kind: 'user', + userId, + tokens, + githubInstallationGrants, + confluenceSiteGrants, + }) ) const values = query.params.map((value: unknown) => { if (typeof value === 'string' || typeof value === 'number') return value @@ -206,6 +216,154 @@ describe.runIf(Boolean(databaseUrl))('knowledge ACLs in PostgreSQL', () => { expect(await readable([token], 'github-document', true)).toBe(false) }) + it('requires current Confluence site proof as well as space and inherited page grants', async () => { + const token = 's:confluence:-:cf-alice' + await connection.unsafe(` + INSERT INTO organization(id) VALUES ('cf-org'); + INSERT INTO "user"(id,email,email_verified) VALUES ('cf-reader','cf-alice@example.com',true), ('cf-bob','cf-bob@example.com',true); + INSERT INTO member VALUES ('cf-alice-membership','cf-org','cf-reader'), ('cf-bob-membership','cf-org','cf-bob'); + INSERT INTO knowledge_base(id,organization_id,name,is_search_index) VALUES ('cf-index','cf-org','Search',true); + INSERT INTO credential_group(id,organization_id,name,status,options) + VALUES ('cf-group','cf-org','Confluence','active','[{"id":"cf-option","status":"active"}]'); + INSERT INTO credential_group_enrollment(id,credential_group_id,email,status,user_id) + VALUES ('cf-enrollment','cf-group','cf-alice@example.com','completed','cf-reader'); + INSERT INTO credential(id,organization_id,type,provider_id,encrypted_service_account_key) + VALUES ('cf-crawler','cf-org','service_account','atlassian-service-account','encrypted'); + INSERT INTO credential(id,organization_id,type,provider_id,provider_subject_id,authorization_app_id, + managed_oauth_status,granted_scopes,encrypted_oauth_token_set,granted_at,credential_group_enrollment_id,credential_group_option_id) + VALUES ('cf-personal','cf-org','managed_oauth','confluence','cf-alice','cf-app','active', + ARRAY['read:confluence-user'],'encrypted',now(),'cf-enrollment','cf-option'); + INSERT INTO knowledge_connector(id,knowledge_base_id,connector_type,access_mode,credential_id,source_config) + VALUES ('cf-source','cf-index','confluence','admin','cf-crawler','{"domain":"company.atlassian.net"}'); + INSERT INTO document(id,knowledge_base_id,connector_id,acl,acl_requirements,acl_verified_at) + VALUES ('cf-document','cf-index','cf-source',ARRAY['${token}'],'[["${token}"]]',now()); + INSERT INTO embedding(id,document_id,content) VALUES ('cf-chunk','cf-document','restricted content'); + `) + const grant = { + connectorId: 'cf-source', + contentCredentialId: 'cf-crawler', + readerCredentialId: 'cf-personal', + readerSubjectToken: token, + domain: 'company.atlassian.net', + cloudId: 'cloud-1', + } + const check = (grants?: ConfluenceSiteReadGrant[], userId = 'cf-reader', join = false) => + readable([token], 'cf-document', join, undefined, userId, grants) + for (const join of [false, true]) { + expect(await check(undefined, 'cf-reader', join)).toBe(false) + expect(await check([grant], 'cf-reader', join)).toBe(true) + expect(await check([grant], 'cf-bob', join)).toBe(false) + for (const changed of [ + { ...grant, connectorId: 'other-source' }, + { ...grant, contentCredentialId: 'other-crawler' }, + { ...grant, readerCredentialId: 'other-reader' }, + { ...grant, readerSubjectToken: 's:confluence:-:cf-bob' }, + { ...grant, domain: 'another.atlassian.net' }, + ]) + expect(await check([changed], 'cf-reader', join)).toBe(false) + } + await connection.unsafe( + `UPDATE document SET acl_requirements='[["s:confluence:-:cf-bob"]]' WHERE id='cf-document'` + ) + expect(await check([grant])).toBe(false) + await connection.unsafe( + `UPDATE document SET acl_requirements='[["${token}"]]' WHERE id='cf-document'` + ) + const mutations = [ + [ + "UPDATE credential SET revoked_at=now() WHERE id='cf-personal'", + "UPDATE credential SET revoked_at=NULL WHERE id='cf-personal'", + ], + [ + "UPDATE credential SET managed_oauth_status='revoked' WHERE id='cf-personal'", + "UPDATE credential SET managed_oauth_status='active' WHERE id='cf-personal'", + ], + [ + "UPDATE credential SET provider_subject_id='cf-bob' WHERE id='cf-personal'", + "UPDATE credential SET provider_subject_id='cf-alice' WHERE id='cf-personal'", + ], + [ + "UPDATE credential_group_enrollment SET revoked_at=now() WHERE id='cf-enrollment'", + "UPDATE credential_group_enrollment SET revoked_at=NULL WHERE id='cf-enrollment'", + ], + [ + "UPDATE credential_group SET status='archived' WHERE id='cf-group'", + "UPDATE credential_group SET status='active' WHERE id='cf-group'", + ], + [ + "UPDATE credential_group SET options='[]' WHERE id='cf-group'", + `UPDATE credential_group SET options='[{"id":"cf-option","status":"active"}]' WHERE id='cf-group'`, + ], + [ + "UPDATE credential SET revoked_at=now() WHERE id='cf-crawler'", + "UPDATE credential SET revoked_at=NULL WHERE id='cf-crawler'", + ], + [ + "UPDATE credential SET provider_id='other-provider' WHERE id='cf-crawler'", + "UPDATE credential SET provider_id='atlassian-service-account' WHERE id='cf-crawler'", + ], + [ + `UPDATE knowledge_connector SET source_config='{"domain":"another.atlassian.net"}' WHERE id='cf-source'`, + `UPDATE knowledge_connector SET source_config='{"domain":"company.atlassian.net"}' WHERE id='cf-source'`, + ], + [ + "UPDATE knowledge_connector SET credential_id=NULL WHERE id='cf-source'", + "UPDATE knowledge_connector SET credential_id='cf-crawler' WHERE id='cf-source'", + ], + [ + "DELETE FROM member WHERE id='cf-alice-membership'", + "INSERT INTO member VALUES ('cf-alice-membership','cf-org','cf-reader')", + ], + ] + for (const [revoke, restore] of mutations) { + await connection.unsafe(revoke) + expect(await check([grant], 'cf-reader', true)).toBe(false) + await connection.unsafe(restore) + expect(await check([grant], 'cf-reader', true)).toBe(true) + } + const secondToken = 's:confluence:-:cf-bob' + const groupToken = 'g:confluence:cloud-1:restricted-group' + await connection.unsafe(` + INSERT INTO credential(id,organization_id,type,provider_id,provider_subject_id,authorization_app_id, + managed_oauth_status,granted_scopes,encrypted_oauth_token_set,granted_at,credential_group_enrollment_id,credential_group_option_id) + VALUES ('cf-second-personal','cf-org','managed_oauth','confluence','cf-bob','cf-app','active', + ARRAY['read:confluence-user'],'encrypted',now(),'cf-enrollment','cf-option'); + INSERT INTO knowledge_external_group(id,organization_id,provider_id,tenant_id,external_group_id,last_synced_at) + VALUES ('cf-external-group','cf-org','confluence','cloud-1','restricted-group',now()); + INSERT INTO knowledge_external_group_member(group_id,subject_token) VALUES ('cf-external-group','${secondToken}'); + UPDATE document SET acl=ARRAY['${secondToken}'], acl_requirements='[]' WHERE id='cf-document'; + `) + const secondGrant = { + ...grant, + readerCredentialId: 'cf-second-personal', + readerSubjectToken: secondToken, + } + const mixedIdentityRead = (grants: ConfluenceSiteReadGrant[]) => + readable( + [token, secondToken, groupToken], + 'cf-document', + true, + undefined, + 'cf-reader', + grants + ) + expect(await mixedIdentityRead([grant])).toBe(false) + expect(await mixedIdentityRead([secondGrant])).toBe(true) + await connection.unsafe(`UPDATE document SET acl=ARRAY['${groupToken}'] WHERE id='cf-document'`) + expect(await mixedIdentityRead([grant])).toBe(false) + expect(await mixedIdentityRead([secondGrant])).toBe(true) + expect(await mixedIdentityRead([{ ...secondGrant, cloudId: 'another-cloud' }])).toBe(false) + await connection.unsafe( + `UPDATE document SET acl_requirements='[["${token}"]]' WHERE id='cf-document'` + ) + expect(await mixedIdentityRead([grant, secondGrant])).toBe(false) + await connection.unsafe(`UPDATE document SET acl_requirements='[]' WHERE id='cf-document'`) + await connection.unsafe( + "UPDATE knowledge_external_group SET last_synced_at=now()-interval '25 hours' WHERE id='cf-external-group'" + ) + expect(await mixedIdentityRead([secondGrant])).toBe(false) + }) + it('revokes every source of one integration without changing ACLs or another organization', async () => { await connection.unsafe("INSERT INTO organization(id) VALUES ('approval-org'), ('other-org')") await connection.unsafe( diff --git a/apps/sim/lib/knowledge/access/predicate.test.ts b/apps/sim/lib/knowledge/access/predicate.test.ts index 044ccc3e9b8..2ff74b38a51 100644 --- a/apps/sim/lib/knowledge/access/predicate.test.ts +++ b/apps/sim/lib/knowledge/access/predicate.test.ts @@ -38,6 +38,31 @@ describe('knowledgeAccessCondition', () => { for (const param of params) expect(Array.isArray(param)).toBe(false) }) + it('binds central Confluence evidence to scalar source, crawler, reader, subject, and site values', () => { + const { sql, params } = render( + knowledgeAccessCondition({ + kind: 'user', + userId: 'user-1', + tokens: ['s:confluence:-:alice'], + confluenceSiteGrants: [ + { + connectorId: 'source-1', + contentCredentialId: 'crawler-1', + readerCredentialId: 'reader-1', + readerSubjectToken: 's:confluence:-:alice', + domain: 'company.atlassian.net', + cloudId: 'cloud-1', + }, + ], + }) + ) + expect(sql).toContain('confluence_read_grant') + expect(params).toEqual( + expect.arrayContaining(['source-1', 'crawler-1', 'reader-1', 'company.atlassian.net']) + ) + for (const param of params) expect(Array.isArray(param)).toBe(false) + }) + it('renders the workspace pair for actorless callers', () => { const { sql, params } = render( knowledgeAccessCondition({ kind: 'workspace', tokens: ['pub', 'ws'] }) diff --git a/apps/sim/lib/knowledge/access/predicate.ts b/apps/sim/lib/knowledge/access/predicate.ts index fb46dd48f86..8de2cb47f79 100644 --- a/apps/sim/lib/knowledge/access/predicate.ts +++ b/apps/sim/lib/knowledge/access/predicate.ts @@ -7,14 +7,96 @@ import { knowledgeConnector, knowledgeConnectorMember, knowledgeDocumentObservation, + knowledgeExternalGroup, + knowledgeExternalGroupMember, member, user, } from '@sim/db/schema' import { type SQL, sql } from 'drizzle-orm' +import { EXTERNAL_GROUP_STALE_AFTER_MS } from '@/lib/knowledge/access/external-groups' import { SOURCE_ACL_MAX_AGE_MS } from '@/lib/knowledge/access/freshness' import type { KnowledgeAccessScope, SystemAccessScope } from '@/lib/knowledge/access/types' import { searchIntegrationAccessCondition } from '@/lib/knowledge/search/integration-policy' import { GITHUB_INSTALLATION_PROVIDER_ID } from '@/lib/oauth/github-installation-types' +import { ATLASSIAN_SERVICE_ACCOUNT_PROVIDER_ID } from '@/lib/oauth/types' + +/** Every Confluence clause must match the same confirmed reader, including that reader's groups. */ +function confluenceReaderClause(hasToken: (token: SQL) => SQL): SQL { + return sql`(${hasToken(sql`confluence_read_grant.reader_subject_token`)} OR EXISTS ( + SELECT 1 FROM ${knowledgeExternalGroup} + JOIN ${knowledgeExternalGroupMember} ON ${knowledgeExternalGroupMember.groupId} = ${knowledgeExternalGroup.id} + WHERE ${knowledgeExternalGroupMember.subjectToken} = confluence_read_grant.reader_subject_token + AND ${knowledgeExternalGroup.providerId} = 'confluence' + AND ${knowledgeExternalGroup.tenantId} = confluence_read_grant.cloud_id + AND ${knowledgeExternalGroup.organizationId} IS NOT DISTINCT FROM ${knowledgeBase.organizationId} + AND ${knowledgeExternalGroup.workspaceId} IS NOT DISTINCT FROM ${knowledgeBase.workspaceId} + AND ${knowledgeExternalGroup.lastSyncedAt} >= statement_timestamp() - (${EXTERNAL_GROUP_STALE_AFTER_MS} * interval '1 millisecond') + AND ${hasToken(sql`('g:confluence:' || confluence_read_grant.cloud_id || ':' || ${knowledgeExternalGroup.externalGroupId})`)} + ))` +} + +/** A cached space grant cannot substitute for the reader's current Confluence site access. */ +function confluenceSiteAccessCondition(scope: KnowledgeAccessScope): SQL { + const grants = scope.kind === 'user' ? (scope.confluenceSiteGrants ?? []) : [] + const allowed = + scope.kind !== 'user' || grants.length === 0 + ? sql`false` + : sql`EXISTS ( + SELECT 1 FROM (VALUES ${sql.join( + grants.map( + (grant) => sql`( + ${grant.connectorId}, ${grant.contentCredentialId}, ${grant.readerCredentialId}, ${grant.readerSubjectToken}, ${grant.domain}, ${grant.cloudId} + )` + ), + sql`, ` + )}) AS confluence_read_grant(connector_id, content_credential_id, reader_credential_id, reader_subject_token, domain, cloud_id) + JOIN ${knowledgeBase} ON ${knowledgeBase.id} = ${knowledgeConnector.knowledgeBaseId} + JOIN ${credential} ON ${credential.id} = confluence_read_grant.content_credential_id + WHERE confluence_read_grant.connector_id = ${knowledgeConnector.id} + AND confluence_read_grant.content_credential_id = ${knowledgeConnector.credentialId} + AND confluence_read_grant.domain = ${knowledgeConnector.sourceConfig}->>'domain' + AND ${confluenceReaderClause((token) => sql`${token} = ANY(${document.acl})`)} + AND NOT EXISTS ( + SELECT 1 FROM jsonb_array_elements(${document.aclRequirements}) AS confluence_required_clause(tokens) + WHERE NOT ${confluenceReaderClause((token) => sql`confluence_required_clause.tokens ? ${token}`)} + ) + AND ${knowledgeConnector.archivedAt} IS NULL AND ${knowledgeConnector.deletedAt} IS NULL + AND ${knowledgeBase.deletedAt} IS NULL + AND ${credential.type} = 'service_account' + AND ${credential.providerId} = ${ATLASSIAN_SERVICE_ACCOUNT_PROVIDER_ID} + AND ${credential.revokedAt} IS NULL + AND ${credential.organizationId} IS NOT DISTINCT FROM ${knowledgeBase.organizationId} + AND ${credential.workspaceId} IS NOT DISTINCT FROM ${knowledgeBase.workspaceId} + AND (${knowledgeBase.organizationId} IS NULL OR EXISTS ( + SELECT 1 FROM ${member} WHERE ${member.organizationId} = ${knowledgeBase.organizationId} + AND ${member.userId} = ${scope.userId} + )) + AND EXISTS ( + SELECT 1 FROM ${credential} + JOIN ${credentialGroupEnrollment} ON ${credentialGroupEnrollment.id} = ${credential.credentialGroupEnrollmentId} + JOIN ${credentialGroup} ON ${credentialGroup.id} = ${credentialGroupEnrollment.credentialGroupId} + JOIN ${user} ON ${user.id} = ${scope.userId} + WHERE ${credential.id} = confluence_read_grant.reader_credential_id + AND ${credential.type} = 'managed_oauth' AND ${credential.providerId} = 'confluence' + AND ${credential.managedOauthStatus} = 'active' AND ${credential.revokedAt} IS NULL + AND ('s:confluence:' || COALESCE(NULLIF(${credential.providerTenantId}, ''), '-') || ':' || ${credential.providerSubjectId}) = confluence_read_grant.reader_subject_token + AND ${credential.organizationId} IS NOT DISTINCT FROM ${knowledgeBase.organizationId} + AND ${credential.workspaceId} IS NOT DISTINCT FROM ${knowledgeBase.workspaceId} + AND ${credentialGroup.organizationId} IS NOT DISTINCT FROM ${knowledgeBase.organizationId} + AND ${credentialGroup.workspaceId} IS NOT DISTINCT FROM ${knowledgeBase.workspaceId} + AND ${credentialGroup.status} = 'active' + AND ${credentialGroupEnrollment.status} IN ('in_progress', 'completed') + AND ${credentialGroupEnrollment.revokedAt} IS NULL + AND ${user.emailVerified} = true + AND ((${knowledgeBase.organizationId} IS NOT NULL AND ${credentialGroupEnrollment.userId} = ${scope.userId}) + OR (${knowledgeBase.workspaceId} IS NOT NULL AND ${credentialGroupEnrollment.email} = lower(btrim(${user.email})))) + AND EXISTS (SELECT 1 FROM jsonb_array_elements(${credentialGroup.options}) AS option + WHERE option->>'id' = ${credential.credentialGroupOptionId} AND option->>'status' = 'active') + ) + )` + return sql`(${knowledgeConnector.connectorType} IS DISTINCT FROM 'confluence' + OR ${knowledgeConnector.accessMode} <> 'admin' OR ${allowed})` +} /** Missing credentials or missing live evidence must never downgrade an installation source. */ function githubInstallationAccessCondition(scope: KnowledgeAccessScope): SQL { @@ -99,7 +181,9 @@ function githubInstallationAccessCondition(scope: KnowledgeAccessScope): SQL { export function knowledgeAccessCondition(scope: KnowledgeAccessScope | SystemAccessScope): SQL { return storedKnowledgeAccessCondition( scope, - scope.kind === 'system' ? sql`true` : githubInstallationAccessCondition(scope) + scope.kind === 'system' + ? sql`true` + : sql`(${githubInstallationAccessCondition(scope)} AND ${confluenceSiteAccessCondition(scope)})` ) } diff --git a/apps/sim/lib/knowledge/access/scope.test.ts b/apps/sim/lib/knowledge/access/scope.test.ts index d1f936e2004..bb46c448f15 100644 --- a/apps/sim/lib/knowledge/access/scope.test.ts +++ b/apps/sim/lib/knowledge/access/scope.test.ts @@ -6,10 +6,16 @@ import { dbChainMockFns, queueTableRows, resetDbChainMock, schemaMock } from '@s import { eq, inArray } from 'drizzle-orm' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockAvailability, mockCheckWorkspaceAccess, mockGitHubReadGrants } = vi.hoisted(() => ({ +const { + mockAvailability, + mockCheckWorkspaceAccess, + mockGitHubReadGrants, + mockConfluenceReadGrants, +} = vi.hoisted(() => ({ mockAvailability: vi.fn(async () => ({ memberScoped: true, sourceMirrored: true })), mockCheckWorkspaceAccess: vi.fn(async () => ({ hasAccess: true })), mockGitHubReadGrants: vi.fn(async () => []), + mockConfluenceReadGrants: vi.fn(async () => []), })) vi.mock('@/lib/knowledge/access/availability', () => ({ @@ -18,12 +24,16 @@ vi.mock('@/lib/knowledge/access/availability', () => ({ vi.mock('@/lib/workspaces/permissions/utils', () => ({ checkWorkspaceAccess: mockCheckWorkspaceAccess, })) +vi.mock('@/lib/knowledge/access/confluence-site', () => ({ + resolveConfluenceSiteReadGrants: mockConfluenceReadGrants, +})) vi.mock('@/lib/knowledge/access/github-installation', () => ({ resolveGitHubInstallationReadGrants: mockGitHubReadGrants, })) import { createKnowledgeAccessProvider, + createUserKnowledgeAccessProvider, resolveKnowledgeAccessScope, WORKSPACE_ACCESS_SCOPE, } from '@/lib/knowledge/access/scope' @@ -484,6 +494,71 @@ describe('organization document ACL scope', () => { }) expect(scope).toMatchObject({ githubInstallationGrants: [] }) }) + it('checks only the enrolled Confluence reader after ranking canonical document candidates', async () => { + queueTableRows(schemaMock.member, [{ id: 'membership-1' }]) + queueSubjects([ + { + email: 'viewer@example.com', + credentialId: 'personal-confluence', + providerId: 'confluence', + providerSubjectId: 'alice', + providerTenantId: null, + }, + ]) + const provider = createKnowledgeAccessProvider(SESSION, { + ...organization, + knowledgeBaseIds: ['index-1'], + }) + expect(await provider.get()).not.toHaveProperty('confluenceSiteGrants') + expect(mockConfluenceReadGrants).not.toHaveBeenCalled() + queueTableRows(schemaMock.document, [{ connectorId: 'confluence-source' }]) + expect(await provider.getForDocuments(['selected-document'])).toMatchObject({ + confluenceSiteGrants: [], + }) + expect(mockConfluenceReadGrants).toHaveBeenCalledWith({ + scope: { kind: 'organization', organizationId: 'org-1' }, + readers: [{ credentialId: 'personal-confluence', subjectToken: 's:confluence:-:alice' }], + knowledgeBaseIds: ['index-1'], + connectorIds: ['confluence-source'], + signal: undefined, + }) + expect(mockGitHubReadGrants).not.toHaveBeenCalled() + }) + it('preserves candidate admission for an already-authenticated personal-key or session user', async () => { + queueTableRows(schemaMock.member, [{ id: 'membership-1' }]) + queueSubjects([ + { + credentialId: 'personal-confluence', + providerId: 'confluence', + providerSubjectId: 'alice', + providerTenantId: null, + }, + ]) + const provider = createUserKnowledgeAccessProvider('user-1', organization) + expect(await provider.get()).toMatchObject({ kind: 'user', userId: 'user-1' }) + expect(mockConfluenceReadGrants).not.toHaveBeenCalled() + await provider.getForConnectors(['source-1']) + expect(mockConfluenceReadGrants).toHaveBeenCalledWith( + expect.objectContaining({ + connectorIds: ['source-1'], + readers: [{ credentialId: 'personal-confluence', subjectToken: 's:confluence:-:alice' }], + }) + ) + }) + it('cannot check a retained Confluence connection after organization removal', async () => { + queueTableRows(schemaMock.member, []) + queueSubjects([ + { + credentialId: 'personal-confluence', + providerId: 'confluence', + providerSubjectId: 'alice', + providerTenantId: null, + }, + ]) + const provider = createKnowledgeAccessProvider(SESSION, organization) + expect(await provider.getForConnectors(['confluence-source'])).toMatchObject({ tokens: [] }) + expect(mockConfluenceReadGrants).not.toHaveBeenCalled() + }) it('does not live-check retained provider credentials after organization removal', async () => { queueTableRows(schemaMock.member, []) queueSubjects([ diff --git a/apps/sim/lib/knowledge/access/scope.ts b/apps/sim/lib/knowledge/access/scope.ts index 63ad6d25dd3..0fa1a187299 100644 --- a/apps/sim/lib/knowledge/access/scope.ts +++ b/apps/sim/lib/knowledge/access/scope.ts @@ -20,6 +20,10 @@ import { type ResourceScope, resourceScopeFromOwner } from '@/lib/core/resource- import { resourceScopeCondition } from '@/lib/core/resource-scope.server' import { LIVE_ENROLLMENT_STATUSES } from '@/lib/credential-groups/credentials' import { resolveKnowledgeAccessAvailability } from '@/lib/knowledge/access/availability' +import { + type ConfluenceReaderCredential, + resolveConfluenceSiteReadGrants, +} from '@/lib/knowledge/access/confluence-site' import { domainMemberWildcard, EXTERNAL_GROUP_STALE_AFTER_MS, @@ -145,7 +149,11 @@ export interface KnowledgeAccessScopeContext { async function loadUserAccess( userId: string, context: KnowledgeAccessScopeContext -): Promise<{ tokens: readonly string[]; githubReaders?: GitHubReaderCredential[] }> { +): Promise<{ + tokens: readonly string[] + githubReaders?: GitHubReaderCredential[] + confluenceReaders?: ConfluenceReaderCredential[] +}> { const { workspaceId, organizationId } = context const scope = resourceScopeFromOwner(context) const baseline = organizationId ? ORGANIZATION_ACCESS_TOKENS : WORKSPACE_ACCESS_TOKENS @@ -235,6 +243,7 @@ async function loadUserAccess( const identityTokens = new Set() const githubReaders: GitHubReaderCredential[] = [] + const confluenceReaders: ConfluenceReaderCredential[] = [] for (const row of rows) { if (!availability.memberScoped || !row.providerSubjectId) continue try { @@ -242,6 +251,8 @@ async function loadUserAccess( identityTokens.add(token) if (row.providerId === 'github-repositories' && row.credentialId) githubReaders.push({ credentialId: row.credentialId, subjectToken: token }) + if (row.providerId === 'confluence' && row.credentialId) + confluenceReaders.push({ credentialId: row.credentialId, subjectToken: token }) } catch (error) { logger.warn('Skipping malformed managed credential subject', { userId, @@ -275,6 +286,7 @@ async function loadUserAccess( return { tokens: sortAccessTokens(new Set([...baseline, ...identityTokens])), githubReaders, + confluenceReaders, } } @@ -295,7 +307,11 @@ export async function resolveKnowledgeAccessScope( async function resolveKnowledgeIdentity( principal: Principal, context: KnowledgeAccessScopeContext -): Promise<{ access: KnowledgeAccessScope; githubReaders: readonly GitHubReaderCredential[] }> { +): Promise<{ + access: KnowledgeAccessScope + githubReaders: readonly GitHubReaderCredential[] + confluenceReaders: readonly ConfluenceReaderCredential[] +}> { if (principal.kind === 'credential_group_enrollment') { throw new OrchestrationError( 'forbidden', @@ -307,12 +323,22 @@ async function resolveKnowledgeIdentity( if (subject?.kind !== 'sim_user') { if (context.organizationId) throw new OrchestrationError('forbidden', 'Organization search requires a user subject') - return { access: WORKSPACE_ACCESS_SCOPE, githubReaders: [] } + return { access: WORKSPACE_ACCESS_SCOPE, githubReaders: [], confluenceReaders: [] } } - const { tokens, githubReaders = [] } = await loadUserAccess(subject.userId, context) + return resolveUserKnowledgeIdentity(subject.userId, context) +} + +async function resolveUserKnowledgeIdentity(userId: string, context: KnowledgeAccessScopeContext) { + resourceScopeFromOwner(context) + const { + tokens, + githubReaders = [], + confluenceReaders = [], + } = await loadUserAccess(userId, context) return { - access: { kind: 'user', userId: subject.userId, tokens }, + access: { kind: 'user' as const, userId, tokens }, githubReaders, + confluenceReaders, } } @@ -333,10 +359,25 @@ export async function resolveUserKnowledgeAccessScope( export function createKnowledgeAccessProvider( principal: Principal, context: KnowledgeAccessScopeContext +): KnowledgeAccessProvider { + return createAccessProvider(() => resolveKnowledgeIdentity(principal, context), context) +} + +/** Candidate access for a user already authenticated by a session or personal-key adapter. */ +export function createUserKnowledgeAccessProvider( + userId: string, + context: KnowledgeAccessScopeContext +): KnowledgeAccessProvider { + return createAccessProvider(() => resolveUserKnowledgeIdentity(userId, context), context) +} + +function createAccessProvider( + resolveIdentity: () => ReturnType, + context: KnowledgeAccessScopeContext ): KnowledgeAccessProvider { let pending: ReturnType | undefined const identity = () => { - pending ??= resolveKnowledgeIdentity(principal, context).catch((error: unknown) => { + pending ??= resolveIdentity().catch((error: unknown) => { pending = undefined throw error }) @@ -358,26 +399,41 @@ export function createKnowledgeAccessProvider( ? AbortSignal.any([context.signal, signal]) : (signal ?? context.signal) cancellation?.throwIfAborted() - const { access, githubReaders } = await identity() + const { access, githubReaders, confluenceReaders } = await identity() cancellation?.throwIfAborted() - if (access.kind !== 'user' || !githubReaders.length || !ids.length) return access - return { - ...access, - githubInstallationGrants: await resolveGitHubInstallationReadGrants({ - scope: resourceScopeFromOwner(context), - readers: githubReaders, - knowledgeBaseIds: context.knowledgeBaseIds, - connectorIds: ids, - signal: cancellation, - }), + if ( + access.kind !== 'user' || + (!githubReaders.length && !confluenceReaders.length) || + !ids.length + ) + return access + const input = { + scope: resourceScopeFromOwner(context), + knowledgeBaseIds: context.knowledgeBaseIds, + connectorIds: ids, + signal: cancellation, } + const [githubInstallationGrants, confluenceSiteGrants] = await Promise.all([ + githubReaders.length + ? resolveGitHubInstallationReadGrants({ ...input, readers: githubReaders }) + : Promise.resolve([]), + confluenceReaders.length + ? resolveConfluenceSiteReadGrants({ ...input, readers: confluenceReaders }) + : Promise.resolve([]), + ]) + return { ...access, githubInstallationGrants, confluenceSiteGrants } }, async getForDocuments(documentIds, signal) { const ids = boundedIds(documentIds) signal?.throwIfAborted() context.signal?.throwIfAborted() - const { access, githubReaders } = await identity() - if (access.kind !== 'user' || !githubReaders.length || !ids.length) return access + const { access, githubReaders, confluenceReaders } = await identity() + if ( + access.kind !== 'user' || + (!githubReaders.length && !confluenceReaders.length) || + !ids.length + ) + return access const candidates = await db .select({ connectorId: document.connectorId }) .from(document) diff --git a/apps/sim/lib/knowledge/access/types.ts b/apps/sim/lib/knowledge/access/types.ts index 400486649a9..88995f2d3eb 100644 --- a/apps/sim/lib/knowledge/access/types.ts +++ b/apps/sim/lib/knowledge/access/types.ts @@ -41,6 +41,17 @@ export interface UserAccessScope { tokens: readonly string[] /** Live user-token evidence, scoped to the installation source's immutable repository. */ githubInstallationGrants?: readonly GitHubInstallationReadGrant[] + /** Current reader access to the immutable Confluence site behind a central crawl. */ + confluenceSiteGrants?: readonly ConfluenceSiteReadGrant[] +} + +export interface ConfluenceSiteReadGrant { + cloudId: string + connectorId: string + contentCredentialId: string + readerCredentialId: string + readerSubjectToken: string + domain: string } export interface GitHubInstallationReadGrant { diff --git a/apps/sim/lib/knowledge/application/connectors.test.ts b/apps/sim/lib/knowledge/application/connectors.test.ts index c2183e73dda..b631ac8fb93 100644 --- a/apps/sim/lib/knowledge/application/connectors.test.ts +++ b/apps/sim/lib/knowledge/application/connectors.test.ts @@ -2,7 +2,7 @@ * @vitest-environment node */ -import { document, member } from '@sim/db/schema' +import { document, knowledgeConnector, member } from '@sim/db/schema' import { dbChainMockFns, queueTableRows, resetDbChainMock } from '@sim/testing' import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest' @@ -27,6 +27,10 @@ const mocks = vi.hoisted(() => ({ provision: vi.fn(), decryptApiKey: vi.fn(), requireApproval: vi.fn(), + resolveWorkspace: vi.fn(), + viewerMemberships: vi.fn(), + getAccess: vi.fn(), + getForConnectors: vi.fn(), })) vi.mock('@sim/audit', () => ({ @@ -57,6 +61,7 @@ vi.mock('@sim/platform-authz/workspace', () => ({ })) vi.mock('@/lib/knowledge/application/contexts', () => ({ + resolveKnowledgeWorkspaceContext: mocks.resolveWorkspace, resolveActiveKnowledgeBaseContext: mocks.resolveKnowledgeBase, resolveActiveKnowledgeResourceContext: mocks.resolveKnowledgeBase, resolveActiveKnowledgeConnectorContext: mocks.resolveConnector, @@ -67,11 +72,18 @@ vi.mock('@/lib/knowledge/orchestration/connector-access', () => ({ })) vi.mock('@/lib/knowledge/connectors/member-provisioning', () => ({ provisionKnowledgeConnectorMembersBinding: mocks.provision, - resolveViewerConnectorMemberships: async () => new Map(), + resolveViewerConnectorMemberships: mocks.viewerMemberships, })) vi.mock('@/lib/knowledge/connectors/mirrored-access', () => ({ assertConnectorMirrorsSourceAcls: async () => undefined, })) +vi.mock('@/lib/knowledge/access/scope', () => ({ + WORKSPACE_ACCESS_SCOPE: { kind: 'workspace', tokens: ['pub', 'ws'] }, + createKnowledgeAccessProvider: () => ({ + get: mocks.getAccess, + getForConnectors: mocks.getForConnectors, + }), +})) vi.mock('@/lib/knowledge/access/availability', () => ({ requireKnowledgeMemberAccessAvailable: async () => undefined, })) @@ -145,6 +157,7 @@ import { createKnowledgeConnector, deleteKnowledgeConnector, listKnowledgeConnectorDocuments, + listWorkspaceMemberConnectors, resolveConnectorCredentialAccessToken, syncKnowledgeConnector, updateKnowledgeConnector, @@ -223,6 +236,8 @@ describe('knowledge connector application use cases', () => { vi.clearAllMocks() resetDbChainMock() mocks.resolvePermission.mockResolvedValue('write') + mocks.resolveWorkspace.mockResolvedValue(crossWorkspaceContext) + mocks.viewerMemberships.mockResolvedValue(new Map()) mocks.resolveKnowledgeBase.mockResolvedValue(crossWorkspaceContext) mocks.resolveConnector.mockResolvedValue(connectorContext) mocks.getCredentialActorContext.mockResolvedValue({ @@ -246,6 +261,55 @@ describe('knowledge connector application use cases', () => { afterAll(resetDbChainMock) + it('counts workspace central Confluence documents only after candidate site admission', async () => { + const identity = { + kind: 'user' as const, + userId: 'reader', + tokens: ['ws', 's:confluence:-:alice'], + } + mocks.getAccess.mockResolvedValue(identity) + mocks.getForConnectors.mockResolvedValue({ + ...identity, + confluenceSiteGrants: [ + { + connectorId: 'cf-source', + contentCredentialId: 'crawler', + readerCredentialId: 'personal', + readerSubjectToken: 's:confluence:-:alice', + domain: 'company.atlassian.net', + cloudId: 'cloud-1', + }, + ], + }) + mocks.viewerMemberships.mockResolvedValue(new Map([['cf-source', 'connected']])) + queueTableRows(knowledgeConnector, [ + { + id: 'cf-source', + knowledgeBaseId: 'knowledge-b', + knowledgeBaseName: 'Search', + knowledgeBaseIsSearchIndex: true, + connectorType: 'confluence', + accessMode: 'admin', + sourceConfig: { domain: 'company.atlassian.net', spaceKey: ['DEMO'] }, + memberSyncStatus: 'idle', + }, + ]) + queueTableRows(document, []) + queueTableRows(document, [{ connectorId: 'cf-source' }]) + queueTableRows(document, [{ connectorId: 'cf-source', count: 2 }]) + const result = await listWorkspaceMemberConnectors.execute({ + principal: { kind: 'session', userId: 'reader', sessionId: 'test' }, + input: { workspaceId: 'workspace-b' }, + }) + expect(mocks.getForConnectors).toHaveBeenCalledWith(['cf-source'], undefined) + expect(result.connectors).toEqual([ + expect.objectContaining({ connectorId: 'cf-source', viewerDocumentCount: 2 }), + ]) + expect(JSON.stringify(dbChainMockFns.where.mock.calls.at(-1)?.[0])).toContain( + 'confluence_read_grant' + ) + }) + it('rejects a forged OAuth credential for central Drive creation before using its token', async () => { mocks.resolvePermission.mockResolvedValue('admin') mocks.resolveKnowledgeBase.mockResolvedValue({ diff --git a/apps/sim/lib/knowledge/application/connectors.ts b/apps/sim/lib/knowledge/application/connectors.ts index 5eb12fbef2c..ab8f4a2ff5a 100644 --- a/apps/sim/lib/knowledge/application/connectors.ts +++ b/apps/sim/lib/knowledge/application/connectors.ts @@ -31,7 +31,6 @@ import { resolveCredentialTokenIdentity } from '@/lib/credentials/access' import { requireKnowledgeMemberAccessAvailable } from '@/lib/knowledge/access/availability' import { knowledgeAccessCondition } from '@/lib/knowledge/access/predicate' import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' -import type { KnowledgeAccessScope } from '@/lib/knowledge/access/types' import { defineAuthorizedKnowledgeUseCase } from '@/lib/knowledge/application/authorized-knowledge-use-case' import { resolveKnowledgeAttributedUserId, @@ -86,6 +85,7 @@ import type { KnowledgeOperationSource, KnowledgeOrchestrationResult, } from '@/lib/knowledge/orchestration/shared' +import { type KnowledgeReadAccess, knowledgeReadAccessBatches } from '@/lib/knowledge/read-access' import { requireOrganizationSearchApproval } from '@/lib/knowledge/search/integration-policy' import { escapeLikePattern } from '@/lib/knowledge/tags/utils' import { isMemberSyncStatus } from '@/lib/knowledge/types' @@ -491,23 +491,28 @@ export interface ListWorkspaceMemberConnectorsInput { /** Live documents per connector that the viewer's tokens match, for the Search tab's counts. */ async function countViewerDocuments( connectorIds: readonly string[], - access: KnowledgeAccessScope + access: KnowledgeReadAccess ): Promise> { - if (connectorIds.length === 0) return new Map() - const rows = await db - .select({ connectorId: document.connectorId, count: sql`count(*)::int` }) - .from(document) - .where( - and( - inArray(document.connectorId, [...connectorIds]), - eq(document.userExcluded, false), - isNull(document.archivedAt), - isNull(document.deletedAt), - knowledgeAccessCondition(access) - ) - ) - .groupBy(document.connectorId) - return new Map(rows.flatMap((row) => (row.connectorId ? [[row.connectorId, row.count]] : []))) + const counts = new Map() + if (connectorIds.length === 0) return counts + const conditions = [ + inArray(document.connectorId, [...connectorIds]), + eq(document.userExcluded, false), + isNull(document.archivedAt), + isNull(document.deletedAt), + ] + for await (const accessCondition of knowledgeReadAccessBatches(access, conditions)) { + const rows = await db + .select({ connectorId: document.connectorId, count: sql`count(*)::int` }) + .from(document) + .where(and(...conditions, accessCondition)) + .groupBy(document.connectorId) + for (const row of rows) { + if (row.connectorId) + counts.set(row.connectorId, (counts.get(row.connectorId) ?? 0) + row.count) + } + } + return counts } /** Live workspace sources that let the viewer connect a crawl account or a mirrored-ACL identity. */ @@ -564,7 +569,7 @@ export const listWorkspaceMemberConnectors = defineAuthorizedKnowledgeUseCase({ }), countViewerDocuments( rows.map((row) => row.id), - await createKnowledgeAccessProvider(principal, { workspaceId: context.workspaceId }).get() + createKnowledgeAccessProvider(principal, { workspaceId: context.workspaceId }) ), ]) return { diff --git a/apps/sim/lib/knowledge/application/documents.test.ts b/apps/sim/lib/knowledge/application/documents.test.ts index 4bded55be3c..dfb43acb1e4 100644 --- a/apps/sim/lib/knowledge/application/documents.test.ts +++ b/apps/sim/lib/knowledge/application/documents.test.ts @@ -14,6 +14,8 @@ const mocks = vi.hoisted(() => ({ resolveSystemBilling: vi.fn(), checkUsage: vi.fn(), getDocuments: vi.fn(), + bulkDocumentOperation: vi.fn(), + bulkDocumentOperationByFilter: vi.fn(), createDocument: vi.fn(), deleteDocument: vi.fn(), updateDocument: vi.fn(), @@ -68,6 +70,8 @@ vi.mock('@/lib/knowledge/application/contexts', () => ({ vi.mock('@/lib/knowledge/documents/service', () => ({ getDocuments: mocks.getDocuments, + bulkDocumentOperation: mocks.bulkDocumentOperation, + bulkDocumentOperationByFilter: mocks.bulkDocumentOperationByFilter, createSingleDocument: mocks.createDocument, createDocumentRecords: mocks.createDocumentRecords, deleteDocument: mocks.deleteDocumentById, @@ -110,6 +114,7 @@ import { OrchestrationError } from '@/lib/core/orchestration/types' import { WORKSPACE_ACCESS_SCOPE } from '@/lib/knowledge/access/scope' import { bulkDeleteKnowledgeDocuments, + bulkUpdateKnowledgeDocuments, createKnowledgeDocuments, deleteKnowledgeDocument, listKnowledgeDocuments, @@ -344,6 +349,90 @@ describe('knowledge document application use cases', () => { expect(mocks.resolvePermission.mock.invocationCallOrder[0]).toBeLessThan( mocks.getDocuments.mock.invocationCallOrder[0] ) + expect(mocks.getDocuments).toHaveBeenCalledWith( + 'knowledge-1', + expect.any(Object), + expect.any(String), + knowledgeAccess + ) + }) + + it.each([true, false])( + 'retains live workspace access for bulk document selection (all=%s)', + async (selectAll) => { + const result = { success: true, successCount: 1, updatedDocuments: [{ id: 'document-1' }] } + mocks.bulkDocumentOperation.mockResolvedValue(result) + mocks.bulkDocumentOperationByFilter.mockResolvedValue(result) + await bulkUpdateKnowledgeDocuments.execute({ + principal: { kind: 'session', userId: 'user-1', sessionId: 'session-1' }, + input: { + knowledgeBaseId: 'knowledge-1', + assertedWorkspaceId: 'workspace-1', + operation: 'enable', + selectAll, + documentIds: ['document-1'], + }, + }) + if (selectAll) { + expect(mocks.bulkDocumentOperationByFilter).toHaveBeenCalledWith( + 'knowledge-1', + 'enable', + undefined, + knowledgeAccess, + expect.any(String) + ) + } else { + expect(mocks.bulkDocumentOperation).toHaveBeenCalledWith( + 'knowledge-1', + 'enable', + ['document-1'], + knowledgeAccess, + expect.any(String) + ) + } + } + ) + + it('finds a workspace upsert replacement after live candidate authorization', async () => { + const scope = { kind: 'user' as const, userId: 'reader', tokens: ['reader-token'] } + const getForConnectors = vi.fn().mockResolvedValue(scope) + const getForDocuments = vi.fn().mockResolvedValue(scope) + mocks.resolveKnowledgeBase.mockResolvedValue({ + ...context, + access: { + get: async () => scope, + getForConnectors, + getForDocuments, + }, + }) + queueTableRows(schemaMock.document, []) + queueTableRows(schemaMock.document, [{ connectorId: 'confluence-source' }]) + queueTableRows(schemaMock.document, [{ id: 'existing-1' }]) + const result = await upsertKnowledgeDocument.execute({ + principal: { kind: 'session', userId: 'reader', sessionId: 'session-1' }, + input: { + knowledgeBaseId: 'knowledge-1', + assertedWorkspaceId: 'workspace-1', + filename: document.filename, + fileUrl: document.fileUrl, + fileSize: document.fileSize, + mimeType: document.mimeType, + resolveBillingAttribution: async () => ({ + actorUserId: 'reader', + workspaceId: 'workspace-1', + }), + resolveSecretProvenances: () => undefined, + }, + }) + expect(result).toMatchObject({ isUpdate: true, previousDocumentId: 'existing-1' }) + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith(['confluence-source'], undefined) + expect(getForDocuments).toHaveBeenCalledExactlyOnceWith(['existing-1']) + expect(mocks.deleteDocument).toHaveBeenCalledWith( + 'knowledge-1', + 'existing-1', + expect.any(String), + scope + ) }) it('resolves current workspace-key billing while retaining key audit attribution', async () => { diff --git a/apps/sim/lib/knowledge/application/documents.ts b/apps/sim/lib/knowledge/application/documents.ts index 90e9e5f04cd..dc584acb7ac 100644 --- a/apps/sim/lib/knowledge/application/documents.ts +++ b/apps/sim/lib/knowledge/application/documents.ts @@ -329,7 +329,7 @@ export const listKnowledgeDocuments = defineAuthorizedKnowledgeUseCase({ tagFilters: tagFilters.length > 0 ? tagFilters : undefined, }, generateRequestId(), - context.organizationId ? context.access : await context.access.get() + context.access ) return { ...result, @@ -682,7 +682,7 @@ export const upsertKnowledgeDocument = defineAuthorizedKnowledgeUseCase({ ] let existingDocumentId: string | null = null for await (const accessCondition of knowledgeReadAccessBatches( - context.organizationId ? context.access : await context.access.get(), + context.access, lookupConditions )) { const [existing] = await db @@ -1027,7 +1027,7 @@ export const bulkUpdateKnowledgeDocuments = defineAuthorizedKnowledgeUseCase({ context.knowledgeBaseId, input.operation, input.enabledFilter, - context.organizationId ? context.access : await context.access.get(), + context.access, generateRequestId() ) : input.documentIds?.length @@ -1035,7 +1035,7 @@ export const bulkUpdateKnowledgeDocuments = defineAuthorizedKnowledgeUseCase({ context.knowledgeBaseId, input.operation, input.documentIds, - context.organizationId ? context.access : await context.access.get(), + context.access, generateRequestId() ) : null diff --git a/apps/sim/lib/knowledge/application/knowledge-bases.test.ts b/apps/sim/lib/knowledge/application/knowledge-bases.test.ts index c4ecf6a6a05..a0167a92c25 100644 --- a/apps/sim/lib/knowledge/application/knowledge-bases.test.ts +++ b/apps/sim/lib/knowledge/application/knowledge-bases.test.ts @@ -12,6 +12,7 @@ const mocks = vi.hoisted(() => ({ resolveArchivedKnowledgeBase: vi.fn(), resolvePermission: vi.fn(), resolveAccess: vi.fn(), + createAccessProvider: vi.fn(), attachConnectors: vi.fn(), resolveFolderPath: vi.fn(), createRecord: vi.fn(), @@ -49,7 +50,7 @@ vi.mock('@sim/platform-authz/workspace', () => ({ })) vi.mock('@/lib/knowledge/access/scope', () => ({ - resolveKnowledgeAccessScope: mocks.resolveAccess, + createKnowledgeAccessProvider: mocks.createAccessProvider, })) vi.mock('@/lib/core/telemetry', () => ({ @@ -143,6 +144,7 @@ describe('knowledge base application use cases', () => { beforeEach(() => { vi.clearAllMocks() mocks.resolveAccess.mockResolvedValue({ kind: 'workspace', tokens: ['workspace', 'public'] }) + mocks.createAccessProvider.mockReturnValue({ get: mocks.resolveAccess }) mocks.attachConnectors.mockImplementation(async (kb) => kb) mocks.resolveWorkspace.mockResolvedValue(context) mocks.loadAuthorizationWorkspace.mockResolvedValue(context) @@ -226,7 +228,7 @@ describe('knowledge base application use cases', () => { { forUpdate: undefined } ) expect(mocks.listRecords).toHaveBeenCalledWith('workspace-1', 'archived', { - access: expect.objectContaining({ kind: 'workspace' }), + access: expect.objectContaining({ get: mocks.resolveAccess }), }) }) @@ -247,7 +249,7 @@ describe('knowledge base application use cases', () => { ).resolves.toEqual({ knowledgeBases: [knowledgeBase] }) expect(mocks.listRecords).toHaveBeenCalledWith('workspace-1', 'active', { - access: expect.objectContaining({ kind: 'workspace' }), + access: expect.objectContaining({ get: mocks.resolveAccess }), }) }) @@ -674,7 +676,7 @@ describe('knowledge base application use cases', () => { }) expect(mocks.listRecords).toHaveBeenCalledWith('workspace-1', 'archived', { - access: expect.objectContaining({ kind: 'workspace' }), + access: expect.objectContaining({ get: mocks.resolveAccess }), folderId: undefined, search: 'docs', sortBy: 'updatedAt', diff --git a/apps/sim/lib/knowledge/application/knowledge-bases.ts b/apps/sim/lib/knowledge/application/knowledge-bases.ts index 95e7be71eda..76fea95ae96 100644 --- a/apps/sim/lib/knowledge/application/knowledge-bases.ts +++ b/apps/sim/lib/knowledge/application/knowledge-bases.ts @@ -16,7 +16,7 @@ import { OrchestrationError } from '@/lib/core/orchestration/types' import { PlatformEvents } from '@/lib/core/telemetry' import { generateRequestId } from '@/lib/core/utils/request' import { loadActiveFolderPathIndex, resolveFolderPathFilter } from '@/lib/folders/queries' -import { resolveKnowledgeAccessScope } from '@/lib/knowledge/access/scope' +import { createKnowledgeAccessProvider } from '@/lib/knowledge/access/scope' import { knowledgeDelegationPolicy } from '@/lib/knowledge/application/authorization' import { defineAuthorizedKnowledgeUseCase } from '@/lib/knowledge/application/authorized-knowledge-use-case' import { @@ -277,7 +277,7 @@ async function executeListKnowledgeBases(args: { sortOrder: args.input.sortOrder, limit: args.input.limit, cursorKeys: args.input.cursorKeys, - access: await resolveKnowledgeAccessScope(args.principal, args.context), + access: createKnowledgeAccessProvider(args.principal, args.context), }) return { knowledgeBases: page.data.map((knowledgeBase) => ({ @@ -349,7 +349,7 @@ async function executeReadKnowledgeBase(args: { return { knowledgeBase: await attachKnowledgeBaseConnectors( args.context.knowledgeBase, - await args.context.access.get() + args.context.access ), folderPath: knowledgeFolderPathForId(index, args.context.knowledgeBase.folderId), } @@ -389,10 +389,7 @@ async function executeUpdateKnowledgeBase(args: { knowledgeBaseId: knowledgeBase.id, }) return { - knowledgeBase: await attachKnowledgeBaseConnectors( - knowledgeBase, - await args.context.access.get() - ), + knowledgeBase: await attachKnowledgeBaseConnectors(knowledgeBase, args.context.access), folderPath: knowledgeFolderPathForId(index, knowledgeBase.folderId), } } @@ -505,7 +502,7 @@ export const restoreKnowledgeBase = defineAuthorizedKnowledgeUseCase({ return { knowledgeBase: await attachKnowledgeBaseConnectors( knowledgeBase, - await resolveKnowledgeAccessScope(principal, context) + createKnowledgeAccessProvider(principal, context) ), folderPath: knowledgeFolderPathForId(index, knowledgeBase.folderId), restored, @@ -549,7 +546,7 @@ export const listInternalKnowledgeBases = { const { data: knowledgeBases } = await getWorkspaceKnowledgeBases( context.workspaceId, input.scope, - { access: await resolveKnowledgeAccessScope(principal, context) } + { access: createKnowledgeAccessProvider(principal, context) } ) return { knowledgeBases } }, @@ -735,7 +732,7 @@ export const readInternalKnowledgeBase = { return { knowledgeBase: await attachKnowledgeBaseConnectors( knowledgeBase, - await resolveKnowledgeAccessScope(principal, { + createKnowledgeAccessProvider(principal, { workspaceId: knowledgeBase.workspaceId, }) ), @@ -794,7 +791,7 @@ export const updateInternalKnowledgeBase = { return { knowledgeBase: await attachKnowledgeBaseConnectors( outcome.knowledgeBase, - await resolveKnowledgeAccessScope(principal, { + createKnowledgeAccessProvider(principal, { workspaceId: outcome.knowledgeBase.workspaceId ?? undefined, }) ), diff --git a/apps/sim/lib/knowledge/application/search.test.ts b/apps/sim/lib/knowledge/application/search.test.ts index 86bc9e8a76f..abbb70f08f9 100644 --- a/apps/sim/lib/knowledge/application/search.test.ts +++ b/apps/sim/lib/knowledge/application/search.test.ts @@ -750,7 +750,7 @@ describe('knowledge search application use case', () => { expect(mocks.getDocumentMetadata).toHaveBeenCalledWith( ['document-1'], expect.anything(), - undefined, + expect.objectContaining({ getForDocuments: expect.any(Function) }), undefined ) expect(result.results[0]).toMatchObject({ diff --git a/apps/sim/lib/knowledge/application/search.ts b/apps/sim/lib/knowledge/application/search.ts index c5d83ca908a..7e1d6d0da95 100644 --- a/apps/sim/lib/knowledge/application/search.ts +++ b/apps/sim/lib/knowledge/application/search.ts @@ -372,7 +372,7 @@ export const searchKnowledge = defineAuthorizedKnowledgeUseCase({ topK: candidateTopK, filters: input.filters, access, - accessProvider: context.organizationId ? context.access : undefined, + accessProvider: context.access, signal: input.signal, searchMode: searchDefaults.searchMode, boostRecency: searchDefaults.boostRecency, @@ -574,7 +574,7 @@ export const searchKnowledge = defineAuthorizedKnowledgeUseCase({ const basicDocumentMetadata = await getDocumentMetadataByIds( rows.map((row) => row.documentId), access, - context.organizationId ? context.access : undefined, + context.access, input.signal ) const results = rows diff --git a/apps/sim/lib/knowledge/application/tags.test.ts b/apps/sim/lib/knowledge/application/tags.test.ts index 19101ed687f..5dbd277113d 100644 --- a/apps/sim/lib/knowledge/application/tags.test.ts +++ b/apps/sim/lib/knowledge/application/tags.test.ts @@ -16,6 +16,7 @@ const mocks = vi.hoisted(() => ({ updateTag: vi.fn(), deleteTag: vi.fn(), readUsage: vi.fn(), + readDetailedUsage: vi.fn(), saveTags: vi.fn(), cleanupTags: vi.fn(), deleteAllTags: vi.fn(), @@ -53,6 +54,7 @@ vi.mock('@/lib/knowledge/tags/service', () => ({ updateTagDefinition: mocks.updateTag, deleteTagDefinition: mocks.deleteTag, getTagUsageStats: mocks.readUsage, + getTagUsage: mocks.readDetailedUsage, normalizeDisplayName: (displayName: string) => displayName.trim().toLowerCase(), createOrUpdateTagDefinitionsBulk: mocks.saveTags, cleanupUnusedTagDefinitions: mocks.cleanupTags, @@ -65,6 +67,7 @@ import { deleteKnowledgeDocumentTagDefinitions, deleteKnowledgeTag, listKnowledgeTags, + readDetailedKnowledgeTagUsage, readKnowledgeTagUsage, readNextKnowledgeTagSlot, saveKnowledgeDocumentTagDefinitions, @@ -72,7 +75,11 @@ import { } from '@/lib/knowledge/application/tags' /** Every mocked context carries the workspace read scope the resolvers would attach. */ -const knowledgeAccess = { get: async () => WORKSPACE_ACCESS_SCOPE } +const knowledgeAccess = { + get: async () => WORKSPACE_ACCESS_SCOPE, + getForConnectors: async () => WORKSPACE_ACCESS_SCOPE, + getForDocuments: async () => WORKSPACE_ACCESS_SCOPE, +} const crossWorkspaceContext = { access: knowledgeAccess, @@ -136,6 +143,18 @@ describe('knowledge tag application use cases', () => { mocks.listTags.mockResolvedValue([]) }) + it('retains live workspace access in summary and detailed tag counts', async () => { + const input = { knowledgeBaseId: 'knowledge-b', assertedWorkspaceId: 'workspace-b' } + await readKnowledgeTagUsage.execute({ principal: sessionPrincipal, input }) + await readDetailedKnowledgeTagUsage.execute({ principal: sessionPrincipal, input }) + expect(mocks.readUsage).toHaveBeenCalledWith('knowledge-b', knowledgeAccess, expect.any(String)) + expect(mocks.readDetailedUsage).toHaveBeenCalledWith( + 'knowledge-b', + expect.any(String), + knowledgeAccess + ) + }) + it.each([ [ 'list', diff --git a/apps/sim/lib/knowledge/application/tags.ts b/apps/sim/lib/knowledge/application/tags.ts index dd8b9a56c8f..9bf78e6f0e9 100644 --- a/apps/sim/lib/knowledge/application/tags.ts +++ b/apps/sim/lib/knowledge/application/tags.ts @@ -355,11 +355,7 @@ export const readKnowledgeTagUsage = defineAuthorizedKnowledgeUseCase({ resolveActiveKnowledgeResourceContext(input, principal), async execute({ context }) { return { - usage: await getTagUsageStats( - context.knowledgeBaseId, - context.organizationId ? context.access : await context.access.get(), - generateRequestId() - ), + usage: await getTagUsageStats(context.knowledgeBaseId, context.access, generateRequestId()), } }, }) @@ -370,11 +366,7 @@ export const readDetailedKnowledgeTagUsage = defineAuthorizedKnowledgeUseCase({ resolveActiveKnowledgeResourceContext(input, principal), async execute({ context }) { return { - usage: await getTagUsage( - context.knowledgeBaseId, - generateRequestId(), - context.organizationId ? context.access : await context.access.get() - ), + usage: await getTagUsage(context.knowledgeBaseId, generateRequestId(), context.access), } }, }) diff --git a/apps/sim/lib/knowledge/documents/service.test.ts b/apps/sim/lib/knowledge/documents/service.test.ts index 974a5e3fdd1..d2cbd4f456c 100644 --- a/apps/sim/lib/knowledge/documents/service.test.ts +++ b/apps/sim/lib/knowledge/documents/service.test.ts @@ -4,7 +4,11 @@ import { dbChainMockFns, queueTableRows, resetDbChainMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { WORKSPACE_ACCESS_SCOPE } from '@/lib/knowledge/access/scope' import type { KnowledgeAccessProvider, KnowledgeAccessScope } from '@/lib/knowledge/access/types' -import { getDocuments } from '@/lib/knowledge/documents/service' +import { + getDocuments, + getKnowledgeDocument, + getKnowledgeDocumentById, +} from '@/lib/knowledge/documents/service' beforeEach(() => { vi.clearAllMocks() @@ -52,3 +56,40 @@ describe('getDocuments pagination', () => { expect(result.documents).toMatchObject([{ id: 'newly-readable', filename: 'Visible file' }]) }) }) + +describe('knowledge document detail live authorization', () => { + it.each(['parent', 'canonical'] as const)( + 'authorizes a %s lookup before reading document fields', + async (lookup) => { + const identity: KnowledgeAccessScope = { kind: 'user', userId: 'reader', tokens: [] } + const getForDocuments = vi.fn(async () => { + expect(dbChainMockFns.select).not.toHaveBeenCalled() + return identity + }) + const access: KnowledgeAccessProvider = { + get: async () => identity, + getForConnectors: async () => identity, + getForDocuments, + } + queueTableRows(document, [{ id: 'document-1', filename: 'Readable page' }]) + const result = + lookup === 'parent' + ? await getKnowledgeDocument('knowledge-1', 'document-1', access) + : await getKnowledgeDocumentById('document-1', access) + expect(getForDocuments).toHaveBeenCalledExactlyOnceWith(['document-1']) + expect(result).toMatchObject({ id: 'document-1', filename: 'Readable page' }) + } + ) + + it('does not hydrate a document after source authorization fails', async () => { + const access: KnowledgeAccessProvider = { + get: vi.fn(), + getForConnectors: vi.fn(), + getForDocuments: vi.fn().mockRejectedValue(new Error('reader revoked')), + } + await expect(getKnowledgeDocument('knowledge-1', 'document-1', access)).rejects.toThrow( + 'reader revoked' + ) + expect(dbChainMockFns.select).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index 7b962342a17..baa3a7f4309 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -78,7 +78,6 @@ import { type KnowledgeAccessScope, MAX_KNOWLEDGE_ACCESS_CANDIDATES, SYSTEM_ACCESS_SCOPE, - type SystemAccessScope, } from '@/lib/knowledge/access/types' import { assertSyncLeaseHeldInTx, type SyncWriteLease } from '@/lib/knowledge/connectors/sync-lock' import { @@ -2742,8 +2741,9 @@ export type ActiveKnowledgeDocument = typeof document.$inferSelect & { export async function getKnowledgeDocument( knowledgeBaseId: string, documentId: string, - access: KnowledgeAccessScope | SystemAccessScope + access: KnowledgeReadAccess ): Promise { + const scope = 'get' in access ? await access.getForDocuments([documentId]) : access const [row] = await db .select({ ...getTableColumns(document), @@ -2758,7 +2758,7 @@ export async function getKnowledgeDocument( eq(document.userExcluded, false), isNull(document.archivedAt), isNull(document.deletedAt), - knowledgeAccessCondition(access) + knowledgeAccessCondition(scope) ) ) .limit(1) @@ -2769,8 +2769,9 @@ export async function getKnowledgeDocument( /** Loads one visible document by its canonical ID before any asserted parent is trusted. */ export async function getKnowledgeDocumentById( documentId: string, - access: KnowledgeAccessScope | SystemAccessScope + access: KnowledgeReadAccess ): Promise { + const scope = 'get' in access ? await access.getForDocuments([documentId]) : access const [row] = await db .select({ ...getTableColumns(document), @@ -2784,7 +2785,7 @@ export async function getKnowledgeDocumentById( eq(document.userExcluded, false), isNull(document.archivedAt), isNull(document.deletedAt), - knowledgeAccessCondition(access) + knowledgeAccessCondition(scope) ) ) .limit(1) diff --git a/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts b/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts index 76e6ef77d8c..977a5997ef7 100644 --- a/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts +++ b/apps/sim/lib/knowledge/search/queries-github-discovery.test.ts @@ -61,7 +61,7 @@ describe('GitHub discovery through the request access provider', () => { id: 'gmail', documentId: 'gmail-doc', connectorId: 'gmail-source', - installationSource: false, + liveAuthorizationSource: false, }, ]) const hydrated = [{ id: 'gmail', content: 'permitted content' }] @@ -95,13 +95,13 @@ describe('GitHub discovery through the request access provider', () => { id: 'github', documentId: 'github-doc', connectorId: 'classic-github', - installationSource: false, + liveAuthorizationSource: false, }, { id: 'github-second', documentId: 'github-doc', connectorId: 'classic-github', - installationSource: false, + liveAuthorizationSource: false, }, ]) queueTableRows(schemaMock.embedding, [{ id: 'github', content: 'permitted content' }]) @@ -137,7 +137,7 @@ describe('GitHub discovery through the request access provider', () => { const { provider, access } = await createReaderProvider() dbChainMockFns.from.mockClear() queueTableRows(schemaMock.embedding, [ - { id: 'upload', documentId: 'upload-doc', connectorId: null, installationSource: false }, + { id: 'upload', documentId: 'upload-doc', connectorId: null, liveAuthorizationSource: false }, ]) const hydrated = [{ id: 'upload', content: 'permitted content' }] queueTableRows(schemaMock.embedding, hydrated) diff --git a/apps/sim/lib/knowledge/search/queries.test.ts b/apps/sim/lib/knowledge/search/queries.test.ts index 49dd48de8c9..bb56e09e2d7 100644 --- a/apps/sim/lib/knowledge/search/queries.test.ts +++ b/apps/sim/lib/knowledge/search/queries.test.ts @@ -497,7 +497,7 @@ describe('live repository authorization follows ranked candidates', () => { id, documentId: `doc-${id}`, connectorId, - installationSource: true, + liveAuthorizationSource: true, distance: 0.1, }) const getForConnectors = vi.fn() @@ -547,7 +547,7 @@ describe('live repository authorization follows ranked candidates', () => { 'id', 'documentId', 'connectorId', - 'installationSource', + 'liveAuthorizationSource', ...(mode === 'keyword' ? ['keywordRank'] : mode === 'tags' ? [] : ['distance']), ].sort() ) @@ -665,6 +665,43 @@ describe('live repository authorization follows ranked candidates', () => { expect(refillPredicate).toContain('revoked-source') }) + it.each([undefined, 'confluence'])( + 'refills a denied Confluence site under its exact reader proof with source filter %s', + async (source) => { + getForConnectors.mockResolvedValueOnce(identity).mockResolvedValueOnce({ + ...identity, + confluenceSiteGrants: [ + { + connectorId: 'allowed-site', + contentCredentialId: 'crawler', + readerCredentialId: 'confluence-reader', + readerSubjectToken: 's:confluence:-:alice', + domain: 'company.atlassian.net', + cloudId: 'cloud-1', + }, + ], + }) + queueTableRows(schemaMock.embedding, [candidate('denied', 'revoked-site')]) + queueTableRows(schemaMock.embedding, []) + queueTableRows(schemaMock.embedding, [candidate('selected', 'allowed-site')]) + queueTableRows(schemaMock.embedding, [ + { id: 'selected', content: 'authorized Confluence page' }, + ]) + expect(await handleTagOnlySearch({ ...params, filters: { source } })).toEqual([ + { id: 'selected', content: 'authorized Confluence page' }, + ]) + expect(getForConnectors.mock.calls.map(([ids]) => ids)).toEqual([ + ['revoked-site'], + ['allowed-site'], + ]) + expect(dbChainMockFns.offset.mock.calls).toEqual([[0], [0]]) + expect(JSON.stringify(dbChainMockFns.where.mock.calls[2][0])).toContain('revoked-site') + const readPredicate = JSON.stringify(dbChainMockFns.where.mock.calls[3][0]) + expect(readPredicate).toContain('confluence_read_grant') + expect(readPredicate).toContain('confluence-reader') + expect(readPredicate).toContain('company.atlassian.net') + } + ) it('retains a completed authorized result when the next candidate page exhausts its deadline', async () => { vi.useFakeTimers() vi.setSystemTime(new Date(10000)) diff --git a/apps/sim/lib/knowledge/search/queries.ts b/apps/sim/lib/knowledge/search/queries.ts index cecc89281b1..fc7b69969ab 100644 --- a/apps/sim/lib/knowledge/search/queries.ts +++ b/apps/sim/lib/knowledge/search/queries.ts @@ -428,7 +428,7 @@ interface SearchReadCandidate { id: string documentId: string connectorId: string | null - installationSource: boolean + liveAuthorizationSource: boolean } /** Only opaque identifiers leave candidate ranking; content stays behind the full read predicate. */ @@ -436,11 +436,15 @@ const SEARCH_READ_CANDIDATE_FIELDS = { id: embedding.id, documentId: document.id, connectorId: document.connectorId, - installationSource: sql`EXISTS ( + liveAuthorizationSource: sql`EXISTS ( SELECT 1 FROM ${knowledgeConnector} WHERE ${knowledgeConnector.id} = ${document.connectorId} - AND ${knowledgeConnector.connectorType} = 'github' - AND ${knowledgeConnector.sourceConfig}::jsonb ? 'githubRepositoryId' + AND ( + (${knowledgeConnector.connectorType} = 'github' + AND ${knowledgeConnector.sourceConfig}::jsonb ? 'githubRepositoryId') + OR (${knowledgeConnector.connectorType} = 'confluence' + AND ${knowledgeConnector.accessMode} = 'admin') + ) )`, } @@ -449,7 +453,7 @@ const LIVE_SEARCH_BUDGET_MS = 8000 /** * Verification follows ranked candidates, never the organization's source order. Denied - * repositories are excluded on refill, so many matches from one revoked source cannot + * sources are excluded on refill, so many matches from one revoked source cannot * consume every result slot. The existing vector tuple budget also bounds candidate work. */ async function selectAuthorizedSearchResults(input: { @@ -481,7 +485,9 @@ async function selectAuthorizedSearchResults(input: { scanned += candidates.length /** Candidate and hydration queries enforce this source filter; connector types are immutable. */ const connectorIds = - input.filters?.source && input.filters.source !== 'github' + input.filters?.source && + input.filters.source !== 'github' && + input.filters.source !== 'confluence' ? [] : [ ...new Set( @@ -494,13 +500,16 @@ async function selectAuthorizedSearchResults(input: { input.signal?.throwIfAborted() const grantedSources = new Set( access.kind === 'user' - ? (access.githubInstallationGrants?.map((grant) => grant.connectorId) ?? []) + ? [ + ...(access.githubInstallationGrants?.map((grant) => grant.connectorId) ?? []), + ...(access.confluenceSiteGrants?.map((grant) => grant.connectorId) ?? []), + ] : [] ) const excludedBefore = excludedSources.size for (const candidate of candidates) { if ( - candidate.installationSource && + candidate.liveAuthorizationSource && candidate.connectorId && !grantedSources.has(candidate.connectorId) ) diff --git a/apps/sim/lib/knowledge/service.test.ts b/apps/sim/lib/knowledge/service.test.ts index b27489f6e9e..bd8a8780ac1 100644 --- a/apps/sim/lib/knowledge/service.test.ts +++ b/apps/sim/lib/knowledge/service.test.ts @@ -11,6 +11,8 @@ import { schemaMock, } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { KnowledgeAccessProvider } from '@/lib/knowledge/access/types' +import type { KnowledgeBaseWithCounts } from '@/lib/knowledge/types' const { mockApplyStorageUsageDeltasInTx, @@ -30,6 +32,7 @@ vi.mock('@/lib/billing/storage', () => ({ })) import { + attachKnowledgeBaseConnectors, findActiveKnowledgeBasesByExactName, getActiveKnowledgeBaseReference, getActiveKnowledgeBaseReferences, @@ -511,3 +514,89 @@ describe('updateKnowledgeBase — file ownership binding re-point on workspace c expect(dbChainMockFns.update).toHaveBeenCalledTimes(1) }) }) + +describe('knowledge base counts with live source permissions', () => { + beforeEach(() => { + vi.clearAllMocks() + resetDbChainMock() + }) + + function reader() { + const scope = { kind: 'user' as const, userId: 'reader', tokens: ['reader-token'] } + const getForConnectors = vi.fn().mockResolvedValue({ + ...scope, + confluenceSiteGrants: [ + { + cloudId: 'cloud-1', + connectorId: 'confluence-source', + contentCredentialId: 'crawler', + readerCredentialId: 'reader-credential', + readerSubjectToken: 'reader-token', + domain: 'team.atlassian.net', + }, + ], + }) + const access: KnowledgeAccessProvider = { + get: async () => scope, + getForConnectors, + getForDocuments: async () => scope, + } + return { access, getForConnectors } + } + + it('sums ordinary and live-authorized documents once in a paginated list', async () => { + const { access, getForConnectors } = reader() + queueTableRows(schemaMock.knowledgeBase, [ + { + id: 'kb-1', + workspaceId: 'ws-1', + chunkingConfig: {}, + docCount: 99, + tokenCount: 999, + createdAt: new Date('2026-01-01'), + }, + ]) + queueTableRows(schemaMock.document, [{ knowledgeBaseId: 'kb-1', docCount: 2, tokenCount: 10 }]) + queueTableRows(schemaMock.document, [{ connectorId: 'confluence-source' }]) + queueTableRows(schemaMock.document, [{ knowledgeBaseId: 'kb-1', docCount: 3, tokenCount: 20 }]) + const result = await getWorkspaceKnowledgeBases('ws-1', 'active', { access, limit: 2 }) + expect(result.data).toHaveLength(1) + expect(result.data[0]).toMatchObject({ docCount: 5, tokenCount: 30 }) + expect(getForConnectors).toHaveBeenCalledExactlyOnceWith(['confluence-source'], undefined) + expect(dbChainMockFns.selectDistinct).toHaveBeenCalledWith({ + connectorId: schemaMock.document.connectorId, + }) + expect( + dbChainMockFns.where.mock.calls.every( + ([condition]) => + hasMockCondition( + condition, + (node) => node.type === 'inArray' && node.column === schemaMock.knowledgeBase.id + ) || + hasMockCondition( + condition, + (node) => node.type === 'eq' && node.left === schemaMock.knowledgeBase.workspaceId + ) || + hasMockCondition( + condition, + (node) => + node.type === 'inArray' && + node.column === schemaMock.knowledgeConnector.knowledgeBaseId + ) + ) + ).toBe(true) + }) + + it('does not retain stale totals when a live source no longer authorizes its documents', async () => { + const { access, getForConnectors } = reader() + queueTableRows(schemaMock.document, []) + queueTableRows(schemaMock.document, [{ connectorId: 'confluence-source' }]) + queueTableRows(schemaMock.document, []) + const base = { id: 'kb-1', docCount: 5, tokenCount: 50 } as KnowledgeBaseWithCounts + await expect(attachKnowledgeBaseConnectors(base, access)).resolves.toMatchObject({ + docCount: 0, + tokenCount: 0, + }) + expect(getForConnectors).toHaveBeenCalledOnce() + }) +}) diff --git a/apps/sim/lib/knowledge/service.ts b/apps/sim/lib/knowledge/service.ts index 1bd2285032b..0cff654809d 100644 --- a/apps/sim/lib/knowledge/service.ts +++ b/apps/sim/lib/knowledge/service.ts @@ -34,8 +34,9 @@ import { generateRestoreName } from '@/lib/core/utils/restore-name' import { findActiveFolder, resolveRestoredFolderId } from '@/lib/folders/queries' import { isKnowledgeMemberAccessAvailable } from '@/lib/knowledge/access/availability' import { knowledgeAccessCondition } from '@/lib/knowledge/access/predicate' -import type { KnowledgeAccessScope } from '@/lib/knowledge/access/types' +import { MAX_KNOWLEDGE_ACCESS_CANDIDATES } from '@/lib/knowledge/access/types' import { mirrorsSourceAcls } from '@/lib/knowledge/connectors/access-modes' +import { type KnowledgeReadAccess, knowledgeReadAccessBatches } from '@/lib/knowledge/read-access' import type { ChunkingConfig, CreateKnowledgeBaseData, @@ -139,7 +140,7 @@ const KNOWLEDGE_BASE_SORTS = { } satisfies Record[]> export interface GetKnowledgeBasesOptions { - access?: KnowledgeAccessScope + access?: KnowledgeReadAccess /** Restrict to one knowledge-base folder; `undefined` lists all and `null` lists the root. */ folderId?: string | null /** Case-insensitive substring match on the knowledge base name. */ @@ -169,7 +170,7 @@ async function readKnowledgeBaseRows( where: SQL | undefined, orderBy: SQL[], limit?: number, - access?: KnowledgeAccessScope + access?: KnowledgeReadAccess ): Promise< Array> > { @@ -200,7 +201,7 @@ async function readKnowledgeBaseRows( eq(document.userExcluded, false), isNull(document.archivedAt), isNull(document.deletedAt), - access ? knowledgeAccessCondition(access) : undefined + access ? ('get' in access ? sql`false` : knowledgeAccessCondition(access)) : undefined ) ) .where(where) @@ -209,13 +210,64 @@ async function readKnowledgeBaseRows( const rows = limit === undefined ? await query : await query.limit(limit) + const counts = + access && 'get' in access + ? await readKnowledgeBaseDocumentCounts( + rows.map((kb) => kb.id), + access + ) + : undefined return rows.map((kb) => ({ ...kb, chunkingConfig: kb.chunkingConfig as ChunkingConfig, - docCount: Number(kb.docCount), + docCount: counts ? (counts.get(kb.id)?.docCount ?? 0) : Number(kb.docCount), + tokenCount: counts ? (counts.get(kb.id)?.tokenCount ?? 0) : kb.tokenCount, })) } +/** Counts only hydrated access batches, keeping candidate discovery free of document metadata. */ +async function readKnowledgeBaseDocumentCounts( + knowledgeBaseIds: readonly string[], + access: KnowledgeReadAccess +): Promise> { + const counts = new Map() + for ( + let offset = 0; + offset < knowledgeBaseIds.length; + offset += MAX_KNOWLEDGE_ACCESS_CANDIDATES + ) { + const conditions = [ + inArray( + knowledgeBase.id, + knowledgeBaseIds.slice(offset, offset + MAX_KNOWLEDGE_ACCESS_CANDIDATES) + ), + eq(document.userExcluded, false), + isNull(document.archivedAt), + isNull(document.deletedAt), + ] + for await (const accessCondition of knowledgeReadAccessBatches(access, conditions)) { + const rows = await db + .select({ + knowledgeBaseId: document.knowledgeBaseId, + docCount: count(), + tokenCount: sql`COALESCE(SUM(${document.tokenCount}), 0)`.mapWith(Number), + }) + .from(document) + .innerJoin(knowledgeBase, eq(document.knowledgeBaseId, knowledgeBase.id)) + .where(and(...conditions, accessCondition)) + .groupBy(document.knowledgeBaseId) + for (const row of rows) { + const previous = counts.get(row.knowledgeBaseId) + counts.set(row.knowledgeBaseId, { + docCount: (previous?.docCount ?? 0) + Number(row.docCount), + tokenCount: (previous?.tokenCount ?? 0) + Number(row.tokenCount), + }) + } + } + } + return counts +} + async function attachConnectorTypes( knowledgeBases: Array< Omit @@ -963,26 +1015,16 @@ export async function getKnowledgeBaseById( */ export async function attachKnowledgeBaseConnectors( knowledgeBase: KnowledgeBaseWithCounts, - access?: KnowledgeAccessScope + access?: KnowledgeReadAccess ): Promise { let visible = knowledgeBase if (access) { - const [counts] = await db - .select({ - docCount: count(), - tokenCount: sql`COALESCE(SUM(${document.tokenCount}), 0)`.mapWith(Number), - }) - .from(document) - .where( - and( - eq(document.knowledgeBaseId, knowledgeBase.id), - eq(document.userExcluded, false), - isNull(document.archivedAt), - isNull(document.deletedAt), - knowledgeAccessCondition(access) - ) - ) - visible = { ...knowledgeBase, docCount: Number(counts.docCount), tokenCount: counts.tokenCount } + const counts = await readKnowledgeBaseDocumentCounts([knowledgeBase.id], access) + visible = { + ...knowledgeBase, + docCount: counts.get(knowledgeBase.id)?.docCount ?? 0, + tokenCount: counts.get(knowledgeBase.id)?.tokenCount ?? 0, + } } const [withConnectors] = await attachConnectorTypes([visible]) return withConnectors diff --git a/apps/sim/lib/oauth/utils.test.ts b/apps/sim/lib/oauth/utils.test.ts index 37c4320c7c7..830761fc1f6 100644 --- a/apps/sim/lib/oauth/utils.test.ts +++ b/apps/sim/lib/oauth/utils.test.ts @@ -424,6 +424,11 @@ describe('getCanonicalScopesForProvider', () => { }) describe('getScopeDescription', () => { + it('describes Confluence directory access', () => { + expect(getScopeDescription('read:group:confluence', 'confluence')).toBe( + 'View Confluence groups and memberships' + ) + }) it.concurrent('uses provider-specific labels for Bitbucket scope names', () => { expect(getScopeDescription('account', 'bitbucket')).toBe( 'View your Bitbucket account and workspace memberships' diff --git a/apps/sim/lib/oauth/utils.ts b/apps/sim/lib/oauth/utils.ts index c7f72c730dd..39613c6cd32 100644 --- a/apps/sim/lib/oauth/utils.ts +++ b/apps/sim/lib/oauth/utils.ts @@ -109,6 +109,7 @@ export const SCOPE_DESCRIPTIONS: Record = { 'read:hierarchical-content:confluence': 'View page hierarchy (children and ancestors)', 'read:content.metadata:confluence': 'View content metadata (required for ancestors)', 'read:user:confluence': 'View Confluence user profiles', + 'read:group:confluence': 'View Confluence groups and memberships', 'read:confluence-user': 'View Confluence user profiles (v1 API)', 'read:task:confluence': 'View Confluence inline tasks', 'write:task:confluence': 'Update Confluence inline tasks', diff --git a/apps/sim/lib/selectors/manifest.test.ts b/apps/sim/lib/selectors/manifest.test.ts index 76d9c47e0ff..e9cb015bf5f 100644 --- a/apps/sim/lib/selectors/manifest.test.ts +++ b/apps/sim/lib/selectors/manifest.test.ts @@ -9,8 +9,8 @@ describe('selector manifest', () => { const count = (classification: (typeof classifications)[number]) => classifications.filter((value) => value === classification).length - expect(Object.keys(selectorManifest)).toHaveLength(96) - expect(count('provider-server')).toBe(83) + expect(Object.keys(selectorManifest)).toHaveLength(97) + expect(count('provider-server')).toBe(84) expect(count('internal-server')).toBe(12) expect(count('local')).toBe(1) expect(classifications).not.toContain('provider-legacy') @@ -36,7 +36,7 @@ describe('selector manifest', () => { const rawConnectionKeys = providerKeys.filter( (key) => !serverSelectorRegistry[key as keyof typeof serverSelectorRegistry].credential ) - expect(providerKeys).toHaveLength(83) + expect(providerKeys).toHaveLength(84) expect(rawConnectionKeys.sort()).toEqual([ 'cloudwatch.logGroups', 'cloudwatch.logStreams', @@ -110,7 +110,7 @@ describe('selector manifest', () => { } }) - it('preserves credential-use auditing only for the seven legacy-audited selectors', () => { + it('preserves credential-use auditing for the declared selectors', () => { const auditedKeys = Object.entries(serverSelectorRegistry) .flatMap(([key, attachment]) => (attachment.auditCredentialUse ? [key] : [])) .sort() @@ -118,6 +118,7 @@ describe('selector manifest', () => { expect(auditedKeys).toEqual([ 'confluence.pages', 'jira.issues', + 'jira.projectKeys', 'jira.projects', 'managedAgent.agents', 'managedAgent.environments', diff --git a/apps/sim/lib/selectors/manifest.ts b/apps/sim/lib/selectors/manifest.ts index 418e0da162d..b6596873305 100644 --- a/apps/sim/lib/selectors/manifest.ts +++ b/apps/sim/lib/selectors/manifest.ts @@ -298,6 +298,12 @@ export const selectorManifest = { search: true, detail: true, }), + 'jira.projectKeys': providerSelector(['domain'], { + readiness: { all: ['oauthCredential', 'domain'] }, + listMode: 'paginated', + search: true, + detail: true, + }), 'linear.projects': providerSelector(['teamId'], { readiness: { all: ['oauthCredential', 'teamId'] }, listMode: 'paginated', diff --git a/apps/sim/lib/selectors/server/providers/jira.test.ts b/apps/sim/lib/selectors/server/providers/jira.test.ts index 5ddb6bd34f6..d4ea2fcf665 100644 --- a/apps/sim/lib/selectors/server/providers/jira.test.ts +++ b/apps/sim/lib/selectors/server/providers/jira.test.ts @@ -47,52 +47,71 @@ describe('Jira server selector adapter', () => { afterAll(() => vi.unstubAllGlobals()) - it('returns one project page and preserves provider search and continuation', async () => { - mockFetch.mockResolvedValueOnce( - new Response( - JSON.stringify({ - values: Array.from({ length: 50 }, (_, index) => ({ - id: `project-${index + 1}`, - name: `Payments ${index + 1}`, - })), - maxResults: 50, - isLast: false, - }), - { status: 200 } + it.each(['jira.projects', 'jira.projectKeys'] as const)( + 'returns one %s page and preserves provider search and continuation', + async (selectorKey) => { + mockFetch.mockResolvedValueOnce( + new Response( + JSON.stringify({ + values: Array.from({ length: 50 }, (_, index) => ({ + id: `project-${index + 1}`, + key: `PAY${index + 1}`, + name: `Payments ${index + 1}`, + })), + maxResults: 50, + isLast: false, + }), + { status: 200 } + ) ) - ) - await expect(jiraSelectorAttachments['jira.projects'].execute(args())).resolves.toEqual({ - kind: 'list', - items: Array.from({ length: 50 }, (_, index) => ({ - id: `project-${index + 1}`, - label: `Payments ${index + 1}`, - })), - nextCursor: '100', - }) - const url = new URL(String(mockFetch.mock.calls[0]?.[0])) - expect(url.searchParams.get('query')).toBe('payments') - expect(url.searchParams.get('startAt')).toBe('50') - expect(url.searchParams.get('maxResults')).toBe('50') - expect(mockFetch).toHaveBeenCalledTimes(1) - expect(mockResolveSelectorCredentialBundle).toHaveBeenCalledWith( - expect.objectContaining({ scopes: ['read:jira-work'] }) - ) - }) + await expect( + jiraSelectorAttachments[selectorKey].execute({ ...args(), selectorKey }) + ).resolves.toEqual({ + kind: 'list', + items: Array.from({ length: 50 }, (_, index) => ({ + id: selectorKey === 'jira.projectKeys' ? `PAY${index + 1}` : `project-${index + 1}`, + label: `Payments ${index + 1}`, + })), + nextCursor: '100', + }) + const url = new URL(String(mockFetch.mock.calls[0]?.[0])) + expect(url.searchParams.get('query')).toBe('payments') + expect(url.searchParams.get('startAt')).toBe('50') + expect(url.searchParams.get('maxResults')).toBe('50') + expect(mockFetch).toHaveBeenCalledTimes(1) + expect(mockResolveSelectorCredentialBundle).toHaveBeenCalledWith( + expect.objectContaining({ scopes: ['read:jira-work'] }) + ) + } + ) - it('preserves a requested project key when hydrating its label', async () => { - mockFetch.mockResolvedValueOnce( - new Response(JSON.stringify({ id: '10001', name: 'Engineering' }), { status: 200 }) - ) + it.each([ + ['jira.projects', 'ENG'], + ['jira.projectKeys', 'ENG'], + ['jira.projectKeys', '10001'], + ] as const)( + 'hydrates %s selection %s without replacing its saved value', + async (selectorKey, id) => { + mockFetch.mockResolvedValueOnce( + new Response(JSON.stringify({ id: '10001', key: 'ENG', name: 'Engineering' }), { + status: 200, + }) + ) - await expect( - jiraSelectorAttachments['jira.projects'].execute({ - ...args(), - request: { kind: 'detail', id: 'ENG' }, + await expect( + jiraSelectorAttachments[selectorKey].execute({ + ...args(), + selectorKey, + request: { kind: 'detail', id }, + }) + ).resolves.toEqual({ + kind: 'detail', + item: { id, label: 'Engineering' }, }) - ).resolves.toEqual({ - kind: 'detail', - item: { id: 'ENG', label: 'Engineering' }, - }) - }) + expect(String(mockFetch.mock.calls[0]?.[0])).toBe( + `https://api.atlassian.com/ex/jira/cloud-1/rest/api/3/project/${id}` + ) + } + ) }) diff --git a/apps/sim/lib/selectors/server/providers/jira.ts b/apps/sim/lib/selectors/server/providers/jira.ts index f6892a69517..bf5e028837a 100644 --- a/apps/sim/lib/selectors/server/providers/jira.ts +++ b/apps/sim/lib/selectors/server/providers/jira.ts @@ -15,7 +15,10 @@ import { type ServerSelectorAttachmentMap, } from '@/lib/selectors/server/types' -type JiraSelectorKey = Extract +type JiraSelectorKey = Extract< + ServerSelectorKey, + 'jira.projects' | 'jira.projectKeys' | 'jira.issues' +> const JIRA_SCOPES = ['read:jira-work'] const JIRA_PROJECTS_PAGE_SIZE = 50 @@ -23,6 +26,7 @@ const JIRA_ISSUES_LIMIT = 25 const jiraProjectSchema = z.object({ id: z.string().min(1).max(100), + key: z.string().min(1).max(100), name: z.string().min(1).max(1_000), }) @@ -125,7 +129,10 @@ async function listProjects(args: ExecuteServerSelectorArgs) { parsed.data.isLast === false || (parsed.data.isLast === undefined && values.length >= pageSize) return { - items: values.map((project) => ({ id: project.id, label: project.name })), + items: values.map((project) => ({ + id: args.selectorKey === 'jira.projectKeys' ? project.key : project.id, + label: project.name, + })), nextCursor: hasMore ? String(nextStartAt) : undefined, } } @@ -206,6 +213,12 @@ async function executeIssues(args: ExecuteServerSelectorArgs) { const credential = { kind: 'stored', field: 'oauthCredential', serviceIds: ['jira'] } as const export const jiraSelectorAttachments = { + 'jira.projectKeys': { + credential, + destination: 'fixed', + auditCredentialUse: true, + execute: executeProjects, + }, 'jira.projects': { credential, destination: 'fixed', diff --git a/apps/sim/lib/uploads/utils/user-file-base64.server.test.ts b/apps/sim/lib/uploads/utils/user-file-base64.server.test.ts index c9fe94f0725..49ac99226c9 100644 --- a/apps/sim/lib/uploads/utils/user-file-base64.server.test.ts +++ b/apps/sim/lib/uploads/utils/user-file-base64.server.test.ts @@ -3,6 +3,7 @@ */ import { redisConfigMockFns, resetRedisConfigMock } from '@sim/testing' import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest' +import type { KnowledgeAccessProvider } from '@/lib/knowledge/access/types' import { cleanupExecutionBase64Cache, hydrateUserFilesWithBase64, @@ -14,7 +15,7 @@ const { mockDownloadServableFileFromStorage, mockRedis, mockVerifyFileAccess, - mockResolveKnowledgeAccessScope, + mockCreateKnowledgeAccessProvider, } = vi.hoisted(() => { const mockRedis = { get: vi.fn(), @@ -32,7 +33,7 @@ const { mockDownloadServableFileFromStorage: vi.fn(), mockRedis, mockVerifyFileAccess: vi.fn(), - mockResolveKnowledgeAccessScope: vi.fn(), + mockCreateKnowledgeAccessProvider: vi.fn(), } }) @@ -60,12 +61,14 @@ vi.mock('@/app/api/files/authorization', () => ({ })) vi.mock('@/lib/knowledge/access/scope', () => ({ - resolveKnowledgeAccessScope: mockResolveKnowledgeAccessScope, + createKnowledgeAccessProvider: mockCreateKnowledgeAccessProvider, })) describe('hydrateUserFilesWithBase64', () => { beforeEach(() => { vi.clearAllMocks() + mockDownloadFile.mockReset() + mockDownloadServableFileFromStorage.mockReset() mockGetRedisClient.mockReturnValue(null) mockRedis.get.mockResolvedValue(null) mockRedis.set.mockResolvedValue('OK') @@ -250,45 +253,59 @@ describe('hydrateUserFilesWithBase64', () => { expect(hydrated.file).not.toHaveProperty('base64') }) - it('reads a knowledge-base file as the principal behind the run', async () => { - mockDownloadFile.mockResolvedValueOnce(Buffer.from('hello', 'utf8')) - const principal = { kind: 'session' as const, userId: 'user-1', sessionId: 'session-1' } - const scope = { kind: 'user' as const, tokens: ['user:user-1'] } - mockResolveKnowledgeAccessScope.mockResolvedValue(scope) - const file: UserFile = { - id: 'file-1', - name: 'shared.txt', - key: 'kb/workspace/shared.txt', - url: '/api/files/serve/kb/workspace/shared.txt?context=knowledge-base', - size: 5, - type: 'text/plain', - context: 'knowledge-base', - } - - const hydrated = await hydrateUserFilesWithBase64( - { file }, - { - workspaceId: 'workspace', - workflowId: 'workflow', - userId: 'user-1', - principal, - maxBytes: 10, + it.each([true, false])( + 'retains the run principal and knowledge reader when file access is %s', + async (allowed) => { + mockDownloadFile.mockResolvedValueOnce(Buffer.from('hello', 'utf8')) + const principal = { kind: 'session' as const, userId: 'user-1', sessionId: 'session-1' } + const scope = { kind: 'user' as const, userId: 'user-1', tokens: ['user:user-1'] } + const access: KnowledgeAccessProvider = { + get: vi.fn().mockResolvedValue(scope), + getForConnectors: vi.fn().mockResolvedValue(scope), + getForDocuments: vi.fn().mockResolvedValue(scope), + } + mockCreateKnowledgeAccessProvider.mockReturnValue(access) + mockVerifyFileAccess.mockResolvedValue(allowed) + const file: UserFile = { + id: 'file-1', + name: 'shared.txt', + key: 'kb/workspace/shared.txt', + url: '/api/files/serve/kb/workspace/shared.txt?context=knowledge-base', + size: 5, + type: 'text/plain', + context: 'knowledge-base', } - ) - expect(hydrated.file.base64).toBe(Buffer.from('hello').toString('base64')) - expect(mockResolveKnowledgeAccessScope).toHaveBeenCalledWith(principal, { - workspaceId: 'workspace', - }) - expect(mockVerifyFileAccess).toHaveBeenCalledWith( - file.key, - 'user-1', - undefined, - 'knowledge-base', - false, - { knowledgeAccess: scope } - ) - }) + const hydrated = await hydrateUserFilesWithBase64( + { file }, + { + workspaceId: 'workspace', + workflowId: 'workflow', + userId: 'user-1', + principal, + maxBytes: 10, + } + ) + + if (allowed) { + expect(hydrated.file.base64).toBe(Buffer.from('hello').toString('base64')) + } else { + expect(hydrated.file).not.toHaveProperty('base64') + expect(mockDownloadFile).not.toHaveBeenCalled() + } + expect(mockCreateKnowledgeAccessProvider).toHaveBeenCalledWith(principal, { + workspaceId: 'workspace', + }) + expect(mockVerifyFileAccess).toHaveBeenCalledWith( + file.key, + 'user-1', + undefined, + 'knowledge-base', + false, + { knowledgeAccess: access } + ) + } + ) it('hydrates prior-execution files when workflow-scoped reads are enabled', async () => { mockDownloadFile.mockResolvedValueOnce(Buffer.from('hello', 'utf8')) diff --git a/apps/sim/vitest.config.ts b/apps/sim/vitest.config.ts index 6c3930cda1e..c9ecd52838f 100644 --- a/apps/sim/vitest.config.ts +++ b/apps/sim/vitest.config.ts @@ -23,7 +23,13 @@ export default defineConfig(({ mode }) => { globals: true, environment: 'node', include: integration ? ['**/*.integration.ts'] : ['**/*.test.{ts,tsx}'], - exclude: [...configDefaults.exclude, '**/node_modules/**', '**/dist/**'], + exclude: [ + ...configDefaults.exclude, + '**/node_modules/**', + '**/dist/**', + /** Workspace suites require their dedicated database and realtime setup. */ + ...(integration ? ['lib/workspaces/__integration__/*.integration.ts'] : []), + ], setupFiles: integration ? ['./lib/knowledge/__integration__/setup.ts'] : ['./vitest.setup.ts'], diff --git a/packages/sim-cli/src/generated/v2-api.ts b/packages/sim-cli/src/generated/v2-api.ts index 4d5eec6bb50..64ae6b86cec 100644 --- a/packages/sim-cli/src/generated/v2-api.ts +++ b/packages/sim-cli/src/generated/v2-api.ts @@ -4748,6 +4748,7 @@ export type GetSelectorBody = { | 'wealthbox.contacts' | 'jira.issues' | 'jira.projects' + | 'jira.projectKeys' | 'linear.projects' | 'linear.teams' | 'monday.boards' @@ -6798,6 +6799,7 @@ export type ListSelectorBody = { | 'wealthbox.contacts' | 'jira.issues' | 'jira.projects' + | 'jira.projectKeys' | 'linear.projects' | 'linear.teams' | 'monday.boards' @@ -13335,6 +13337,7 @@ export const V2_OPERATIONS = { 'wealthbox.contacts', 'jira.issues', 'jira.projects', + 'jira.projectKeys', 'linear.projects', 'linear.teams', 'monday.boards', @@ -14868,6 +14871,7 @@ export const V2_OPERATIONS = { 'wealthbox.contacts', 'jira.issues', 'jira.projects', + 'jira.projectKeys', 'linear.projects', 'linear.teams', 'monday.boards',