@opengeni/documents 0.8.6 → 0.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +11 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/knowledge-projection.ts"],"sourcesContent":["import type { Settings } from \"@opengeni/config\";\nimport {\n KnowledgeProviderCitation,\n type KnowledgeProviderCitation as KnowledgeProviderCitationValue,\n type AddDocumentRequest,\n CreateDocumentBaseRequest,\n Document,\n DocumentAuthorityKind,\n DocumentAuthorityReclassification,\n ListDocumentAuthorityReclassificationsResponse,\n DocumentBase,\n DocumentCuration,\n DocumentCurationStatus,\n DocumentSearchMode,\n DocumentSearchResult,\n DocumentStatus,\n DocumentVisibility,\n FileAsset,\n IndexedDocumentSummary,\n KnowledgeBrowseResponse,\n KnowledgeRecord,\n KnowledgeSearchResult,\n KnowledgeSearchResponse,\n KnowledgeSourceKind,\n ListIndexedDocumentsResponse,\n type ReclassifyDocumentAuthorityRequest,\n type RunDocumentDefaultCollectionBackfillRequest,\n DocumentDefaultCollectionBackfill,\n DocumentDefaultCollectionBackfillAudit,\n DocumentDefaultCollectionBackfillOperationAudit,\n DocumentDefaultCollectionBackfillReceiptAudit,\n DocumentDefaultCollectionBackfillRunAudit,\n ListDocumentDefaultCollectionBackfillRunsResponse,\n ListOrganizationDocumentAuthorityReclassificationsResponse,\n OrganizationDocumentAuthorityReclassification,\n} from \"@opengeni/contracts\";\nimport {\n createPersonalDocumentAuthority,\n getFilesForSubject,\n resolveDocumentOriginalFileForSubject,\n rlsContextForWorkspace,\n setSubjectRlsContext,\n withRlsContext,\n withWorkspaceRls,\n withWorkspaceSubjectRls,\n type Database,\n} from \"@opengeni/db\";\nimport * as schema from \"@opengeni/db/schema\";\nimport { retryWhileMissing, type ObjectStorage } from \"@opengeni/storage\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { and, asc, desc, eq, gt, inArray, isNotNull, isNull, or, sql, type SQL } from \"drizzle-orm\";\nimport type OpenAI from \"openai\";\nimport {\n KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS,\n KNOWLEDGE_BROWSE_MAX_LIMIT,\n KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES,\n KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES,\n KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS,\n KNOWLEDGE_SEARCH_MAX_RESULTS,\n KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE,\n KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE,\n KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n} from \"@opengeni/contracts\";\nimport { projectKnowledgeRecord } from \"./knowledge-projection\";\n\nexport { projectKnowledgeRecord } from \"./knowledge-projection\";\n\nexport const DEFAULT_DOCUMENT_PARSER = \"liteparse\";\nexport const DEFAULT_DOCUMENT_EMBEDDING_MODEL = \"text-embedding-3-large\";\nexport const DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS = 3072;\nexport const DEFAULT_DOCUMENT_CHUNK_SIZE = 1200;\nexport const DEFAULT_DOCUMENT_CHUNK_OVERLAP = 160;\nexport const DEFAULT_DOCUMENT_CURATION_MODEL = \"gpt-4o-mini\";\n// Curator input is a preview, not the whole document — enough to name and\n// classify without paying for a full-document prompt on every drop.\nexport const DOCUMENT_CURATION_MAX_INPUT_CHARS = 24_000;\nexport const DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES = 1024;\nexport const DOCUMENT_INDEX_CHECKPOINT_MAX_CHARS = 1_024;\n// A base move is applied automatically only at or above this curator\n// confidence; below it the suggestion is surfaced for human review instead.\nexport const DOCUMENT_CURATION_AUTO_FILE_CONFIDENCE = 0.75;\n// The per-workspace default base: where knowledge drops land (created on\n// first drop) and stay unless configured curation files them into a topical base.\nexport const DEFAULT_BASE_NAME = \"Default\";\nexport const DEFAULT_BASE_DESCRIPTION = \"Default base for dropped files and notes.\";\n\nexport type ParsedDocument = {\n text: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type DocumentChunk = {\n text: string;\n metadata: Record<string, unknown>;\n};\n\nexport type DocumentParser = {\n name: string;\n parse: (bytes: Uint8Array, file: FileAsset) => Promise<ParsedDocument>;\n};\n\nexport type DocumentChunker = {\n chunk: (parsed: ParsedDocument, file: FileAsset) => DocumentChunk[];\n};\n\nexport type DocumentEmbedder = {\n model: string;\n dimensions: number;\n embedMany: (texts: string[]) => Promise<number[][]>;\n embedQuery: (text: string) => Promise<number[]>;\n};\n\nexport type DocumentCurationCandidateBase = {\n id: string;\n name: string;\n description: string | null;\n};\n\nexport type DocumentCurationInput = {\n /** Parsed document text, clipped to DOCUMENT_CURATION_MAX_INPUT_CHARS. */\n text: string;\n filename: string;\n /** Current (usually filename-derived) title. */\n title: string;\n /** Candidate bases the document could be filed into (never its current base). */\n bases: DocumentCurationCandidateBase[];\n};\n\nexport type DocumentCurationOutcome = {\n title: string | null;\n summary: string | null;\n sourceKind: KnowledgeSourceKind | null;\n topics: string[];\n targetBaseId: string | null;\n confidence: number;\n reason: string | null;\n};\n\nexport type DocumentCurator = {\n model: string;\n curate: (input: DocumentCurationInput) => Promise<DocumentCurationOutcome>;\n};\n\nexport type DocumentServices = {\n parser: DocumentParser;\n chunker: DocumentChunker;\n embedder: DocumentEmbedder;\n /** Optional: names/summarizes/categorizes dropped documents during indexing. */\n curator?: DocumentCurator | undefined;\n};\n\n/**\n * Read-scoping for document queries. Fail-closed: when a caller supplies no\n * filter, private documents are invisible (only their creator may see them,\n * and only by passing their subject id).\n */\nexport type DocumentAccessFilter = {\n /** Grant subject id of the human viewer; null/undefined hides private docs. */\n viewerSubjectId?: string | null | undefined;\n /**\n * Agent retrieval surface: only agent-enabled documents. Workspace-visible\n * documents are available to every agent; private documents are available\n * only when the agent carries the creating subject as its viewer subject.\n */\n agentOnly?: boolean | undefined;\n /** Exact attempt whose grant snapshot must be revalidated in the content query. */\n authorizedPersonalAttempt?:\n | {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n attemptId: string;\n }\n | undefined;\n};\n\nexport type DocumentAuthority = {\n kind: DocumentAuthorityKind;\n workspaceId: string | null;\n subjectId: string | null;\n};\n\n/** JSON-safe projection of the opaque capability minted by the API access layer. */\nexport type DocumentAccountAdminAuthorization = Readonly<{\n authorizationId: string;\n accountId: string;\n actorSubjectId: string;\n permission: \"account:admin\";\n}>;\n\nexport type ReclassifyDocumentAuthorityInput = ReclassifyDocumentAuthorityRequest & {\n accountId: string;\n workspaceId: string;\n documentId: string;\n actorSubjectId: string;\n accountAdminAuthorization: DocumentAccountAdminAuthorization | null;\n};\n\nexport type RunDocumentDefaultCollectionBackfillInput =\n RunDocumentDefaultCollectionBackfillRequest & {\n accountId: string;\n workspaceId: string;\n actorSubjectId: string;\n accountAdminAuthorization: DocumentAccountAdminAuthorization;\n };\n\nexport type DocumentMigrationAuditInput = {\n accountId: string;\n workspaceId: string;\n actorSubjectId: string;\n accountAdminAuthorization: DocumentAccountAdminAuthorization;\n limit?: number | undefined;\n cursor?: string | undefined;\n};\n\nexport type AgentDocumentAuthorityContext = {\n sessionId: string;\n attemptId: string;\n};\n\nexport type DocumentInventoryStatusCounts = Record<DocumentStatus, number>;\nexport type DocumentInventorySourceKindCounts = Record<KnowledgeSourceKind, number>;\nexport type DocumentInventoryAuthorityKindCounts = Record<DocumentAuthorityKind, number>;\n\nexport type DocumentInventory = {\n baseCount: number;\n bases: Array<{\n id: string;\n name: string;\n visibleDocumentCount: number;\n statusCounts: DocumentInventoryStatusCounts;\n latestUpdatedAt: string | null;\n }>;\n visibleDocumentCount: number;\n statusCounts: DocumentInventoryStatusCounts;\n sourceKindCounts: DocumentInventorySourceKindCounts;\n authorityKindCounts: DocumentInventoryAuthorityKindCounts;\n latestUpdatedAt: string | null;\n topics: Array<{ name: string; documentCount: number }>;\n topicsTruncated: boolean;\n};\n\nexport type DocumentInventoryInput = {\n baseLimit: number;\n topicLimit: number;\n topicMaxChars: number;\n access?: DocumentAccessFilter | undefined;\n};\n\nconst DOCUMENT_INVENTORY_MAX_BASE_LIMIT = 100;\nconst DOCUMENT_INVENTORY_MAX_TOPIC_LIMIT = 100;\nconst DOCUMENT_INVENTORY_MAX_TOPIC_CHARS = 256;\n\nexport type DocumentSearchInput = {\n accountId: string;\n workspaceId: string;\n query: string;\n baseIds?: string[] | undefined;\n limit?: number | undefined;\n mode?: DocumentSearchMode | undefined;\n sourceKinds?: KnowledgeSourceKind[] | undefined;\n authorityKinds?: DocumentAuthorityKind[] | undefined;\n aclTags?: string[] | undefined;\n access?: DocumentAccessFilter | undefined;\n};\n\nexport type EffectiveDocumentSearchInput = Omit<DocumentSearchInput, \"access\"> & {\n /** Immutable human subject accepted for the logical request/turn. */\n initiatingSubjectId: string;\n /** Agent retrieval additionally enforces documents.agent_access. */\n surface: \"human\" | \"agent\";\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n};\n\nexport type ListEffectiveIndexedDocumentsInput = {\n accountId: string;\n workspaceId: string;\n /** Immutable human subject accepted for the logical request/turn. */\n initiatingSubjectId: string;\n checkpoint?: string | undefined;\n limit?: number | undefined;\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n};\n\nexport type EffectiveKnowledgeBrowseInput = {\n accountId: string;\n workspaceId: string;\n /** Immutable human subject accepted for the logical request/turn. */\n initiatingSubjectId: string;\n /** Human inspection bypasses agent_access but still uses exact subject/RLS authority. */\n surface?: \"human\" | \"agent\" | undefined;\n /** Omit to browse top-level documents; pass a document record id for chunks. */\n parentId?: string | undefined;\n topic?: string | undefined;\n sourceKinds?: KnowledgeSourceKind[] | undefined;\n cursor?: string | undefined;\n limit?: number | undefined;\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n};\n\nexport type DocumentIndexHooks = {\n beforeEmbed?: (input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n chunkCount: number;\n }) => Promise<void>;\n};\n\nexport class LiteParseDocumentParser implements DocumentParser {\n readonly name = DEFAULT_DOCUMENT_PARSER;\n private parseQueue: Promise<void> = Promise.resolve();\n\n async parse(bytes: Uint8Array, file: FileAsset): Promise<ParsedDocument> {\n const text = isTextLike(file)\n ? Buffer.from(bytes).toString(\"utf8\").replace(/\\0/g, \" \").trim()\n : await this.parseWithLiteParse(bytes);\n if (!text.trim()) {\n throw new Error(`Parsed document is empty: ${file.filename}`);\n }\n return {\n text: text.trim(),\n metadata: {\n parser: this.name,\n filename: file.filename,\n contentType: file.contentType,\n },\n };\n }\n\n private async parseWithLiteParse(bytes: Uint8Array): Promise<string> {\n return await this.enqueueParse(async () => {\n const { LiteParse } = await import(\"@llamaindex/liteparse\");\n const parser = new LiteParse({ ocrEnabled: true, numWorkers: 1 });\n const result = await parser.parse(Buffer.from(bytes), true);\n const text = typeof result?.text === \"string\" ? result.text : \"\";\n return text.replace(/\\0/g, \" \").trim();\n });\n }\n\n private async enqueueParse<T>(task: () => Promise<T>): Promise<T> {\n const previous = this.parseQueue;\n let release: () => void = () => undefined;\n this.parseQueue = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous.catch(() => undefined);\n try {\n return await task();\n } finally {\n release();\n }\n }\n}\n\nexport class RecursiveTextChunker implements DocumentChunker {\n constructor(\n private readonly maxChars = DEFAULT_DOCUMENT_CHUNK_SIZE,\n private readonly overlapChars = DEFAULT_DOCUMENT_CHUNK_OVERLAP,\n ) {\n if (overlapChars >= maxChars) {\n throw new Error(\"document chunk overlap must be smaller than chunk size\");\n }\n }\n\n chunk(parsed: ParsedDocument, file: FileAsset): DocumentChunk[] {\n return chunkText(parsed.text, this.maxChars, this.overlapChars).map((text, index) => ({\n text,\n metadata: {\n ...parsed.metadata,\n filename: file.filename,\n contentType: file.contentType,\n chunkIndex: index,\n },\n }));\n }\n}\n\nexport class OpenAIEmbeddingProvider implements DocumentEmbedder {\n private clientPromise: Promise<OpenAI> | null = null;\n private readonly apiKey: string | undefined;\n private readonly baseURL: string | undefined;\n\n constructor(args: {\n apiKey?: string | undefined;\n baseURL?: string | undefined;\n defaultHeaders?: Record<string, string> | undefined;\n defaultQuery?: Record<string, string> | undefined;\n model?: string | undefined;\n dimensions?: number | undefined;\n }) {\n this.apiKey = args.apiKey ?? process.env.OPENAI_API_KEY;\n this.baseURL = args.baseURL;\n this.defaultHeaders = args.defaultHeaders;\n this.defaultQuery = args.defaultQuery;\n this.model = args.model ?? DEFAULT_DOCUMENT_EMBEDDING_MODEL;\n this.dimensions = args.dimensions ?? DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS;\n }\n\n readonly model: string;\n readonly dimensions: number;\n private readonly defaultHeaders: Record<string, string> | undefined;\n private readonly defaultQuery: Record<string, string> | undefined;\n\n async embedMany(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n const out: number[][] = [];\n for (let start = 0; start < texts.length; start += 64) {\n const batch = texts.slice(start, start + 64);\n const response = await (\n await this.openai()\n ).embeddings.create({\n model: this.model,\n input: batch,\n dimensions: this.dimensions,\n });\n for (const item of response.data) {\n out.push(validateEmbedding(item.embedding, this.dimensions, this.model));\n }\n }\n return out;\n }\n\n async embedQuery(text: string): Promise<number[]> {\n const [embedding] = await this.embedMany([text]);\n if (!embedding) {\n throw new Error(\"Embedding provider returned no query embedding\");\n }\n return embedding;\n }\n\n private async openai(): Promise<OpenAI> {\n if (!this.apiKey) {\n throw new Error(\"OpenAI document embeddings require an API key\");\n }\n this.clientPromise ??= import(\"openai\").then(\n ({ default: OpenAIClient }) =>\n new OpenAIClient({\n apiKey: this.apiKey,\n ...(this.baseURL ? { baseURL: this.baseURL } : {}),\n ...(this.defaultQuery ? { defaultQuery: this.defaultQuery } : {}),\n ...(this.defaultHeaders ? { defaultHeaders: this.defaultHeaders } : {}),\n }),\n );\n return await this.clientPromise;\n }\n}\n\nexport class DeterministicEmbeddingProvider implements DocumentEmbedder {\n constructor(\n readonly dimensions = DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS,\n readonly model = `deterministic-local-${dimensions}`,\n ) {}\n\n async embedMany(texts: string[]): Promise<number[][]> {\n return texts.map((text) => deterministicEmbedding(text, this.dimensions));\n }\n\n async embedQuery(text: string): Promise<number[]> {\n return deterministicEmbedding(text, this.dimensions);\n }\n}\n\n/**\n * Deterministic no-network curation: first meaningful line becomes the title,\n * the opening text becomes the summary, and the kind is guessed from the\n * filename/content type. Never proposes a base move (confidence 0). Used as\n * the `heuristic` provider and as the in-pipeline fallback when the LLM\n * curator fails — a drop must always end up named and summarized.\n */\nexport function heuristicCuration(\n input: DocumentCurationInput,\n contentType = \"application/octet-stream\",\n): DocumentCurationOutcome {\n const firstLine = input.text\n .split(\"\\n\")\n .map((line) => line.replace(/^[#>\\s*-]+/, \"\").trim())\n .find((line) => line.length >= 3);\n const title = (firstLine ?? input.title).slice(0, 120).trim() || input.title;\n const summaryWindow = input.text.replace(/\\s+/g, \" \").trim().slice(0, 360);\n const summary =\n summaryWindow.length === 360 ? `${summaryWindow.slice(0, 357)}...` : summaryWindow;\n return {\n title,\n summary: summary || null,\n sourceKind: heuristicSourceKind(input.filename, contentType),\n topics: [],\n targetBaseId: null,\n confidence: 0,\n reason: null,\n };\n}\n\nfunction heuristicSourceKind(rawFilename: string, rawContentType: string): KnowledgeSourceKind {\n const filename = rawFilename.toLowerCase();\n const contentType = rawContentType.toLowerCase();\n if (filename.endsWith(\".eml\") || contentType === \"message/rfc822\") return \"email\";\n if (filename.endsWith(\".vtt\") || filename.endsWith(\".srt\") || filename.includes(\"transcript\")) {\n return \"meeting_transcript\";\n }\n if (contentType === \"text/html\") return \"web\";\n if (contentType === \"application/pdf\" || filename.endsWith(\".docx\") || filename.endsWith(\".md\")) {\n return \"document\";\n }\n return \"manual_upload\";\n}\n\nexport class HeuristicCurationProvider implements DocumentCurator {\n readonly model = \"heuristic\";\n\n async curate(input: DocumentCurationInput): Promise<DocumentCurationOutcome> {\n return heuristicCuration(input);\n }\n}\n\nconst CURATION_SYSTEM_PROMPT = [\n \"You organize a team knowledge base. Given the beginning of a dropped document\",\n \"and the list of existing collections (bases), return STRICT JSON with keys:\",\n '\"title\" (concise, specific, <= 120 chars, no filename extensions),',\n '\"summary\" (2-3 sentences, plain prose, what the document is and why it matters),',\n '\"sourceKind\" (one of: manual_upload, meeting_transcript, repository, email, chat, document, web, other),',\n '\"topics\" (3-6 short lowercase tags),',\n '\"targetBaseId\" (the id of the best-fitting existing base, or null if none fits),',\n '\"confidence\" (0..1 — how sure you are the document belongs in targetBaseId),',\n '\"reason\" (one sentence explaining the filing choice).',\n \"Only pick a targetBaseId from the provided list. If the document fits no base\",\n \"well, return targetBaseId null and confidence 0. Respond with JSON only.\",\n].join(\" \");\n\nexport class OpenAICurationProvider implements DocumentCurator {\n private clientPromise: Promise<OpenAI> | null = null;\n private readonly apiKey: string | undefined;\n private readonly baseURL: string | undefined;\n private readonly defaultHeaders: Record<string, string> | undefined;\n private readonly defaultQuery: Record<string, string> | undefined;\n readonly model: string;\n\n constructor(args: {\n apiKey?: string | undefined;\n baseURL?: string | undefined;\n defaultHeaders?: Record<string, string> | undefined;\n defaultQuery?: Record<string, string> | undefined;\n model?: string | undefined;\n }) {\n this.apiKey = args.apiKey ?? process.env.OPENAI_API_KEY;\n this.baseURL = args.baseURL;\n this.defaultHeaders = args.defaultHeaders;\n this.defaultQuery = args.defaultQuery;\n this.model = args.model ?? DEFAULT_DOCUMENT_CURATION_MODEL;\n }\n\n async curate(input: DocumentCurationInput): Promise<DocumentCurationOutcome> {\n const response = await (\n await this.openai()\n ).chat.completions.create({\n model: this.model,\n response_format: { type: \"json_object\" },\n messages: [\n { role: \"system\", content: CURATION_SYSTEM_PROMPT },\n {\n role: \"user\",\n content: JSON.stringify({\n filename: input.filename,\n currentTitle: input.title,\n bases: input.bases,\n text: input.text,\n }),\n },\n ],\n });\n const raw = response.choices[0]?.message?.content;\n if (!raw) {\n throw new Error(\"curation model returned no content\");\n }\n return parseCurationOutcome(raw, input.bases);\n }\n\n private async openai(): Promise<OpenAI> {\n if (!this.apiKey) {\n throw new Error(\"OpenAI document curation requires an API key\");\n }\n this.clientPromise ??= import(\"openai\").then(\n ({ default: OpenAIClient }) =>\n new OpenAIClient({\n apiKey: this.apiKey,\n ...(this.baseURL ? { baseURL: this.baseURL } : {}),\n ...(this.defaultQuery ? { defaultQuery: this.defaultQuery } : {}),\n ...(this.defaultHeaders ? { defaultHeaders: this.defaultHeaders } : {}),\n }),\n );\n return await this.clientPromise;\n }\n}\n\n/** Parse + clamp model output; a targetBaseId outside the candidate list is dropped. */\nexport function parseCurationOutcome(\n raw: string,\n bases: DocumentCurationCandidateBase[],\n): DocumentCurationOutcome {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"curation model returned non-object JSON\");\n }\n const record = parsed as Record<string, unknown>;\n const knownBase = bases.find((base) => base.id === record.targetBaseId);\n const confidence =\n typeof record.confidence === \"number\" && Number.isFinite(record.confidence)\n ? Math.min(1, Math.max(0, record.confidence))\n : 0;\n return {\n title:\n cleanString(typeof record.title === \"string\" ? record.title.slice(0, 200) : null) ?? null,\n summary:\n cleanString(typeof record.summary === \"string\" ? record.summary.slice(0, 2000) : null) ??\n null,\n sourceKind:\n typeof record.sourceKind === \"string\"\n ? normalizeKnowledgeSourceKind(record.sourceKind)\n : null,\n topics: cleanStringArray(\n Array.isArray(record.topics)\n ? record.topics.filter((topic): topic is string => typeof topic === \"string\").slice(0, 8)\n : [],\n ).map((topic) => topic.toLowerCase().slice(0, 60)),\n targetBaseId: knownBase?.id ?? null,\n confidence: knownBase ? confidence : 0,\n reason:\n cleanString(typeof record.reason === \"string\" ? record.reason.slice(0, 500) : null) ?? null,\n };\n}\n\nexport function createDocumentServices(\n settings?: Settings,\n overrides: Partial<DocumentServices> = {},\n): DocumentServices {\n const dimensions = settings?.documentEmbeddingDimensions ?? DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS;\n const openAIEmbeddingConfig = documentOpenAIEmbeddingConfig(settings);\n return {\n parser: overrides.parser ?? new LiteParseDocumentParser(),\n chunker:\n overrides.chunker ??\n new RecursiveTextChunker(\n settings?.documentChunkSize ?? DEFAULT_DOCUMENT_CHUNK_SIZE,\n settings?.documentChunkOverlap ?? DEFAULT_DOCUMENT_CHUNK_OVERLAP,\n ),\n embedder:\n overrides.embedder ??\n (settings?.documentEmbeddingProvider === \"deterministic\"\n ? new DeterministicEmbeddingProvider(dimensions, settings.documentEmbeddingModel)\n : new OpenAIEmbeddingProvider({\n ...openAIEmbeddingConfig,\n model: settings?.documentEmbeddingModel ?? DEFAULT_DOCUMENT_EMBEDDING_MODEL,\n dimensions,\n })),\n curator: overrides.curator ?? createDocumentCurator(settings),\n };\n}\n\nfunction createDocumentCurator(settings?: Settings): DocumentCurator | undefined {\n const provider = settings?.documentCurationProvider ?? \"openai\";\n if (provider === \"none\") return undefined;\n if (provider === \"heuristic\") return new HeuristicCurationProvider();\n const embeddingConfig = documentOpenAIEmbeddingConfig(settings);\n return new OpenAICurationProvider({\n apiKey: settings?.documentCurationApiKey ?? embeddingConfig.apiKey,\n baseURL: settings?.documentCurationBaseUrl ?? embeddingConfig.baseURL,\n defaultHeaders: embeddingConfig.defaultHeaders,\n defaultQuery: embeddingConfig.defaultQuery,\n model: settings?.documentCurationModel ?? DEFAULT_DOCUMENT_CURATION_MODEL,\n });\n}\n\nexport function documentOpenAIEmbeddingConfig(settings?: Settings): {\n apiKey?: string | undefined;\n baseURL?: string | undefined;\n defaultHeaders?: Record<string, string> | undefined;\n defaultQuery?: Record<string, string> | undefined;\n} {\n if (!settings) return {};\n if (settings.documentEmbeddingApiKey || settings.documentEmbeddingBaseUrl) {\n return {\n apiKey:\n settings.documentEmbeddingApiKey ?? settings.openaiApiKey ?? settings.azureOpenaiApiKey,\n baseURL:\n settings.documentEmbeddingBaseUrl ?? settings.openaiBaseUrl ?? settings.azureOpenaiBaseUrl,\n };\n }\n if (settings.openaiProvider === \"azure\") {\n const baseURL = settings.azureOpenaiBaseUrl ?? azureDeploymentBaseUrl(settings);\n return {\n apiKey: settings.azureOpenaiApiKey ?? settings.azureOpenaiAdToken ?? \"azure-ad-token\",\n baseURL,\n defaultQuery: azureOpenAIDefaultQuery(settings, baseURL),\n defaultHeaders:\n settings.azureOpenaiAdToken && !settings.azureOpenaiApiKey\n ? { Authorization: `Bearer ${settings.azureOpenaiAdToken}` }\n : undefined,\n };\n }\n return {\n apiKey: settings.openaiApiKey,\n baseURL: settings.openaiBaseUrl,\n };\n}\n\nfunction azureDeploymentBaseUrl(settings: Settings): string {\n const endpoint = settings.azureOpenaiEndpoint?.replace(/\\/+$/, \"\");\n if (!endpoint || !settings.azureOpenaiDeployment) {\n throw new Error(\"Azure OpenAI endpoint/deployment settings are incomplete\");\n }\n return `${endpoint}/openai/deployments/${settings.azureOpenaiDeployment}`;\n}\n\nfunction azureOpenAIDefaultQuery(\n settings: Pick<Settings, \"azureOpenaiApiVersion\">,\n baseURL: string,\n): Record<string, string> | undefined {\n if (!settings.azureOpenaiApiVersion) return undefined;\n const normalized = baseURL.replace(/\\/+$/, \"\").toLowerCase();\n if (normalized.endsWith(\"/openai/v1\")) {\n return undefined;\n }\n return { \"api-version\": settings.azureOpenaiApiVersion };\n}\n\nexport async function createDocumentBase(\n db: Database,\n input: CreateDocumentBaseRequest & { accountId: string; workspaceId: string },\n): Promise<DocumentBase> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [row] = await scopedDb\n .insert(schema.documentBases)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n name: input.name.trim(),\n description: input.description?.trim() || null,\n })\n .returning();\n if (!row) throw new Error(\"Failed to create document base\");\n return mapDocumentBase(row);\n },\n );\n}\n\nexport async function listDocumentBases(\n db: Database,\n workspaceId: string,\n): Promise<DocumentBase[]> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const rows = await scopedDb\n .select()\n .from(schema.documentBases)\n .where(eq(schema.documentBases.workspaceId, workspaceId))\n .orderBy(desc(schema.documentBases.createdAt));\n return rows.map(mapDocumentBase);\n });\n}\n\n/**\n * Return a bounded structural inventory without loading document records.\n * Document predicates are applied independently to every aggregate so private\n * counts and topic metadata remain scoped to the initiating grant subject.\n */\nexport async function getDocumentInventory(\n db: Database,\n workspaceId: string,\n input: DocumentInventoryInput,\n): Promise<DocumentInventory> {\n const baseLimit = requireDocumentInventoryLimit(\n input.baseLimit,\n DOCUMENT_INVENTORY_MAX_BASE_LIMIT,\n \"baseLimit\",\n );\n const topicLimit = requireDocumentInventoryLimit(\n input.topicLimit,\n DOCUMENT_INVENTORY_MAX_TOPIC_LIMIT,\n \"topicLimit\",\n );\n const topicMaxChars = requireDocumentInventoryLimit(\n input.topicMaxChars,\n DOCUMENT_INVENTORY_MAX_TOPIC_CHARS,\n \"topicMaxChars\",\n );\n\n return await withDocumentRls(db, workspaceId, input.access, async (scopedDb) => {\n const [baseTotal] = await scopedDb\n .select({ count: sql<number>`count(*)::int` })\n .from(schema.documentBases)\n .where(eq(schema.documentBases.workspaceId, workspaceId));\n\n const baseJoin = and(\n eq(schema.documents.workspaceId, workspaceId),\n eq(schema.documents.baseId, schema.documentBases.id),\n ...documentAccessConditions(workspaceId, input.access),\n );\n const baseRows = await scopedDb\n .select({\n id: schema.documentBases.id,\n name: schema.documentBases.name,\n visibleDocumentCount: sql<number>`count(${schema.documents.id})::int`,\n queuedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'queued')::int`,\n indexingCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'indexing')::int`,\n readyCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'ready')::int`,\n failedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'failed')::int`,\n latestUpdatedAt: sql<Date | null>`max(${schema.documents.updatedAt})`,\n })\n .from(schema.documentBases)\n .leftJoin(schema.documents, baseJoin)\n .where(eq(schema.documentBases.workspaceId, workspaceId))\n .groupBy(schema.documentBases.id, schema.documentBases.name, schema.documentBases.createdAt)\n .orderBy(desc(schema.documentBases.createdAt), asc(schema.documentBases.id))\n .limit(baseLimit);\n\n const documentWhere = and(\n eq(schema.documents.workspaceId, workspaceId),\n ...documentAccessConditions(workspaceId, input.access),\n );\n const [summary] = await scopedDb\n .select({\n visibleDocumentCount: sql<number>`count(${schema.documents.id})::int`,\n queuedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'queued')::int`,\n indexingCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'indexing')::int`,\n readyCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'ready')::int`,\n failedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'failed')::int`,\n manualUploadCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'manual_upload')::int`,\n meetingTranscriptCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'meeting_transcript')::int`,\n repositoryCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'repository')::int`,\n emailCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'email')::int`,\n chatCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'chat')::int`,\n documentCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'document')::int`,\n webCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'web')::int`,\n otherCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'other')::int`,\n organizationAuthorityCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.authorityKind} = 'organization')::int`,\n workspaceAuthorityCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.authorityKind} = 'workspace')::int`,\n personalAuthorityCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.authorityKind} = 'personal')::int`,\n latestUpdatedAt: sql<Date | null>`max(${schema.documents.updatedAt})`,\n })\n .from(schema.documents)\n .where(documentWhere);\n\n const topicStringValue = sql<string>`topic.value #>> '{}'`;\n const topicNormalizedName = sql<string>`btrim(regexp_replace(normalize(${topicStringValue}, NFKC), '[[:space:]]+', ' ', 'g'))`;\n const topicName = sql<string>`left(${topicNormalizedName}, ${topicMaxChars})`;\n const topicDocumentCount = sql<number>`count(distinct ${schema.documents.id})::int`;\n const topicRows = await scopedDb\n .select({ name: topicName, documentCount: topicDocumentCount })\n .from(schema.documents)\n .innerJoin(\n sql`lateral jsonb_array_elements(${schema.documents.topics}) as topic(value)`,\n sql`true`,\n )\n .where(\n and(\n documentWhere,\n sql`jsonb_typeof(topic.value) = 'string'`,\n sql`nullif(${topicNormalizedName}, '') is not null`,\n ),\n )\n .groupBy(sql`1`)\n .orderBy(sql`2 desc`, sql`1 asc`)\n .limit(topicLimit + 1);\n\n const statusCounts = documentInventoryStatusCounts(summary ?? {});\n const topics = topicRows.slice(0, topicLimit).map((topic) => ({\n name: topic.name,\n documentCount: Number(topic.documentCount),\n }));\n return {\n baseCount: Number(baseTotal?.count ?? 0),\n bases: baseRows.map((base) => ({\n id: base.id,\n name: base.name,\n visibleDocumentCount: Number(base.visibleDocumentCount),\n statusCounts: documentInventoryStatusCounts(base),\n latestUpdatedAt: documentInventoryTimestamp(base.latestUpdatedAt),\n })),\n visibleDocumentCount: Number(summary?.visibleDocumentCount ?? 0),\n statusCounts,\n sourceKindCounts: {\n manual_upload: Number(summary?.manualUploadCount ?? 0),\n meeting_transcript: Number(summary?.meetingTranscriptCount ?? 0),\n repository: Number(summary?.repositoryCount ?? 0),\n email: Number(summary?.emailCount ?? 0),\n chat: Number(summary?.chatCount ?? 0),\n document: Number(summary?.documentCount ?? 0),\n web: Number(summary?.webCount ?? 0),\n other: Number(summary?.otherCount ?? 0),\n },\n authorityKindCounts: {\n organization: Number(summary?.organizationAuthorityCount ?? 0),\n workspace: Number(summary?.workspaceAuthorityCount ?? 0),\n personal: Number(summary?.personalAuthorityCount ?? 0),\n },\n latestUpdatedAt: documentInventoryTimestamp(summary?.latestUpdatedAt ?? null),\n topics,\n topicsTruncated: topicRows.length > topics.length,\n };\n });\n}\n\nfunction requireDocumentInventoryLimit(value: number, max: number, name: string): number {\n if (!Number.isInteger(value) || value < 1 || value > max) {\n throw new Error(`${name} must be an integer between 1 and ${max}`);\n }\n return value;\n}\n\nfunction documentInventoryStatusCounts(input: {\n queuedCount?: number | null | undefined;\n indexingCount?: number | null | undefined;\n readyCount?: number | null | undefined;\n failedCount?: number | null | undefined;\n}): DocumentInventoryStatusCounts {\n return {\n queued: Number(input.queuedCount ?? 0),\n indexing: Number(input.indexingCount ?? 0),\n ready: Number(input.readyCount ?? 0),\n failed: Number(input.failedCount ?? 0),\n };\n}\n\nfunction documentInventoryTimestamp(value: Date | string | null): string | null {\n if (!value) return null;\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString();\n}\n\nexport async function getDocumentBase(\n db: Database,\n workspaceId: string,\n baseId: string,\n): Promise<DocumentBase | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.documentBases)\n .where(\n and(eq(schema.documentBases.workspaceId, workspaceId), eq(schema.documentBases.id, baseId)),\n )\n .limit(1);\n return row ? mapDocumentBase(row) : null;\n });\n}\n\n/**\n * Find-or-create the workspace's internal Default collection — where ordinary\n * uploads can start and knowledge drops land before configured curation files\n * them elsewhere. Matched by name (case-insensitive) so a user-created\n * \"Default\" is adopted rather than duplicated.\n */\nexport async function ensureDefaultBase(\n db: Database,\n input: { accountId: string; workspaceId: string },\n): Promise<DocumentBase> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const defaultName = sql`lower(btrim(${schema.documentBases.name})) = ${DEFAULT_BASE_NAME.toLowerCase()}`;\n const [existing] = await tx\n .select()\n .from(schema.documentBases)\n .where(and(eq(schema.documentBases.workspaceId, input.workspaceId), defaultName))\n .limit(1);\n if (existing) return mapDocumentBase(existing);\n\n // The partial unique index is the serialization point for concurrent\n // first uploads. A losing insert re-reads the winner instead of\n // surfacing a duplicate-base error.\n const [inserted] = await tx\n .insert(schema.documentBases)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n name: DEFAULT_BASE_NAME,\n description: DEFAULT_BASE_DESCRIPTION,\n })\n .onConflictDoNothing()\n .returning();\n if (inserted) return mapDocumentBase(inserted);\n\n const [raced] = await tx\n .select()\n .from(schema.documentBases)\n .where(and(eq(schema.documentBases.workspaceId, input.workspaceId), defaultName))\n .limit(1);\n if (raced) return mapDocumentBase(raced);\n throw new Error(\"Failed to create Default document base\");\n }),\n );\n}\n\n/**\n * List a workspace's optional document collections after restoring the\n * internal Default collection when it is missing. Keeping the ensure and list\n * in the service layer gives every caller the same migration-free recovery\n * behavior after an old writer, manual repair, or future collection-management\n * path renames or removes Default.\n */\nexport async function listDocumentBasesEnsuringDefault(\n db: Database,\n input: { accountId: string; workspaceId: string },\n): Promise<DocumentBase[]> {\n await ensureDefaultBase(db, input);\n return await listDocumentBases(db, input.workspaceId);\n}\n\nexport async function runDocumentDefaultCollectionBackfill(\n db: Database,\n input: RunDocumentDefaultCollectionBackfillInput,\n) {\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n runId: input.runId,\n operationId: input.operationId,\n batchSize: input.batchSize,\n accountAdminAuthorization: input.accountAdminAuthorization,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT run_document_default_collection_backfill(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const row = rows[0];\n if (!row) throw new Error(\"Document Default collection backfill returned no result\");\n return DocumentDefaultCollectionBackfill.parse(row.result);\n },\n );\n}\n\nexport async function listDocumentDefaultCollectionBackfillRuns(\n db: Database,\n input: DocumentMigrationAuditInput,\n) {\n const limit = validateDocumentMigrationAuditLimit(input.limit);\n const cursor = input.cursor\n ? decodeDocumentMigrationAuditCursor(input.cursor, [\"backfill-runs\", input.accountId], true)\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n accountAdminAuthorization: input.accountAdminAuthorization,\n limit: limit + 1,\n beforeStartedAt: cursor?.timestamp ?? null,\n beforeRunId: cursor?.id ?? null,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT list_document_default_collection_backfill_runs(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const parsed = rows.map((row) => DocumentDefaultCollectionBackfillRunAudit.parse(row.result));\n const hasMore = parsed.length > limit;\n const runs = parsed.slice(0, limit);\n const tail = hasMore ? runs.at(-1) : null;\n return ListDocumentDefaultCollectionBackfillRunsResponse.parse({\n runs,\n hasMore,\n nextCursor: tail\n ? encodeDocumentMigrationAuditCursor([\"backfill-runs\", input.accountId], {\n timestamp: tail.startedAt,\n id: tail.runId,\n })\n : null,\n });\n },\n );\n}\n\nexport async function getDocumentDefaultCollectionBackfillAudit(\n db: Database,\n input: DocumentMigrationAuditInput & {\n runId: string;\n operationCursor?: string | undefined;\n receiptCursor?: string | undefined;\n },\n) {\n const limit = validateDocumentMigrationAuditLimit(input.limit);\n const operationCursor = input.operationCursor\n ? decodeDocumentMigrationAuditCursor(\n input.operationCursor,\n [\"backfill-operations\", input.accountId, input.runId],\n true,\n )\n : null;\n const receiptCursor = input.receiptCursor\n ? decodeDocumentMigrationAuditCursor(\n input.receiptCursor,\n [\"backfill-receipts\", input.accountId, input.runId],\n false,\n )\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n accountAdminAuthorization: input.accountAdminAuthorization,\n runId: input.runId,\n limit,\n operationBeforeCreatedAt: operationCursor?.timestamp ?? null,\n operationBeforeId: operationCursor?.id ?? null,\n receiptAfterWorkspaceId: receiptCursor?.id ?? null,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT get_document_default_collection_backfill_audit(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const raw = rows[0]?.result;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\"document Default collection backfill audit returned no result\");\n }\n const value = raw as Record<string, unknown>;\n const run = DocumentDefaultCollectionBackfillRunAudit.parse(value.run);\n const operations = Array.isArray(value.operations)\n ? value.operations.map((operation) =>\n DocumentDefaultCollectionBackfillOperationAudit.parse(operation),\n )\n : [];\n const receipts = Array.isArray(value.receipts)\n ? value.receipts.map((receipt) =>\n DocumentDefaultCollectionBackfillReceiptAudit.parse(receipt),\n )\n : [];\n const operationsHasMore = operations.length > limit;\n const receiptsHasMore = receipts.length > limit;\n const operationPage = operations.slice(0, limit);\n const receiptPage = receipts.slice(0, limit);\n const operationTail = operationsHasMore ? operationPage.at(-1) : null;\n const receiptTail = receiptsHasMore ? receiptPage.at(-1) : null;\n return DocumentDefaultCollectionBackfillAudit.parse({\n run,\n operations: operationPage,\n receipts: receiptPage,\n operationsHasMore,\n operationsNextCursor: operationTail\n ? encodeDocumentMigrationAuditCursor(\n [\"backfill-operations\", input.accountId, input.runId],\n {\n timestamp: operationTail.createdAt,\n id: operationTail.operationId,\n },\n )\n : null,\n receiptsHasMore,\n receiptsNextCursor: receiptTail\n ? encodeDocumentMigrationAuditCursor(\n [\"backfill-receipts\", input.accountId, input.runId],\n { timestamp: null, id: receiptTail.workspaceId },\n )\n : null,\n });\n },\n );\n}\n\nexport async function listOrganizationDocumentAuthorityReclassifications(\n db: Database,\n input: DocumentMigrationAuditInput,\n) {\n const limit = validateDocumentMigrationAuditLimit(input.limit);\n const cursor = input.cursor\n ? decodeDocumentMigrationAuditCursor(\n input.cursor,\n [\"organization-reclassifications\", input.accountId],\n true,\n )\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n accountAdminAuthorization: input.accountAdminAuthorization,\n limit: limit + 1,\n beforeCreatedAt: cursor?.timestamp ?? null,\n beforeOperationId: cursor?.id ?? null,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT list_organization_document_authority_reclassifications(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const parsed = rows.map((row) =>\n OrganizationDocumentAuthorityReclassification.parse(row.result),\n );\n const hasMore = parsed.length > limit;\n const receipts = parsed.slice(0, limit);\n const tail = hasMore ? receipts.at(-1) : null;\n return ListOrganizationDocumentAuthorityReclassificationsResponse.parse({\n receipts,\n hasMore,\n nextCursor: tail\n ? encodeDocumentMigrationAuditCursor(\n [\"organization-reclassifications\", input.accountId],\n { timestamp: tail.createdAt, id: tail.operationId },\n )\n : null,\n });\n },\n );\n}\n\nfunction validateDocumentMigrationAuditLimit(value: number | undefined): number {\n const limit = value ?? 50;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error(\"document migration audit limit must be between 1 and 100\");\n }\n return limit;\n}\n\ntype DocumentMigrationAuditCursor = { timestamp: string | null; id: string };\n\nfunction documentMigrationAuditCursorScope(parts: string[]): string {\n return createHash(\"sha256\")\n .update(JSON.stringify([\"document-migration-audit\", 1, ...parts]), \"utf8\")\n .digest(\"hex\")\n .slice(0, 32);\n}\n\nfunction encodeDocumentMigrationAuditCursor(\n parts: string[],\n cursor: DocumentMigrationAuditCursor,\n): string {\n return Buffer.from(\n JSON.stringify({\n v: 1,\n s: documentMigrationAuditCursorScope(parts),\n t: cursor.timestamp,\n i: cursor.id,\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nfunction decodeDocumentMigrationAuditCursor(\n value: string,\n parts: string[],\n requireTimestamp: boolean,\n): DocumentMigrationAuditCursor {\n try {\n if (!value || value.length > 1_024) throw new Error(\"cursor length\");\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"cursor encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n if (\n Object.keys(parsed).sort().join(\",\") !== \"i,s,t,v\" ||\n parsed.v !== 1 ||\n parsed.s !== documentMigrationAuditCursorScope(parts) ||\n typeof parsed.i !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(\n parsed.i,\n ) ||\n (requireTimestamp\n ? typeof parsed.t !== \"string\" || !Number.isFinite(new Date(parsed.t).getTime())\n : parsed.t !== null)\n ) {\n throw new Error(\"cursor payload\");\n }\n return {\n timestamp: typeof parsed.t === \"string\" ? parsed.t : null,\n id: parsed.i,\n };\n } catch (error) {\n throw new Error(\"invalid document migration audit cursor\", {\n cause: error,\n });\n }\n}\n\nexport async function reclassifyDocumentAuthority(\n db: Database,\n input: ReclassifyDocumentAuthorityInput,\n) {\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n documentId: input.documentId,\n operationId: input.operationId,\n actorSubjectId: input.actorSubjectId,\n expectedAuthority: input.expectedAuthority,\n targetAuthorityKind: input.targetAuthorityKind,\n accountAdminAuthorization: input.accountAdminAuthorization,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT reclassify_document_authority(${JSON.stringify(command)}::jsonb) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const row = rows[0];\n if (!row) throw new Error(\"Document authority reclassification returned no result\");\n return DocumentAuthorityReclassification.parse(row.result);\n },\n );\n}\n\nexport async function listDocumentAuthorityReclassifications(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n actorSubjectId: string;\n limit?: number | undefined;\n cursor?: string | undefined;\n },\n) {\n const limit = input.limit ?? 50;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error(\"document authority receipt limit must be between 1 and 100\");\n }\n const cursor = input.cursor\n ? decodeDocumentAuthorityReclassificationCursor(input.cursor, input)\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const rows = (await scopedDb.execute(sql`\n SELECT list_document_authority_reclassifications(\n ${input.accountId}::uuid,\n ${input.workspaceId}::uuid,\n ${input.actorSubjectId},\n ${input.documentId}::uuid,\n ${limit + 1}::integer,\n ${cursor?.createdAt ?? null}::timestamptz,\n ${cursor?.operationId ?? null}::uuid\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const parsed = rows.map((row) => DocumentAuthorityReclassification.parse(row.result));\n const hasMore = parsed.length > limit;\n const receipts = parsed.slice(0, limit);\n const tail = hasMore ? receipts.at(-1) : null;\n return ListDocumentAuthorityReclassificationsResponse.parse({\n receipts,\n hasMore,\n nextCursor: tail\n ? encodeDocumentAuthorityReclassificationCursor(input, {\n createdAt: tail.createdAt,\n operationId: tail.operationId,\n })\n : null,\n });\n },\n );\n}\n\ntype DocumentAuthorityReclassificationCursor = {\n createdAt: string;\n operationId: string;\n};\n\nfunction documentAuthorityReclassificationCursorScope(input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n actorSubjectId: string;\n}): string {\n return createHash(\"sha256\")\n .update(\n JSON.stringify([\n \"document_authority_reclassification_cursor\",\n 1,\n input.accountId,\n input.workspaceId,\n input.documentId,\n input.actorSubjectId,\n ]),\n \"utf8\",\n )\n .digest(\"hex\")\n .slice(0, 32);\n}\n\nfunction encodeDocumentAuthorityReclassificationCursor(\n scope: Parameters<typeof documentAuthorityReclassificationCursorScope>[0],\n cursor: DocumentAuthorityReclassificationCursor,\n): string {\n return Buffer.from(\n JSON.stringify({\n v: 1,\n s: documentAuthorityReclassificationCursorScope(scope),\n t: cursor.createdAt,\n i: cursor.operationId,\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nfunction decodeDocumentAuthorityReclassificationCursor(\n value: string,\n scope: Parameters<typeof documentAuthorityReclassificationCursorScope>[0],\n): DocumentAuthorityReclassificationCursor {\n try {\n if (!value || value.length > 1_024) throw new Error(\"cursor length\");\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"cursor encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n if (\n Object.keys(parsed).sort().join(\",\") !== \"i,s,t,v\" ||\n parsed.v !== 1 ||\n parsed.s !== documentAuthorityReclassificationCursorScope(scope) ||\n typeof parsed.t !== \"string\" ||\n !Number.isFinite(new Date(parsed.t).getTime()) ||\n typeof parsed.i !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(parsed.i)\n ) {\n throw new Error(\"cursor payload\");\n }\n return { createdAt: parsed.t, operationId: parsed.i };\n } catch (error) {\n throw new Error(\"invalid document authority receipt cursor\", {\n cause: error,\n });\n }\n}\n\nexport async function addDocumentToBase(\n db: Database,\n input: AddDocumentRequest & {\n accountId: string;\n workspaceId: string;\n baseId: string;\n createdBy?: string | null | undefined;\n initiatingSubjectId?: string | null | undefined;\n organizationAuthorityGranted?: boolean | undefined;\n curationStatus?: DocumentCurationStatus | undefined;\n access?: DocumentAccessFilter | undefined;\n knowledgeSourceIdentity?: string | null | undefined;\n },\n): Promise<Document> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const viewerSubjectId = cleanString(input.access?.viewerSubjectId ?? null);\n const authority = resolveDocumentAuthority({\n kind: input.authorityKind,\n legacyVisibility: input.visibility,\n workspaceId: input.workspaceId,\n initiatingSubjectId: input.initiatingSubjectId,\n });\n if (authority.kind === \"organization\" && input.organizationAuthorityGranted !== true) {\n throw new Error(\"organization document writes require exact account authority\");\n }\n if (\n authority.kind === \"personal\" &&\n (viewerSubjectId !== authority.subjectId ||\n cleanString(input.createdBy ?? null) !== authority.subjectId)\n ) {\n throw new Error(\"personal document writes require the exact initiating subject\");\n }\n if (viewerSubjectId) await setSubjectRlsContext(scopedDb, viewerSubjectId);\n const base = await getDocumentBase(scopedDb, input.workspaceId, input.baseId);\n if (!base) throw new Error(`Document base not found: ${input.baseId}`);\n const initiatingSubjectId = cleanString(input.initiatingSubjectId ?? null);\n const createdBy = cleanString(input.createdBy ?? null);\n if (initiatingSubjectId && createdBy && initiatingSubjectId !== createdBy) {\n throw new Error(\"document file authority must match the exact initiating subject\");\n }\n const fileAuthoritySubjectId = initiatingSubjectId ?? createdBy ?? null;\n const file = await requireReadyFile(scopedDb, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: fileAuthoritySubjectId,\n fileId: input.fileId,\n });\n const knowledgeSourceIdentity = cleanString(input.knowledgeSourceIdentity ?? null);\n if (knowledgeSourceIdentity && knowledgeSourceIdentity.length > 512) {\n throw new Error(\"knowledge source document identity exceeds 512 characters\");\n }\n const now = new Date();\n const [existing] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, input.workspaceId),\n ...(knowledgeSourceIdentity\n ? [eq(schema.documents.knowledgeSourceIdentity, knowledgeSourceIdentity)]\n : [\n eq(schema.documents.baseId, input.baseId),\n eq(schema.documents.fileId, input.fileId),\n ]),\n ),\n )\n .limit(1);\n if (existing) {\n if (knowledgeSourceIdentity && existing.fileId !== input.fileId) {\n throw new Error(\"knowledge source document identity is bound to different content\");\n }\n if (!documentMatchesAccess(existing, input.workspaceId, input.access)) {\n throw new Error(`Document not found: ${existing.id}`);\n }\n assertOrganizationDocumentAuthority(\n existing.authorityKind,\n input.organizationAuthorityGranted,\n );\n // Idempotent re-add: refresh caller-supplied source metadata on the\n // existing row instead of silently discarding it (aclTags especially —\n // a re-add that tightens tags must not be a no-op). Access policy is\n // deliberately inherited: re-adding a known file is not an implicit\n // visibility/agent-policy update that another manager can exploit.\n const [updated] = await scopedDb\n .update(schema.documents)\n .set({\n title: cleanString(input.title) ?? cleanString(input.sourceTitle) ?? existing.title,\n ...(input.sourceKind !== undefined ? { sourceKind: input.sourceKind } : {}),\n sourceUri: cleanString(input.sourceUri) ?? existing.sourceUri,\n sourceExternalId: cleanString(input.sourceExternalId) ?? existing.sourceExternalId,\n sourceTitle: cleanString(input.sourceTitle) ?? existing.sourceTitle,\n sourceAuthor: cleanString(input.sourceAuthor) ?? existing.sourceAuthor,\n sourceCreatedAt: parseOptionalDate(input.sourceCreatedAt) ?? existing.sourceCreatedAt,\n sourceUpdatedAt: parseOptionalDate(input.sourceUpdatedAt) ?? existing.sourceUpdatedAt,\n sourceVersion: cleanString(input.sourceVersion) ?? existing.sourceVersion,\n ...(input.aclTags !== undefined ? { aclTags: cleanStringArray(input.aclTags) } : {}),\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.documents.workspaceId, input.workspaceId),\n eq(schema.documents.id, existing.id),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .returning();\n return mapDocument(updated ?? existing);\n }\n const documentId = randomUUID();\n const row = await scopedDb.transaction(async (tx) => {\n const userAuthority =\n authority.kind === \"personal\"\n ? await createPersonalDocumentAuthority(tx, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: authority.subjectId!,\n documentId,\n })\n : null;\n const [inserted] = await tx\n .insert(schema.documents)\n .values({\n id: documentId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n baseId: input.baseId,\n fileId: input.fileId,\n status: \"queued\",\n title: cleanString(input.title) ?? cleanString(input.sourceTitle) ?? file.filename,\n parser: DEFAULT_DOCUMENT_PARSER,\n sourceKind: input.sourceKind ?? \"manual_upload\",\n sourceUri: cleanString(input.sourceUri) ?? null,\n sourceExternalId: cleanString(input.sourceExternalId) ?? null,\n sourceTitle: cleanString(input.sourceTitle) ?? null,\n sourceAuthor: cleanString(input.sourceAuthor) ?? null,\n sourceCreatedAt: parseOptionalDate(input.sourceCreatedAt),\n sourceUpdatedAt: parseOptionalDate(input.sourceUpdatedAt),\n sourceVersion: cleanString(input.sourceVersion) ?? null,\n knowledgeSourceIdentity,\n aclTags: cleanStringArray(input.aclTags),\n authorityKind: authority.kind,\n authorityWorkspaceId: userAuthority ? null : authority.workspaceId,\n authoritySubjectId: authority.subjectId,\n authorityId: userAuthority?.authorityId ?? null,\n ownerOrganizationMembershipId: userAuthority?.ownerOrganizationMembershipId ?? null,\n originWorkspaceId: input.workspaceId,\n visibility: authority.kind === \"personal\" ? \"private\" : \"workspace\",\n agentAccess: input.agentAccess ?? true,\n createdBy: fileAuthoritySubjectId,\n curationStatus: input.curationStatus ?? \"none\",\n updatedAt: now,\n })\n .returning();\n return inserted;\n });\n if (!row) throw new Error(\"Failed to create document\");\n return mapDocument(row);\n },\n );\n}\n\n/**\n * Move a document and its indexed chunks to another base. With no explicit\n * target, applies the stored curation suggestion. A 'suggested' or 'pending'\n * document that gets moved counts as filed.\n */\nexport async function moveDocumentToBase(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n targetBaseId?: string | null | undefined;\n organizationAuthorityGranted?: boolean | undefined;\n access?: DocumentAccessFilter | undefined;\n },\n): Promise<Document> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const viewerSubjectId = cleanString(input.access?.viewerSubjectId ?? null);\n if (viewerSubjectId) await setSubjectRlsContext(scopedDb, viewerSubjectId);\n const [row] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .limit(1);\n if (!row) throw new Error(`Document not found: ${input.documentId}`);\n assertOrganizationDocumentAuthority(row.authorityKind, input.organizationAuthorityGranted);\n const suggestion = (row.curation as { suggestedBaseId?: string | null } | null)\n ?.suggestedBaseId;\n const targetBaseId = input.targetBaseId ?? suggestion;\n if (!targetBaseId) {\n throw new Error(\"document has no suggested base; pass targetBaseId\");\n }\n if (targetBaseId === row.baseId) return mapDocument(row);\n // A portable personal Document retains its immutable ingestion workspace\n // as provenance and physical storage. Management may be authorized from\n // another same-organization workspace, but filing still targets a base\n // in that origin workspace rather than silently copying authority/data.\n const base = await getDocumentBase(scopedDb, row.workspaceId, targetBaseId);\n if (!base) throw new Error(`Document base not found: ${targetBaseId}`);\n const [conflict] = await scopedDb\n .select({ id: schema.documents.id })\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, row.workspaceId),\n eq(schema.documents.baseId, targetBaseId),\n ...(row.knowledgeSourceIdentity\n ? [eq(schema.documents.knowledgeSourceIdentity, row.knowledgeSourceIdentity)]\n : [eq(schema.documents.fileId, row.fileId)]),\n ),\n )\n .limit(1);\n if (conflict) {\n throw new Error(\"a document for this file already exists in the target base\");\n }\n const now = new Date();\n const moved = await scopedDb.transaction(async (tx) => {\n const [updated] = await tx\n .update(schema.documents)\n .set({\n baseId: targetBaseId,\n ...(row.curationStatus === \"suggested\" || row.curationStatus === \"pending\"\n ? { curationStatus: \"auto_filed\" }\n : {}),\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.documents.workspaceId, row.workspaceId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .returning();\n if (updated) {\n await tx\n .update(schema.documentChunks)\n .set({ baseId: targetBaseId })\n .where(\n and(\n eq(schema.documentChunks.workspaceId, row.workspaceId),\n eq(schema.documentChunks.documentId, input.documentId),\n ),\n );\n }\n return updated;\n });\n if (!moved) throw new Error(`Document not found: ${input.documentId}`);\n return mapDocument(moved);\n },\n );\n}\n\nexport async function deleteDocumentFromBase(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n baseId: string;\n documentId: string;\n organizationAuthorityGranted?: boolean | undefined;\n access?: DocumentAccessFilter | undefined;\n },\n): Promise<void> {\n await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const viewerSubjectId = cleanString(input.access?.viewerSubjectId ?? null);\n if (viewerSubjectId) await setSubjectRlsContext(scopedDb, viewerSubjectId);\n const [document] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .limit(1);\n if (!document) {\n throw new Error(`Document not found: ${input.documentId}`);\n }\n assertOrganizationDocumentAuthority(\n document.authorityKind,\n input.organizationAuthorityGranted,\n );\n if (document.baseId !== input.baseId) {\n throw new Error(`Document not found: ${input.documentId}`);\n }\n await scopedDb\n .delete(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n );\n },\n );\n}\n\nexport async function listDocuments(\n db: Database,\n workspaceId: string,\n baseId: string,\n access?: DocumentAccessFilter,\n): Promise<Document[]> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const rows = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, workspaceId),\n eq(schema.documents.baseId, baseId),\n ...documentAccessConditions(workspaceId, access),\n ),\n )\n .orderBy(asc(schema.documents.createdAt));\n return rows.map(mapDocument);\n });\n}\n\n/**\n * List Documents the human can discover and manage from the requested\n * workspace. Organization Documents are account-wide, workspace Documents are\n * local, activated organization-user Documents are portable across the owner's\n * same-organization workspaces, and legacy personal rows remain anchored to\n * their ingestion workspace through documentAccessConditions.\n */\nexport async function listAccessibleDocuments(\n db: Database,\n workspaceId: string,\n access: DocumentAccessFilter,\n): Promise<Document[]> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const rows = await scopedDb\n .select()\n .from(schema.documents)\n .where(and(...documentAccessConditions(workspaceId, access)))\n .orderBy(desc(schema.documents.updatedAt), asc(schema.documents.createdAt));\n return rows.map(mapDocument);\n });\n}\n\n/**\n * List newly ready documents in the same effective scope used by agent\n * retrieval. The opaque checkpoint is bound to the account, requesting\n * workspace, and immutable initiating subject, so it cannot be reused across\n * scheduled-task authority boundaries.\n */\nexport async function listEffectiveIndexedDocuments(\n db: Database,\n input: ListEffectiveIndexedDocumentsInput,\n): Promise<ListIndexedDocumentsResponse> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const limit = input.limit ?? 50;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error(\"indexed document list limit must be between 1 and 100\");\n }\n const afterSequence = input.checkpoint\n ? decodeDocumentIndexCheckpoint(input.checkpoint, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n })\n : 0n;\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: \"agent\",\n agentAuthority: input.agentAuthority,\n });\n const rows = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.status, \"ready\"),\n isNotNull(schema.documents.indexSequence),\n gt(schema.documents.indexSequence, afterSequence),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .orderBy(asc(schema.documents.indexSequence))\n .limit(limit + 1),\n );\n const hasMore = rows.length > limit;\n const pageRows = rows.slice(0, limit);\n const nextSequence = pageRows.at(-1)?.indexSequence ?? afterSequence;\n if (nextSequence === null) {\n throw new Error(\"ready document is missing its index sequence\");\n }\n return {\n documents: pageRows.map(mapIndexedDocumentSummary),\n nextCheckpoint: encodeDocumentIndexCheckpoint({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n sequence: nextSequence,\n }),\n hasMore,\n };\n}\n\nexport function encodeDocumentIndexCheckpoint(input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n sequence: bigint;\n}): string {\n if (input.sequence < 0n) throw new Error(\"document index checkpoint sequence is invalid\");\n return Buffer.from(\n JSON.stringify({\n v: 1,\n s: documentIndexCheckpointScope(input),\n q: input.sequence.toString(),\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nexport function decodeDocumentIndexCheckpoint(\n value: string,\n scope: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n },\n): bigint {\n try {\n if (!value || value.length > DOCUMENT_INDEX_CHECKPOINT_MAX_CHARS) {\n throw new Error(\"checkpoint length\");\n }\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"checkpoint encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n if (\n Object.keys(parsed).sort().join(\",\") !== \"q,s,v\" ||\n parsed.v !== 1 ||\n typeof parsed.s !== \"string\" ||\n typeof parsed.q !== \"string\" ||\n !/^(0|[1-9][0-9]*)$/.test(parsed.q)\n ) {\n throw new Error(\"checkpoint payload\");\n }\n if (parsed.s !== documentIndexCheckpointScope(scope)) {\n throw new Error(\"document index checkpoint belongs to a different workspace or subject\");\n }\n return BigInt(parsed.q);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === \"document index checkpoint belongs to a different workspace or subject\"\n ) {\n throw error;\n }\n throw new Error(\"invalid document index checkpoint\", { cause: error });\n }\n}\n\nfunction documentIndexCheckpointScope(input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n}): string {\n return createHash(\"sha256\")\n .update(\"opengeni:document-index-checkpoint:v1\\0\")\n .update(input.accountId)\n .update(\"\\0\")\n .update(input.workspaceId)\n .update(\"\\0\")\n .update(canonicalEffectiveDocumentSubject(input.initiatingSubjectId))\n .digest(\"hex\");\n}\n\nfunction canonicalEffectiveDocumentSubject(value: string): string {\n const subjectId = cleanString(value);\n if (!subjectId || subjectId !== value) {\n throw new Error(\"effective document retrieval requires an initiating subject\");\n }\n if (new TextEncoder().encode(subjectId).byteLength > DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES) {\n throw new Error(\n `effective document initiating subject exceeds ${DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES} UTF-8 bytes`,\n );\n }\n return subjectId;\n}\n\nexport async function getDocument(\n db: Database,\n workspaceId: string,\n documentId: string,\n access?: DocumentAccessFilter,\n): Promise<Document | null> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.id, documentId), ...documentAccessConditions(workspaceId, access)),\n )\n .limit(1);\n return row ? mapDocument(row) : null;\n });\n}\n\n/**\n * Resolve the immutable source file through Document authority in the requested\n * workspace. The file remains physically owned by its ingestion workspace;\n * callers never gain generic access to that workspace's file inventory.\n */\nexport async function getDocumentOriginalFile(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n access: DocumentAccessFilter;\n },\n): Promise<FileAsset | null> {\n const subjectId = cleanString(input.access.viewerSubjectId ?? null);\n if (!subjectId || input.access.agentOnly) return null;\n return await resolveDocumentOriginalFileForSubject(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId,\n documentId: input.documentId,\n });\n}\n\n/**\n * Internal ingestion-only read used after the worker has independently resolved\n * and fenced the immutable document authority tuple. It deliberately does not\n * apply provider retrieval authorization because a new Drive document must be\n * indexed before its first ACL evidence can be attached. User, API, MCP, and\n * agent reads must use getDocument/effective retrieval instead.\n */\nexport async function getDocumentForIndexing(\n db: Database,\n workspaceId: string,\n documentId: string,\n): Promise<Document | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n )\n .limit(1);\n return row ? mapDocument(row) : null;\n });\n}\n\nexport async function queueDocumentForReindex(\n db: Database,\n workspaceId: string,\n documentId: string,\n access?: DocumentAccessFilter,\n organizationAuthorityGranted?: boolean,\n): Promise<Document> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const [document] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.id, documentId), ...documentAccessConditions(workspaceId, access)),\n )\n .limit(1);\n if (!document) throw new Error(`Document not found: ${documentId}`);\n assertOrganizationDocumentAuthority(document.authorityKind, organizationAuthorityGranted);\n const [row] = await scopedDb\n .update(schema.documents)\n .set({\n status: \"queued\",\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(eq(schema.documents.id, documentId), ...documentAccessConditions(workspaceId, access)),\n )\n .returning();\n if (!row) throw new Error(`Document not found: ${documentId}`);\n return mapDocument(row);\n });\n}\n\nfunction assertOrganizationDocumentAuthority(\n authorityKind: string,\n organizationAuthorityGranted: boolean | undefined,\n): void {\n if (authorityKind === \"organization\" && organizationAuthorityGranted !== true) {\n throw new Error(\"organization document mutations require exact account authority\");\n }\n}\n\nexport async function indexDocumentNow(\n db: Database,\n objectStorage: ObjectStorage,\n workspaceId: string,\n documentId: string,\n services: DocumentServices = createDocumentServices(),\n hooks: DocumentIndexHooks = {},\n access?: DocumentAccessFilter,\n): Promise<Document> {\n const [loadedDocument] = await withDocumentRls(\n db,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n )\n .limit(1),\n );\n if (!loadedDocument) throw new Error(`Document not found: ${documentId}`);\n let document: DocumentRow = loadedDocument;\n const file = await requireReadyFile(db, {\n accountId: document.accountId,\n workspaceId,\n subjectId: cleanString(document.createdBy) ?? null,\n fileId: document.fileId,\n });\n await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n await scopedDb\n .update(schema.documents)\n .set({\n status: \"indexing\",\n parser: services.parser.name,\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n );\n });\n try {\n const object = await retryWhileMissing(async () =>\n objectStorage.getObjectBytes(file.objectKey),\n );\n if (!object) throw new Error(\"document source object is missing\");\n const bytes = object.bytes;\n const parsed = await services.parser.parse(bytes, file);\n // Knowledge drops (curationStatus 'pending') are curated between parse and\n // chunking when a provider is enabled, so chunk metadata and base placement\n // reflect the curated truth. Disabled curation leaves caller metadata intact;\n // enabled-provider failures remain fail-soft through the heuristic fallback.\n if (document.curationStatus === \"pending\") {\n document = await curateDroppedDocument(db, services, document, parsed, file);\n }\n const chunks = services.chunker.chunk(parsed, file);\n await hooks.beforeEmbed?.({\n accountId: document.accountId,\n workspaceId: document.workspaceId,\n documentId,\n chunkCount: chunks.length,\n });\n const embeddings = await services.embedder.embedMany(chunks.map((chunk) => chunk.text));\n if (embeddings.length !== chunks.length) {\n throw new Error(\n `Embedding provider returned ${embeddings.length} embeddings for ${chunks.length} chunks`,\n );\n }\n await withDocumentRls(\n db,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n await tx\n .delete(schema.documentChunks)\n .where(\n and(\n eq(schema.documentChunks.workspaceId, workspaceId),\n eq(schema.documentChunks.documentId, documentId),\n ),\n );\n if (chunks.length > 0) {\n await tx.insert(schema.documentChunks).values(\n chunks.map((chunk, index) => ({\n accountId: document.accountId,\n workspaceId: document.workspaceId,\n documentId,\n baseId: document.baseId,\n fileId: file.id,\n authorityKind: document.authorityKind,\n authorityWorkspaceId: document.authorityWorkspaceId,\n authoritySubjectId: document.authoritySubjectId,\n chunkIndex: index,\n text: chunk.text,\n metadata: {\n ...chunk.metadata,\n documentTitle: document.title,\n sourceKind: document.sourceKind,\n sourceUri: document.sourceUri,\n sourceExternalId: document.sourceExternalId,\n sourceTitle: document.sourceTitle,\n sourceAuthor: document.sourceAuthor,\n sourceCreatedAt: document.sourceCreatedAt?.toISOString() ?? null,\n sourceUpdatedAt: document.sourceUpdatedAt?.toISOString() ?? null,\n sourceVersion: document.sourceVersion,\n aclTags: document.aclTags,\n },\n embedding: validateEmbedding(\n embeddings[index] ?? [],\n services.embedder.dimensions,\n services.embedder.model,\n ),\n embeddingModel: services.embedder.model,\n })),\n );\n }\n await tx\n .update(schema.documents)\n .set({\n status: \"ready\",\n parser: services.parser.name,\n chunkCount: chunks.length,\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.documents.workspaceId, workspaceId),\n eq(schema.documents.id, documentId),\n ),\n );\n }),\n );\n } catch (error) {\n const [failed] = await withDocumentRls(\n db,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .update(schema.documents)\n .set({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n updatedAt: new Date(),\n })\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n )\n .returning(),\n );\n if (!failed) throw error;\n return mapDocument(failed);\n }\n // Internal indexing must be able to return a private document to the caller\n // that created/queued it. Public reads remain fail-closed when no subject is\n // supplied; the creator subject is the document's frozen access principal.\n const updated = await getDocumentForIndexing(db, workspaceId, documentId);\n if (!updated) throw new Error(`Document disappeared after indexing: ${documentId}`);\n return updated;\n}\n\ntype DocumentRow = typeof schema.documents.$inferSelect;\n\nasync function curateDroppedDocument(\n db: Database,\n services: DocumentServices,\n document: DocumentRow,\n parsed: ParsedDocument,\n file: FileAsset,\n): Promise<DocumentRow> {\n // `none` is an explicit disabled-curation policy. Do not silently replace\n // it with heuristics: indexing still proceeds, but the drop remains an\n // ordinary uncured document with its caller-supplied title and metadata.\n if (!services.curator) {\n const [updated] = await withDocumentRls(\n db,\n document.workspaceId,\n { viewerSubjectId: document.authoritySubjectId },\n async (scopedDb) =>\n await scopedDb\n .update(schema.documents)\n .set({\n curationStatus: \"none\",\n summary: null,\n topics: [],\n curation: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.documents.workspaceId, document.workspaceId),\n eq(schema.documents.id, document.id),\n ),\n )\n .returning(),\n );\n return updated ?? document;\n }\n const bases = await listDocumentBases(db, document.workspaceId);\n const candidates: DocumentCurationCandidateBase[] = bases\n .filter((base) => base.id !== document.baseId)\n .map((base) => ({\n id: base.id,\n name: base.name,\n description: base.description,\n }));\n const input: DocumentCurationInput = {\n text: parsed.text.slice(0, DOCUMENT_CURATION_MAX_INPUT_CHARS),\n filename: file.filename,\n title: document.title,\n bases: candidates,\n };\n let outcome: DocumentCurationOutcome;\n let model: string;\n let failure: string | null = null;\n try {\n outcome = await services.curator.curate(input);\n model = services.curator.model;\n } catch (error) {\n failure = error instanceof Error ? error.message : String(error);\n console.warn(\"document curation failed; applying heuristic fallback\", {\n workspaceId: document.workspaceId,\n documentId: document.id,\n error: failure,\n });\n outcome = heuristicCuration(input, file.contentType);\n model = \"heuristic\";\n }\n const suggestedBase = candidates.find((base) => base.id === outcome.targetBaseId) ?? null;\n let moveToBaseId: string | null = null;\n if (\n suggestedBase &&\n failure === null &&\n outcome.confidence >= DOCUMENT_CURATION_AUTO_FILE_CONFIDENCE\n ) {\n // The (workspace, base, file) unique index means a same-file twin already\n // in the target base blocks the move; keep it as a suggestion instead.\n const conflict = await withDocumentRls(\n db,\n document.workspaceId,\n { viewerSubjectId: document.authoritySubjectId },\n async (scopedDb) =>\n await scopedDb\n .select({ id: schema.documents.id })\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, document.workspaceId),\n eq(schema.documents.baseId, suggestedBase.id),\n eq(schema.documents.fileId, document.fileId),\n ),\n )\n .limit(1),\n );\n if (conflict.length === 0) {\n moveToBaseId = suggestedBase.id;\n }\n }\n const curation: DocumentCuration = {\n suggestedBaseId: suggestedBase?.id ?? null,\n suggestedBaseName: suggestedBase?.name ?? null,\n confidence: outcome.confidence,\n reason: failure ? `curation failed (${failure}); heuristic fallback applied` : outcome.reason,\n originalTitle: document.title,\n model,\n };\n const curationStatus: DocumentCurationStatus = failure\n ? \"failed\"\n : moveToBaseId\n ? \"auto_filed\"\n : \"suggested\";\n const [updated] = await withDocumentRls(\n db,\n document.workspaceId,\n { viewerSubjectId: document.authoritySubjectId },\n async (scopedDb) =>\n await scopedDb\n .update(schema.documents)\n .set({\n title: outcome.title ?? document.title,\n summary: outcome.summary,\n topics: outcome.topics,\n ...(outcome.sourceKind ? { sourceKind: outcome.sourceKind } : {}),\n ...(moveToBaseId ? { baseId: moveToBaseId } : {}),\n curationStatus,\n curation,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.documents.workspaceId, document.workspaceId),\n eq(schema.documents.id, document.id),\n ),\n )\n .returning(),\n );\n return updated ?? document;\n}\n\nexport async function searchDocuments(\n db: Database,\n input: DocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\"> = createDocumentServices(),\n): Promise<DocumentSearchResult[]> {\n return (await searchDocumentCandidates(db, input, services)).results;\n}\n\nexport type DocumentCandidateRelevanceFloor = {\n vectorScore: number;\n keywordScore: number;\n};\n\nasync function searchDocumentCandidates(\n db: Database,\n input: DocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\">,\n relevanceFloor?: DocumentCandidateRelevanceFloor,\n): Promise<{ results: DocumentSearchResult[]; belowRelevanceFloor: number }> {\n await assertDocumentAccountWorkspace(db, input.accountId, input.workspaceId);\n const mode = input.mode ?? \"hybrid\";\n const limit = Math.min(Math.max(input.limit ?? 5, 1), 50);\n const candidateLimit = mode === \"hybrid\" ? Math.min(limit * 4, 100) : limit;\n const rows: CombinedSearchRow[] = [];\n if (mode === \"vector\" || mode === \"hybrid\") {\n try {\n rows.push(...(await vectorSearchDocuments(db, input, candidateLimit, services)));\n } catch (error) {\n if (mode === \"vector\") {\n throw error;\n }\n console.warn(\n \"document hybrid search vector component failed; falling back to keyword search\",\n {\n workspaceId: input.workspaceId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n }\n if (mode === \"keyword\" || mode === \"hybrid\") {\n rows.push(...(await keywordSearchDocuments(db, input, candidateLimit)));\n }\n const merged = mergeDocumentSearchRows(rows, mode);\n return selectDocumentSearchCandidateWindow(merged, limit, relevanceFloor);\n}\n\nexport function selectDocumentSearchCandidateWindow(\n merged: DocumentSearchResult[],\n limit: number,\n relevanceFloor?: DocumentCandidateRelevanceFloor,\n): { results: DocumentSearchResult[]; belowRelevanceFloor: number } {\n const boundedLimit = Math.min(Math.max(Math.trunc(limit), 1), 50);\n if (!relevanceFloor) {\n return { results: merged.slice(0, boundedLimit), belowRelevanceFloor: 0 };\n }\n let belowRelevanceFloor = 0;\n const relevant = merged.filter((result) => {\n const included =\n (result.vectorScore !== null && result.vectorScore >= relevanceFloor.vectorScore) ||\n (result.keywordScore !== null && result.keywordScore >= relevanceFloor.keywordScore);\n if (!included) belowRelevanceFloor += 1;\n return included;\n });\n return { results: relevant.slice(0, boundedLimit), belowRelevanceFloor };\n}\n\n/**\n * Canonical effective retrieval composition for API, SDK, and MCP surfaces.\n * Callers supply the already-authorized immutable initiating subject; no\n * request/tool input can replace it with another user's personal authority.\n */\nexport async function searchEffectiveDocuments(\n db: Database,\n input: EffectiveDocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\"> = createDocumentServices(),\n): Promise<DocumentSearchResult[]> {\n const initiatingSubjectId = cleanString(input.initiatingSubjectId);\n if (!initiatingSubjectId) {\n throw new Error(\"effective document retrieval requires an initiating subject\");\n }\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface,\n agentAuthority: input.agentAuthority,\n });\n return await searchDocuments(\n db,\n {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n query: input.query,\n baseIds: input.baseIds,\n limit: input.limit,\n mode: input.mode,\n sourceKinds: input.sourceKinds,\n authorityKinds: input.authorityKinds,\n aclTags: input.aclTags,\n // Construct the lower-level access filter here instead of spreading the\n // caller input, so an untyped/legacy access override is always ignored.\n access,\n },\n services,\n );\n}\n\n/**\n * Agent-facing Knowledge search over the existing Documents evidence store.\n * Search selects candidates only after authority filtering; this second read\n * rechecks every exact chunk before projecting it, so a record revoked between\n * ranking and response construction disappears rather than leaking stale data.\n */\nexport async function searchEffectiveKnowledge(\n db: Database,\n input: EffectiveDocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\"> = createDocumentServices(),\n): Promise<KnowledgeSearchResponse> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const requestedLimit = Math.min(Math.max(input.limit ?? 5, 1), KNOWLEDGE_SEARCH_MAX_RESULTS);\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface,\n agentAuthority: input.agentAuthority,\n });\n // Pull a bounded surplus so the permission-safe result set can still satisfy\n // the caller after relevance filtering and exact-content deduplication.\n const candidateLimit = Math.min(requestedLimit * 4, KNOWLEDGE_SEARCH_MAX_RESULTS);\n const rankedSelection = await searchDocumentCandidates(\n db,\n {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n query: input.query,\n limit: candidateLimit,\n ...(input.baseIds ? { baseIds: input.baseIds } : {}),\n ...(input.mode ? { mode: input.mode } : {}),\n ...(input.sourceKinds ? { sourceKinds: input.sourceKinds } : {}),\n ...(input.authorityKinds ? { authorityKinds: input.authorityKinds } : {}),\n ...(input.aclTags ? { aclTags: input.aclTags } : {}),\n access,\n },\n services,\n {\n vectorScore: KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE,\n keywordScore: KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE,\n },\n );\n const ranked = rankedSelection.results;\n if (ranked.length === 0) {\n return selectKnowledgeSearchResults({\n candidates: [],\n rankedCandidateCount: 0,\n requestedLimit,\n alreadyBelowRelevanceFloor: rankedSelection.belowRelevanceFloor,\n });\n }\n const current = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunk: schema.documentChunks,\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n previousChunkId: knowledgePreviousChunkIdProjection(),\n nextChunkId: knowledgeNextChunkIdProjection(),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documentChunks.accountId, input.accountId),\n inArray(\n schema.documentChunks.id,\n ranked.map((result) => result.chunkId),\n ),\n eq(schema.documents.status, \"ready\"),\n ...(input.authorityKinds?.length\n ? [inArray(schema.documents.authorityKind, input.authorityKinds)]\n : []),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n ),\n );\n const currentByChunkId = new Map(current.map((row) => [row.chunk.id, row]));\n return selectKnowledgeSearchResults({\n rankedCandidateCount: ranked.length,\n requestedLimit,\n alreadyBelowRelevanceFloor: rankedSelection.belowRelevanceFloor,\n candidates: ranked.flatMap((rankedResult) => {\n const row = currentByChunkId.get(rankedResult.chunkId);\n if (!row) return [];\n return [\n {\n record: knowledgeChunkRecord(row.document, row.chunk, row.citation, {\n previousChunkId: row.previousChunkId,\n nextChunkId: row.nextChunkId,\n }),\n semanticScore: rankedResult.score,\n matchType: rankedResult.matchType,\n vectorScore: rankedResult.vectorScore,\n keywordScore: rankedResult.keywordScore,\n },\n ];\n }),\n });\n}\n\ntype KnowledgeSearchCandidate = {\n record: KnowledgeRecord;\n semanticScore: number;\n matchType: DocumentSearchMode;\n vectorScore: number | null;\n keywordScore: number | null;\n};\n\ntype KnowledgeSearchSelectionInput = {\n candidates: KnowledgeSearchCandidate[];\n rankedCandidateCount: number;\n requestedLimit: number;\n alreadyBelowRelevanceFloor?: number | undefined;\n now?: Date | undefined;\n};\n\n/**\n * Deterministic, content-safe final selection over already-authorized and\n * freshly rechecked Knowledge candidates. Exported for boundary tests; callers\n * must never use it as a substitute for the database authorization pass above.\n */\nexport function selectKnowledgeSearchResults(\n input: KnowledgeSearchSelectionInput,\n): KnowledgeSearchResponse {\n const requestedLimit = Math.min(\n Math.max(Math.trunc(input.requestedLimit), 1),\n KNOWLEDGE_SEARCH_MAX_RESULTS,\n );\n const nowMs = (input.now ?? new Date()).getTime();\n let belowRelevanceFloor = Math.min(\n Math.max(0, Math.trunc(input.alreadyBelowRelevanceFloor ?? 0)),\n KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS,\n );\n const relevant: KnowledgeSearchResult[] = [];\n for (const candidate of input.candidates) {\n const relevanceSignals: Array<\"vector\" | \"keyword\"> = [];\n if (\n candidate.vectorScore !== null &&\n candidate.vectorScore >= KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE\n ) {\n relevanceSignals.push(\"vector\");\n }\n if (\n candidate.keywordScore !== null &&\n candidate.keywordScore >= KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE\n ) {\n relevanceSignals.push(\"keyword\");\n }\n if (relevanceSignals.length === 0) {\n belowRelevanceFloor = Math.min(belowRelevanceFloor + 1, KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS);\n continue;\n }\n const freshness = knowledgeFreshness(candidate.record.quality.freshnessAt, nowMs);\n const qualityAdjustment = freshness === \"current\" ? 0.02 : freshness === \"aging\" ? 0.01 : 0;\n relevant.push({\n record: candidate.record,\n retrieval: {\n score: roundScore(Math.min(1, candidate.semanticScore + qualityAdjustment)),\n semanticScore: roundScore(candidate.semanticScore),\n matchType: candidate.matchType,\n vectorScore: candidate.vectorScore === null ? null : roundScore(candidate.vectorScore),\n keywordScore: candidate.keywordScore === null ? null : roundScore(candidate.keywordScore),\n relevanceSignals,\n freshness,\n qualityAdjustment,\n duplicateCount: 0,\n },\n });\n }\n relevant.sort(compareKnowledgeSearchResults);\n\n const deduped: KnowledgeSearchResult[] = [];\n const byContent = new Map<string, number>();\n let asDuplicate = 0;\n for (const result of relevant) {\n const key = knowledgeTextualContentKey(result.record);\n const retainedIndex = byContent.get(key);\n if (retainedIndex === undefined) {\n byContent.set(key, deduped.length);\n deduped.push(result);\n continue;\n }\n asDuplicate += 1;\n const retained = deduped[retainedIndex]!;\n retained.retrieval.duplicateCount += 1;\n }\n\n const forLimit = Math.max(0, deduped.length - requestedLimit);\n const bounded = deduped.slice(0, requestedLimit);\n let forResponseBudget = 0;\n let response = knowledgeSearchResponse({\n results: bounded,\n rankedCandidateCount: input.rankedCandidateCount,\n recheckedCandidateCount: input.candidates.length,\n belowRelevanceFloor,\n asDuplicate,\n forLimit,\n forResponseBudget,\n });\n while (knowledgeResponseBytes(response) > KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES) {\n if (bounded.length === 0) {\n throw new Error(\"knowledge search selection facts exceed the response budget\");\n }\n bounded.pop();\n forResponseBudget += 1;\n response = knowledgeSearchResponse({\n results: bounded,\n rankedCandidateCount: input.rankedCandidateCount,\n recheckedCandidateCount: input.candidates.length,\n belowRelevanceFloor,\n asDuplicate,\n forLimit,\n forResponseBudget,\n });\n }\n return response;\n}\n\nfunction compareKnowledgeSearchResults(\n left: KnowledgeSearchResult,\n right: KnowledgeSearchResult,\n): number {\n return (\n right.retrieval.score - left.retrieval.score ||\n right.retrieval.semanticScore - left.retrieval.semanticScore ||\n (right.retrieval.vectorScore ?? 0) - (left.retrieval.vectorScore ?? 0) ||\n (right.retrieval.keywordScore ?? 0) - (left.retrieval.keywordScore ?? 0) ||\n (left.record.id === right.record.id ? 0 : left.record.id < right.record.id ? -1 : 1)\n );\n}\n\nfunction knowledgeFreshness(value: string, nowMs: number): \"current\" | \"aging\" | \"stale\" {\n const freshnessMs = Date.parse(value);\n if (!Number.isFinite(freshnessMs)) return \"stale\";\n const ageDays = Math.max(0, (nowMs - freshnessMs) / 86_400_000);\n if (ageDays <= 90) return \"current\";\n return ageDays <= 365 ? \"aging\" : \"stale\";\n}\n\nfunction knowledgeTextualContentKey(record: KnowledgeRecord): string {\n return createHash(\"sha256\")\n .update(\"opengeni:knowledge-search-content:v1\\0\")\n .update(record.title)\n .update(\"\\0\")\n .update(\n JSON.stringify({\n body: record.content.body,\n summary: record.content.summary,\n topics: record.content.topics,\n }),\n )\n .digest(\"hex\");\n}\n\nfunction knowledgeSearchResponse(input: {\n results: KnowledgeSearchResult[];\n rankedCandidateCount: number;\n recheckedCandidateCount: number;\n belowRelevanceFloor: number;\n asDuplicate: number;\n forLimit: number;\n forResponseBudget: number;\n}): KnowledgeSearchResponse {\n const selection = {\n relevanceFloor: {\n policy: \"any_signal\" as const,\n vectorScore: KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE as 0.52,\n keywordScore: KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE as 0.01,\n },\n dedupe: { policy: \"exact_textual_content\" as const },\n candidates: {\n ranked: input.rankedCandidateCount,\n rechecked: input.recheckedCandidateCount,\n omittedOnRecheck: Math.max(0, input.rankedCandidateCount - input.recheckedCandidateCount),\n },\n omitted: {\n belowRelevanceFloor: input.belowRelevanceFloor,\n asDuplicate: input.asDuplicate,\n forLimit: input.forLimit,\n forResponseBudget: input.forResponseBudget,\n },\n budget: {\n maxResults: KNOWLEDGE_SEARCH_MAX_RESULTS as 50,\n maxResponseBytes: KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES as 65_536,\n responseBytes: 0,\n tokenEstimateBytesPerToken: KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN as 4,\n estimatedTokens: 0,\n maxEstimatedTokens: Math.ceil(\n KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n ) as 16_384,\n },\n };\n const response: KnowledgeSearchResponse = {\n results: [...input.results],\n selection,\n };\n // The counters themselves contribute a few bytes. Iterate to a fixed point so\n // responseBytes describes the actual serialized response, not an approximation.\n for (let index = 0; index < 8; index += 1) {\n const responseBytes = knowledgeResponseBytes(response);\n const estimatedTokens = Math.ceil(\n responseBytes / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n );\n if (\n response.selection.budget.responseBytes === responseBytes &&\n response.selection.budget.estimatedTokens === estimatedTokens\n ) {\n break;\n }\n response.selection.budget.responseBytes = responseBytes;\n response.selection.budget.estimatedTokens = estimatedTokens;\n }\n return response;\n}\n\nfunction knowledgeResponseBytes(response: KnowledgeSearchResponse): number {\n return Buffer.byteLength(JSON.stringify(response), \"utf8\");\n}\n\ntype KnowledgeBrowseEntry = {\n record: KnowledgeRecord;\n cursorAfter: string;\n};\n\n/**\n * Bound a browse page without skipping records. Tail records omitted for the\n * response budget remain behind the returned cursor. If one complete record is\n * itself too large, return a deterministic discovery projection; knowledge_get\n * remains the freshly authorized full-record path.\n */\nexport function selectKnowledgeBrowseRecords(input: {\n entries: KnowledgeBrowseEntry[];\n hasMoreAfterEntries: boolean;\n}): KnowledgeBrowseResponse {\n const entries = input.entries.slice(0, KNOWLEDGE_BROWSE_MAX_LIMIT);\n const selected = entries.map((entry) => entry.record);\n let omittedForResponseBudget = 0;\n let compactedRecordCount = 0;\n let response = knowledgeBrowseResponse({\n records: selected,\n nextCursor: input.hasMoreAfterEntries ? (entries.at(-1)?.cursorAfter ?? null) : null,\n hasMore: input.hasMoreAfterEntries,\n omittedForResponseBudget,\n compactedRecordCount,\n });\n while (\n selected.length > 1 &&\n knowledgeBrowseResponseBytes(response) > KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES\n ) {\n selected.pop();\n omittedForResponseBudget += 1;\n response = knowledgeBrowseResponse({\n records: selected,\n nextCursor: entries[selected.length - 1]?.cursorAfter ?? null,\n hasMore: true,\n omittedForResponseBudget,\n compactedRecordCount,\n });\n }\n if (\n selected.length === 1 &&\n knowledgeBrowseResponseBytes(response) > KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES\n ) {\n selected[0] = compactKnowledgeBrowseRecord(selected[0]!);\n compactedRecordCount = 1;\n response = knowledgeBrowseResponse({\n records: selected,\n nextCursor:\n omittedForResponseBudget > 0 || input.hasMoreAfterEntries\n ? (entries[0]?.cursorAfter ?? null)\n : null,\n hasMore: omittedForResponseBudget > 0 || input.hasMoreAfterEntries,\n omittedForResponseBudget,\n compactedRecordCount,\n });\n }\n if (knowledgeBrowseResponseBytes(response) > KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES) {\n throw new Error(\"knowledge browse discovery projection exceeds the response budget\");\n }\n return response;\n}\n\nfunction compactKnowledgeBrowseRecord(record: KnowledgeRecord): KnowledgeRecord {\n const fields = new Set<KnowledgeRecord[\"projection\"][\"fields\"][number]>([\n ...record.projection.fields,\n \"content.body\",\n \"content.summary\",\n \"content.topics\",\n \"content.metadata\",\n \"provenance.source.uri\",\n \"provenance.source.externalId\",\n \"provenance.source.title\",\n \"provenance.source.author\",\n \"provenance.source.version\",\n \"provenance.citation\",\n ]);\n return {\n ...record,\n content: {\n format: \"markdown\",\n body: null,\n summary: null,\n topics: [],\n metadata: {},\n },\n provenance: {\n ...record.provenance,\n source: {\n ...record.provenance.source,\n uri: null,\n externalId: null,\n title: null,\n author: null,\n version: null,\n },\n citation: null,\n },\n links: record.links.filter((link) => link.target.kind === \"knowledge\"),\n projection: {\n truncated: true,\n fields: [...fields].sort(),\n },\n };\n}\n\nfunction knowledgeBrowseResponse(input: {\n records: KnowledgeRecord[];\n nextCursor: string | null;\n hasMore: boolean;\n omittedForResponseBudget: number;\n compactedRecordCount: number;\n}): KnowledgeBrowseResponse {\n const response: KnowledgeBrowseResponse = {\n records: [...input.records],\n nextCursor: input.nextCursor,\n hasMore: input.hasMore,\n selection: {\n omitted: { forResponseBudget: input.omittedForResponseBudget },\n compactedRecordCount: input.compactedRecordCount,\n budget: {\n maxResults: KNOWLEDGE_BROWSE_MAX_LIMIT as 50,\n maxResponseBytes: KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES as 65_536,\n responseBytes: 0,\n tokenEstimateBytesPerToken: KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN as 4,\n estimatedTokens: 0,\n maxEstimatedTokens: Math.ceil(\n KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n ) as 16_384,\n },\n },\n };\n for (let index = 0; index < 8; index += 1) {\n const responseBytes = knowledgeBrowseResponseBytes(response);\n const estimatedTokens = Math.ceil(\n responseBytes / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n );\n if (\n response.selection.budget.responseBytes === responseBytes &&\n response.selection.budget.estimatedTokens === estimatedTokens\n ) {\n break;\n }\n response.selection.budget.responseBytes = responseBytes;\n response.selection.budget.estimatedTokens = estimatedTokens;\n }\n return response;\n}\n\nfunction knowledgeBrowseResponseBytes(response: KnowledgeBrowseResponse): number {\n return Buffer.byteLength(JSON.stringify(response), \"utf8\");\n}\n\n/** Fetch one stable Knowledge record with a fresh authorization check. */\nexport async function getEffectiveKnowledgeRecord(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n surface?: \"human\" | \"agent\" | undefined;\n id: string;\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n },\n): Promise<KnowledgeRecord | null> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const target = parseKnowledgeRecordId(input.id);\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface ?? \"agent\",\n agentAuthority: input.agentAuthority,\n });\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) => {\n if (target.kind === \"document\") {\n const [row] = await scopedDb\n .select({\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n firstChunkId: schema.documentChunks.id,\n })\n .from(schema.documents)\n .leftJoin(\n schema.documentChunks,\n and(\n eq(schema.documentChunks.accountId, schema.documents.accountId),\n eq(schema.documentChunks.documentId, schema.documents.id),\n eq(schema.documentChunks.chunkIndex, 0),\n ),\n )\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, target.id),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .limit(1);\n return row ? knowledgeDocumentRecord(row.document, row.citation, row.firstChunkId) : null;\n }\n const [row] = await scopedDb\n .select({\n chunk: schema.documentChunks,\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n previousChunkId: knowledgePreviousChunkIdProjection(),\n nextChunkId: knowledgeNextChunkIdProjection(),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documentChunks.accountId, input.accountId),\n eq(schema.documentChunks.id, target.id),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .limit(1);\n return row\n ? knowledgeChunkRecord(row.document, row.chunk, row.citation, {\n previousChunkId: row.previousChunkId,\n nextChunkId: row.nextChunkId,\n })\n : null;\n },\n );\n}\n\n/**\n * Browse top-level authorized documents or the chunks of one authorized\n * document. The cursor is opaque and bound to the caller, workspace, parent,\n * and filters. It can change pagination position but can never widen scope.\n */\nexport async function browseEffectiveKnowledge(\n db: Database,\n input: EffectiveKnowledgeBrowseInput,\n): Promise<KnowledgeBrowseResponse> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const limit = input.limit ?? 20;\n if (!Number.isInteger(limit) || limit < 1 || limit > 50) {\n throw new Error(\"knowledge browse limit must be between 1 and 50\");\n }\n const topic = input.topic === undefined ? null : (cleanString(input.topic) ?? null);\n if (input.topic !== undefined && (!topic || topic !== input.topic || topic.length > 256)) {\n throw new Error(\"knowledge browse topic is invalid\");\n }\n const sourceKinds = [...new Set(input.sourceKinds ?? [])].sort();\n const parent = input.parentId ? parseKnowledgeRecordId(input.parentId) : null;\n if (parent?.kind === \"document_chunk\") {\n throw new Error(\"knowledge browse parent must be a document record\");\n }\n if (parent && (topic || sourceKinds.length > 0)) {\n throw new Error(\"knowledge browse document contents do not accept topic/source filters\");\n }\n const cursorScope: KnowledgeBrowseCursorScope = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n parentId: parent ? `${parent.kind}:${parent.id}` : null,\n topic,\n sourceKinds,\n };\n const topLevelAfter =\n !parent && input.cursor ? decodeKnowledgeBrowseCursor(input.cursor, cursorScope) : 0n;\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface ?? \"agent\",\n agentAuthority: input.agentAuthority,\n });\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) => {\n if (parent) {\n const [authorizedParent] = await scopedDb\n .select({\n id: schema.documents.id,\n indexSequence: schema.documents.indexSequence,\n })\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, parent.id),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .limit(1);\n if (!authorizedParent) {\n return selectKnowledgeBrowseRecords({\n entries: [],\n hasMoreAfterEntries: false,\n });\n }\n if (authorizedParent.indexSequence === null) {\n throw new Error(\"ready knowledge document is missing its index revision\");\n }\n const parentCursorScope: KnowledgeBrowseCursorScope = {\n ...cursorScope,\n parentRevision: authorizedParent.indexSequence.toString(),\n };\n const after = input.cursor\n ? decodeKnowledgeBrowseCursor(input.cursor, parentCursorScope)\n : 0n;\n if (after > 2_147_483_648n) {\n throw new Error(\"invalid knowledge browse cursor\");\n }\n const rows = await scopedDb\n .select({\n chunk: schema.documentChunks,\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n previousChunkId: knowledgePreviousChunkIdProjection(),\n nextChunkId: knowledgeNextChunkIdProjection(),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documentChunks.accountId, input.accountId),\n eq(schema.documentChunks.documentId, parent.id),\n gt(schema.documentChunks.chunkIndex, Number(after) - 1),\n eq(schema.documents.status, \"ready\"),\n eq(schema.documents.indexSequence, authorizedParent.indexSequence),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .orderBy(asc(schema.documentChunks.chunkIndex))\n .limit(limit + 1);\n const hasMore = rows.length > limit;\n const page = rows.slice(0, limit);\n return selectKnowledgeBrowseRecords({\n entries: page.map((row) => ({\n record: knowledgeChunkRecord(row.document, row.chunk, row.citation, {\n previousChunkId: row.previousChunkId,\n nextChunkId: row.nextChunkId,\n }),\n cursorAfter: encodeKnowledgeBrowseCursor(\n parentCursorScope,\n BigInt(row.chunk.chunkIndex + 1),\n ),\n })),\n hasMoreAfterEntries: hasMore,\n });\n }\n\n const conditions: SQL[] = [\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.status, \"ready\"),\n isNotNull(schema.documents.indexSequence),\n gt(schema.documents.indexSequence, topLevelAfter),\n ...documentAccessConditions(input.workspaceId, access),\n ];\n if (topic) conditions.push(sql`${schema.documents.topics} ? ${topic}`);\n if (sourceKinds.length > 0)\n conditions.push(inArray(schema.documents.sourceKind, sourceKinds));\n const rows = await scopedDb\n .select({\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n firstChunkId: schema.documentChunks.id,\n })\n .from(schema.documents)\n .leftJoin(\n schema.documentChunks,\n and(\n eq(schema.documentChunks.accountId, schema.documents.accountId),\n eq(schema.documentChunks.documentId, schema.documents.id),\n eq(schema.documentChunks.chunkIndex, 0),\n ),\n )\n .where(and(...conditions))\n .orderBy(asc(schema.documents.indexSequence))\n .limit(limit + 1);\n const hasMore = rows.length > limit;\n const page = rows.slice(0, limit);\n return selectKnowledgeBrowseRecords({\n entries: page.map((row) => {\n if (row.document.indexSequence === null) {\n throw new Error(\"ready knowledge document is missing its index revision\");\n }\n return {\n record: knowledgeDocumentRecord(row.document, row.citation, row.firstChunkId),\n cursorAfter: encodeKnowledgeBrowseCursor(cursorScope, row.document.indexSequence),\n };\n }),\n hasMoreAfterEntries: hasMore,\n });\n },\n );\n}\n\ntype KnowledgeBrowseCursorScope = {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n parentId: string | null;\n parentRevision?: string | null | undefined;\n topic: string | null;\n sourceKinds: readonly string[];\n};\n\nexport function encodeKnowledgeBrowseCursor(\n scope: KnowledgeBrowseCursorScope,\n position: bigint,\n): string {\n if (position < 0n) throw new Error(\"knowledge browse cursor position is invalid\");\n const version = knowledgeBrowseCursorVersion(scope);\n return Buffer.from(\n JSON.stringify({\n v: version,\n s: knowledgeBrowseCursorScope(scope),\n q: position.toString(),\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nexport function decodeKnowledgeBrowseCursor(\n value: string,\n scope: KnowledgeBrowseCursorScope,\n): bigint {\n try {\n if (!value || value.length > KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS) {\n throw new Error(\"cursor length\");\n }\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"cursor encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n const expectedVersion = knowledgeBrowseCursorVersion(scope);\n if (\n Object.keys(parsed).sort().join(\",\") !== \"q,s,v\" ||\n parsed.v !== expectedVersion ||\n typeof parsed.s !== \"string\" ||\n typeof parsed.q !== \"string\" ||\n !/^(0|[1-9][0-9]*)$/.test(parsed.q)\n ) {\n throw new Error(\"cursor payload\");\n }\n if (parsed.s !== knowledgeBrowseCursorScope(scope)) {\n throw new Error(\"knowledge browse cursor belongs to a different scope\");\n }\n const position = BigInt(parsed.q);\n if (position > 9_223_372_036_854_775_807n) throw new Error(\"cursor position\");\n return position;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === \"knowledge browse cursor belongs to a different scope\"\n ) {\n throw error;\n }\n throw new Error(\"invalid knowledge browse cursor\", { cause: error });\n }\n}\n\nfunction knowledgeBrowseCursorScope(scope: KnowledgeBrowseCursorScope): string {\n const version = knowledgeBrowseCursorVersion(scope);\n const hash = createHash(\"sha256\")\n .update(`opengeni:knowledge-browse-cursor:v${version}\\0`)\n .update(scope.accountId)\n .update(\"\\0\")\n .update(scope.workspaceId)\n .update(\"\\0\")\n .update(canonicalEffectiveDocumentSubject(scope.initiatingSubjectId))\n .update(\"\\0\")\n .update(scope.parentId ?? \"\")\n .update(\"\\0\");\n if (version === 2) hash.update(scope.parentRevision!).update(\"\\0\");\n return hash\n .update(scope.topic ?? \"\")\n .update(\"\\0\")\n .update([...scope.sourceKinds].sort().join(\"\\0\"))\n .digest(\"hex\");\n}\n\nfunction knowledgeBrowseCursorVersion(scope: KnowledgeBrowseCursorScope): 1 | 2 {\n if (!scope.parentId) return 1;\n if (!scope.parentRevision || !/^[1-9][0-9]*$/.test(scope.parentRevision)) {\n throw new Error(\"knowledge browse parent cursor requires an exact document revision\");\n }\n return 2;\n}\n\nfunction parseKnowledgeRecordId(value: string): {\n kind: \"document\" | \"document_chunk\";\n id: string;\n} {\n const match =\n /^(document|document_chunk):([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/iu.exec(\n value,\n );\n if (!match) throw new Error(\"invalid knowledge record id\");\n return {\n kind: match[1] as \"document\" | \"document_chunk\",\n id: match[2]!.toLowerCase(),\n };\n}\n\nfunction knowledgeDocumentRecord(\n document: typeof schema.documents.$inferSelect,\n citation: unknown = null,\n firstChunkId: string | null = null,\n): KnowledgeRecord {\n if (!document.indexedAt) throw new Error(`Ready document is missing indexed_at: ${document.id}`);\n const projected = projectKnowledgeRecord({\n title: document.title,\n body: document.summary,\n summary: document.summary,\n topics: document.topics,\n metadata: { parser: document.parser, chunkCount: document.chunkCount },\n source: knowledgeSource(document),\n });\n return {\n id: `document:${document.id}`,\n kind: \"document\",\n title: projected.title,\n content: projected.content,\n authority: { kind: normalizeDocumentAuthorityKind(document.authorityKind) },\n provenance: {\n source: projected.source,\n indexedAt: document.indexedAt.toISOString(),\n citation: parseKnowledgeProviderCitation(citation),\n },\n lifecycle: { state: \"active\", updatedAt: document.updatedAt.toISOString() },\n quality: knowledgeQuality(document),\n links: [\n ...(firstChunkId\n ? [\n {\n relation: \"contents\" as const,\n target: {\n kind: \"knowledge\" as const,\n id: `document_chunk:${firstChunkId}` as const,\n },\n },\n ]\n : []),\n ...knowledgeSourceLinks(projected.source.uri),\n ],\n projection: projected.projection,\n };\n}\n\nfunction knowledgeChunkRecord(\n document: typeof schema.documents.$inferSelect,\n chunk: typeof schema.documentChunks.$inferSelect,\n citation: unknown = null,\n traversal: {\n previousChunkId: string | null;\n nextChunkId: string | null;\n } = { previousChunkId: null, nextChunkId: null },\n): KnowledgeRecord {\n if (!document.indexedAt) throw new Error(`Ready document is missing indexed_at: ${document.id}`);\n const projected = projectKnowledgeRecord({\n title: document.title,\n body: chunk.text,\n summary: document.summary,\n topics: document.topics,\n metadata: { ...chunk.metadata, chunkIndex: chunk.chunkIndex },\n source: knowledgeSource(document),\n });\n return {\n id: `document_chunk:${chunk.id}`,\n kind: \"document_chunk\",\n title: projected.title,\n content: projected.content,\n authority: { kind: normalizeDocumentAuthorityKind(document.authorityKind) },\n provenance: {\n source: projected.source,\n indexedAt: document.indexedAt.toISOString(),\n citation: parseKnowledgeProviderCitation(citation),\n },\n lifecycle: { state: \"active\", updatedAt: document.updatedAt.toISOString() },\n quality: knowledgeQuality(document),\n links: [\n {\n relation: \"parent\",\n target: { kind: \"knowledge\", id: `document:${document.id}` },\n },\n ...(traversal.previousChunkId\n ? [\n {\n relation: \"previous\" as const,\n target: {\n kind: \"knowledge\" as const,\n id: `document_chunk:${traversal.previousChunkId}` as const,\n },\n },\n ]\n : []),\n ...(traversal.nextChunkId\n ? [\n {\n relation: \"next\" as const,\n target: {\n kind: \"knowledge\" as const,\n id: `document_chunk:${traversal.nextChunkId}` as const,\n },\n },\n ]\n : []),\n ...knowledgeSourceLinks(projected.source.uri),\n ],\n projection: projected.projection,\n };\n}\n\nfunction knowledgeSource(document: typeof schema.documents.$inferSelect) {\n return {\n kind: normalizeKnowledgeSourceKind(document.sourceKind),\n uri: document.sourceUri,\n externalId: document.sourceExternalId,\n title: document.sourceTitle,\n author: document.sourceAuthor,\n createdAt: document.sourceCreatedAt?.toISOString() ?? null,\n updatedAt: document.sourceUpdatedAt?.toISOString() ?? null,\n version: document.sourceVersion,\n };\n}\n\nfunction knowledgeQuality(\n document: typeof schema.documents.$inferSelect,\n): KnowledgeRecord[\"quality\"] {\n if (!document.indexedAt) throw new Error(`Ready document is missing indexed_at: ${document.id}`);\n return {\n trust: \"sourced\",\n freshnessAt: (document.sourceUpdatedAt ?? document.indexedAt).toISOString(),\n conflict: \"not_evaluated\",\n correction: \"current_source_version\",\n };\n}\n\nfunction knowledgeSourceLinks(sourceUri: string | null): KnowledgeRecord[\"links\"] {\n return sourceUri ? [{ relation: \"source\", target: { kind: \"external\", uri: sourceUri } }] : [];\n}\n\n/**\n * These structural targets are selected inside the same authorization-scoped\n * transaction as their owning record. Only opaque ids are projected; titles,\n * source fields, and content require a subsequent freshly authorized get.\n */\nfunction knowledgePreviousChunkIdProjection(): SQL<string | null> {\n return sql<string | null>`(\n select knowledge_previous_chunk.id\n from document_chunks knowledge_previous_chunk\n where knowledge_previous_chunk.account_id = ${schema.documentChunks.accountId}\n and knowledge_previous_chunk.document_id = ${schema.documentChunks.documentId}\n and knowledge_previous_chunk.chunk_index < ${schema.documentChunks.chunkIndex}\n order by knowledge_previous_chunk.chunk_index desc\n limit 1\n )`;\n}\n\nfunction knowledgeNextChunkIdProjection(): SQL<string | null> {\n return sql<string | null>`(\n select knowledge_next_chunk.id\n from document_chunks knowledge_next_chunk\n where knowledge_next_chunk.account_id = ${schema.documentChunks.accountId}\n and knowledge_next_chunk.document_id = ${schema.documentChunks.documentId}\n and knowledge_next_chunk.chunk_index > ${schema.documentChunks.chunkIndex}\n order by knowledge_next_chunk.chunk_index asc\n limit 1\n )`;\n}\n\nasync function vectorSearchDocuments(\n db: Database,\n input: DocumentSearchInput,\n limit: number,\n services: Pick<DocumentServices, \"embedder\">,\n): Promise<CombinedSearchRow[]> {\n const queryEmbedding = await services.embedder.embedQuery(input.query);\n validateEmbedding(queryEmbedding, services.embedder.dimensions, services.embedder.model);\n const distance = sql<number>`${schema.documentChunks.embedding} <=> ${vectorLiteral(queryEmbedding)}::vector`;\n const rows = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n input.access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunkId: schema.documentChunks.id,\n workspaceId: schema.documentChunks.workspaceId,\n documentId: schema.documentChunks.documentId,\n baseId: schema.documentChunks.baseId,\n fileId: schema.documentChunks.fileId,\n title: schema.documents.title,\n text: schema.documentChunks.text,\n chunkIndex: schema.documentChunks.chunkIndex,\n metadata: schema.documentChunks.metadata,\n sourceKind: schema.documents.sourceKind,\n sourceUri: schema.documents.sourceUri,\n sourceExternalId: schema.documents.sourceExternalId,\n sourceTitle: schema.documents.sourceTitle,\n sourceAuthor: schema.documents.sourceAuthor,\n sourceCreatedAt: schema.documents.sourceCreatedAt,\n sourceUpdatedAt: schema.documents.sourceUpdatedAt,\n sourceVersion: schema.documents.sourceVersion,\n aclTags: schema.documents.aclTags,\n authorityKind: schema.documents.authorityKind,\n authorityWorkspaceId: schema.documents.authorityWorkspaceId,\n authoritySubjectId: schema.documents.authoritySubjectId,\n citation: googleDriveCitationProjection(input.workspaceId, input.access),\n distance,\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(and(...documentSearchConditions(input, services.embedder.model)))\n .orderBy(distance, asc(schema.documentChunks.id))\n .limit(limit),\n );\n return rows.map((row) => ({\n ...mapSearchRowBase(row),\n vectorScore: 1 / (1 + Number(row.distance)),\n keywordScore: null,\n }));\n}\n\nasync function keywordSearchDocuments(\n db: Database,\n input: DocumentSearchInput,\n limit: number,\n): Promise<CombinedSearchRow[]> {\n const rank = sql<number>`ts_rank_cd(to_tsvector('simple', ${schema.documentChunks.text}), plainto_tsquery('simple', ${input.query}))`;\n const rows = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n input.access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunkId: schema.documentChunks.id,\n workspaceId: schema.documentChunks.workspaceId,\n documentId: schema.documentChunks.documentId,\n baseId: schema.documentChunks.baseId,\n fileId: schema.documentChunks.fileId,\n title: schema.documents.title,\n text: schema.documentChunks.text,\n chunkIndex: schema.documentChunks.chunkIndex,\n metadata: schema.documentChunks.metadata,\n sourceKind: schema.documents.sourceKind,\n sourceUri: schema.documents.sourceUri,\n sourceExternalId: schema.documents.sourceExternalId,\n sourceTitle: schema.documents.sourceTitle,\n sourceAuthor: schema.documents.sourceAuthor,\n sourceCreatedAt: schema.documents.sourceCreatedAt,\n sourceUpdatedAt: schema.documents.sourceUpdatedAt,\n sourceVersion: schema.documents.sourceVersion,\n aclTags: schema.documents.aclTags,\n authorityKind: schema.documents.authorityKind,\n authorityWorkspaceId: schema.documents.authorityWorkspaceId,\n authoritySubjectId: schema.documents.authoritySubjectId,\n citation: googleDriveCitationProjection(input.workspaceId, input.access),\n rank,\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n ...documentSearchConditions(input),\n sql`to_tsvector('simple', ${schema.documentChunks.text}) @@ plainto_tsquery('simple', ${input.query})`,\n ),\n )\n .orderBy(desc(rank), asc(schema.documentChunks.id))\n .limit(limit),\n );\n return rows.map((row) => ({\n ...mapSearchRowBase(row),\n vectorScore: null,\n keywordScore: normalizeKeywordScore(Number(row.rank)),\n }));\n}\n\nexport async function getDocumentChunk(\n db: Database,\n accountId: string,\n workspaceId: string,\n chunkId: string,\n access?: DocumentAccessFilter,\n): Promise<DocumentSearchResult | null> {\n const [row] = await withDocumentAccountRls(\n db,\n accountId,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunkId: schema.documentChunks.id,\n workspaceId: schema.documentChunks.workspaceId,\n documentId: schema.documentChunks.documentId,\n baseId: schema.documentChunks.baseId,\n fileId: schema.documentChunks.fileId,\n title: schema.documents.title,\n text: schema.documentChunks.text,\n chunkIndex: schema.documentChunks.chunkIndex,\n metadata: schema.documentChunks.metadata,\n sourceKind: schema.documents.sourceKind,\n sourceUri: schema.documents.sourceUri,\n sourceExternalId: schema.documents.sourceExternalId,\n sourceTitle: schema.documents.sourceTitle,\n sourceAuthor: schema.documents.sourceAuthor,\n sourceCreatedAt: schema.documents.sourceCreatedAt,\n sourceUpdatedAt: schema.documents.sourceUpdatedAt,\n sourceVersion: schema.documents.sourceVersion,\n aclTags: schema.documents.aclTags,\n authorityKind: schema.documents.authorityKind,\n authorityWorkspaceId: schema.documents.authorityWorkspaceId,\n authoritySubjectId: schema.documents.authoritySubjectId,\n citation: googleDriveCitationProjection(workspaceId, access),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documents.accountId, accountId),\n eq(schema.documentChunks.accountId, accountId),\n eq(schema.documentChunks.id, chunkId),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(workspaceId, access),\n ),\n )\n .limit(1),\n );\n if (!row) return null;\n return {\n ...mapSearchRowBase(row),\n score: 1,\n matchType: \"hybrid\",\n vectorScore: null,\n keywordScore: null,\n };\n}\n\ntype SearchRowBase = Omit<\n DocumentSearchResult,\n \"score\" | \"matchType\" | \"vectorScore\" | \"keywordScore\"\n>;\ntype CombinedSearchRow = SearchRowBase & {\n vectorScore: number | null;\n keywordScore: number | null;\n};\n\nexport function resolveDocumentAuthority(input: {\n kind?: DocumentAuthorityKind | undefined;\n legacyVisibility?: DocumentVisibility | undefined;\n workspaceId: string;\n initiatingSubjectId?: string | null | undefined;\n}): DocumentAuthority {\n const legacyKind = input.legacyVisibility === \"private\" ? \"personal\" : \"workspace\";\n const kind = input.kind ?? legacyKind;\n if (\n input.kind &&\n input.legacyVisibility &&\n (input.legacyVisibility === \"private\") !== (input.kind === \"personal\")\n ) {\n throw new Error(\"document authorityKind conflicts with legacy visibility\");\n }\n if (kind === \"organization\") {\n return { kind, workspaceId: null, subjectId: null };\n }\n if (kind === \"workspace\") {\n return { kind, workspaceId: input.workspaceId, subjectId: null };\n }\n const subjectId = cleanString(input.initiatingSubjectId ?? null);\n if (!subjectId) throw new Error(\"personal documents require an initiating subject\");\n if (new TextEncoder().encode(subjectId).byteLength > DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES) {\n throw new Error(\n `personal document initiating subject exceeds ${DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES} UTF-8 bytes`,\n );\n }\n return { kind, workspaceId: input.workspaceId, subjectId };\n}\n\nasync function withDocumentRls<T>(\n db: Database,\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n fn: (db: Database) => Promise<T>,\n): Promise<T> {\n const subjectId = cleanString(access?.viewerSubjectId ?? null);\n return subjectId\n ? await withWorkspaceSubjectRls(db, workspaceId, subjectId, fn)\n : await withWorkspaceRls(db, workspaceId, fn);\n}\n\nasync function withDocumentAccountRls<T>(\n db: Database,\n accountId: string,\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n fn: (db: Database) => Promise<T>,\n): Promise<T> {\n const context = await assertDocumentAccountWorkspace(db, accountId, workspaceId);\n const subjectId = cleanString(access?.viewerSubjectId ?? null);\n return await withRlsContext(db, context, async (scopedDb) => {\n if (subjectId) await setSubjectRlsContext(scopedDb, subjectId);\n return await fn(scopedDb);\n });\n}\n\nasync function assertDocumentAccountWorkspace(\n db: Database,\n accountId: string,\n workspaceId: string,\n) {\n const context = await rlsContextForWorkspace(db, workspaceId);\n if (context.accountId !== accountId) {\n throw new Error(\"document account/workspace authority mismatch\");\n }\n return context;\n}\n\nexport async function resolveEffectiveDocumentAccess(\n _db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n surface: \"human\" | \"agent\";\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n },\n): Promise<DocumentAccessFilter> {\n if (input.surface === \"human\") {\n return { viewerSubjectId: input.initiatingSubjectId };\n }\n return {\n agentOnly: true,\n viewerSubjectId: input.initiatingSubjectId,\n authorizedPersonalAttempt: input.agentAuthority\n ? {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.agentAuthority.sessionId,\n attemptId: input.agentAuthority.attemptId,\n }\n : undefined,\n };\n}\n\n/**\n * Visibility/agent scoping shared by every document read path. Fail-closed:\n * with no filter supplied, private documents are invisible.\n */\nfunction documentAccessConditions(\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n): SQL[] {\n const organization = eq(schema.documents.authorityKind, \"organization\");\n const workspace = and(\n eq(schema.documents.authorityKind, \"workspace\"),\n eq(schema.documents.authorityWorkspaceId, workspaceId),\n );\n const viewer = cleanString(access?.viewerSubjectId ?? null);\n const personalAttempt = access?.authorizedPersonalAttempt;\n const authorizedPersonal = personalAttempt\n ? sql`${schema.documents.id} IN (\n SELECT resolve_session_attempt_personal_document_reads(\n ${personalAttempt.accountId}::uuid,\n ${personalAttempt.workspaceId}::uuid,\n ${personalAttempt.sessionId}::uuid,\n ${personalAttempt.attemptId}::uuid\n )\n )`\n : sql`false`;\n const personal = viewer\n ? and(\n eq(schema.documents.authorityKind, \"personal\"),\n eq(schema.documents.authoritySubjectId, viewer),\n access?.agentOnly\n ? (or(\n and(\n isNull(schema.documents.authorityId),\n eq(schema.documents.authorityWorkspaceId, workspaceId),\n ),\n and(isNotNull(schema.documents.authorityId), authorizedPersonal),\n ) ?? authorizedPersonal)\n : (or(\n eq(schema.documents.authorityWorkspaceId, workspaceId),\n isNull(schema.documents.authorityWorkspaceId),\n ) ?? eq(schema.documents.authorityWorkspaceId, workspaceId)),\n )\n : undefined;\n const authority = viewer\n ? (or(organization, workspace, personal) ?? organization)\n : (or(organization, workspace) ?? organization);\n const viewerSql = viewer ? sql`${viewer}` : sql`NULL::text`;\n const providerAuthorization = sql`google_drive_file_authorized(\n ${schema.documents.accountId},\n ${workspaceId}::uuid,\n ${viewerSql},\n ${schema.documents.fileId}\n )`;\n if (access?.agentOnly) {\n return [eq(schema.documents.agentAccess, true), authority, providerAuthorization];\n }\n return [authority, providerAuthorization];\n}\n\nfunction documentMatchesAccess(\n document: Pick<\n DocumentAccessRecord,\n | \"id\"\n | \"authorityId\"\n | \"authorityKind\"\n | \"authorityWorkspaceId\"\n | \"authoritySubjectId\"\n | \"agentAccess\"\n >,\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n): boolean {\n if (access?.agentOnly) {\n return (\n document.agentAccess &&\n (document.authorityKind !== \"personal\" || document.authorityId === null) &&\n canViewDocument(document, access.viewerSubjectId, workspaceId)\n );\n }\n return canViewDocument(document, access?.viewerSubjectId, workspaceId);\n}\n\nfunction canonicalDocumentAuthoritySubject(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const subjectId = cleanString(value);\n if (!subjectId || subjectId !== value) return undefined;\n if (new TextEncoder().encode(subjectId).byteLength > DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES) {\n return undefined;\n }\n return subjectId;\n}\n\n/**\n * Whether a single already-fetched document is readable in this workspace.\n *\n * Keep this compatibility predicate as strict as SQL/RLS: legacy personal\n * authority remains origin-workspace anchored while activated personal\n * authority has a null workspace and follows the exact owner within the org.\n */\nexport function canViewDocument(\n document: Pick<DocumentAccessRecord, \"authorityKind\" | \"authoritySubjectId\"> & {\n authorityWorkspaceId?: string | null | undefined;\n },\n viewerSubjectId: string | null | undefined,\n workspaceId?: string | null | undefined,\n): boolean {\n if (document.authorityKind === \"organization\") {\n return document.authorityWorkspaceId === null && document.authoritySubjectId === null;\n }\n const normalizedWorkspaceId = cleanString(workspaceId ?? null);\n if (!normalizedWorkspaceId) {\n return false;\n }\n if (document.authorityKind === \"workspace\") {\n return (\n document.authorityWorkspaceId === normalizedWorkspaceId &&\n document.authoritySubjectId === null\n );\n }\n if (document.authorityKind === \"personal\") {\n const authoritySubjectId = canonicalDocumentAuthoritySubject(document.authoritySubjectId);\n const viewer = canonicalDocumentAuthoritySubject(viewerSubjectId);\n return (\n !!authoritySubjectId &&\n authoritySubjectId === viewer &&\n (document.authorityWorkspaceId === null ||\n document.authorityWorkspaceId === normalizedWorkspaceId)\n );\n }\n return false;\n}\n\ntype DocumentAccessRecord = {\n id: string;\n authorityId: string | null;\n authorityKind: string;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n agentAccess: boolean;\n};\n\nfunction documentSearchConditions(input: DocumentSearchInput, embeddingModel?: string): SQL[] {\n const conditions: SQL[] = [\n eq(schema.documents.status, \"ready\"),\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documentChunks.accountId, input.accountId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ];\n if (embeddingModel) {\n conditions.push(eq(schema.documentChunks.embeddingModel, embeddingModel));\n }\n if (input.baseIds?.length) {\n conditions.push(inArray(schema.documentChunks.baseId, input.baseIds));\n }\n if (input.sourceKinds?.length) {\n conditions.push(inArray(schema.documents.sourceKind, input.sourceKinds));\n }\n if (input.authorityKinds?.length) {\n conditions.push(inArray(schema.documents.authorityKind, input.authorityKinds));\n }\n const aclTags = cleanStringArray(input.aclTags);\n if (aclTags.length > 0) {\n conditions.push(sql`${schema.documents.aclTags} @> ${JSON.stringify(aclTags)}::jsonb`);\n }\n return conditions;\n}\n\nfunction mapSearchRowBase(row: {\n chunkId: string;\n workspaceId: string;\n documentId: string;\n baseId: string;\n fileId: string;\n title: string;\n text: string;\n chunkIndex: number;\n metadata: Record<string, unknown>;\n sourceKind: string;\n sourceUri: string | null;\n sourceExternalId: string | null;\n sourceTitle: string | null;\n sourceAuthor: string | null;\n sourceCreatedAt: Date | null;\n sourceUpdatedAt: Date | null;\n sourceVersion: string | null;\n aclTags: string[];\n authorityKind: string;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n citation?: unknown;\n}): SearchRowBase {\n return {\n chunkId: row.chunkId,\n workspaceId: row.workspaceId,\n documentId: row.documentId,\n baseId: row.baseId,\n fileId: row.fileId,\n title: row.title,\n text: row.text,\n chunkIndex: row.chunkIndex,\n metadata: row.metadata,\n sourceKind: normalizeKnowledgeSourceKind(row.sourceKind),\n sourceUri: row.sourceUri,\n sourceExternalId: row.sourceExternalId,\n sourceTitle: row.sourceTitle,\n sourceAuthor: row.sourceAuthor,\n sourceCreatedAt: row.sourceCreatedAt?.toISOString() ?? null,\n sourceUpdatedAt: row.sourceUpdatedAt?.toISOString() ?? null,\n sourceVersion: row.sourceVersion,\n aclTags: cleanStringArray(row.aclTags),\n authorityKind: normalizeDocumentAuthorityKind(row.authorityKind),\n authorityWorkspaceId: row.authorityWorkspaceId,\n authoritySubjectId: row.authoritySubjectId,\n citation: parseKnowledgeProviderCitation(row.citation),\n };\n}\n\nfunction googleDriveCitationProjection(\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n): SQL<unknown> {\n const viewer = cleanString(access?.viewerSubjectId ?? null);\n const viewerSql = viewer ? sql`${viewer}` : sql`NULL::text`;\n return sql`google_drive_document_citation(\n ${schema.documents.accountId},\n ${workspaceId}::uuid,\n ${viewerSql},\n ${schema.documents.id},\n ${schema.documents.fileId}\n )`;\n}\n\nfunction parseKnowledgeProviderCitation(value: unknown): KnowledgeProviderCitationValue | null {\n return value === null || value === undefined ? null : KnowledgeProviderCitation.parse(value);\n}\n\nfunction mergeDocumentSearchRows(\n rows: CombinedSearchRow[],\n mode: DocumentSearchMode,\n): DocumentSearchResult[] {\n const byChunk = new Map<string, CombinedSearchRow>();\n for (const row of rows) {\n const existing = byChunk.get(row.chunkId);\n if (!existing) {\n byChunk.set(row.chunkId, row);\n continue;\n }\n byChunk.set(row.chunkId, {\n ...existing,\n vectorScore: Math.max(existing.vectorScore ?? 0, row.vectorScore ?? 0) || null,\n keywordScore: Math.max(existing.keywordScore ?? 0, row.keywordScore ?? 0) || null,\n });\n }\n return [...byChunk.values()]\n .map((row) => {\n const vectorScore = row.vectorScore;\n const keywordScore = row.keywordScore;\n const matchType: DocumentSearchMode =\n vectorScore !== null && keywordScore !== null\n ? \"hybrid\"\n : vectorScore !== null\n ? \"vector\"\n : \"keyword\";\n return {\n ...row,\n score: combinedSearchScore(mode, vectorScore, keywordScore, matchType),\n matchType,\n };\n })\n .sort(\n (left, right) =>\n right.score - left.score ||\n (right.vectorScore ?? 0) - (left.vectorScore ?? 0) ||\n (right.keywordScore ?? 0) - (left.keywordScore ?? 0) ||\n left.chunkIndex - right.chunkIndex ||\n (left.chunkId === right.chunkId ? 0 : left.chunkId < right.chunkId ? -1 : 1),\n );\n}\n\nfunction combinedSearchScore(\n mode: DocumentSearchMode,\n vectorScore: number | null,\n keywordScore: number | null,\n matchType: DocumentSearchMode,\n): number {\n const vector = vectorScore ?? 0;\n const keyword = keywordScore ?? 0;\n if (mode === \"vector\") return roundScore(vector);\n if (mode === \"keyword\") return roundScore(keyword);\n return roundScore(\n Math.min(1, 0.65 * vector + 0.35 * keyword + (matchType === \"hybrid\" ? 0.1 : 0)),\n );\n}\n\nfunction normalizeKeywordScore(rank: number): number {\n if (!Number.isFinite(rank) || rank <= 0) {\n return 0;\n }\n return rank / (rank + 1);\n}\n\nfunction roundScore(value: number): number {\n return Number(value.toFixed(6));\n}\n\nexport async function parseDocumentBytes(\n bytes: Uint8Array,\n file: FileAsset,\n parser: DocumentParser = new LiteParseDocumentParser(),\n): Promise<ParsedDocument> {\n return await parser.parse(bytes, file);\n}\n\nexport function chunkText(\n text: string,\n maxChars = DEFAULT_DOCUMENT_CHUNK_SIZE,\n overlapChars = DEFAULT_DOCUMENT_CHUNK_OVERLAP,\n): string[] {\n if (overlapChars >= maxChars) {\n throw new Error(\"chunk overlap must be smaller than chunk size\");\n }\n const normalized = text\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/[ \\t]+/g, \" \")\n .trim();\n if (!normalized) return [];\n const paragraphs = normalized\n .split(/\\n{2,}/)\n .map((part) => part.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n const chunks: string[] = [];\n let current = \"\";\n for (const paragraph of paragraphs.length > 0 ? paragraphs : [normalized.replace(/\\s+/g, \" \")]) {\n for (const part of splitOversizedText(paragraph, maxChars)) {\n if (!current) {\n current = part;\n } else if (current.length + 1 + part.length <= maxChars) {\n current = `${current} ${part}`;\n } else {\n chunks.push(current);\n current = withOverlap(current, overlapChars, part, maxChars);\n }\n }\n }\n if (current) chunks.push(current);\n return chunks.map((chunk) => chunk.trim()).filter(Boolean);\n}\n\nexport function deterministicEmbedding(\n text: string,\n dimensions = DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS,\n): number[] {\n const values = new Array(dimensions).fill(0);\n const tokens = text.toLowerCase().match(/[\\p{L}\\p{N}_-]+/gu) ?? [];\n for (const token of tokens) {\n let hash = 2166136261;\n for (const char of token) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n values[Math.abs(hash) % dimensions] += 1;\n }\n const norm = Math.hypot(...values) || 1;\n return values.map((value) => Number((value / norm).toFixed(6)));\n}\n\nasync function requireReadyFile(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n subjectId: string | null;\n fileId: string;\n },\n): Promise<FileAsset> {\n const [file] = await getFilesForSubject(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: input.subjectId,\n fileIds: [input.fileId],\n });\n if (!file) throw new Error(`File not found: ${input.fileId}`);\n if (file.status !== \"ready\") {\n throw new Error(`File ${input.fileId} is ${file.status}`);\n }\n return file;\n}\n\nfunction validateEmbedding(values: number[], dimensions: number, model: string): number[] {\n if (values.length !== dimensions) {\n throw new Error(\n `Embedding model ${model} returned ${values.length} dimensions; expected ${dimensions}`,\n );\n }\n if (values.some((value) => !Number.isFinite(value))) {\n throw new Error(`Embedding model ${model} returned non-finite values`);\n }\n return values;\n}\n\nfunction isTextLike(file: FileAsset): boolean {\n const contentType = file.contentType.toLowerCase();\n const filename = file.filename.toLowerCase();\n return (\n contentType.startsWith(\"text/\") ||\n contentType === \"application/json\" ||\n contentType === \"application/xml\" ||\n contentType === \"application/x-yaml\" ||\n filename.endsWith(\".md\") ||\n filename.endsWith(\".markdown\") ||\n filename.endsWith(\".json\") ||\n filename.endsWith(\".yaml\") ||\n filename.endsWith(\".yml\") ||\n filename.endsWith(\".csv\") ||\n filename.endsWith(\".tsv\") ||\n filename.endsWith(\".xml\")\n );\n}\n\nfunction splitOversizedText(text: string, maxChars: number): string[] {\n if (text.length <= maxChars) return [text];\n const out: string[] = [];\n let remaining = text;\n while (remaining.length > maxChars) {\n const window = remaining.slice(0, maxChars + 1);\n const breakAt = Math.max(\n window.lastIndexOf(\". \"),\n window.lastIndexOf(\"? \"),\n window.lastIndexOf(\"! \"),\n window.lastIndexOf(\"; \"),\n window.lastIndexOf(\", \"),\n window.lastIndexOf(\" \"),\n );\n const end = breakAt > Math.floor(maxChars * 0.5) ? breakAt + 1 : maxChars;\n out.push(remaining.slice(0, end).trim());\n remaining = remaining.slice(end).trim();\n }\n if (remaining) out.push(remaining);\n return out;\n}\n\nfunction withOverlap(\n previous: string,\n overlapChars: number,\n next: string,\n maxChars: number,\n): string {\n if (overlapChars <= 0) return next;\n const overlap = previous\n .slice(Math.max(0, previous.length - overlapChars))\n .replace(/^\\S+\\s+/, \"\")\n .trim();\n const candidate = overlap ? `${overlap} ${next}` : next;\n return candidate.length <= maxChars ? candidate : next;\n}\n\nfunction cleanString(value: string | undefined | null): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction cleanStringArray(values: string[] | undefined | null): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];\n}\n\nfunction parseOptionalDate(value: string | undefined): Date | null {\n const trimmed = cleanString(value);\n if (!trimmed) {\n return null;\n }\n const date = new Date(trimmed);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid source timestamp: ${trimmed}`);\n }\n return date;\n}\n\nfunction normalizeKnowledgeSourceKind(value: string): KnowledgeSourceKind {\n switch (value) {\n case \"manual_upload\":\n case \"meeting_transcript\":\n case \"repository\":\n case \"email\":\n case \"chat\":\n case \"document\":\n case \"web\":\n case \"other\":\n return value;\n default:\n return \"other\";\n }\n}\n\nfunction vectorLiteral(values: number[]): string {\n return `[${values.join(\",\")}]`;\n}\n\nfunction mapDocumentBase(row: typeof schema.documentBases.$inferSelect): DocumentBase {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n name: row.name,\n description: row.description,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n\nfunction mapDocument(row: typeof schema.documents.$inferSelect): Document {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n baseId: row.baseId,\n fileId: row.fileId,\n status: row.status as Document[\"status\"],\n title: row.title,\n parser: row.parser,\n chunkCount: row.chunkCount,\n error: row.error,\n sourceKind: normalizeKnowledgeSourceKind(row.sourceKind),\n sourceUri: row.sourceUri,\n sourceExternalId: row.sourceExternalId,\n sourceTitle: row.sourceTitle,\n sourceAuthor: row.sourceAuthor,\n sourceCreatedAt: row.sourceCreatedAt?.toISOString() ?? null,\n sourceUpdatedAt: row.sourceUpdatedAt?.toISOString() ?? null,\n sourceVersion: row.sourceVersion,\n aclTags: cleanStringArray(row.aclTags),\n authorityKind: normalizeDocumentAuthorityKind(row.authorityKind),\n authorityWorkspaceId: row.authorityWorkspaceId,\n authoritySubjectId: row.authoritySubjectId,\n authorityId: row.authorityId,\n visibility: normalizeDocumentVisibility(row.visibility),\n createdBy: row.createdBy,\n agentAccess: row.agentAccess,\n summary: row.summary,\n topics: cleanStringArray(row.topics),\n curationStatus: normalizeDocumentCurationStatus(row.curationStatus),\n curation: (row.curation as DocumentCuration | null) ?? null,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n\nfunction mapIndexedDocumentSummary(\n row: typeof schema.documents.$inferSelect,\n): IndexedDocumentSummary {\n if (row.indexSequence === null || row.indexedAt === null) {\n throw new Error(`Ready document is missing index completion metadata: ${row.id}`);\n }\n return {\n id: row.id,\n title: row.title,\n parser: row.parser,\n chunkCount: row.chunkCount,\n indexedAt: row.indexedAt.toISOString(),\n summary: row.summary,\n topics: cleanStringArray(row.topics),\n source: {\n kind: normalizeKnowledgeSourceKind(row.sourceKind),\n uri: row.sourceUri,\n externalId: row.sourceExternalId,\n title: row.sourceTitle,\n author: row.sourceAuthor,\n createdAt: row.sourceCreatedAt?.toISOString() ?? null,\n updatedAt: row.sourceUpdatedAt?.toISOString() ?? null,\n version: row.sourceVersion,\n },\n provenance: {\n ingestionWorkspaceId: row.workspaceId,\n baseId: row.baseId,\n fileId: row.fileId,\n authorityKind: normalizeDocumentAuthorityKind(row.authorityKind),\n authorityWorkspaceId: row.authorityWorkspaceId,\n authoritySubjectId: row.authoritySubjectId,\n createdBy: row.createdBy,\n createdAt: row.createdAt.toISOString(),\n },\n };\n}\n\nfunction normalizeDocumentAuthorityKind(value: string): DocumentAuthorityKind {\n switch (value) {\n case \"organization\":\n case \"personal\":\n return value;\n default:\n return \"workspace\";\n }\n}\n\nfunction normalizeDocumentVisibility(value: string): DocumentVisibility {\n return value === \"private\" ? \"private\" : \"workspace\";\n}\n\nfunction normalizeDocumentCurationStatus(value: string): DocumentCurationStatus {\n switch (value) {\n case \"pending\":\n case \"suggested\":\n case \"auto_filed\":\n case \"failed\":\n return value;\n default:\n return \"none\";\n }\n}\n","import {\n KNOWLEDGE_BODY_MAX_BYTES,\n KNOWLEDGE_METADATA_MAX_BYTES,\n KNOWLEDGE_METADATA_MAX_DEPTH,\n KNOWLEDGE_METADATA_MAX_ITEMS,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n KNOWLEDGE_SOURCE_URI_MAX_BYTES,\n KNOWLEDGE_SUMMARY_MAX_BYTES,\n KNOWLEDGE_TITLE_MAX_BYTES,\n KNOWLEDGE_TOPIC_MAX_BYTES,\n KNOWLEDGE_TOPICS_MAX_ITEMS,\n type KnowledgeRecord,\n type KnowledgeSource,\n} from \"@opengeni/contracts\";\n\ntype ProjectionField = KnowledgeRecord[\"projection\"][\"fields\"][number];\n\nexport type KnowledgeProjectionInput = {\n title: string;\n body: string | null;\n summary: string | null;\n topics: unknown;\n metadata: unknown;\n source: KnowledgeSource;\n};\n\nexport type KnowledgeProjectionResult = Pick<\n KnowledgeRecord,\n \"title\" | \"content\" | \"projection\"\n> & {\n source: KnowledgeSource;\n};\n\nconst utf8Bytes = (value: string): number => Buffer.byteLength(value, \"utf8\");\n\nfunction truncateUtf8(value: string, maxBytes: number): { value: string; truncated: boolean } {\n if (utf8Bytes(value) <= maxBytes) return { value, truncated: false };\n let low = 0;\n let high = value.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n const end =\n middle > 0 && middle < value.length && /[\\uD800-\\uDBFF]/u.test(value[middle - 1]!)\n ? middle - 1\n : middle;\n if (utf8Bytes(value.slice(0, end)) <= maxBytes) low = middle;\n else high = middle - 1;\n }\n let end = low;\n if (end > 0 && end < value.length && /[\\uD800-\\uDBFF]/u.test(value[end - 1]!)) end -= 1;\n while (end > 0 && utf8Bytes(value.slice(0, end)) > maxBytes) end -= 1;\n return { value: value.slice(0, end), truncated: true };\n}\n\nfunction projectNullableString(\n value: string | null,\n maxBytes: number,\n field: ProjectionField,\n fields: Set<ProjectionField>,\n): string | null {\n if (value === null) return null;\n const projected = truncateUtf8(value, maxBytes);\n if (projected.truncated) fields.add(field);\n return projected.value;\n}\n\nfunction projectSourceUri(value: string | null, fields: Set<ProjectionField>): string | null {\n if (value === null || value === \"\") return null;\n if (utf8Bytes(value) > KNOWLEDGE_SOURCE_URI_MAX_BYTES) {\n fields.add(\"provenance.source.uri\");\n return null;\n }\n return value;\n}\n\nfunction projectTopics(value: unknown, fields: Set<ProjectionField>): string[] {\n if (!Array.isArray(value)) {\n if (value !== null && value !== undefined) fields.add(\"content.topics\");\n return [];\n }\n const result: string[] = [];\n for (const candidate of value) {\n if (result.length >= KNOWLEDGE_TOPICS_MAX_ITEMS) {\n fields.add(\"content.topics\");\n break;\n }\n if (typeof candidate !== \"string\") {\n fields.add(\"content.topics\");\n continue;\n }\n const projected = truncateUtf8(candidate, KNOWLEDGE_TOPIC_MAX_BYTES);\n if (projected.truncated) fields.add(\"content.topics\");\n result.push(projected.value);\n }\n return result;\n}\n\nfunction projectMetadata(value: unknown): { value: Record<string, unknown>; truncated: boolean } {\n let remainingItems = KNOWLEDGE_METADATA_MAX_ITEMS;\n let truncated = false;\n\n const visit = (candidate: unknown, depth: number): unknown => {\n if (remainingItems <= 0 || depth > KNOWLEDGE_METADATA_MAX_DEPTH) {\n truncated = true;\n return undefined;\n }\n remainingItems -= 1;\n if (\n candidate === null ||\n typeof candidate === \"boolean\" ||\n (typeof candidate === \"number\" && Number.isFinite(candidate))\n ) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const projected = truncateUtf8(candidate, KNOWLEDGE_SOURCE_STRING_MAX_BYTES);\n if (projected.truncated) truncated = true;\n return projected.value;\n }\n if (Array.isArray(candidate)) {\n const result: unknown[] = [];\n for (const item of candidate) {\n const projected = visit(item, depth + 1);\n if (projected === undefined) break;\n result.push(projected);\n }\n return result;\n }\n if (candidate && typeof candidate === \"object\") {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(candidate as Record<string, unknown>).sort()) {\n if (utf8Bytes(key) > KNOWLEDGE_TOPIC_MAX_BYTES) {\n truncated = true;\n continue;\n }\n const projected = visit((candidate as Record<string, unknown>)[key], depth + 1);\n if (projected === undefined) break;\n result[key] = projected;\n }\n return result;\n }\n truncated = true;\n return undefined;\n };\n\n const root = visit(value, 0);\n let result = root && typeof root === \"object\" && !Array.isArray(root) ? root : {};\n if (result !== root) truncated = true;\n const bounded: Record<string, unknown> = {};\n for (const key of Object.keys(result as Record<string, unknown>).sort()) {\n bounded[key] = (result as Record<string, unknown>)[key];\n if (utf8Bytes(JSON.stringify(bounded)) > KNOWLEDGE_METADATA_MAX_BYTES) {\n delete bounded[key];\n truncated = true;\n break;\n }\n }\n result = bounded;\n return { value: result as Record<string, unknown>, truncated };\n}\n\n/** Deterministic, byte-bounded projection at the agent-facing Knowledge envelope. */\nexport function projectKnowledgeRecord(input: KnowledgeProjectionInput): KnowledgeProjectionResult {\n const fields = new Set<ProjectionField>();\n const title = truncateUtf8(input.title, KNOWLEDGE_TITLE_MAX_BYTES);\n if (title.truncated) fields.add(\"title\");\n const metadata = projectMetadata(input.metadata);\n if (metadata.truncated) fields.add(\"content.metadata\");\n const source: KnowledgeSource = {\n ...input.source,\n uri: projectSourceUri(input.source.uri, fields),\n externalId: projectNullableString(\n input.source.externalId,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.externalId\",\n fields,\n ),\n title: projectNullableString(\n input.source.title,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.title\",\n fields,\n ),\n author: projectNullableString(\n input.source.author,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.author\",\n fields,\n ),\n version: projectNullableString(\n input.source.version,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.version\",\n fields,\n ),\n };\n return {\n title: title.value,\n content: {\n format: \"markdown\",\n body: projectNullableString(input.body, KNOWLEDGE_BODY_MAX_BYTES, \"content.body\", fields),\n summary: projectNullableString(\n input.summary,\n KNOWLEDGE_SUMMARY_MAX_BYTES,\n \"content.summary\",\n fields,\n ),\n topics: projectTopics(input.topics, fields),\n metadata: metadata.value,\n },\n source,\n projection: { truncated: fields.size > 0, fields: [...fields].sort() },\n };\n}\n"],"mappings":"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","names":["end","result","updated","row","rows","hasMore","page"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/knowledge-projection.ts"],"sourcesContent":["import type { Settings } from \"@opengeni/config\";\nimport {\n KnowledgeProviderCitation,\n type KnowledgeProviderCitation as KnowledgeProviderCitationValue,\n type AddDocumentRequest,\n CreateDocumentBaseRequest,\n Document,\n DocumentAuthorityKind,\n DocumentAuthorityReclassification,\n ListDocumentAuthorityReclassificationsResponse,\n DocumentBase,\n DocumentCuration,\n DocumentCurationStatus,\n DocumentSearchMode,\n DocumentSearchResult,\n DocumentStatus,\n DocumentVisibility,\n FileAsset,\n IndexedDocumentSummary,\n KnowledgeBrowseResponse,\n KnowledgeRecord,\n KnowledgeSearchResult,\n KnowledgeSearchResponse,\n KnowledgeSourceKind,\n ListIndexedDocumentsResponse,\n type ReclassifyDocumentAuthorityRequest,\n type RunDocumentDefaultCollectionBackfillRequest,\n DocumentDefaultCollectionBackfill,\n DocumentDefaultCollectionBackfillAudit,\n DocumentDefaultCollectionBackfillOperationAudit,\n DocumentDefaultCollectionBackfillReceiptAudit,\n DocumentDefaultCollectionBackfillRunAudit,\n ListDocumentDefaultCollectionBackfillRunsResponse,\n ListOrganizationDocumentAuthorityReclassificationsResponse,\n OrganizationDocumentAuthorityReclassification,\n} from \"@opengeni/contracts\";\nimport {\n createPersonalDocumentAuthority,\n getFilesForSubject,\n resolveDocumentOriginalFileForSubject,\n rlsContextForWorkspace,\n setSubjectRlsContext,\n withRlsContext,\n withWorkspaceRls,\n withWorkspaceSubjectRls,\n type Database,\n} from \"@opengeni/db\";\nimport * as schema from \"@opengeni/db/schema\";\nimport { retryWhileMissing, type ObjectStorage } from \"@opengeni/storage\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { and, asc, desc, eq, gt, inArray, isNotNull, isNull, or, sql, type SQL } from \"drizzle-orm\";\nimport type OpenAI from \"openai\";\nimport {\n KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS,\n KNOWLEDGE_BROWSE_MAX_LIMIT,\n KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES,\n KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES,\n KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS,\n KNOWLEDGE_SEARCH_MAX_RESULTS,\n KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE,\n KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE,\n KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n} from \"@opengeni/contracts\";\nimport { projectKnowledgeRecord } from \"./knowledge-projection\";\n\nexport { projectKnowledgeRecord } from \"./knowledge-projection\";\n\nexport const DEFAULT_DOCUMENT_PARSER = \"liteparse\";\nexport const DEFAULT_DOCUMENT_EMBEDDING_MODEL = \"text-embedding-3-large\";\nexport const DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS = 3072;\nexport const DEFAULT_DOCUMENT_CHUNK_SIZE = 1200;\nexport const DEFAULT_DOCUMENT_CHUNK_OVERLAP = 160;\nexport const DEFAULT_DOCUMENT_CURATION_MODEL = \"gpt-4o-mini\";\n// Curator input is a preview, not the whole document — enough to name and\n// classify without paying for a full-document prompt on every drop.\nexport const DOCUMENT_CURATION_MAX_INPUT_CHARS = 24_000;\nexport const DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES = 1024;\nexport const DOCUMENT_INDEX_CHECKPOINT_MAX_CHARS = 1_024;\n// A base move is applied automatically only at or above this curator\n// confidence; below it the suggestion is surfaced for human review instead.\nexport const DOCUMENT_CURATION_AUTO_FILE_CONFIDENCE = 0.75;\n// The per-workspace default base: where knowledge drops land (created on\n// first drop) and stay unless configured curation files them into a topical base.\nexport const DEFAULT_BASE_NAME = \"Default\";\nexport const DEFAULT_BASE_DESCRIPTION = \"Default base for dropped files and notes.\";\n\nexport type ParsedDocument = {\n text: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type DocumentChunk = {\n text: string;\n metadata: Record<string, unknown>;\n};\n\nexport type DocumentParser = {\n name: string;\n parse: (bytes: Uint8Array, file: FileAsset) => Promise<ParsedDocument>;\n};\n\nexport type DocumentChunker = {\n chunk: (parsed: ParsedDocument, file: FileAsset) => DocumentChunk[];\n};\n\nexport type DocumentEmbedder = {\n model: string;\n dimensions: number;\n embedMany: (texts: string[]) => Promise<number[][]>;\n embedQuery: (text: string) => Promise<number[]>;\n};\n\nexport type DocumentCurationCandidateBase = {\n id: string;\n name: string;\n description: string | null;\n};\n\nexport type DocumentCurationInput = {\n /** Parsed document text, clipped to DOCUMENT_CURATION_MAX_INPUT_CHARS. */\n text: string;\n filename: string;\n /** Current (usually filename-derived) title. */\n title: string;\n /** Candidate bases the document could be filed into (never its current base). */\n bases: DocumentCurationCandidateBase[];\n};\n\nexport type DocumentCurationOutcome = {\n title: string | null;\n summary: string | null;\n sourceKind: KnowledgeSourceKind | null;\n topics: string[];\n targetBaseId: string | null;\n confidence: number;\n reason: string | null;\n};\n\nexport type DocumentCurator = {\n model: string;\n curate: (input: DocumentCurationInput) => Promise<DocumentCurationOutcome>;\n};\n\nexport type DocumentServices = {\n parser: DocumentParser;\n chunker: DocumentChunker;\n embedder: DocumentEmbedder;\n /** Optional: names/summarizes/categorizes dropped documents during indexing. */\n curator?: DocumentCurator | undefined;\n};\n\n/**\n * Read-scoping for document queries. Fail-closed: when a caller supplies no\n * filter, private documents are invisible (only their creator may see them,\n * and only by passing their subject id).\n */\nexport type DocumentAccessFilter = {\n /** Grant subject id of the human viewer; null/undefined hides private docs. */\n viewerSubjectId?: string | null | undefined;\n /**\n * Agent retrieval surface: only agent-enabled documents. Workspace-visible\n * documents are available to every agent; private documents are available\n * only when the agent carries the creating subject as its viewer subject.\n */\n agentOnly?: boolean | undefined;\n /** Exact attempt whose grant snapshot must be revalidated in the content query. */\n authorizedPersonalAttempt?:\n | {\n accountId: string;\n workspaceId: string;\n sessionId: string;\n attemptId: string;\n }\n | undefined;\n};\n\nexport type DocumentAuthority = {\n kind: DocumentAuthorityKind;\n workspaceId: string | null;\n subjectId: string | null;\n};\n\n/** JSON-safe projection of the opaque capability minted by the API access layer. */\nexport type DocumentAccountAdminAuthorization = Readonly<{\n authorizationId: string;\n accountId: string;\n actorSubjectId: string;\n permission: \"account:admin\";\n}>;\n\nexport type ReclassifyDocumentAuthorityInput = ReclassifyDocumentAuthorityRequest & {\n accountId: string;\n workspaceId: string;\n documentId: string;\n actorSubjectId: string;\n accountAdminAuthorization: DocumentAccountAdminAuthorization | null;\n};\n\nexport type RunDocumentDefaultCollectionBackfillInput =\n RunDocumentDefaultCollectionBackfillRequest & {\n accountId: string;\n workspaceId: string;\n actorSubjectId: string;\n accountAdminAuthorization: DocumentAccountAdminAuthorization;\n };\n\nexport type DocumentMigrationAuditInput = {\n accountId: string;\n workspaceId: string;\n actorSubjectId: string;\n accountAdminAuthorization: DocumentAccountAdminAuthorization;\n limit?: number | undefined;\n cursor?: string | undefined;\n};\n\nexport type AgentDocumentAuthorityContext = {\n sessionId: string;\n attemptId: string;\n};\n\nexport type DocumentInventoryStatusCounts = Record<DocumentStatus, number>;\nexport type DocumentInventorySourceKindCounts = Record<KnowledgeSourceKind, number>;\nexport type DocumentInventoryAuthorityKindCounts = Record<DocumentAuthorityKind, number>;\n\nexport type DocumentInventory = {\n baseCount: number;\n bases: Array<{\n id: string;\n name: string;\n visibleDocumentCount: number;\n statusCounts: DocumentInventoryStatusCounts;\n latestUpdatedAt: string | null;\n }>;\n visibleDocumentCount: number;\n statusCounts: DocumentInventoryStatusCounts;\n sourceKindCounts: DocumentInventorySourceKindCounts;\n authorityKindCounts: DocumentInventoryAuthorityKindCounts;\n latestUpdatedAt: string | null;\n topics: Array<{ name: string; documentCount: number }>;\n topicsTruncated: boolean;\n};\n\nexport type DocumentInventoryInput = {\n baseLimit: number;\n topicLimit: number;\n topicMaxChars: number;\n access?: DocumentAccessFilter | undefined;\n};\n\nconst DOCUMENT_INVENTORY_MAX_BASE_LIMIT = 100;\nconst DOCUMENT_INVENTORY_MAX_TOPIC_LIMIT = 100;\nconst DOCUMENT_INVENTORY_MAX_TOPIC_CHARS = 256;\n\nexport type DocumentSearchInput = {\n accountId: string;\n workspaceId: string;\n query: string;\n baseIds?: string[] | undefined;\n limit?: number | undefined;\n mode?: DocumentSearchMode | undefined;\n sourceKinds?: KnowledgeSourceKind[] | undefined;\n authorityKinds?: DocumentAuthorityKind[] | undefined;\n aclTags?: string[] | undefined;\n access?: DocumentAccessFilter | undefined;\n};\n\nexport type EffectiveDocumentSearchInput = Omit<DocumentSearchInput, \"access\"> & {\n /** Immutable human subject accepted for the logical request/turn. */\n initiatingSubjectId: string;\n /** Agent retrieval additionally enforces documents.agent_access. */\n surface: \"human\" | \"agent\";\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n};\n\nexport type ListEffectiveIndexedDocumentsInput = {\n accountId: string;\n workspaceId: string;\n /** Immutable human subject accepted for the logical request/turn. */\n initiatingSubjectId: string;\n checkpoint?: string | undefined;\n limit?: number | undefined;\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n};\n\nexport type EffectiveKnowledgeBrowseInput = {\n accountId: string;\n workspaceId: string;\n /** Immutable human subject accepted for the logical request/turn. */\n initiatingSubjectId: string;\n /** Human inspection bypasses agent_access but still uses exact subject/RLS authority. */\n surface?: \"human\" | \"agent\" | undefined;\n /** Omit to browse top-level documents; pass a document record id for chunks. */\n parentId?: string | undefined;\n topic?: string | undefined;\n sourceKinds?: KnowledgeSourceKind[] | undefined;\n cursor?: string | undefined;\n limit?: number | undefined;\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n};\n\nexport type DocumentIndexHooks = {\n beforeEmbed?: (input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n chunkCount: number;\n }) => Promise<void>;\n};\n\nexport class LiteParseDocumentParser implements DocumentParser {\n readonly name = DEFAULT_DOCUMENT_PARSER;\n private parseQueue: Promise<void> = Promise.resolve();\n\n async parse(bytes: Uint8Array, file: FileAsset): Promise<ParsedDocument> {\n const text = isTextLike(file)\n ? Buffer.from(bytes).toString(\"utf8\").replace(/\\0/g, \" \").trim()\n : await this.parseWithLiteParse(bytes);\n if (!text.trim()) {\n throw new Error(`Parsed document is empty: ${file.filename}`);\n }\n return {\n text: text.trim(),\n metadata: {\n parser: this.name,\n filename: file.filename,\n contentType: file.contentType,\n },\n };\n }\n\n private async parseWithLiteParse(bytes: Uint8Array): Promise<string> {\n return await this.enqueueParse(async () => {\n const { LiteParse } = await import(\"@llamaindex/liteparse\");\n const parser = new LiteParse({ ocrEnabled: true, numWorkers: 1, quiet: true });\n const result = await parser.parse(Buffer.from(bytes));\n const text = typeof result?.text === \"string\" ? result.text : \"\";\n return text.replace(/\\0/g, \" \").trim();\n });\n }\n\n private async enqueueParse<T>(task: () => Promise<T>): Promise<T> {\n const previous = this.parseQueue;\n let release: () => void = () => undefined;\n this.parseQueue = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous.catch(() => undefined);\n try {\n return await task();\n } finally {\n release();\n }\n }\n}\n\nexport class RecursiveTextChunker implements DocumentChunker {\n constructor(\n private readonly maxChars = DEFAULT_DOCUMENT_CHUNK_SIZE,\n private readonly overlapChars = DEFAULT_DOCUMENT_CHUNK_OVERLAP,\n ) {\n if (overlapChars >= maxChars) {\n throw new Error(\"document chunk overlap must be smaller than chunk size\");\n }\n }\n\n chunk(parsed: ParsedDocument, file: FileAsset): DocumentChunk[] {\n return chunkText(parsed.text, this.maxChars, this.overlapChars).map((text, index) => ({\n text,\n metadata: {\n ...parsed.metadata,\n filename: file.filename,\n contentType: file.contentType,\n chunkIndex: index,\n },\n }));\n }\n}\n\nexport class OpenAIEmbeddingProvider implements DocumentEmbedder {\n private clientPromise: Promise<OpenAI> | null = null;\n private readonly apiKey: string | undefined;\n private readonly baseURL: string | undefined;\n\n constructor(args: {\n apiKey?: string | undefined;\n baseURL?: string | undefined;\n defaultHeaders?: Record<string, string> | undefined;\n defaultQuery?: Record<string, string> | undefined;\n model?: string | undefined;\n dimensions?: number | undefined;\n }) {\n this.apiKey = args.apiKey ?? process.env.OPENAI_API_KEY;\n this.baseURL = args.baseURL;\n this.defaultHeaders = args.defaultHeaders;\n this.defaultQuery = args.defaultQuery;\n this.model = args.model ?? DEFAULT_DOCUMENT_EMBEDDING_MODEL;\n this.dimensions = args.dimensions ?? DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS;\n }\n\n readonly model: string;\n readonly dimensions: number;\n private readonly defaultHeaders: Record<string, string> | undefined;\n private readonly defaultQuery: Record<string, string> | undefined;\n\n async embedMany(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n const out: number[][] = [];\n for (let start = 0; start < texts.length; start += 64) {\n const batch = texts.slice(start, start + 64);\n const response = await (\n await this.openai()\n ).embeddings.create({\n model: this.model,\n input: batch,\n dimensions: this.dimensions,\n });\n for (const item of response.data) {\n out.push(validateEmbedding(item.embedding, this.dimensions, this.model));\n }\n }\n return out;\n }\n\n async embedQuery(text: string): Promise<number[]> {\n const [embedding] = await this.embedMany([text]);\n if (!embedding) {\n throw new Error(\"Embedding provider returned no query embedding\");\n }\n return embedding;\n }\n\n private async openai(): Promise<OpenAI> {\n if (!this.apiKey) {\n throw new Error(\"OpenAI document embeddings require an API key\");\n }\n this.clientPromise ??= import(\"openai\").then(\n ({ default: OpenAIClient }) =>\n new OpenAIClient({\n apiKey: this.apiKey,\n ...(this.baseURL ? { baseURL: this.baseURL } : {}),\n ...(this.defaultQuery ? { defaultQuery: this.defaultQuery } : {}),\n ...(this.defaultHeaders ? { defaultHeaders: this.defaultHeaders } : {}),\n }),\n );\n return await this.clientPromise;\n }\n}\n\nexport class DeterministicEmbeddingProvider implements DocumentEmbedder {\n constructor(\n readonly dimensions = DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS,\n readonly model = `deterministic-local-${dimensions}`,\n ) {}\n\n async embedMany(texts: string[]): Promise<number[][]> {\n return texts.map((text) => deterministicEmbedding(text, this.dimensions));\n }\n\n async embedQuery(text: string): Promise<number[]> {\n return deterministicEmbedding(text, this.dimensions);\n }\n}\n\n/**\n * Deterministic no-network curation: first meaningful line becomes the title,\n * the opening text becomes the summary, and the kind is guessed from the\n * filename/content type. Never proposes a base move (confidence 0). Used as\n * the `heuristic` provider and as the in-pipeline fallback when the LLM\n * curator fails — a drop must always end up named and summarized.\n */\nexport function heuristicCuration(\n input: DocumentCurationInput,\n contentType = \"application/octet-stream\",\n): DocumentCurationOutcome {\n const firstLine = input.text\n .split(\"\\n\")\n .map((line) => line.replace(/^[#>\\s*-]+/, \"\").trim())\n .find((line) => line.length >= 3);\n const title = (firstLine ?? input.title).slice(0, 120).trim() || input.title;\n const summaryWindow = input.text.replace(/\\s+/g, \" \").trim().slice(0, 360);\n const summary =\n summaryWindow.length === 360 ? `${summaryWindow.slice(0, 357)}...` : summaryWindow;\n return {\n title,\n summary: summary || null,\n sourceKind: heuristicSourceKind(input.filename, contentType),\n topics: [],\n targetBaseId: null,\n confidence: 0,\n reason: null,\n };\n}\n\nfunction heuristicSourceKind(rawFilename: string, rawContentType: string): KnowledgeSourceKind {\n const filename = rawFilename.toLowerCase();\n const contentType = rawContentType.toLowerCase();\n if (filename.endsWith(\".eml\") || contentType === \"message/rfc822\") return \"email\";\n if (filename.endsWith(\".vtt\") || filename.endsWith(\".srt\") || filename.includes(\"transcript\")) {\n return \"meeting_transcript\";\n }\n if (contentType === \"text/html\") return \"web\";\n if (contentType === \"application/pdf\" || filename.endsWith(\".docx\") || filename.endsWith(\".md\")) {\n return \"document\";\n }\n return \"manual_upload\";\n}\n\nexport class HeuristicCurationProvider implements DocumentCurator {\n readonly model = \"heuristic\";\n\n async curate(input: DocumentCurationInput): Promise<DocumentCurationOutcome> {\n return heuristicCuration(input);\n }\n}\n\nconst CURATION_SYSTEM_PROMPT = [\n \"You organize a team knowledge base. Given the beginning of a dropped document\",\n \"and the list of existing collections (bases), return STRICT JSON with keys:\",\n '\"title\" (concise, specific, <= 120 chars, no filename extensions),',\n '\"summary\" (2-3 sentences, plain prose, what the document is and why it matters),',\n '\"sourceKind\" (one of: manual_upload, meeting_transcript, repository, email, chat, document, web, other),',\n '\"topics\" (3-6 short lowercase tags),',\n '\"targetBaseId\" (the id of the best-fitting existing base, or null if none fits),',\n '\"confidence\" (0..1 — how sure you are the document belongs in targetBaseId),',\n '\"reason\" (one sentence explaining the filing choice).',\n \"Only pick a targetBaseId from the provided list. If the document fits no base\",\n \"well, return targetBaseId null and confidence 0. Respond with JSON only.\",\n].join(\" \");\n\nexport class OpenAICurationProvider implements DocumentCurator {\n private clientPromise: Promise<OpenAI> | null = null;\n private readonly apiKey: string | undefined;\n private readonly baseURL: string | undefined;\n private readonly defaultHeaders: Record<string, string> | undefined;\n private readonly defaultQuery: Record<string, string> | undefined;\n readonly model: string;\n\n constructor(args: {\n apiKey?: string | undefined;\n baseURL?: string | undefined;\n defaultHeaders?: Record<string, string> | undefined;\n defaultQuery?: Record<string, string> | undefined;\n model?: string | undefined;\n }) {\n this.apiKey = args.apiKey ?? process.env.OPENAI_API_KEY;\n this.baseURL = args.baseURL;\n this.defaultHeaders = args.defaultHeaders;\n this.defaultQuery = args.defaultQuery;\n this.model = args.model ?? DEFAULT_DOCUMENT_CURATION_MODEL;\n }\n\n async curate(input: DocumentCurationInput): Promise<DocumentCurationOutcome> {\n const response = await (\n await this.openai()\n ).chat.completions.create({\n model: this.model,\n response_format: { type: \"json_object\" },\n messages: [\n { role: \"system\", content: CURATION_SYSTEM_PROMPT },\n {\n role: \"user\",\n content: JSON.stringify({\n filename: input.filename,\n currentTitle: input.title,\n bases: input.bases,\n text: input.text,\n }),\n },\n ],\n });\n const raw = response.choices[0]?.message?.content;\n if (!raw) {\n throw new Error(\"curation model returned no content\");\n }\n return parseCurationOutcome(raw, input.bases);\n }\n\n private async openai(): Promise<OpenAI> {\n if (!this.apiKey) {\n throw new Error(\"OpenAI document curation requires an API key\");\n }\n this.clientPromise ??= import(\"openai\").then(\n ({ default: OpenAIClient }) =>\n new OpenAIClient({\n apiKey: this.apiKey,\n ...(this.baseURL ? { baseURL: this.baseURL } : {}),\n ...(this.defaultQuery ? { defaultQuery: this.defaultQuery } : {}),\n ...(this.defaultHeaders ? { defaultHeaders: this.defaultHeaders } : {}),\n }),\n );\n return await this.clientPromise;\n }\n}\n\n/** Parse + clamp model output; a targetBaseId outside the candidate list is dropped. */\nexport function parseCurationOutcome(\n raw: string,\n bases: DocumentCurationCandidateBase[],\n): DocumentCurationOutcome {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\"curation model returned non-object JSON\");\n }\n const record = parsed as Record<string, unknown>;\n const knownBase = bases.find((base) => base.id === record.targetBaseId);\n const confidence =\n typeof record.confidence === \"number\" && Number.isFinite(record.confidence)\n ? Math.min(1, Math.max(0, record.confidence))\n : 0;\n return {\n title:\n cleanString(typeof record.title === \"string\" ? record.title.slice(0, 200) : null) ?? null,\n summary:\n cleanString(typeof record.summary === \"string\" ? record.summary.slice(0, 2000) : null) ??\n null,\n sourceKind:\n typeof record.sourceKind === \"string\"\n ? normalizeKnowledgeSourceKind(record.sourceKind)\n : null,\n topics: cleanStringArray(\n Array.isArray(record.topics)\n ? record.topics.filter((topic): topic is string => typeof topic === \"string\").slice(0, 8)\n : [],\n ).map((topic) => topic.toLowerCase().slice(0, 60)),\n targetBaseId: knownBase?.id ?? null,\n confidence: knownBase ? confidence : 0,\n reason:\n cleanString(typeof record.reason === \"string\" ? record.reason.slice(0, 500) : null) ?? null,\n };\n}\n\nexport function createDocumentServices(\n settings?: Settings,\n overrides: Partial<DocumentServices> = {},\n): DocumentServices {\n const dimensions = settings?.documentEmbeddingDimensions ?? DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS;\n const openAIEmbeddingConfig = documentOpenAIEmbeddingConfig(settings);\n return {\n parser: overrides.parser ?? new LiteParseDocumentParser(),\n chunker:\n overrides.chunker ??\n new RecursiveTextChunker(\n settings?.documentChunkSize ?? DEFAULT_DOCUMENT_CHUNK_SIZE,\n settings?.documentChunkOverlap ?? DEFAULT_DOCUMENT_CHUNK_OVERLAP,\n ),\n embedder:\n overrides.embedder ??\n (settings?.documentEmbeddingProvider === \"deterministic\"\n ? new DeterministicEmbeddingProvider(dimensions, settings.documentEmbeddingModel)\n : new OpenAIEmbeddingProvider({\n ...openAIEmbeddingConfig,\n model: settings?.documentEmbeddingModel ?? DEFAULT_DOCUMENT_EMBEDDING_MODEL,\n dimensions,\n })),\n curator: overrides.curator ?? createDocumentCurator(settings),\n };\n}\n\nfunction createDocumentCurator(settings?: Settings): DocumentCurator | undefined {\n const provider = settings?.documentCurationProvider ?? \"openai\";\n if (provider === \"none\") return undefined;\n if (provider === \"heuristic\") return new HeuristicCurationProvider();\n const embeddingConfig = documentOpenAIEmbeddingConfig(settings);\n return new OpenAICurationProvider({\n apiKey: settings?.documentCurationApiKey ?? embeddingConfig.apiKey,\n baseURL: settings?.documentCurationBaseUrl ?? embeddingConfig.baseURL,\n defaultHeaders: embeddingConfig.defaultHeaders,\n defaultQuery: embeddingConfig.defaultQuery,\n model: settings?.documentCurationModel ?? DEFAULT_DOCUMENT_CURATION_MODEL,\n });\n}\n\nexport function documentOpenAIEmbeddingConfig(settings?: Settings): {\n apiKey?: string | undefined;\n baseURL?: string | undefined;\n defaultHeaders?: Record<string, string> | undefined;\n defaultQuery?: Record<string, string> | undefined;\n} {\n if (!settings) return {};\n if (settings.documentEmbeddingApiKey || settings.documentEmbeddingBaseUrl) {\n return {\n apiKey:\n settings.documentEmbeddingApiKey ?? settings.openaiApiKey ?? settings.azureOpenaiApiKey,\n baseURL:\n settings.documentEmbeddingBaseUrl ?? settings.openaiBaseUrl ?? settings.azureOpenaiBaseUrl,\n };\n }\n if (settings.openaiProvider === \"azure\") {\n const baseURL = settings.azureOpenaiBaseUrl ?? azureDeploymentBaseUrl(settings);\n return {\n apiKey: settings.azureOpenaiApiKey ?? settings.azureOpenaiAdToken ?? \"azure-ad-token\",\n baseURL,\n defaultQuery: azureOpenAIDefaultQuery(settings, baseURL),\n defaultHeaders:\n settings.azureOpenaiAdToken && !settings.azureOpenaiApiKey\n ? { Authorization: `Bearer ${settings.azureOpenaiAdToken}` }\n : undefined,\n };\n }\n return {\n apiKey: settings.openaiApiKey,\n baseURL: settings.openaiBaseUrl,\n };\n}\n\nfunction azureDeploymentBaseUrl(settings: Settings): string {\n const endpoint = settings.azureOpenaiEndpoint?.replace(/\\/+$/, \"\");\n if (!endpoint || !settings.azureOpenaiDeployment) {\n throw new Error(\"Azure OpenAI endpoint/deployment settings are incomplete\");\n }\n return `${endpoint}/openai/deployments/${settings.azureOpenaiDeployment}`;\n}\n\nfunction azureOpenAIDefaultQuery(\n settings: Pick<Settings, \"azureOpenaiApiVersion\">,\n baseURL: string,\n): Record<string, string> | undefined {\n if (!settings.azureOpenaiApiVersion) return undefined;\n const normalized = baseURL.replace(/\\/+$/, \"\").toLowerCase();\n if (normalized.endsWith(\"/openai/v1\")) {\n return undefined;\n }\n return { \"api-version\": settings.azureOpenaiApiVersion };\n}\n\nexport async function createDocumentBase(\n db: Database,\n input: CreateDocumentBaseRequest & { accountId: string; workspaceId: string },\n): Promise<DocumentBase> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const [row] = await scopedDb\n .insert(schema.documentBases)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n name: input.name.trim(),\n description: input.description?.trim() || null,\n })\n .returning();\n if (!row) throw new Error(\"Failed to create document base\");\n return mapDocumentBase(row);\n },\n );\n}\n\nexport async function listDocumentBases(\n db: Database,\n workspaceId: string,\n): Promise<DocumentBase[]> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const rows = await scopedDb\n .select()\n .from(schema.documentBases)\n .where(eq(schema.documentBases.workspaceId, workspaceId))\n .orderBy(desc(schema.documentBases.createdAt));\n return rows.map(mapDocumentBase);\n });\n}\n\n/**\n * Return a bounded structural inventory without loading document records.\n * Document predicates are applied independently to every aggregate so private\n * counts and topic metadata remain scoped to the initiating grant subject.\n */\nexport async function getDocumentInventory(\n db: Database,\n workspaceId: string,\n input: DocumentInventoryInput,\n): Promise<DocumentInventory> {\n const baseLimit = requireDocumentInventoryLimit(\n input.baseLimit,\n DOCUMENT_INVENTORY_MAX_BASE_LIMIT,\n \"baseLimit\",\n );\n const topicLimit = requireDocumentInventoryLimit(\n input.topicLimit,\n DOCUMENT_INVENTORY_MAX_TOPIC_LIMIT,\n \"topicLimit\",\n );\n const topicMaxChars = requireDocumentInventoryLimit(\n input.topicMaxChars,\n DOCUMENT_INVENTORY_MAX_TOPIC_CHARS,\n \"topicMaxChars\",\n );\n\n return await withDocumentRls(db, workspaceId, input.access, async (scopedDb) => {\n const [baseTotal] = await scopedDb\n .select({ count: sql<number>`count(*)::int` })\n .from(schema.documentBases)\n .where(eq(schema.documentBases.workspaceId, workspaceId));\n\n const baseJoin = and(\n eq(schema.documents.workspaceId, workspaceId),\n eq(schema.documents.baseId, schema.documentBases.id),\n ...documentAccessConditions(workspaceId, input.access),\n );\n const baseRows = await scopedDb\n .select({\n id: schema.documentBases.id,\n name: schema.documentBases.name,\n visibleDocumentCount: sql<number>`count(${schema.documents.id})::int`,\n queuedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'queued')::int`,\n indexingCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'indexing')::int`,\n readyCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'ready')::int`,\n failedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'failed')::int`,\n latestUpdatedAt: sql<Date | null>`max(${schema.documents.updatedAt})`,\n })\n .from(schema.documentBases)\n .leftJoin(schema.documents, baseJoin)\n .where(eq(schema.documentBases.workspaceId, workspaceId))\n .groupBy(schema.documentBases.id, schema.documentBases.name, schema.documentBases.createdAt)\n .orderBy(desc(schema.documentBases.createdAt), asc(schema.documentBases.id))\n .limit(baseLimit);\n\n const documentWhere = and(\n eq(schema.documents.workspaceId, workspaceId),\n ...documentAccessConditions(workspaceId, input.access),\n );\n const [summary] = await scopedDb\n .select({\n visibleDocumentCount: sql<number>`count(${schema.documents.id})::int`,\n queuedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'queued')::int`,\n indexingCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'indexing')::int`,\n readyCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'ready')::int`,\n failedCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.status} = 'failed')::int`,\n manualUploadCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'manual_upload')::int`,\n meetingTranscriptCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'meeting_transcript')::int`,\n repositoryCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'repository')::int`,\n emailCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'email')::int`,\n chatCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'chat')::int`,\n documentCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'document')::int`,\n webCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'web')::int`,\n otherCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.sourceKind} = 'other')::int`,\n organizationAuthorityCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.authorityKind} = 'organization')::int`,\n workspaceAuthorityCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.authorityKind} = 'workspace')::int`,\n personalAuthorityCount: sql<number>`count(${schema.documents.id}) filter (where ${schema.documents.authorityKind} = 'personal')::int`,\n latestUpdatedAt: sql<Date | null>`max(${schema.documents.updatedAt})`,\n })\n .from(schema.documents)\n .where(documentWhere);\n\n const topicStringValue = sql<string>`topic.value #>> '{}'`;\n const topicNormalizedName = sql<string>`btrim(regexp_replace(normalize(${topicStringValue}, NFKC), '[[:space:]]+', ' ', 'g'))`;\n const topicName = sql<string>`left(${topicNormalizedName}, ${topicMaxChars})`;\n const topicDocumentCount = sql<number>`count(distinct ${schema.documents.id})::int`;\n const topicRows = await scopedDb\n .select({ name: topicName, documentCount: topicDocumentCount })\n .from(schema.documents)\n .innerJoin(\n sql`lateral jsonb_array_elements(${schema.documents.topics}) as topic(value)`,\n sql`true`,\n )\n .where(\n and(\n documentWhere,\n sql`jsonb_typeof(topic.value) = 'string'`,\n sql`nullif(${topicNormalizedName}, '') is not null`,\n ),\n )\n .groupBy(sql`1`)\n .orderBy(sql`2 desc`, sql`1 asc`)\n .limit(topicLimit + 1);\n\n const statusCounts = documentInventoryStatusCounts(summary ?? {});\n const topics = topicRows.slice(0, topicLimit).map((topic) => ({\n name: topic.name,\n documentCount: Number(topic.documentCount),\n }));\n return {\n baseCount: Number(baseTotal?.count ?? 0),\n bases: baseRows.map((base) => ({\n id: base.id,\n name: base.name,\n visibleDocumentCount: Number(base.visibleDocumentCount),\n statusCounts: documentInventoryStatusCounts(base),\n latestUpdatedAt: documentInventoryTimestamp(base.latestUpdatedAt),\n })),\n visibleDocumentCount: Number(summary?.visibleDocumentCount ?? 0),\n statusCounts,\n sourceKindCounts: {\n manual_upload: Number(summary?.manualUploadCount ?? 0),\n meeting_transcript: Number(summary?.meetingTranscriptCount ?? 0),\n repository: Number(summary?.repositoryCount ?? 0),\n email: Number(summary?.emailCount ?? 0),\n chat: Number(summary?.chatCount ?? 0),\n document: Number(summary?.documentCount ?? 0),\n web: Number(summary?.webCount ?? 0),\n other: Number(summary?.otherCount ?? 0),\n },\n authorityKindCounts: {\n organization: Number(summary?.organizationAuthorityCount ?? 0),\n workspace: Number(summary?.workspaceAuthorityCount ?? 0),\n personal: Number(summary?.personalAuthorityCount ?? 0),\n },\n latestUpdatedAt: documentInventoryTimestamp(summary?.latestUpdatedAt ?? null),\n topics,\n topicsTruncated: topicRows.length > topics.length,\n };\n });\n}\n\nfunction requireDocumentInventoryLimit(value: number, max: number, name: string): number {\n if (!Number.isInteger(value) || value < 1 || value > max) {\n throw new Error(`${name} must be an integer between 1 and ${max}`);\n }\n return value;\n}\n\nfunction documentInventoryStatusCounts(input: {\n queuedCount?: number | null | undefined;\n indexingCount?: number | null | undefined;\n readyCount?: number | null | undefined;\n failedCount?: number | null | undefined;\n}): DocumentInventoryStatusCounts {\n return {\n queued: Number(input.queuedCount ?? 0),\n indexing: Number(input.indexingCount ?? 0),\n ready: Number(input.readyCount ?? 0),\n failed: Number(input.failedCount ?? 0),\n };\n}\n\nfunction documentInventoryTimestamp(value: Date | string | null): string | null {\n if (!value) return null;\n return value instanceof Date ? value.toISOString() : new Date(value).toISOString();\n}\n\nexport async function getDocumentBase(\n db: Database,\n workspaceId: string,\n baseId: string,\n): Promise<DocumentBase | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.documentBases)\n .where(\n and(eq(schema.documentBases.workspaceId, workspaceId), eq(schema.documentBases.id, baseId)),\n )\n .limit(1);\n return row ? mapDocumentBase(row) : null;\n });\n}\n\n/**\n * Find-or-create the workspace's internal Default collection — where ordinary\n * uploads can start and knowledge drops land before configured curation files\n * them elsewhere. Matched by name (case-insensitive) so a user-created\n * \"Default\" is adopted rather than duplicated.\n */\nexport async function ensureDefaultBase(\n db: Database,\n input: { accountId: string; workspaceId: string },\n): Promise<DocumentBase> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n const defaultName = sql`lower(btrim(${schema.documentBases.name})) = ${DEFAULT_BASE_NAME.toLowerCase()}`;\n const [existing] = await tx\n .select()\n .from(schema.documentBases)\n .where(and(eq(schema.documentBases.workspaceId, input.workspaceId), defaultName))\n .limit(1);\n if (existing) return mapDocumentBase(existing);\n\n // The partial unique index is the serialization point for concurrent\n // first uploads. A losing insert re-reads the winner instead of\n // surfacing a duplicate-base error.\n const [inserted] = await tx\n .insert(schema.documentBases)\n .values({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n name: DEFAULT_BASE_NAME,\n description: DEFAULT_BASE_DESCRIPTION,\n })\n .onConflictDoNothing()\n .returning();\n if (inserted) return mapDocumentBase(inserted);\n\n const [raced] = await tx\n .select()\n .from(schema.documentBases)\n .where(and(eq(schema.documentBases.workspaceId, input.workspaceId), defaultName))\n .limit(1);\n if (raced) return mapDocumentBase(raced);\n throw new Error(\"Failed to create Default document base\");\n }),\n );\n}\n\n/**\n * List a workspace's optional document collections after restoring the\n * internal Default collection when it is missing. Keeping the ensure and list\n * in the service layer gives every caller the same migration-free recovery\n * behavior after an old writer, manual repair, or future collection-management\n * path renames or removes Default.\n */\nexport async function listDocumentBasesEnsuringDefault(\n db: Database,\n input: { accountId: string; workspaceId: string },\n): Promise<DocumentBase[]> {\n await ensureDefaultBase(db, input);\n return await listDocumentBases(db, input.workspaceId);\n}\n\nexport async function runDocumentDefaultCollectionBackfill(\n db: Database,\n input: RunDocumentDefaultCollectionBackfillInput,\n) {\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n runId: input.runId,\n operationId: input.operationId,\n batchSize: input.batchSize,\n accountAdminAuthorization: input.accountAdminAuthorization,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT run_document_default_collection_backfill(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const row = rows[0];\n if (!row) throw new Error(\"Document Default collection backfill returned no result\");\n return DocumentDefaultCollectionBackfill.parse(row.result);\n },\n );\n}\n\nexport async function listDocumentDefaultCollectionBackfillRuns(\n db: Database,\n input: DocumentMigrationAuditInput,\n) {\n const limit = validateDocumentMigrationAuditLimit(input.limit);\n const cursor = input.cursor\n ? decodeDocumentMigrationAuditCursor(input.cursor, [\"backfill-runs\", input.accountId], true)\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n accountAdminAuthorization: input.accountAdminAuthorization,\n limit: limit + 1,\n beforeStartedAt: cursor?.timestamp ?? null,\n beforeRunId: cursor?.id ?? null,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT list_document_default_collection_backfill_runs(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const parsed = rows.map((row) => DocumentDefaultCollectionBackfillRunAudit.parse(row.result));\n const hasMore = parsed.length > limit;\n const runs = parsed.slice(0, limit);\n const tail = hasMore ? runs.at(-1) : null;\n return ListDocumentDefaultCollectionBackfillRunsResponse.parse({\n runs,\n hasMore,\n nextCursor: tail\n ? encodeDocumentMigrationAuditCursor([\"backfill-runs\", input.accountId], {\n timestamp: tail.startedAt,\n id: tail.runId,\n })\n : null,\n });\n },\n );\n}\n\nexport async function getDocumentDefaultCollectionBackfillAudit(\n db: Database,\n input: DocumentMigrationAuditInput & {\n runId: string;\n operationCursor?: string | undefined;\n receiptCursor?: string | undefined;\n },\n) {\n const limit = validateDocumentMigrationAuditLimit(input.limit);\n const operationCursor = input.operationCursor\n ? decodeDocumentMigrationAuditCursor(\n input.operationCursor,\n [\"backfill-operations\", input.accountId, input.runId],\n true,\n )\n : null;\n const receiptCursor = input.receiptCursor\n ? decodeDocumentMigrationAuditCursor(\n input.receiptCursor,\n [\"backfill-receipts\", input.accountId, input.runId],\n false,\n )\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n accountAdminAuthorization: input.accountAdminAuthorization,\n runId: input.runId,\n limit,\n operationBeforeCreatedAt: operationCursor?.timestamp ?? null,\n operationBeforeId: operationCursor?.id ?? null,\n receiptAfterWorkspaceId: receiptCursor?.id ?? null,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT get_document_default_collection_backfill_audit(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const raw = rows[0]?.result;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\"document Default collection backfill audit returned no result\");\n }\n const value = raw as Record<string, unknown>;\n const run = DocumentDefaultCollectionBackfillRunAudit.parse(value.run);\n const operations = Array.isArray(value.operations)\n ? value.operations.map((operation) =>\n DocumentDefaultCollectionBackfillOperationAudit.parse(operation),\n )\n : [];\n const receipts = Array.isArray(value.receipts)\n ? value.receipts.map((receipt) =>\n DocumentDefaultCollectionBackfillReceiptAudit.parse(receipt),\n )\n : [];\n const operationsHasMore = operations.length > limit;\n const receiptsHasMore = receipts.length > limit;\n const operationPage = operations.slice(0, limit);\n const receiptPage = receipts.slice(0, limit);\n const operationTail = operationsHasMore ? operationPage.at(-1) : null;\n const receiptTail = receiptsHasMore ? receiptPage.at(-1) : null;\n return DocumentDefaultCollectionBackfillAudit.parse({\n run,\n operations: operationPage,\n receipts: receiptPage,\n operationsHasMore,\n operationsNextCursor: operationTail\n ? encodeDocumentMigrationAuditCursor(\n [\"backfill-operations\", input.accountId, input.runId],\n {\n timestamp: operationTail.createdAt,\n id: operationTail.operationId,\n },\n )\n : null,\n receiptsHasMore,\n receiptsNextCursor: receiptTail\n ? encodeDocumentMigrationAuditCursor(\n [\"backfill-receipts\", input.accountId, input.runId],\n { timestamp: null, id: receiptTail.workspaceId },\n )\n : null,\n });\n },\n );\n}\n\nexport async function listOrganizationDocumentAuthorityReclassifications(\n db: Database,\n input: DocumentMigrationAuditInput,\n) {\n const limit = validateDocumentMigrationAuditLimit(input.limit);\n const cursor = input.cursor\n ? decodeDocumentMigrationAuditCursor(\n input.cursor,\n [\"organization-reclassifications\", input.accountId],\n true,\n )\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n actorSubjectId: input.actorSubjectId,\n accountAdminAuthorization: input.accountAdminAuthorization,\n limit: limit + 1,\n beforeCreatedAt: cursor?.timestamp ?? null,\n beforeOperationId: cursor?.id ?? null,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT list_organization_document_authority_reclassifications(\n ${JSON.stringify(command)}::jsonb\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const parsed = rows.map((row) =>\n OrganizationDocumentAuthorityReclassification.parse(row.result),\n );\n const hasMore = parsed.length > limit;\n const receipts = parsed.slice(0, limit);\n const tail = hasMore ? receipts.at(-1) : null;\n return ListOrganizationDocumentAuthorityReclassificationsResponse.parse({\n receipts,\n hasMore,\n nextCursor: tail\n ? encodeDocumentMigrationAuditCursor(\n [\"organization-reclassifications\", input.accountId],\n { timestamp: tail.createdAt, id: tail.operationId },\n )\n : null,\n });\n },\n );\n}\n\nfunction validateDocumentMigrationAuditLimit(value: number | undefined): number {\n const limit = value ?? 50;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error(\"document migration audit limit must be between 1 and 100\");\n }\n return limit;\n}\n\ntype DocumentMigrationAuditCursor = { timestamp: string | null; id: string };\n\nfunction documentMigrationAuditCursorScope(parts: string[]): string {\n return createHash(\"sha256\")\n .update(JSON.stringify([\"document-migration-audit\", 1, ...parts]), \"utf8\")\n .digest(\"hex\")\n .slice(0, 32);\n}\n\nfunction encodeDocumentMigrationAuditCursor(\n parts: string[],\n cursor: DocumentMigrationAuditCursor,\n): string {\n return Buffer.from(\n JSON.stringify({\n v: 1,\n s: documentMigrationAuditCursorScope(parts),\n t: cursor.timestamp,\n i: cursor.id,\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nfunction decodeDocumentMigrationAuditCursor(\n value: string,\n parts: string[],\n requireTimestamp: boolean,\n): DocumentMigrationAuditCursor {\n try {\n if (!value || value.length > 1_024) throw new Error(\"cursor length\");\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"cursor encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n if (\n Object.keys(parsed).sort().join(\",\") !== \"i,s,t,v\" ||\n parsed.v !== 1 ||\n parsed.s !== documentMigrationAuditCursorScope(parts) ||\n typeof parsed.i !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(\n parsed.i,\n ) ||\n (requireTimestamp\n ? typeof parsed.t !== \"string\" || !Number.isFinite(new Date(parsed.t).getTime())\n : parsed.t !== null)\n ) {\n throw new Error(\"cursor payload\");\n }\n return {\n timestamp: typeof parsed.t === \"string\" ? parsed.t : null,\n id: parsed.i,\n };\n } catch (error) {\n throw new Error(\"invalid document migration audit cursor\", {\n cause: error,\n });\n }\n}\n\nexport async function reclassifyDocumentAuthority(\n db: Database,\n input: ReclassifyDocumentAuthorityInput,\n) {\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const command = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n documentId: input.documentId,\n operationId: input.operationId,\n actorSubjectId: input.actorSubjectId,\n expectedAuthority: input.expectedAuthority,\n targetAuthorityKind: input.targetAuthorityKind,\n accountAdminAuthorization: input.accountAdminAuthorization,\n };\n const rows = (await scopedDb.execute(sql`\n SELECT reclassify_document_authority(${JSON.stringify(command)}::jsonb) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const row = rows[0];\n if (!row) throw new Error(\"Document authority reclassification returned no result\");\n return DocumentAuthorityReclassification.parse(row.result);\n },\n );\n}\n\nexport async function listDocumentAuthorityReclassifications(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n actorSubjectId: string;\n limit?: number | undefined;\n cursor?: string | undefined;\n },\n) {\n const limit = input.limit ?? 50;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error(\"document authority receipt limit must be between 1 and 100\");\n }\n const cursor = input.cursor\n ? decodeDocumentAuthorityReclassificationCursor(input.cursor, input)\n : null;\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n { viewerSubjectId: input.actorSubjectId },\n async (scopedDb) => {\n const rows = (await scopedDb.execute(sql`\n SELECT list_document_authority_reclassifications(\n ${input.accountId}::uuid,\n ${input.workspaceId}::uuid,\n ${input.actorSubjectId},\n ${input.documentId}::uuid,\n ${limit + 1}::integer,\n ${cursor?.createdAt ?? null}::timestamptz,\n ${cursor?.operationId ?? null}::uuid\n ) AS result\n `)) as unknown as Array<{ result: unknown }>;\n const parsed = rows.map((row) => DocumentAuthorityReclassification.parse(row.result));\n const hasMore = parsed.length > limit;\n const receipts = parsed.slice(0, limit);\n const tail = hasMore ? receipts.at(-1) : null;\n return ListDocumentAuthorityReclassificationsResponse.parse({\n receipts,\n hasMore,\n nextCursor: tail\n ? encodeDocumentAuthorityReclassificationCursor(input, {\n createdAt: tail.createdAt,\n operationId: tail.operationId,\n })\n : null,\n });\n },\n );\n}\n\ntype DocumentAuthorityReclassificationCursor = {\n createdAt: string;\n operationId: string;\n};\n\nfunction documentAuthorityReclassificationCursorScope(input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n actorSubjectId: string;\n}): string {\n return createHash(\"sha256\")\n .update(\n JSON.stringify([\n \"document_authority_reclassification_cursor\",\n 1,\n input.accountId,\n input.workspaceId,\n input.documentId,\n input.actorSubjectId,\n ]),\n \"utf8\",\n )\n .digest(\"hex\")\n .slice(0, 32);\n}\n\nfunction encodeDocumentAuthorityReclassificationCursor(\n scope: Parameters<typeof documentAuthorityReclassificationCursorScope>[0],\n cursor: DocumentAuthorityReclassificationCursor,\n): string {\n return Buffer.from(\n JSON.stringify({\n v: 1,\n s: documentAuthorityReclassificationCursorScope(scope),\n t: cursor.createdAt,\n i: cursor.operationId,\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nfunction decodeDocumentAuthorityReclassificationCursor(\n value: string,\n scope: Parameters<typeof documentAuthorityReclassificationCursorScope>[0],\n): DocumentAuthorityReclassificationCursor {\n try {\n if (!value || value.length > 1_024) throw new Error(\"cursor length\");\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"cursor encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n if (\n Object.keys(parsed).sort().join(\",\") !== \"i,s,t,v\" ||\n parsed.v !== 1 ||\n parsed.s !== documentAuthorityReclassificationCursorScope(scope) ||\n typeof parsed.t !== \"string\" ||\n !Number.isFinite(new Date(parsed.t).getTime()) ||\n typeof parsed.i !== \"string\" ||\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(parsed.i)\n ) {\n throw new Error(\"cursor payload\");\n }\n return { createdAt: parsed.t, operationId: parsed.i };\n } catch (error) {\n throw new Error(\"invalid document authority receipt cursor\", {\n cause: error,\n });\n }\n}\n\nexport async function addDocumentToBase(\n db: Database,\n input: AddDocumentRequest & {\n accountId: string;\n workspaceId: string;\n baseId: string;\n createdBy?: string | null | undefined;\n initiatingSubjectId?: string | null | undefined;\n organizationAuthorityGranted?: boolean | undefined;\n curationStatus?: DocumentCurationStatus | undefined;\n access?: DocumentAccessFilter | undefined;\n knowledgeSourceIdentity?: string | null | undefined;\n },\n): Promise<Document> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const viewerSubjectId = cleanString(input.access?.viewerSubjectId ?? null);\n const authority = resolveDocumentAuthority({\n kind: input.authorityKind,\n legacyVisibility: input.visibility,\n workspaceId: input.workspaceId,\n initiatingSubjectId: input.initiatingSubjectId,\n });\n if (authority.kind === \"organization\" && input.organizationAuthorityGranted !== true) {\n throw new Error(\"organization document writes require exact account authority\");\n }\n if (\n authority.kind === \"personal\" &&\n (viewerSubjectId !== authority.subjectId ||\n cleanString(input.createdBy ?? null) !== authority.subjectId)\n ) {\n throw new Error(\"personal document writes require the exact initiating subject\");\n }\n if (viewerSubjectId) await setSubjectRlsContext(scopedDb, viewerSubjectId);\n const base = await getDocumentBase(scopedDb, input.workspaceId, input.baseId);\n if (!base) throw new Error(`Document base not found: ${input.baseId}`);\n const initiatingSubjectId = cleanString(input.initiatingSubjectId ?? null);\n const createdBy = cleanString(input.createdBy ?? null);\n if (initiatingSubjectId && createdBy && initiatingSubjectId !== createdBy) {\n throw new Error(\"document file authority must match the exact initiating subject\");\n }\n const fileAuthoritySubjectId = initiatingSubjectId ?? createdBy ?? null;\n const file = await requireReadyFile(scopedDb, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: fileAuthoritySubjectId,\n fileId: input.fileId,\n });\n const knowledgeSourceIdentity = cleanString(input.knowledgeSourceIdentity ?? null);\n if (knowledgeSourceIdentity && knowledgeSourceIdentity.length > 512) {\n throw new Error(\"knowledge source document identity exceeds 512 characters\");\n }\n const now = new Date();\n const [existing] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, input.workspaceId),\n ...(knowledgeSourceIdentity\n ? [eq(schema.documents.knowledgeSourceIdentity, knowledgeSourceIdentity)]\n : [\n eq(schema.documents.baseId, input.baseId),\n eq(schema.documents.fileId, input.fileId),\n ]),\n ),\n )\n .limit(1);\n if (existing) {\n if (knowledgeSourceIdentity && existing.fileId !== input.fileId) {\n throw new Error(\"knowledge source document identity is bound to different content\");\n }\n if (!documentMatchesAccess(existing, input.workspaceId, input.access)) {\n throw new Error(`Document not found: ${existing.id}`);\n }\n assertOrganizationDocumentAuthority(\n existing.authorityKind,\n input.organizationAuthorityGranted,\n );\n // Idempotent re-add: refresh caller-supplied source metadata on the\n // existing row instead of silently discarding it (aclTags especially —\n // a re-add that tightens tags must not be a no-op). Access policy is\n // deliberately inherited: re-adding a known file is not an implicit\n // visibility/agent-policy update that another manager can exploit.\n const [updated] = await scopedDb\n .update(schema.documents)\n .set({\n title: cleanString(input.title) ?? cleanString(input.sourceTitle) ?? existing.title,\n ...(input.sourceKind !== undefined ? { sourceKind: input.sourceKind } : {}),\n sourceUri: cleanString(input.sourceUri) ?? existing.sourceUri,\n sourceExternalId: cleanString(input.sourceExternalId) ?? existing.sourceExternalId,\n sourceTitle: cleanString(input.sourceTitle) ?? existing.sourceTitle,\n sourceAuthor: cleanString(input.sourceAuthor) ?? existing.sourceAuthor,\n sourceCreatedAt: parseOptionalDate(input.sourceCreatedAt) ?? existing.sourceCreatedAt,\n sourceUpdatedAt: parseOptionalDate(input.sourceUpdatedAt) ?? existing.sourceUpdatedAt,\n sourceVersion: cleanString(input.sourceVersion) ?? existing.sourceVersion,\n ...(input.aclTags !== undefined ? { aclTags: cleanStringArray(input.aclTags) } : {}),\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.documents.workspaceId, input.workspaceId),\n eq(schema.documents.id, existing.id),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .returning();\n return mapDocument(updated ?? existing);\n }\n const documentId = randomUUID();\n const row = await scopedDb.transaction(async (tx) => {\n const userAuthority =\n authority.kind === \"personal\"\n ? await createPersonalDocumentAuthority(tx, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: authority.subjectId!,\n documentId,\n })\n : null;\n const [inserted] = await tx\n .insert(schema.documents)\n .values({\n id: documentId,\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n baseId: input.baseId,\n fileId: input.fileId,\n status: \"queued\",\n title: cleanString(input.title) ?? cleanString(input.sourceTitle) ?? file.filename,\n parser: DEFAULT_DOCUMENT_PARSER,\n sourceKind: input.sourceKind ?? \"manual_upload\",\n sourceUri: cleanString(input.sourceUri) ?? null,\n sourceExternalId: cleanString(input.sourceExternalId) ?? null,\n sourceTitle: cleanString(input.sourceTitle) ?? null,\n sourceAuthor: cleanString(input.sourceAuthor) ?? null,\n sourceCreatedAt: parseOptionalDate(input.sourceCreatedAt),\n sourceUpdatedAt: parseOptionalDate(input.sourceUpdatedAt),\n sourceVersion: cleanString(input.sourceVersion) ?? null,\n knowledgeSourceIdentity,\n aclTags: cleanStringArray(input.aclTags),\n authorityKind: authority.kind,\n authorityWorkspaceId: userAuthority ? null : authority.workspaceId,\n authoritySubjectId: authority.subjectId,\n authorityId: userAuthority?.authorityId ?? null,\n ownerOrganizationMembershipId: userAuthority?.ownerOrganizationMembershipId ?? null,\n originWorkspaceId: input.workspaceId,\n visibility: authority.kind === \"personal\" ? \"private\" : \"workspace\",\n agentAccess: input.agentAccess ?? true,\n createdBy: fileAuthoritySubjectId,\n curationStatus: input.curationStatus ?? \"none\",\n updatedAt: now,\n })\n .returning();\n return inserted;\n });\n if (!row) throw new Error(\"Failed to create document\");\n return mapDocument(row);\n },\n );\n}\n\n/**\n * Move a document and its indexed chunks to another base. With no explicit\n * target, applies the stored curation suggestion. A 'suggested' or 'pending'\n * document that gets moved counts as filed.\n */\nexport async function moveDocumentToBase(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n targetBaseId?: string | null | undefined;\n organizationAuthorityGranted?: boolean | undefined;\n access?: DocumentAccessFilter | undefined;\n },\n): Promise<Document> {\n return await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const viewerSubjectId = cleanString(input.access?.viewerSubjectId ?? null);\n if (viewerSubjectId) await setSubjectRlsContext(scopedDb, viewerSubjectId);\n const [row] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .limit(1);\n if (!row) throw new Error(`Document not found: ${input.documentId}`);\n assertOrganizationDocumentAuthority(row.authorityKind, input.organizationAuthorityGranted);\n const suggestion = (row.curation as { suggestedBaseId?: string | null } | null)\n ?.suggestedBaseId;\n const targetBaseId = input.targetBaseId ?? suggestion;\n if (!targetBaseId) {\n throw new Error(\"document has no suggested base; pass targetBaseId\");\n }\n if (targetBaseId === row.baseId) return mapDocument(row);\n // A portable personal Document retains its immutable ingestion workspace\n // as provenance and physical storage. Management may be authorized from\n // another same-organization workspace, but filing still targets a base\n // in that origin workspace rather than silently copying authority/data.\n const base = await getDocumentBase(scopedDb, row.workspaceId, targetBaseId);\n if (!base) throw new Error(`Document base not found: ${targetBaseId}`);\n const [conflict] = await scopedDb\n .select({ id: schema.documents.id })\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, row.workspaceId),\n eq(schema.documents.baseId, targetBaseId),\n ...(row.knowledgeSourceIdentity\n ? [eq(schema.documents.knowledgeSourceIdentity, row.knowledgeSourceIdentity)]\n : [eq(schema.documents.fileId, row.fileId)]),\n ),\n )\n .limit(1);\n if (conflict) {\n throw new Error(\"a document for this file already exists in the target base\");\n }\n const now = new Date();\n const moved = await scopedDb.transaction(async (tx) => {\n const [updated] = await tx\n .update(schema.documents)\n .set({\n baseId: targetBaseId,\n ...(row.curationStatus === \"suggested\" || row.curationStatus === \"pending\"\n ? { curationStatus: \"auto_filed\" }\n : {}),\n updatedAt: now,\n })\n .where(\n and(\n eq(schema.documents.workspaceId, row.workspaceId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .returning();\n if (updated) {\n await tx\n .update(schema.documentChunks)\n .set({ baseId: targetBaseId })\n .where(\n and(\n eq(schema.documentChunks.workspaceId, row.workspaceId),\n eq(schema.documentChunks.documentId, input.documentId),\n ),\n );\n }\n return updated;\n });\n if (!moved) throw new Error(`Document not found: ${input.documentId}`);\n return mapDocument(moved);\n },\n );\n}\n\nexport async function deleteDocumentFromBase(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n baseId: string;\n documentId: string;\n organizationAuthorityGranted?: boolean | undefined;\n access?: DocumentAccessFilter | undefined;\n },\n): Promise<void> {\n await withRlsContext(\n db,\n { accountId: input.accountId, workspaceId: input.workspaceId },\n async (scopedDb) => {\n const viewerSubjectId = cleanString(input.access?.viewerSubjectId ?? null);\n if (viewerSubjectId) await setSubjectRlsContext(scopedDb, viewerSubjectId);\n const [document] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n )\n .limit(1);\n if (!document) {\n throw new Error(`Document not found: ${input.documentId}`);\n }\n assertOrganizationDocumentAuthority(\n document.authorityKind,\n input.organizationAuthorityGranted,\n );\n if (document.baseId !== input.baseId) {\n throw new Error(`Document not found: ${input.documentId}`);\n }\n await scopedDb\n .delete(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, input.documentId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ),\n );\n },\n );\n}\n\nexport async function listDocuments(\n db: Database,\n workspaceId: string,\n baseId: string,\n access?: DocumentAccessFilter,\n): Promise<Document[]> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const rows = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, workspaceId),\n eq(schema.documents.baseId, baseId),\n ...documentAccessConditions(workspaceId, access),\n ),\n )\n .orderBy(asc(schema.documents.createdAt));\n return rows.map(mapDocument);\n });\n}\n\n/**\n * List Documents the human can discover and manage from the requested\n * workspace. Organization Documents are account-wide, workspace Documents are\n * local, activated organization-user Documents are portable across the owner's\n * same-organization workspaces, and legacy personal rows remain anchored to\n * their ingestion workspace through documentAccessConditions.\n */\nexport async function listAccessibleDocuments(\n db: Database,\n workspaceId: string,\n access: DocumentAccessFilter,\n): Promise<Document[]> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const rows = await scopedDb\n .select()\n .from(schema.documents)\n .where(and(...documentAccessConditions(workspaceId, access)))\n .orderBy(desc(schema.documents.updatedAt), asc(schema.documents.createdAt));\n return rows.map(mapDocument);\n });\n}\n\n/**\n * List newly ready documents in the same effective scope used by agent\n * retrieval. The opaque checkpoint is bound to the account, requesting\n * workspace, and immutable initiating subject, so it cannot be reused across\n * scheduled-task authority boundaries.\n */\nexport async function listEffectiveIndexedDocuments(\n db: Database,\n input: ListEffectiveIndexedDocumentsInput,\n): Promise<ListIndexedDocumentsResponse> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const limit = input.limit ?? 50;\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n throw new Error(\"indexed document list limit must be between 1 and 100\");\n }\n const afterSequence = input.checkpoint\n ? decodeDocumentIndexCheckpoint(input.checkpoint, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n })\n : 0n;\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: \"agent\",\n agentAuthority: input.agentAuthority,\n });\n const rows = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.status, \"ready\"),\n isNotNull(schema.documents.indexSequence),\n gt(schema.documents.indexSequence, afterSequence),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .orderBy(asc(schema.documents.indexSequence))\n .limit(limit + 1),\n );\n const hasMore = rows.length > limit;\n const pageRows = rows.slice(0, limit);\n const nextSequence = pageRows.at(-1)?.indexSequence ?? afterSequence;\n if (nextSequence === null) {\n throw new Error(\"ready document is missing its index sequence\");\n }\n return {\n documents: pageRows.map(mapIndexedDocumentSummary),\n nextCheckpoint: encodeDocumentIndexCheckpoint({\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n sequence: nextSequence,\n }),\n hasMore,\n };\n}\n\nexport function encodeDocumentIndexCheckpoint(input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n sequence: bigint;\n}): string {\n if (input.sequence < 0n) throw new Error(\"document index checkpoint sequence is invalid\");\n return Buffer.from(\n JSON.stringify({\n v: 1,\n s: documentIndexCheckpointScope(input),\n q: input.sequence.toString(),\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nexport function decodeDocumentIndexCheckpoint(\n value: string,\n scope: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n },\n): bigint {\n try {\n if (!value || value.length > DOCUMENT_INDEX_CHECKPOINT_MAX_CHARS) {\n throw new Error(\"checkpoint length\");\n }\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"checkpoint encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n if (\n Object.keys(parsed).sort().join(\",\") !== \"q,s,v\" ||\n parsed.v !== 1 ||\n typeof parsed.s !== \"string\" ||\n typeof parsed.q !== \"string\" ||\n !/^(0|[1-9][0-9]*)$/.test(parsed.q)\n ) {\n throw new Error(\"checkpoint payload\");\n }\n if (parsed.s !== documentIndexCheckpointScope(scope)) {\n throw new Error(\"document index checkpoint belongs to a different workspace or subject\");\n }\n return BigInt(parsed.q);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === \"document index checkpoint belongs to a different workspace or subject\"\n ) {\n throw error;\n }\n throw new Error(\"invalid document index checkpoint\", { cause: error });\n }\n}\n\nfunction documentIndexCheckpointScope(input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n}): string {\n return createHash(\"sha256\")\n .update(\"opengeni:document-index-checkpoint:v1\\0\")\n .update(input.accountId)\n .update(\"\\0\")\n .update(input.workspaceId)\n .update(\"\\0\")\n .update(canonicalEffectiveDocumentSubject(input.initiatingSubjectId))\n .digest(\"hex\");\n}\n\nfunction canonicalEffectiveDocumentSubject(value: string): string {\n const subjectId = cleanString(value);\n if (!subjectId || subjectId !== value) {\n throw new Error(\"effective document retrieval requires an initiating subject\");\n }\n if (new TextEncoder().encode(subjectId).byteLength > DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES) {\n throw new Error(\n `effective document initiating subject exceeds ${DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES} UTF-8 bytes`,\n );\n }\n return subjectId;\n}\n\nexport async function getDocument(\n db: Database,\n workspaceId: string,\n documentId: string,\n access?: DocumentAccessFilter,\n): Promise<Document | null> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.id, documentId), ...documentAccessConditions(workspaceId, access)),\n )\n .limit(1);\n return row ? mapDocument(row) : null;\n });\n}\n\n/**\n * Resolve the immutable source file through Document authority in the requested\n * workspace. The file remains physically owned by its ingestion workspace;\n * callers never gain generic access to that workspace's file inventory.\n */\nexport async function getDocumentOriginalFile(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n documentId: string;\n access: DocumentAccessFilter;\n },\n): Promise<FileAsset | null> {\n const subjectId = cleanString(input.access.viewerSubjectId ?? null);\n if (!subjectId || input.access.agentOnly) return null;\n return await resolveDocumentOriginalFileForSubject(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId,\n documentId: input.documentId,\n });\n}\n\n/**\n * Internal ingestion-only read used after the worker has independently resolved\n * and fenced the immutable document authority tuple. It deliberately does not\n * apply provider retrieval authorization because a new Drive document must be\n * indexed before its first ACL evidence can be attached. User, API, MCP, and\n * agent reads must use getDocument/effective retrieval instead.\n */\nexport async function getDocumentForIndexing(\n db: Database,\n workspaceId: string,\n documentId: string,\n): Promise<Document | null> {\n return await withWorkspaceRls(db, workspaceId, async (scopedDb) => {\n const [row] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n )\n .limit(1);\n return row ? mapDocument(row) : null;\n });\n}\n\nexport async function queueDocumentForReindex(\n db: Database,\n workspaceId: string,\n documentId: string,\n access?: DocumentAccessFilter,\n organizationAuthorityGranted?: boolean,\n): Promise<Document> {\n return await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n const [document] = await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.id, documentId), ...documentAccessConditions(workspaceId, access)),\n )\n .limit(1);\n if (!document) throw new Error(`Document not found: ${documentId}`);\n assertOrganizationDocumentAuthority(document.authorityKind, organizationAuthorityGranted);\n const [row] = await scopedDb\n .update(schema.documents)\n .set({\n status: \"queued\",\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(eq(schema.documents.id, documentId), ...documentAccessConditions(workspaceId, access)),\n )\n .returning();\n if (!row) throw new Error(`Document not found: ${documentId}`);\n return mapDocument(row);\n });\n}\n\nfunction assertOrganizationDocumentAuthority(\n authorityKind: string,\n organizationAuthorityGranted: boolean | undefined,\n): void {\n if (authorityKind === \"organization\" && organizationAuthorityGranted !== true) {\n throw new Error(\"organization document mutations require exact account authority\");\n }\n}\n\nexport async function indexDocumentNow(\n db: Database,\n objectStorage: ObjectStorage,\n workspaceId: string,\n documentId: string,\n services: DocumentServices = createDocumentServices(),\n hooks: DocumentIndexHooks = {},\n access?: DocumentAccessFilter,\n): Promise<Document> {\n const [loadedDocument] = await withDocumentRls(\n db,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select()\n .from(schema.documents)\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n )\n .limit(1),\n );\n if (!loadedDocument) throw new Error(`Document not found: ${documentId}`);\n let document: DocumentRow = loadedDocument;\n const file = await requireReadyFile(db, {\n accountId: document.accountId,\n workspaceId,\n subjectId: cleanString(document.createdBy) ?? null,\n fileId: document.fileId,\n });\n await withDocumentRls(db, workspaceId, access, async (scopedDb) => {\n await scopedDb\n .update(schema.documents)\n .set({\n status: \"indexing\",\n parser: services.parser.name,\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n );\n });\n try {\n const object = await retryWhileMissing(async () =>\n objectStorage.getObjectBytes(file.objectKey),\n );\n if (!object) throw new Error(\"document source object is missing\");\n const bytes = object.bytes;\n const parsed = await services.parser.parse(bytes, file);\n // Knowledge drops (curationStatus 'pending') are curated between parse and\n // chunking when a provider is enabled, so chunk metadata and base placement\n // reflect the curated truth. Disabled curation leaves caller metadata intact;\n // enabled-provider failures remain fail-soft through the heuristic fallback.\n if (document.curationStatus === \"pending\") {\n document = await curateDroppedDocument(db, services, document, parsed, file);\n }\n const chunks = services.chunker.chunk(parsed, file);\n await hooks.beforeEmbed?.({\n accountId: document.accountId,\n workspaceId: document.workspaceId,\n documentId,\n chunkCount: chunks.length,\n });\n const embeddings = await services.embedder.embedMany(chunks.map((chunk) => chunk.text));\n if (embeddings.length !== chunks.length) {\n throw new Error(\n `Embedding provider returned ${embeddings.length} embeddings for ${chunks.length} chunks`,\n );\n }\n await withDocumentRls(\n db,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb.transaction(async (tx) => {\n await tx\n .delete(schema.documentChunks)\n .where(\n and(\n eq(schema.documentChunks.workspaceId, workspaceId),\n eq(schema.documentChunks.documentId, documentId),\n ),\n );\n if (chunks.length > 0) {\n await tx.insert(schema.documentChunks).values(\n chunks.map((chunk, index) => ({\n accountId: document.accountId,\n workspaceId: document.workspaceId,\n documentId,\n baseId: document.baseId,\n fileId: file.id,\n authorityKind: document.authorityKind,\n authorityWorkspaceId: document.authorityWorkspaceId,\n authoritySubjectId: document.authoritySubjectId,\n chunkIndex: index,\n text: chunk.text,\n metadata: {\n ...chunk.metadata,\n documentTitle: document.title,\n sourceKind: document.sourceKind,\n sourceUri: document.sourceUri,\n sourceExternalId: document.sourceExternalId,\n sourceTitle: document.sourceTitle,\n sourceAuthor: document.sourceAuthor,\n sourceCreatedAt: document.sourceCreatedAt?.toISOString() ?? null,\n sourceUpdatedAt: document.sourceUpdatedAt?.toISOString() ?? null,\n sourceVersion: document.sourceVersion,\n aclTags: document.aclTags,\n },\n embedding: validateEmbedding(\n embeddings[index] ?? [],\n services.embedder.dimensions,\n services.embedder.model,\n ),\n embeddingModel: services.embedder.model,\n })),\n );\n }\n await tx\n .update(schema.documents)\n .set({\n status: \"ready\",\n parser: services.parser.name,\n chunkCount: chunks.length,\n error: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.documents.workspaceId, workspaceId),\n eq(schema.documents.id, documentId),\n ),\n );\n }),\n );\n } catch (error) {\n const [failed] = await withDocumentRls(\n db,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .update(schema.documents)\n .set({\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n updatedAt: new Date(),\n })\n .where(\n and(eq(schema.documents.workspaceId, workspaceId), eq(schema.documents.id, documentId)),\n )\n .returning(),\n );\n if (!failed) throw error;\n return mapDocument(failed);\n }\n // Internal indexing must be able to return a private document to the caller\n // that created/queued it. Public reads remain fail-closed when no subject is\n // supplied; the creator subject is the document's frozen access principal.\n const updated = await getDocumentForIndexing(db, workspaceId, documentId);\n if (!updated) throw new Error(`Document disappeared after indexing: ${documentId}`);\n return updated;\n}\n\ntype DocumentRow = typeof schema.documents.$inferSelect;\n\nasync function curateDroppedDocument(\n db: Database,\n services: DocumentServices,\n document: DocumentRow,\n parsed: ParsedDocument,\n file: FileAsset,\n): Promise<DocumentRow> {\n // `none` is an explicit disabled-curation policy. Do not silently replace\n // it with heuristics: indexing still proceeds, but the drop remains an\n // ordinary uncured document with its caller-supplied title and metadata.\n if (!services.curator) {\n const [updated] = await withDocumentRls(\n db,\n document.workspaceId,\n { viewerSubjectId: document.authoritySubjectId },\n async (scopedDb) =>\n await scopedDb\n .update(schema.documents)\n .set({\n curationStatus: \"none\",\n summary: null,\n topics: [],\n curation: null,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.documents.workspaceId, document.workspaceId),\n eq(schema.documents.id, document.id),\n ),\n )\n .returning(),\n );\n return updated ?? document;\n }\n const bases = await listDocumentBases(db, document.workspaceId);\n const candidates: DocumentCurationCandidateBase[] = bases\n .filter((base) => base.id !== document.baseId)\n .map((base) => ({\n id: base.id,\n name: base.name,\n description: base.description,\n }));\n const input: DocumentCurationInput = {\n text: parsed.text.slice(0, DOCUMENT_CURATION_MAX_INPUT_CHARS),\n filename: file.filename,\n title: document.title,\n bases: candidates,\n };\n let outcome: DocumentCurationOutcome;\n let model: string;\n let failure: string | null = null;\n try {\n outcome = await services.curator.curate(input);\n model = services.curator.model;\n } catch (error) {\n failure = error instanceof Error ? error.message : String(error);\n console.warn(\"document curation failed; applying heuristic fallback\", {\n workspaceId: document.workspaceId,\n documentId: document.id,\n error: failure,\n });\n outcome = heuristicCuration(input, file.contentType);\n model = \"heuristic\";\n }\n const suggestedBase = candidates.find((base) => base.id === outcome.targetBaseId) ?? null;\n let moveToBaseId: string | null = null;\n if (\n suggestedBase &&\n failure === null &&\n outcome.confidence >= DOCUMENT_CURATION_AUTO_FILE_CONFIDENCE\n ) {\n // The (workspace, base, file) unique index means a same-file twin already\n // in the target base blocks the move; keep it as a suggestion instead.\n const conflict = await withDocumentRls(\n db,\n document.workspaceId,\n { viewerSubjectId: document.authoritySubjectId },\n async (scopedDb) =>\n await scopedDb\n .select({ id: schema.documents.id })\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.workspaceId, document.workspaceId),\n eq(schema.documents.baseId, suggestedBase.id),\n eq(schema.documents.fileId, document.fileId),\n ),\n )\n .limit(1),\n );\n if (conflict.length === 0) {\n moveToBaseId = suggestedBase.id;\n }\n }\n const curation: DocumentCuration = {\n suggestedBaseId: suggestedBase?.id ?? null,\n suggestedBaseName: suggestedBase?.name ?? null,\n confidence: outcome.confidence,\n reason: failure ? `curation failed (${failure}); heuristic fallback applied` : outcome.reason,\n originalTitle: document.title,\n model,\n };\n const curationStatus: DocumentCurationStatus = failure\n ? \"failed\"\n : moveToBaseId\n ? \"auto_filed\"\n : \"suggested\";\n const [updated] = await withDocumentRls(\n db,\n document.workspaceId,\n { viewerSubjectId: document.authoritySubjectId },\n async (scopedDb) =>\n await scopedDb\n .update(schema.documents)\n .set({\n title: outcome.title ?? document.title,\n summary: outcome.summary,\n topics: outcome.topics,\n ...(outcome.sourceKind ? { sourceKind: outcome.sourceKind } : {}),\n ...(moveToBaseId ? { baseId: moveToBaseId } : {}),\n curationStatus,\n curation,\n updatedAt: new Date(),\n })\n .where(\n and(\n eq(schema.documents.workspaceId, document.workspaceId),\n eq(schema.documents.id, document.id),\n ),\n )\n .returning(),\n );\n return updated ?? document;\n}\n\nexport async function searchDocuments(\n db: Database,\n input: DocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\"> = createDocumentServices(),\n): Promise<DocumentSearchResult[]> {\n return (await searchDocumentCandidates(db, input, services)).results;\n}\n\nexport type DocumentCandidateRelevanceFloor = {\n vectorScore: number;\n keywordScore: number;\n};\n\nasync function searchDocumentCandidates(\n db: Database,\n input: DocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\">,\n relevanceFloor?: DocumentCandidateRelevanceFloor,\n): Promise<{ results: DocumentSearchResult[]; belowRelevanceFloor: number }> {\n await assertDocumentAccountWorkspace(db, input.accountId, input.workspaceId);\n const mode = input.mode ?? \"hybrid\";\n const limit = Math.min(Math.max(input.limit ?? 5, 1), 50);\n const candidateLimit = mode === \"hybrid\" ? Math.min(limit * 4, 100) : limit;\n const rows: CombinedSearchRow[] = [];\n if (mode === \"vector\" || mode === \"hybrid\") {\n try {\n rows.push(...(await vectorSearchDocuments(db, input, candidateLimit, services)));\n } catch (error) {\n if (mode === \"vector\") {\n throw error;\n }\n console.warn(\n \"document hybrid search vector component failed; falling back to keyword search\",\n {\n workspaceId: input.workspaceId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n }\n if (mode === \"keyword\" || mode === \"hybrid\") {\n rows.push(...(await keywordSearchDocuments(db, input, candidateLimit)));\n }\n const merged = mergeDocumentSearchRows(rows, mode);\n return selectDocumentSearchCandidateWindow(merged, limit, relevanceFloor);\n}\n\nexport function selectDocumentSearchCandidateWindow(\n merged: DocumentSearchResult[],\n limit: number,\n relevanceFloor?: DocumentCandidateRelevanceFloor,\n): { results: DocumentSearchResult[]; belowRelevanceFloor: number } {\n const boundedLimit = Math.min(Math.max(Math.trunc(limit), 1), 50);\n if (!relevanceFloor) {\n return { results: merged.slice(0, boundedLimit), belowRelevanceFloor: 0 };\n }\n let belowRelevanceFloor = 0;\n const relevant = merged.filter((result) => {\n const included =\n (result.vectorScore !== null && result.vectorScore >= relevanceFloor.vectorScore) ||\n (result.keywordScore !== null && result.keywordScore >= relevanceFloor.keywordScore);\n if (!included) belowRelevanceFloor += 1;\n return included;\n });\n return { results: relevant.slice(0, boundedLimit), belowRelevanceFloor };\n}\n\n/**\n * Canonical effective retrieval composition for API, SDK, and MCP surfaces.\n * Callers supply the already-authorized immutable initiating subject; no\n * request/tool input can replace it with another user's personal authority.\n */\nexport async function searchEffectiveDocuments(\n db: Database,\n input: EffectiveDocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\"> = createDocumentServices(),\n): Promise<DocumentSearchResult[]> {\n const initiatingSubjectId = cleanString(input.initiatingSubjectId);\n if (!initiatingSubjectId) {\n throw new Error(\"effective document retrieval requires an initiating subject\");\n }\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface,\n agentAuthority: input.agentAuthority,\n });\n return await searchDocuments(\n db,\n {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n query: input.query,\n baseIds: input.baseIds,\n limit: input.limit,\n mode: input.mode,\n sourceKinds: input.sourceKinds,\n authorityKinds: input.authorityKinds,\n aclTags: input.aclTags,\n // Construct the lower-level access filter here instead of spreading the\n // caller input, so an untyped/legacy access override is always ignored.\n access,\n },\n services,\n );\n}\n\n/**\n * Agent-facing Knowledge search over the existing Documents evidence store.\n * Search selects candidates only after authority filtering; this second read\n * rechecks every exact chunk before projecting it, so a record revoked between\n * ranking and response construction disappears rather than leaking stale data.\n */\nexport async function searchEffectiveKnowledge(\n db: Database,\n input: EffectiveDocumentSearchInput,\n services: Pick<DocumentServices, \"embedder\"> = createDocumentServices(),\n): Promise<KnowledgeSearchResponse> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const requestedLimit = Math.min(Math.max(input.limit ?? 5, 1), KNOWLEDGE_SEARCH_MAX_RESULTS);\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface,\n agentAuthority: input.agentAuthority,\n });\n // Pull a bounded surplus so the permission-safe result set can still satisfy\n // the caller after relevance filtering and exact-content deduplication.\n const candidateLimit = Math.min(requestedLimit * 4, KNOWLEDGE_SEARCH_MAX_RESULTS);\n const rankedSelection = await searchDocumentCandidates(\n db,\n {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n query: input.query,\n limit: candidateLimit,\n ...(input.baseIds ? { baseIds: input.baseIds } : {}),\n ...(input.mode ? { mode: input.mode } : {}),\n ...(input.sourceKinds ? { sourceKinds: input.sourceKinds } : {}),\n ...(input.authorityKinds ? { authorityKinds: input.authorityKinds } : {}),\n ...(input.aclTags ? { aclTags: input.aclTags } : {}),\n access,\n },\n services,\n {\n vectorScore: KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE,\n keywordScore: KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE,\n },\n );\n const ranked = rankedSelection.results;\n if (ranked.length === 0) {\n return selectKnowledgeSearchResults({\n candidates: [],\n rankedCandidateCount: 0,\n requestedLimit,\n alreadyBelowRelevanceFloor: rankedSelection.belowRelevanceFloor,\n });\n }\n const current = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunk: schema.documentChunks,\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n previousChunkId: knowledgePreviousChunkIdProjection(),\n nextChunkId: knowledgeNextChunkIdProjection(),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documentChunks.accountId, input.accountId),\n inArray(\n schema.documentChunks.id,\n ranked.map((result) => result.chunkId),\n ),\n eq(schema.documents.status, \"ready\"),\n ...(input.authorityKinds?.length\n ? [inArray(schema.documents.authorityKind, input.authorityKinds)]\n : []),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n ),\n );\n const currentByChunkId = new Map(current.map((row) => [row.chunk.id, row]));\n return selectKnowledgeSearchResults({\n rankedCandidateCount: ranked.length,\n requestedLimit,\n alreadyBelowRelevanceFloor: rankedSelection.belowRelevanceFloor,\n candidates: ranked.flatMap((rankedResult) => {\n const row = currentByChunkId.get(rankedResult.chunkId);\n if (!row) return [];\n return [\n {\n record: knowledgeChunkRecord(row.document, row.chunk, row.citation, {\n previousChunkId: row.previousChunkId,\n nextChunkId: row.nextChunkId,\n }),\n semanticScore: rankedResult.score,\n matchType: rankedResult.matchType,\n vectorScore: rankedResult.vectorScore,\n keywordScore: rankedResult.keywordScore,\n },\n ];\n }),\n });\n}\n\ntype KnowledgeSearchCandidate = {\n record: KnowledgeRecord;\n semanticScore: number;\n matchType: DocumentSearchMode;\n vectorScore: number | null;\n keywordScore: number | null;\n};\n\ntype KnowledgeSearchSelectionInput = {\n candidates: KnowledgeSearchCandidate[];\n rankedCandidateCount: number;\n requestedLimit: number;\n alreadyBelowRelevanceFloor?: number | undefined;\n now?: Date | undefined;\n};\n\n/**\n * Deterministic, content-safe final selection over already-authorized and\n * freshly rechecked Knowledge candidates. Exported for boundary tests; callers\n * must never use it as a substitute for the database authorization pass above.\n */\nexport function selectKnowledgeSearchResults(\n input: KnowledgeSearchSelectionInput,\n): KnowledgeSearchResponse {\n const requestedLimit = Math.min(\n Math.max(Math.trunc(input.requestedLimit), 1),\n KNOWLEDGE_SEARCH_MAX_RESULTS,\n );\n const nowMs = (input.now ?? new Date()).getTime();\n let belowRelevanceFloor = Math.min(\n Math.max(0, Math.trunc(input.alreadyBelowRelevanceFloor ?? 0)),\n KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS,\n );\n const relevant: KnowledgeSearchResult[] = [];\n for (const candidate of input.candidates) {\n const relevanceSignals: Array<\"vector\" | \"keyword\"> = [];\n if (\n candidate.vectorScore !== null &&\n candidate.vectorScore >= KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE\n ) {\n relevanceSignals.push(\"vector\");\n }\n if (\n candidate.keywordScore !== null &&\n candidate.keywordScore >= KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE\n ) {\n relevanceSignals.push(\"keyword\");\n }\n if (relevanceSignals.length === 0) {\n belowRelevanceFloor = Math.min(belowRelevanceFloor + 1, KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS);\n continue;\n }\n const freshness = knowledgeFreshness(candidate.record.quality.freshnessAt, nowMs);\n const qualityAdjustment = freshness === \"current\" ? 0.02 : freshness === \"aging\" ? 0.01 : 0;\n relevant.push({\n record: candidate.record,\n retrieval: {\n score: roundScore(Math.min(1, candidate.semanticScore + qualityAdjustment)),\n semanticScore: roundScore(candidate.semanticScore),\n matchType: candidate.matchType,\n vectorScore: candidate.vectorScore === null ? null : roundScore(candidate.vectorScore),\n keywordScore: candidate.keywordScore === null ? null : roundScore(candidate.keywordScore),\n relevanceSignals,\n freshness,\n qualityAdjustment,\n duplicateCount: 0,\n },\n });\n }\n relevant.sort(compareKnowledgeSearchResults);\n\n const deduped: KnowledgeSearchResult[] = [];\n const byContent = new Map<string, number>();\n let asDuplicate = 0;\n for (const result of relevant) {\n const key = knowledgeTextualContentKey(result.record);\n const retainedIndex = byContent.get(key);\n if (retainedIndex === undefined) {\n byContent.set(key, deduped.length);\n deduped.push(result);\n continue;\n }\n asDuplicate += 1;\n const retained = deduped[retainedIndex]!;\n retained.retrieval.duplicateCount += 1;\n }\n\n const forLimit = Math.max(0, deduped.length - requestedLimit);\n const bounded = deduped.slice(0, requestedLimit);\n let forResponseBudget = 0;\n let response = knowledgeSearchResponse({\n results: bounded,\n rankedCandidateCount: input.rankedCandidateCount,\n recheckedCandidateCount: input.candidates.length,\n belowRelevanceFloor,\n asDuplicate,\n forLimit,\n forResponseBudget,\n });\n while (knowledgeResponseBytes(response) > KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES) {\n if (bounded.length === 0) {\n throw new Error(\"knowledge search selection facts exceed the response budget\");\n }\n bounded.pop();\n forResponseBudget += 1;\n response = knowledgeSearchResponse({\n results: bounded,\n rankedCandidateCount: input.rankedCandidateCount,\n recheckedCandidateCount: input.candidates.length,\n belowRelevanceFloor,\n asDuplicate,\n forLimit,\n forResponseBudget,\n });\n }\n return response;\n}\n\nfunction compareKnowledgeSearchResults(\n left: KnowledgeSearchResult,\n right: KnowledgeSearchResult,\n): number {\n return (\n right.retrieval.score - left.retrieval.score ||\n right.retrieval.semanticScore - left.retrieval.semanticScore ||\n (right.retrieval.vectorScore ?? 0) - (left.retrieval.vectorScore ?? 0) ||\n (right.retrieval.keywordScore ?? 0) - (left.retrieval.keywordScore ?? 0) ||\n (left.record.id === right.record.id ? 0 : left.record.id < right.record.id ? -1 : 1)\n );\n}\n\nfunction knowledgeFreshness(value: string, nowMs: number): \"current\" | \"aging\" | \"stale\" {\n const freshnessMs = Date.parse(value);\n if (!Number.isFinite(freshnessMs)) return \"stale\";\n const ageDays = Math.max(0, (nowMs - freshnessMs) / 86_400_000);\n if (ageDays <= 90) return \"current\";\n return ageDays <= 365 ? \"aging\" : \"stale\";\n}\n\nfunction knowledgeTextualContentKey(record: KnowledgeRecord): string {\n return createHash(\"sha256\")\n .update(\"opengeni:knowledge-search-content:v1\\0\")\n .update(record.title)\n .update(\"\\0\")\n .update(\n JSON.stringify({\n body: record.content.body,\n summary: record.content.summary,\n topics: record.content.topics,\n }),\n )\n .digest(\"hex\");\n}\n\nfunction knowledgeSearchResponse(input: {\n results: KnowledgeSearchResult[];\n rankedCandidateCount: number;\n recheckedCandidateCount: number;\n belowRelevanceFloor: number;\n asDuplicate: number;\n forLimit: number;\n forResponseBudget: number;\n}): KnowledgeSearchResponse {\n const selection = {\n relevanceFloor: {\n policy: \"any_signal\" as const,\n vectorScore: KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE as 0.52,\n keywordScore: KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE as 0.01,\n },\n dedupe: { policy: \"exact_textual_content\" as const },\n candidates: {\n ranked: input.rankedCandidateCount,\n rechecked: input.recheckedCandidateCount,\n omittedOnRecheck: Math.max(0, input.rankedCandidateCount - input.recheckedCandidateCount),\n },\n omitted: {\n belowRelevanceFloor: input.belowRelevanceFloor,\n asDuplicate: input.asDuplicate,\n forLimit: input.forLimit,\n forResponseBudget: input.forResponseBudget,\n },\n budget: {\n maxResults: KNOWLEDGE_SEARCH_MAX_RESULTS as 50,\n maxResponseBytes: KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES as 65_536,\n responseBytes: 0,\n tokenEstimateBytesPerToken: KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN as 4,\n estimatedTokens: 0,\n maxEstimatedTokens: Math.ceil(\n KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n ) as 16_384,\n },\n };\n const response: KnowledgeSearchResponse = {\n results: [...input.results],\n selection,\n };\n // The counters themselves contribute a few bytes. Iterate to a fixed point so\n // responseBytes describes the actual serialized response, not an approximation.\n for (let index = 0; index < 8; index += 1) {\n const responseBytes = knowledgeResponseBytes(response);\n const estimatedTokens = Math.ceil(\n responseBytes / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n );\n if (\n response.selection.budget.responseBytes === responseBytes &&\n response.selection.budget.estimatedTokens === estimatedTokens\n ) {\n break;\n }\n response.selection.budget.responseBytes = responseBytes;\n response.selection.budget.estimatedTokens = estimatedTokens;\n }\n return response;\n}\n\nfunction knowledgeResponseBytes(response: KnowledgeSearchResponse): number {\n return Buffer.byteLength(JSON.stringify(response), \"utf8\");\n}\n\ntype KnowledgeBrowseEntry = {\n record: KnowledgeRecord;\n cursorAfter: string;\n};\n\n/**\n * Bound a browse page without skipping records. Tail records omitted for the\n * response budget remain behind the returned cursor. If one complete record is\n * itself too large, return a deterministic discovery projection; knowledge_get\n * remains the freshly authorized full-record path.\n */\nexport function selectKnowledgeBrowseRecords(input: {\n entries: KnowledgeBrowseEntry[];\n hasMoreAfterEntries: boolean;\n}): KnowledgeBrowseResponse {\n const entries = input.entries.slice(0, KNOWLEDGE_BROWSE_MAX_LIMIT);\n const selected = entries.map((entry) => entry.record);\n let omittedForResponseBudget = 0;\n let compactedRecordCount = 0;\n let response = knowledgeBrowseResponse({\n records: selected,\n nextCursor: input.hasMoreAfterEntries ? (entries.at(-1)?.cursorAfter ?? null) : null,\n hasMore: input.hasMoreAfterEntries,\n omittedForResponseBudget,\n compactedRecordCount,\n });\n while (\n selected.length > 1 &&\n knowledgeBrowseResponseBytes(response) > KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES\n ) {\n selected.pop();\n omittedForResponseBudget += 1;\n response = knowledgeBrowseResponse({\n records: selected,\n nextCursor: entries[selected.length - 1]?.cursorAfter ?? null,\n hasMore: true,\n omittedForResponseBudget,\n compactedRecordCount,\n });\n }\n if (\n selected.length === 1 &&\n knowledgeBrowseResponseBytes(response) > KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES\n ) {\n selected[0] = compactKnowledgeBrowseRecord(selected[0]!);\n compactedRecordCount = 1;\n response = knowledgeBrowseResponse({\n records: selected,\n nextCursor:\n omittedForResponseBudget > 0 || input.hasMoreAfterEntries\n ? (entries[0]?.cursorAfter ?? null)\n : null,\n hasMore: omittedForResponseBudget > 0 || input.hasMoreAfterEntries,\n omittedForResponseBudget,\n compactedRecordCount,\n });\n }\n if (knowledgeBrowseResponseBytes(response) > KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES) {\n throw new Error(\"knowledge browse discovery projection exceeds the response budget\");\n }\n return response;\n}\n\nfunction compactKnowledgeBrowseRecord(record: KnowledgeRecord): KnowledgeRecord {\n const fields = new Set<KnowledgeRecord[\"projection\"][\"fields\"][number]>([\n ...record.projection.fields,\n \"content.body\",\n \"content.summary\",\n \"content.topics\",\n \"content.metadata\",\n \"provenance.source.uri\",\n \"provenance.source.externalId\",\n \"provenance.source.title\",\n \"provenance.source.author\",\n \"provenance.source.version\",\n \"provenance.citation\",\n ]);\n return {\n ...record,\n content: {\n format: \"markdown\",\n body: null,\n summary: null,\n topics: [],\n metadata: {},\n },\n provenance: {\n ...record.provenance,\n source: {\n ...record.provenance.source,\n uri: null,\n externalId: null,\n title: null,\n author: null,\n version: null,\n },\n citation: null,\n },\n links: record.links.filter((link) => link.target.kind === \"knowledge\"),\n projection: {\n truncated: true,\n fields: [...fields].sort(),\n },\n };\n}\n\nfunction knowledgeBrowseResponse(input: {\n records: KnowledgeRecord[];\n nextCursor: string | null;\n hasMore: boolean;\n omittedForResponseBudget: number;\n compactedRecordCount: number;\n}): KnowledgeBrowseResponse {\n const response: KnowledgeBrowseResponse = {\n records: [...input.records],\n nextCursor: input.nextCursor,\n hasMore: input.hasMore,\n selection: {\n omitted: { forResponseBudget: input.omittedForResponseBudget },\n compactedRecordCount: input.compactedRecordCount,\n budget: {\n maxResults: KNOWLEDGE_BROWSE_MAX_LIMIT as 50,\n maxResponseBytes: KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES as 65_536,\n responseBytes: 0,\n tokenEstimateBytesPerToken: KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN as 4,\n estimatedTokens: 0,\n maxEstimatedTokens: Math.ceil(\n KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n ) as 16_384,\n },\n },\n };\n for (let index = 0; index < 8; index += 1) {\n const responseBytes = knowledgeBrowseResponseBytes(response);\n const estimatedTokens = Math.ceil(\n responseBytes / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,\n );\n if (\n response.selection.budget.responseBytes === responseBytes &&\n response.selection.budget.estimatedTokens === estimatedTokens\n ) {\n break;\n }\n response.selection.budget.responseBytes = responseBytes;\n response.selection.budget.estimatedTokens = estimatedTokens;\n }\n return response;\n}\n\nfunction knowledgeBrowseResponseBytes(response: KnowledgeBrowseResponse): number {\n return Buffer.byteLength(JSON.stringify(response), \"utf8\");\n}\n\n/** Fetch one stable Knowledge record with a fresh authorization check. */\nexport async function getEffectiveKnowledgeRecord(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n surface?: \"human\" | \"agent\" | undefined;\n id: string;\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n },\n): Promise<KnowledgeRecord | null> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const target = parseKnowledgeRecordId(input.id);\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface ?? \"agent\",\n agentAuthority: input.agentAuthority,\n });\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) => {\n if (target.kind === \"document\") {\n const [row] = await scopedDb\n .select({\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n firstChunkId: schema.documentChunks.id,\n })\n .from(schema.documents)\n .leftJoin(\n schema.documentChunks,\n and(\n eq(schema.documentChunks.accountId, schema.documents.accountId),\n eq(schema.documentChunks.documentId, schema.documents.id),\n eq(schema.documentChunks.chunkIndex, 0),\n ),\n )\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, target.id),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .limit(1);\n return row ? knowledgeDocumentRecord(row.document, row.citation, row.firstChunkId) : null;\n }\n const [row] = await scopedDb\n .select({\n chunk: schema.documentChunks,\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n previousChunkId: knowledgePreviousChunkIdProjection(),\n nextChunkId: knowledgeNextChunkIdProjection(),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documentChunks.accountId, input.accountId),\n eq(schema.documentChunks.id, target.id),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .limit(1);\n return row\n ? knowledgeChunkRecord(row.document, row.chunk, row.citation, {\n previousChunkId: row.previousChunkId,\n nextChunkId: row.nextChunkId,\n })\n : null;\n },\n );\n}\n\n/**\n * Browse top-level authorized documents or the chunks of one authorized\n * document. The cursor is opaque and bound to the caller, workspace, parent,\n * and filters. It can change pagination position but can never widen scope.\n */\nexport async function browseEffectiveKnowledge(\n db: Database,\n input: EffectiveKnowledgeBrowseInput,\n): Promise<KnowledgeBrowseResponse> {\n const initiatingSubjectId = canonicalEffectiveDocumentSubject(input.initiatingSubjectId);\n const limit = input.limit ?? 20;\n if (!Number.isInteger(limit) || limit < 1 || limit > 50) {\n throw new Error(\"knowledge browse limit must be between 1 and 50\");\n }\n const topic = input.topic === undefined ? null : (cleanString(input.topic) ?? null);\n if (input.topic !== undefined && (!topic || topic !== input.topic || topic.length > 256)) {\n throw new Error(\"knowledge browse topic is invalid\");\n }\n const sourceKinds = [...new Set(input.sourceKinds ?? [])].sort();\n const parent = input.parentId ? parseKnowledgeRecordId(input.parentId) : null;\n if (parent?.kind === \"document_chunk\") {\n throw new Error(\"knowledge browse parent must be a document record\");\n }\n if (parent && (topic || sourceKinds.length > 0)) {\n throw new Error(\"knowledge browse document contents do not accept topic/source filters\");\n }\n const cursorScope: KnowledgeBrowseCursorScope = {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n parentId: parent ? `${parent.kind}:${parent.id}` : null,\n topic,\n sourceKinds,\n };\n const topLevelAfter =\n !parent && input.cursor ? decodeKnowledgeBrowseCursor(input.cursor, cursorScope) : 0n;\n const access = await resolveEffectiveDocumentAccess(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n initiatingSubjectId,\n surface: input.surface ?? \"agent\",\n agentAuthority: input.agentAuthority,\n });\n return await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n access,\n async (scopedDb) => {\n if (parent) {\n const [authorizedParent] = await scopedDb\n .select({\n id: schema.documents.id,\n indexSequence: schema.documents.indexSequence,\n })\n .from(schema.documents)\n .where(\n and(\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.id, parent.id),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .limit(1);\n if (!authorizedParent) {\n return selectKnowledgeBrowseRecords({\n entries: [],\n hasMoreAfterEntries: false,\n });\n }\n if (authorizedParent.indexSequence === null) {\n throw new Error(\"ready knowledge document is missing its index revision\");\n }\n const parentCursorScope: KnowledgeBrowseCursorScope = {\n ...cursorScope,\n parentRevision: authorizedParent.indexSequence.toString(),\n };\n const after = input.cursor\n ? decodeKnowledgeBrowseCursor(input.cursor, parentCursorScope)\n : 0n;\n if (after > 2_147_483_648n) {\n throw new Error(\"invalid knowledge browse cursor\");\n }\n const rows = await scopedDb\n .select({\n chunk: schema.documentChunks,\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n previousChunkId: knowledgePreviousChunkIdProjection(),\n nextChunkId: knowledgeNextChunkIdProjection(),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documentChunks.accountId, input.accountId),\n eq(schema.documentChunks.documentId, parent.id),\n gt(schema.documentChunks.chunkIndex, Number(after) - 1),\n eq(schema.documents.status, \"ready\"),\n eq(schema.documents.indexSequence, authorizedParent.indexSequence),\n ...documentAccessConditions(input.workspaceId, access),\n ),\n )\n .orderBy(asc(schema.documentChunks.chunkIndex))\n .limit(limit + 1);\n const hasMore = rows.length > limit;\n const page = rows.slice(0, limit);\n return selectKnowledgeBrowseRecords({\n entries: page.map((row) => ({\n record: knowledgeChunkRecord(row.document, row.chunk, row.citation, {\n previousChunkId: row.previousChunkId,\n nextChunkId: row.nextChunkId,\n }),\n cursorAfter: encodeKnowledgeBrowseCursor(\n parentCursorScope,\n BigInt(row.chunk.chunkIndex + 1),\n ),\n })),\n hasMoreAfterEntries: hasMore,\n });\n }\n\n const conditions: SQL[] = [\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documents.status, \"ready\"),\n isNotNull(schema.documents.indexSequence),\n gt(schema.documents.indexSequence, topLevelAfter),\n ...documentAccessConditions(input.workspaceId, access),\n ];\n if (topic) conditions.push(sql`${schema.documents.topics} ? ${topic}`);\n if (sourceKinds.length > 0)\n conditions.push(inArray(schema.documents.sourceKind, sourceKinds));\n const rows = await scopedDb\n .select({\n document: schema.documents,\n citation: googleDriveCitationProjection(input.workspaceId, access),\n firstChunkId: schema.documentChunks.id,\n })\n .from(schema.documents)\n .leftJoin(\n schema.documentChunks,\n and(\n eq(schema.documentChunks.accountId, schema.documents.accountId),\n eq(schema.documentChunks.documentId, schema.documents.id),\n eq(schema.documentChunks.chunkIndex, 0),\n ),\n )\n .where(and(...conditions))\n .orderBy(asc(schema.documents.indexSequence))\n .limit(limit + 1);\n const hasMore = rows.length > limit;\n const page = rows.slice(0, limit);\n return selectKnowledgeBrowseRecords({\n entries: page.map((row) => {\n if (row.document.indexSequence === null) {\n throw new Error(\"ready knowledge document is missing its index revision\");\n }\n return {\n record: knowledgeDocumentRecord(row.document, row.citation, row.firstChunkId),\n cursorAfter: encodeKnowledgeBrowseCursor(cursorScope, row.document.indexSequence),\n };\n }),\n hasMoreAfterEntries: hasMore,\n });\n },\n );\n}\n\ntype KnowledgeBrowseCursorScope = {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n parentId: string | null;\n parentRevision?: string | null | undefined;\n topic: string | null;\n sourceKinds: readonly string[];\n};\n\nexport function encodeKnowledgeBrowseCursor(\n scope: KnowledgeBrowseCursorScope,\n position: bigint,\n): string {\n if (position < 0n) throw new Error(\"knowledge browse cursor position is invalid\");\n const version = knowledgeBrowseCursorVersion(scope);\n return Buffer.from(\n JSON.stringify({\n v: version,\n s: knowledgeBrowseCursorScope(scope),\n q: position.toString(),\n }),\n \"utf8\",\n ).toString(\"base64url\");\n}\n\nexport function decodeKnowledgeBrowseCursor(\n value: string,\n scope: KnowledgeBrowseCursorScope,\n): bigint {\n try {\n if (!value || value.length > KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS) {\n throw new Error(\"cursor length\");\n }\n const bytes = Buffer.from(value, \"base64url\");\n if (bytes.toString(\"base64url\") !== value) throw new Error(\"cursor encoding\");\n const parsed = JSON.parse(bytes.toString(\"utf8\")) as Record<string, unknown>;\n const expectedVersion = knowledgeBrowseCursorVersion(scope);\n if (\n Object.keys(parsed).sort().join(\",\") !== \"q,s,v\" ||\n parsed.v !== expectedVersion ||\n typeof parsed.s !== \"string\" ||\n typeof parsed.q !== \"string\" ||\n !/^(0|[1-9][0-9]*)$/.test(parsed.q)\n ) {\n throw new Error(\"cursor payload\");\n }\n if (parsed.s !== knowledgeBrowseCursorScope(scope)) {\n throw new Error(\"knowledge browse cursor belongs to a different scope\");\n }\n const position = BigInt(parsed.q);\n if (position > 9_223_372_036_854_775_807n) throw new Error(\"cursor position\");\n return position;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message === \"knowledge browse cursor belongs to a different scope\"\n ) {\n throw error;\n }\n throw new Error(\"invalid knowledge browse cursor\", { cause: error });\n }\n}\n\nfunction knowledgeBrowseCursorScope(scope: KnowledgeBrowseCursorScope): string {\n const version = knowledgeBrowseCursorVersion(scope);\n const hash = createHash(\"sha256\")\n .update(`opengeni:knowledge-browse-cursor:v${version}\\0`)\n .update(scope.accountId)\n .update(\"\\0\")\n .update(scope.workspaceId)\n .update(\"\\0\")\n .update(canonicalEffectiveDocumentSubject(scope.initiatingSubjectId))\n .update(\"\\0\")\n .update(scope.parentId ?? \"\")\n .update(\"\\0\");\n if (version === 2) hash.update(scope.parentRevision!).update(\"\\0\");\n return hash\n .update(scope.topic ?? \"\")\n .update(\"\\0\")\n .update([...scope.sourceKinds].sort().join(\"\\0\"))\n .digest(\"hex\");\n}\n\nfunction knowledgeBrowseCursorVersion(scope: KnowledgeBrowseCursorScope): 1 | 2 {\n if (!scope.parentId) return 1;\n if (!scope.parentRevision || !/^[1-9][0-9]*$/.test(scope.parentRevision)) {\n throw new Error(\"knowledge browse parent cursor requires an exact document revision\");\n }\n return 2;\n}\n\nfunction parseKnowledgeRecordId(value: string): {\n kind: \"document\" | \"document_chunk\";\n id: string;\n} {\n const match =\n /^(document|document_chunk):([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/iu.exec(\n value,\n );\n if (!match) throw new Error(\"invalid knowledge record id\");\n return {\n kind: match[1] as \"document\" | \"document_chunk\",\n id: match[2]!.toLowerCase(),\n };\n}\n\nfunction knowledgeDocumentRecord(\n document: typeof schema.documents.$inferSelect,\n citation: unknown = null,\n firstChunkId: string | null = null,\n): KnowledgeRecord {\n if (!document.indexedAt) throw new Error(`Ready document is missing indexed_at: ${document.id}`);\n const projected = projectKnowledgeRecord({\n title: document.title,\n body: document.summary,\n summary: document.summary,\n topics: document.topics,\n metadata: { parser: document.parser, chunkCount: document.chunkCount },\n source: knowledgeSource(document),\n });\n return {\n id: `document:${document.id}`,\n kind: \"document\",\n title: projected.title,\n content: projected.content,\n authority: { kind: normalizeDocumentAuthorityKind(document.authorityKind) },\n provenance: {\n source: projected.source,\n indexedAt: document.indexedAt.toISOString(),\n citation: parseKnowledgeProviderCitation(citation),\n },\n lifecycle: { state: \"active\", updatedAt: document.updatedAt.toISOString() },\n quality: knowledgeQuality(document),\n links: [\n ...(firstChunkId\n ? [\n {\n relation: \"contents\" as const,\n target: {\n kind: \"knowledge\" as const,\n id: `document_chunk:${firstChunkId}` as const,\n },\n },\n ]\n : []),\n ...knowledgeSourceLinks(projected.source.uri),\n ],\n projection: projected.projection,\n };\n}\n\nfunction knowledgeChunkRecord(\n document: typeof schema.documents.$inferSelect,\n chunk: typeof schema.documentChunks.$inferSelect,\n citation: unknown = null,\n traversal: {\n previousChunkId: string | null;\n nextChunkId: string | null;\n } = { previousChunkId: null, nextChunkId: null },\n): KnowledgeRecord {\n if (!document.indexedAt) throw new Error(`Ready document is missing indexed_at: ${document.id}`);\n const projected = projectKnowledgeRecord({\n title: document.title,\n body: chunk.text,\n summary: document.summary,\n topics: document.topics,\n metadata: { ...chunk.metadata, chunkIndex: chunk.chunkIndex },\n source: knowledgeSource(document),\n });\n return {\n id: `document_chunk:${chunk.id}`,\n kind: \"document_chunk\",\n title: projected.title,\n content: projected.content,\n authority: { kind: normalizeDocumentAuthorityKind(document.authorityKind) },\n provenance: {\n source: projected.source,\n indexedAt: document.indexedAt.toISOString(),\n citation: parseKnowledgeProviderCitation(citation),\n },\n lifecycle: { state: \"active\", updatedAt: document.updatedAt.toISOString() },\n quality: knowledgeQuality(document),\n links: [\n {\n relation: \"parent\",\n target: { kind: \"knowledge\", id: `document:${document.id}` },\n },\n ...(traversal.previousChunkId\n ? [\n {\n relation: \"previous\" as const,\n target: {\n kind: \"knowledge\" as const,\n id: `document_chunk:${traversal.previousChunkId}` as const,\n },\n },\n ]\n : []),\n ...(traversal.nextChunkId\n ? [\n {\n relation: \"next\" as const,\n target: {\n kind: \"knowledge\" as const,\n id: `document_chunk:${traversal.nextChunkId}` as const,\n },\n },\n ]\n : []),\n ...knowledgeSourceLinks(projected.source.uri),\n ],\n projection: projected.projection,\n };\n}\n\nfunction knowledgeSource(document: typeof schema.documents.$inferSelect) {\n return {\n kind: normalizeKnowledgeSourceKind(document.sourceKind),\n uri: document.sourceUri,\n externalId: document.sourceExternalId,\n title: document.sourceTitle,\n author: document.sourceAuthor,\n createdAt: document.sourceCreatedAt?.toISOString() ?? null,\n updatedAt: document.sourceUpdatedAt?.toISOString() ?? null,\n version: document.sourceVersion,\n };\n}\n\nfunction knowledgeQuality(\n document: typeof schema.documents.$inferSelect,\n): KnowledgeRecord[\"quality\"] {\n if (!document.indexedAt) throw new Error(`Ready document is missing indexed_at: ${document.id}`);\n return {\n trust: \"sourced\",\n freshnessAt: (document.sourceUpdatedAt ?? document.indexedAt).toISOString(),\n conflict: \"not_evaluated\",\n correction: \"current_source_version\",\n };\n}\n\nfunction knowledgeSourceLinks(sourceUri: string | null): KnowledgeRecord[\"links\"] {\n return sourceUri ? [{ relation: \"source\", target: { kind: \"external\", uri: sourceUri } }] : [];\n}\n\n/**\n * These structural targets are selected inside the same authorization-scoped\n * transaction as their owning record. Only opaque ids are projected; titles,\n * source fields, and content require a subsequent freshly authorized get.\n */\nfunction knowledgePreviousChunkIdProjection(): SQL<string | null> {\n return sql<string | null>`(\n select knowledge_previous_chunk.id\n from document_chunks knowledge_previous_chunk\n where knowledge_previous_chunk.account_id = ${schema.documentChunks.accountId}\n and knowledge_previous_chunk.document_id = ${schema.documentChunks.documentId}\n and knowledge_previous_chunk.chunk_index < ${schema.documentChunks.chunkIndex}\n order by knowledge_previous_chunk.chunk_index desc\n limit 1\n )`;\n}\n\nfunction knowledgeNextChunkIdProjection(): SQL<string | null> {\n return sql<string | null>`(\n select knowledge_next_chunk.id\n from document_chunks knowledge_next_chunk\n where knowledge_next_chunk.account_id = ${schema.documentChunks.accountId}\n and knowledge_next_chunk.document_id = ${schema.documentChunks.documentId}\n and knowledge_next_chunk.chunk_index > ${schema.documentChunks.chunkIndex}\n order by knowledge_next_chunk.chunk_index asc\n limit 1\n )`;\n}\n\nasync function vectorSearchDocuments(\n db: Database,\n input: DocumentSearchInput,\n limit: number,\n services: Pick<DocumentServices, \"embedder\">,\n): Promise<CombinedSearchRow[]> {\n const queryEmbedding = await services.embedder.embedQuery(input.query);\n validateEmbedding(queryEmbedding, services.embedder.dimensions, services.embedder.model);\n const distance = sql<number>`${schema.documentChunks.embedding} <=> ${vectorLiteral(queryEmbedding)}::vector`;\n const rows = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n input.access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunkId: schema.documentChunks.id,\n workspaceId: schema.documentChunks.workspaceId,\n documentId: schema.documentChunks.documentId,\n baseId: schema.documentChunks.baseId,\n fileId: schema.documentChunks.fileId,\n title: schema.documents.title,\n text: schema.documentChunks.text,\n chunkIndex: schema.documentChunks.chunkIndex,\n metadata: schema.documentChunks.metadata,\n sourceKind: schema.documents.sourceKind,\n sourceUri: schema.documents.sourceUri,\n sourceExternalId: schema.documents.sourceExternalId,\n sourceTitle: schema.documents.sourceTitle,\n sourceAuthor: schema.documents.sourceAuthor,\n sourceCreatedAt: schema.documents.sourceCreatedAt,\n sourceUpdatedAt: schema.documents.sourceUpdatedAt,\n sourceVersion: schema.documents.sourceVersion,\n aclTags: schema.documents.aclTags,\n authorityKind: schema.documents.authorityKind,\n authorityWorkspaceId: schema.documents.authorityWorkspaceId,\n authoritySubjectId: schema.documents.authoritySubjectId,\n citation: googleDriveCitationProjection(input.workspaceId, input.access),\n distance,\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(and(...documentSearchConditions(input, services.embedder.model)))\n .orderBy(distance, asc(schema.documentChunks.id))\n .limit(limit),\n );\n return rows.map((row) => ({\n ...mapSearchRowBase(row),\n vectorScore: 1 / (1 + Number(row.distance)),\n keywordScore: null,\n }));\n}\n\nasync function keywordSearchDocuments(\n db: Database,\n input: DocumentSearchInput,\n limit: number,\n): Promise<CombinedSearchRow[]> {\n const rank = sql<number>`ts_rank_cd(to_tsvector('simple', ${schema.documentChunks.text}), plainto_tsquery('simple', ${input.query}))`;\n const rows = await withDocumentAccountRls(\n db,\n input.accountId,\n input.workspaceId,\n input.access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunkId: schema.documentChunks.id,\n workspaceId: schema.documentChunks.workspaceId,\n documentId: schema.documentChunks.documentId,\n baseId: schema.documentChunks.baseId,\n fileId: schema.documentChunks.fileId,\n title: schema.documents.title,\n text: schema.documentChunks.text,\n chunkIndex: schema.documentChunks.chunkIndex,\n metadata: schema.documentChunks.metadata,\n sourceKind: schema.documents.sourceKind,\n sourceUri: schema.documents.sourceUri,\n sourceExternalId: schema.documents.sourceExternalId,\n sourceTitle: schema.documents.sourceTitle,\n sourceAuthor: schema.documents.sourceAuthor,\n sourceCreatedAt: schema.documents.sourceCreatedAt,\n sourceUpdatedAt: schema.documents.sourceUpdatedAt,\n sourceVersion: schema.documents.sourceVersion,\n aclTags: schema.documents.aclTags,\n authorityKind: schema.documents.authorityKind,\n authorityWorkspaceId: schema.documents.authorityWorkspaceId,\n authoritySubjectId: schema.documents.authoritySubjectId,\n citation: googleDriveCitationProjection(input.workspaceId, input.access),\n rank,\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n ...documentSearchConditions(input),\n sql`to_tsvector('simple', ${schema.documentChunks.text}) @@ plainto_tsquery('simple', ${input.query})`,\n ),\n )\n .orderBy(desc(rank), asc(schema.documentChunks.id))\n .limit(limit),\n );\n return rows.map((row) => ({\n ...mapSearchRowBase(row),\n vectorScore: null,\n keywordScore: normalizeKeywordScore(Number(row.rank)),\n }));\n}\n\nexport async function getDocumentChunk(\n db: Database,\n accountId: string,\n workspaceId: string,\n chunkId: string,\n access?: DocumentAccessFilter,\n): Promise<DocumentSearchResult | null> {\n const [row] = await withDocumentAccountRls(\n db,\n accountId,\n workspaceId,\n access,\n async (scopedDb) =>\n await scopedDb\n .select({\n chunkId: schema.documentChunks.id,\n workspaceId: schema.documentChunks.workspaceId,\n documentId: schema.documentChunks.documentId,\n baseId: schema.documentChunks.baseId,\n fileId: schema.documentChunks.fileId,\n title: schema.documents.title,\n text: schema.documentChunks.text,\n chunkIndex: schema.documentChunks.chunkIndex,\n metadata: schema.documentChunks.metadata,\n sourceKind: schema.documents.sourceKind,\n sourceUri: schema.documents.sourceUri,\n sourceExternalId: schema.documents.sourceExternalId,\n sourceTitle: schema.documents.sourceTitle,\n sourceAuthor: schema.documents.sourceAuthor,\n sourceCreatedAt: schema.documents.sourceCreatedAt,\n sourceUpdatedAt: schema.documents.sourceUpdatedAt,\n sourceVersion: schema.documents.sourceVersion,\n aclTags: schema.documents.aclTags,\n authorityKind: schema.documents.authorityKind,\n authorityWorkspaceId: schema.documents.authorityWorkspaceId,\n authoritySubjectId: schema.documents.authoritySubjectId,\n citation: googleDriveCitationProjection(workspaceId, access),\n })\n .from(schema.documentChunks)\n .innerJoin(schema.documents, eq(schema.documentChunks.documentId, schema.documents.id))\n .where(\n and(\n eq(schema.documents.accountId, accountId),\n eq(schema.documentChunks.accountId, accountId),\n eq(schema.documentChunks.id, chunkId),\n eq(schema.documents.status, \"ready\"),\n ...documentAccessConditions(workspaceId, access),\n ),\n )\n .limit(1),\n );\n if (!row) return null;\n return {\n ...mapSearchRowBase(row),\n score: 1,\n matchType: \"hybrid\",\n vectorScore: null,\n keywordScore: null,\n };\n}\n\ntype SearchRowBase = Omit<\n DocumentSearchResult,\n \"score\" | \"matchType\" | \"vectorScore\" | \"keywordScore\"\n>;\ntype CombinedSearchRow = SearchRowBase & {\n vectorScore: number | null;\n keywordScore: number | null;\n};\n\nexport function resolveDocumentAuthority(input: {\n kind?: DocumentAuthorityKind | undefined;\n legacyVisibility?: DocumentVisibility | undefined;\n workspaceId: string;\n initiatingSubjectId?: string | null | undefined;\n}): DocumentAuthority {\n const legacyKind = input.legacyVisibility === \"private\" ? \"personal\" : \"workspace\";\n const kind = input.kind ?? legacyKind;\n if (\n input.kind &&\n input.legacyVisibility &&\n (input.legacyVisibility === \"private\") !== (input.kind === \"personal\")\n ) {\n throw new Error(\"document authorityKind conflicts with legacy visibility\");\n }\n if (kind === \"organization\") {\n return { kind, workspaceId: null, subjectId: null };\n }\n if (kind === \"workspace\") {\n return { kind, workspaceId: input.workspaceId, subjectId: null };\n }\n const subjectId = cleanString(input.initiatingSubjectId ?? null);\n if (!subjectId) throw new Error(\"personal documents require an initiating subject\");\n if (new TextEncoder().encode(subjectId).byteLength > DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES) {\n throw new Error(\n `personal document initiating subject exceeds ${DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES} UTF-8 bytes`,\n );\n }\n return { kind, workspaceId: input.workspaceId, subjectId };\n}\n\nasync function withDocumentRls<T>(\n db: Database,\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n fn: (db: Database) => Promise<T>,\n): Promise<T> {\n const subjectId = cleanString(access?.viewerSubjectId ?? null);\n return subjectId\n ? await withWorkspaceSubjectRls(db, workspaceId, subjectId, fn)\n : await withWorkspaceRls(db, workspaceId, fn);\n}\n\nasync function withDocumentAccountRls<T>(\n db: Database,\n accountId: string,\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n fn: (db: Database) => Promise<T>,\n): Promise<T> {\n const context = await assertDocumentAccountWorkspace(db, accountId, workspaceId);\n const subjectId = cleanString(access?.viewerSubjectId ?? null);\n return await withRlsContext(db, context, async (scopedDb) => {\n if (subjectId) await setSubjectRlsContext(scopedDb, subjectId);\n return await fn(scopedDb);\n });\n}\n\nasync function assertDocumentAccountWorkspace(\n db: Database,\n accountId: string,\n workspaceId: string,\n) {\n const context = await rlsContextForWorkspace(db, workspaceId);\n if (context.accountId !== accountId) {\n throw new Error(\"document account/workspace authority mismatch\");\n }\n return context;\n}\n\nexport async function resolveEffectiveDocumentAccess(\n _db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n initiatingSubjectId: string;\n surface: \"human\" | \"agent\";\n agentAuthority?: AgentDocumentAuthorityContext | undefined;\n },\n): Promise<DocumentAccessFilter> {\n if (input.surface === \"human\") {\n return { viewerSubjectId: input.initiatingSubjectId };\n }\n return {\n agentOnly: true,\n viewerSubjectId: input.initiatingSubjectId,\n authorizedPersonalAttempt: input.agentAuthority\n ? {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n sessionId: input.agentAuthority.sessionId,\n attemptId: input.agentAuthority.attemptId,\n }\n : undefined,\n };\n}\n\n/**\n * Visibility/agent scoping shared by every document read path. Fail-closed:\n * with no filter supplied, private documents are invisible.\n */\nfunction documentAccessConditions(\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n): SQL[] {\n const organization = eq(schema.documents.authorityKind, \"organization\");\n const workspace = and(\n eq(schema.documents.authorityKind, \"workspace\"),\n eq(schema.documents.authorityWorkspaceId, workspaceId),\n );\n const viewer = cleanString(access?.viewerSubjectId ?? null);\n const personalAttempt = access?.authorizedPersonalAttempt;\n const authorizedPersonal = personalAttempt\n ? sql`${schema.documents.id} IN (\n SELECT resolve_session_attempt_personal_document_reads(\n ${personalAttempt.accountId}::uuid,\n ${personalAttempt.workspaceId}::uuid,\n ${personalAttempt.sessionId}::uuid,\n ${personalAttempt.attemptId}::uuid\n )\n )`\n : sql`false`;\n const personal = viewer\n ? and(\n eq(schema.documents.authorityKind, \"personal\"),\n eq(schema.documents.authoritySubjectId, viewer),\n access?.agentOnly\n ? (or(\n and(\n isNull(schema.documents.authorityId),\n eq(schema.documents.authorityWorkspaceId, workspaceId),\n ),\n and(isNotNull(schema.documents.authorityId), authorizedPersonal),\n ) ?? authorizedPersonal)\n : (or(\n eq(schema.documents.authorityWorkspaceId, workspaceId),\n isNull(schema.documents.authorityWorkspaceId),\n ) ?? eq(schema.documents.authorityWorkspaceId, workspaceId)),\n )\n : undefined;\n const authority = viewer\n ? (or(organization, workspace, personal) ?? organization)\n : (or(organization, workspace) ?? organization);\n const viewerSql = viewer ? sql`${viewer}` : sql`NULL::text`;\n const providerAuthorization = sql`google_drive_file_authorized(\n ${schema.documents.accountId},\n ${workspaceId}::uuid,\n ${viewerSql},\n ${schema.documents.fileId}\n )`;\n if (access?.agentOnly) {\n return [eq(schema.documents.agentAccess, true), authority, providerAuthorization];\n }\n return [authority, providerAuthorization];\n}\n\nfunction documentMatchesAccess(\n document: Pick<\n DocumentAccessRecord,\n | \"id\"\n | \"authorityId\"\n | \"authorityKind\"\n | \"authorityWorkspaceId\"\n | \"authoritySubjectId\"\n | \"agentAccess\"\n >,\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n): boolean {\n if (access?.agentOnly) {\n return (\n document.agentAccess &&\n (document.authorityKind !== \"personal\" || document.authorityId === null) &&\n canViewDocument(document, access.viewerSubjectId, workspaceId)\n );\n }\n return canViewDocument(document, access?.viewerSubjectId, workspaceId);\n}\n\nfunction canonicalDocumentAuthoritySubject(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const subjectId = cleanString(value);\n if (!subjectId || subjectId !== value) return undefined;\n if (new TextEncoder().encode(subjectId).byteLength > DOCUMENT_AUTHORITY_SUBJECT_MAX_BYTES) {\n return undefined;\n }\n return subjectId;\n}\n\n/**\n * Whether a single already-fetched document is readable in this workspace.\n *\n * Keep this compatibility predicate as strict as SQL/RLS: legacy personal\n * authority remains origin-workspace anchored while activated personal\n * authority has a null workspace and follows the exact owner within the org.\n */\nexport function canViewDocument(\n document: Pick<DocumentAccessRecord, \"authorityKind\" | \"authoritySubjectId\"> & {\n authorityWorkspaceId?: string | null | undefined;\n },\n viewerSubjectId: string | null | undefined,\n workspaceId?: string | null | undefined,\n): boolean {\n if (document.authorityKind === \"organization\") {\n return document.authorityWorkspaceId === null && document.authoritySubjectId === null;\n }\n const normalizedWorkspaceId = cleanString(workspaceId ?? null);\n if (!normalizedWorkspaceId) {\n return false;\n }\n if (document.authorityKind === \"workspace\") {\n return (\n document.authorityWorkspaceId === normalizedWorkspaceId &&\n document.authoritySubjectId === null\n );\n }\n if (document.authorityKind === \"personal\") {\n const authoritySubjectId = canonicalDocumentAuthoritySubject(document.authoritySubjectId);\n const viewer = canonicalDocumentAuthoritySubject(viewerSubjectId);\n return (\n !!authoritySubjectId &&\n authoritySubjectId === viewer &&\n (document.authorityWorkspaceId === null ||\n document.authorityWorkspaceId === normalizedWorkspaceId)\n );\n }\n return false;\n}\n\ntype DocumentAccessRecord = {\n id: string;\n authorityId: string | null;\n authorityKind: string;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n agentAccess: boolean;\n};\n\nfunction documentSearchConditions(input: DocumentSearchInput, embeddingModel?: string): SQL[] {\n const conditions: SQL[] = [\n eq(schema.documents.status, \"ready\"),\n eq(schema.documents.accountId, input.accountId),\n eq(schema.documentChunks.accountId, input.accountId),\n ...documentAccessConditions(input.workspaceId, input.access),\n ];\n if (embeddingModel) {\n conditions.push(eq(schema.documentChunks.embeddingModel, embeddingModel));\n }\n if (input.baseIds?.length) {\n conditions.push(inArray(schema.documentChunks.baseId, input.baseIds));\n }\n if (input.sourceKinds?.length) {\n conditions.push(inArray(schema.documents.sourceKind, input.sourceKinds));\n }\n if (input.authorityKinds?.length) {\n conditions.push(inArray(schema.documents.authorityKind, input.authorityKinds));\n }\n const aclTags = cleanStringArray(input.aclTags);\n if (aclTags.length > 0) {\n conditions.push(sql`${schema.documents.aclTags} @> ${JSON.stringify(aclTags)}::jsonb`);\n }\n return conditions;\n}\n\nfunction mapSearchRowBase(row: {\n chunkId: string;\n workspaceId: string;\n documentId: string;\n baseId: string;\n fileId: string;\n title: string;\n text: string;\n chunkIndex: number;\n metadata: Record<string, unknown>;\n sourceKind: string;\n sourceUri: string | null;\n sourceExternalId: string | null;\n sourceTitle: string | null;\n sourceAuthor: string | null;\n sourceCreatedAt: Date | null;\n sourceUpdatedAt: Date | null;\n sourceVersion: string | null;\n aclTags: string[];\n authorityKind: string;\n authorityWorkspaceId: string | null;\n authoritySubjectId: string | null;\n citation?: unknown;\n}): SearchRowBase {\n return {\n chunkId: row.chunkId,\n workspaceId: row.workspaceId,\n documentId: row.documentId,\n baseId: row.baseId,\n fileId: row.fileId,\n title: row.title,\n text: row.text,\n chunkIndex: row.chunkIndex,\n metadata: row.metadata,\n sourceKind: normalizeKnowledgeSourceKind(row.sourceKind),\n sourceUri: row.sourceUri,\n sourceExternalId: row.sourceExternalId,\n sourceTitle: row.sourceTitle,\n sourceAuthor: row.sourceAuthor,\n sourceCreatedAt: row.sourceCreatedAt?.toISOString() ?? null,\n sourceUpdatedAt: row.sourceUpdatedAt?.toISOString() ?? null,\n sourceVersion: row.sourceVersion,\n aclTags: cleanStringArray(row.aclTags),\n authorityKind: normalizeDocumentAuthorityKind(row.authorityKind),\n authorityWorkspaceId: row.authorityWorkspaceId,\n authoritySubjectId: row.authoritySubjectId,\n citation: parseKnowledgeProviderCitation(row.citation),\n };\n}\n\nfunction googleDriveCitationProjection(\n workspaceId: string,\n access: DocumentAccessFilter | undefined,\n): SQL<unknown> {\n const viewer = cleanString(access?.viewerSubjectId ?? null);\n const viewerSql = viewer ? sql`${viewer}` : sql`NULL::text`;\n return sql`google_drive_document_citation(\n ${schema.documents.accountId},\n ${workspaceId}::uuid,\n ${viewerSql},\n ${schema.documents.id},\n ${schema.documents.fileId}\n )`;\n}\n\nfunction parseKnowledgeProviderCitation(value: unknown): KnowledgeProviderCitationValue | null {\n return value === null || value === undefined ? null : KnowledgeProviderCitation.parse(value);\n}\n\nfunction mergeDocumentSearchRows(\n rows: CombinedSearchRow[],\n mode: DocumentSearchMode,\n): DocumentSearchResult[] {\n const byChunk = new Map<string, CombinedSearchRow>();\n for (const row of rows) {\n const existing = byChunk.get(row.chunkId);\n if (!existing) {\n byChunk.set(row.chunkId, row);\n continue;\n }\n byChunk.set(row.chunkId, {\n ...existing,\n vectorScore: Math.max(existing.vectorScore ?? 0, row.vectorScore ?? 0) || null,\n keywordScore: Math.max(existing.keywordScore ?? 0, row.keywordScore ?? 0) || null,\n });\n }\n return [...byChunk.values()]\n .map((row) => {\n const vectorScore = row.vectorScore;\n const keywordScore = row.keywordScore;\n const matchType: DocumentSearchMode =\n vectorScore !== null && keywordScore !== null\n ? \"hybrid\"\n : vectorScore !== null\n ? \"vector\"\n : \"keyword\";\n return {\n ...row,\n score: combinedSearchScore(mode, vectorScore, keywordScore, matchType),\n matchType,\n };\n })\n .sort(\n (left, right) =>\n right.score - left.score ||\n (right.vectorScore ?? 0) - (left.vectorScore ?? 0) ||\n (right.keywordScore ?? 0) - (left.keywordScore ?? 0) ||\n left.chunkIndex - right.chunkIndex ||\n (left.chunkId === right.chunkId ? 0 : left.chunkId < right.chunkId ? -1 : 1),\n );\n}\n\nfunction combinedSearchScore(\n mode: DocumentSearchMode,\n vectorScore: number | null,\n keywordScore: number | null,\n matchType: DocumentSearchMode,\n): number {\n const vector = vectorScore ?? 0;\n const keyword = keywordScore ?? 0;\n if (mode === \"vector\") return roundScore(vector);\n if (mode === \"keyword\") return roundScore(keyword);\n return roundScore(\n Math.min(1, 0.65 * vector + 0.35 * keyword + (matchType === \"hybrid\" ? 0.1 : 0)),\n );\n}\n\nfunction normalizeKeywordScore(rank: number): number {\n if (!Number.isFinite(rank) || rank <= 0) {\n return 0;\n }\n return rank / (rank + 1);\n}\n\nfunction roundScore(value: number): number {\n return Number(value.toFixed(6));\n}\n\nexport async function parseDocumentBytes(\n bytes: Uint8Array,\n file: FileAsset,\n parser: DocumentParser = new LiteParseDocumentParser(),\n): Promise<ParsedDocument> {\n return await parser.parse(bytes, file);\n}\n\nexport function chunkText(\n text: string,\n maxChars = DEFAULT_DOCUMENT_CHUNK_SIZE,\n overlapChars = DEFAULT_DOCUMENT_CHUNK_OVERLAP,\n): string[] {\n if (overlapChars >= maxChars) {\n throw new Error(\"chunk overlap must be smaller than chunk size\");\n }\n const normalized = text\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/[ \\t]+/g, \" \")\n .trim();\n if (!normalized) return [];\n const paragraphs = normalized\n .split(/\\n{2,}/)\n .map((part) => part.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n const chunks: string[] = [];\n let current = \"\";\n for (const paragraph of paragraphs.length > 0 ? paragraphs : [normalized.replace(/\\s+/g, \" \")]) {\n for (const part of splitOversizedText(paragraph, maxChars)) {\n if (!current) {\n current = part;\n } else if (current.length + 1 + part.length <= maxChars) {\n current = `${current} ${part}`;\n } else {\n chunks.push(current);\n current = withOverlap(current, overlapChars, part, maxChars);\n }\n }\n }\n if (current) chunks.push(current);\n return chunks.map((chunk) => chunk.trim()).filter(Boolean);\n}\n\nexport function deterministicEmbedding(\n text: string,\n dimensions = DEFAULT_DOCUMENT_EMBEDDING_DIMENSIONS,\n): number[] {\n const values = new Array(dimensions).fill(0);\n const tokens = text.toLowerCase().match(/[\\p{L}\\p{N}_-]+/gu) ?? [];\n for (const token of tokens) {\n let hash = 2166136261;\n for (const char of token) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n values[Math.abs(hash) % dimensions] += 1;\n }\n const norm = Math.hypot(...values) || 1;\n return values.map((value) => Number((value / norm).toFixed(6)));\n}\n\nasync function requireReadyFile(\n db: Database,\n input: {\n accountId: string;\n workspaceId: string;\n subjectId: string | null;\n fileId: string;\n },\n): Promise<FileAsset> {\n const [file] = await getFilesForSubject(db, {\n accountId: input.accountId,\n workspaceId: input.workspaceId,\n subjectId: input.subjectId,\n fileIds: [input.fileId],\n });\n if (!file) throw new Error(`File not found: ${input.fileId}`);\n if (file.status !== \"ready\") {\n throw new Error(`File ${input.fileId} is ${file.status}`);\n }\n return file;\n}\n\nfunction validateEmbedding(values: number[], dimensions: number, model: string): number[] {\n if (values.length !== dimensions) {\n throw new Error(\n `Embedding model ${model} returned ${values.length} dimensions; expected ${dimensions}`,\n );\n }\n if (values.some((value) => !Number.isFinite(value))) {\n throw new Error(`Embedding model ${model} returned non-finite values`);\n }\n return values;\n}\n\nfunction isTextLike(file: FileAsset): boolean {\n const contentType = file.contentType.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n const filename = file.filename.toLowerCase();\n return (\n contentType.startsWith(\"text/\") ||\n contentType === \"application/json\" ||\n contentType === \"application/xml\" ||\n contentType === \"application/x-yaml\" ||\n contentType === \"application/yaml\" ||\n contentType === \"message/rfc822\" ||\n filename.endsWith(\".txt\") ||\n filename.endsWith(\".log\") ||\n filename.endsWith(\".md\") ||\n filename.endsWith(\".markdown\") ||\n filename.endsWith(\".json\") ||\n filename.endsWith(\".yaml\") ||\n filename.endsWith(\".yml\") ||\n filename.endsWith(\".csv\") ||\n filename.endsWith(\".tsv\") ||\n filename.endsWith(\".xml\") ||\n filename.endsWith(\".html\") ||\n filename.endsWith(\".htm\") ||\n filename.endsWith(\".eml\")\n );\n}\n\nfunction splitOversizedText(text: string, maxChars: number): string[] {\n if (text.length <= maxChars) return [text];\n const out: string[] = [];\n let remaining = text;\n while (remaining.length > maxChars) {\n const window = remaining.slice(0, maxChars + 1);\n const breakAt = Math.max(\n window.lastIndexOf(\". \"),\n window.lastIndexOf(\"? \"),\n window.lastIndexOf(\"! \"),\n window.lastIndexOf(\"; \"),\n window.lastIndexOf(\", \"),\n window.lastIndexOf(\" \"),\n );\n const end = breakAt > Math.floor(maxChars * 0.5) ? breakAt + 1 : maxChars;\n out.push(remaining.slice(0, end).trim());\n remaining = remaining.slice(end).trim();\n }\n if (remaining) out.push(remaining);\n return out;\n}\n\nfunction withOverlap(\n previous: string,\n overlapChars: number,\n next: string,\n maxChars: number,\n): string {\n if (overlapChars <= 0) return next;\n const overlap = previous\n .slice(Math.max(0, previous.length - overlapChars))\n .replace(/^\\S+\\s+/, \"\")\n .trim();\n const candidate = overlap ? `${overlap} ${next}` : next;\n return candidate.length <= maxChars ? candidate : next;\n}\n\nfunction cleanString(value: string | undefined | null): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction cleanStringArray(values: string[] | undefined | null): string[] {\n return [...new Set((values ?? []).map((value) => value.trim()).filter(Boolean))];\n}\n\nfunction parseOptionalDate(value: string | undefined): Date | null {\n const trimmed = cleanString(value);\n if (!trimmed) {\n return null;\n }\n const date = new Date(trimmed);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid source timestamp: ${trimmed}`);\n }\n return date;\n}\n\nfunction normalizeKnowledgeSourceKind(value: string): KnowledgeSourceKind {\n switch (value) {\n case \"manual_upload\":\n case \"meeting_transcript\":\n case \"repository\":\n case \"email\":\n case \"chat\":\n case \"document\":\n case \"web\":\n case \"other\":\n return value;\n default:\n return \"other\";\n }\n}\n\nfunction vectorLiteral(values: number[]): string {\n return `[${values.join(\",\")}]`;\n}\n\nfunction mapDocumentBase(row: typeof schema.documentBases.$inferSelect): DocumentBase {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n name: row.name,\n description: row.description,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n\nfunction mapDocument(row: typeof schema.documents.$inferSelect): Document {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n baseId: row.baseId,\n fileId: row.fileId,\n status: row.status as Document[\"status\"],\n title: row.title,\n parser: row.parser,\n chunkCount: row.chunkCount,\n error: row.error,\n sourceKind: normalizeKnowledgeSourceKind(row.sourceKind),\n sourceUri: row.sourceUri,\n sourceExternalId: row.sourceExternalId,\n sourceTitle: row.sourceTitle,\n sourceAuthor: row.sourceAuthor,\n sourceCreatedAt: row.sourceCreatedAt?.toISOString() ?? null,\n sourceUpdatedAt: row.sourceUpdatedAt?.toISOString() ?? null,\n sourceVersion: row.sourceVersion,\n aclTags: cleanStringArray(row.aclTags),\n authorityKind: normalizeDocumentAuthorityKind(row.authorityKind),\n authorityWorkspaceId: row.authorityWorkspaceId,\n authoritySubjectId: row.authoritySubjectId,\n authorityId: row.authorityId,\n visibility: normalizeDocumentVisibility(row.visibility),\n createdBy: row.createdBy,\n agentAccess: row.agentAccess,\n summary: row.summary,\n topics: cleanStringArray(row.topics),\n curationStatus: normalizeDocumentCurationStatus(row.curationStatus),\n curation: (row.curation as DocumentCuration | null) ?? null,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n };\n}\n\nfunction mapIndexedDocumentSummary(\n row: typeof schema.documents.$inferSelect,\n): IndexedDocumentSummary {\n if (row.indexSequence === null || row.indexedAt === null) {\n throw new Error(`Ready document is missing index completion metadata: ${row.id}`);\n }\n return {\n id: row.id,\n title: row.title,\n parser: row.parser,\n chunkCount: row.chunkCount,\n indexedAt: row.indexedAt.toISOString(),\n summary: row.summary,\n topics: cleanStringArray(row.topics),\n source: {\n kind: normalizeKnowledgeSourceKind(row.sourceKind),\n uri: row.sourceUri,\n externalId: row.sourceExternalId,\n title: row.sourceTitle,\n author: row.sourceAuthor,\n createdAt: row.sourceCreatedAt?.toISOString() ?? null,\n updatedAt: row.sourceUpdatedAt?.toISOString() ?? null,\n version: row.sourceVersion,\n },\n provenance: {\n ingestionWorkspaceId: row.workspaceId,\n baseId: row.baseId,\n fileId: row.fileId,\n authorityKind: normalizeDocumentAuthorityKind(row.authorityKind),\n authorityWorkspaceId: row.authorityWorkspaceId,\n authoritySubjectId: row.authoritySubjectId,\n createdBy: row.createdBy,\n createdAt: row.createdAt.toISOString(),\n },\n };\n}\n\nfunction normalizeDocumentAuthorityKind(value: string): DocumentAuthorityKind {\n switch (value) {\n case \"organization\":\n case \"personal\":\n return value;\n default:\n return \"workspace\";\n }\n}\n\nfunction normalizeDocumentVisibility(value: string): DocumentVisibility {\n return value === \"private\" ? \"private\" : \"workspace\";\n}\n\nfunction normalizeDocumentCurationStatus(value: string): DocumentCurationStatus {\n switch (value) {\n case \"pending\":\n case \"suggested\":\n case \"auto_filed\":\n case \"failed\":\n return value;\n default:\n return \"none\";\n }\n}\n","import {\n KNOWLEDGE_BODY_MAX_BYTES,\n KNOWLEDGE_METADATA_MAX_BYTES,\n KNOWLEDGE_METADATA_MAX_DEPTH,\n KNOWLEDGE_METADATA_MAX_ITEMS,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n KNOWLEDGE_SOURCE_URI_MAX_BYTES,\n KNOWLEDGE_SUMMARY_MAX_BYTES,\n KNOWLEDGE_TITLE_MAX_BYTES,\n KNOWLEDGE_TOPIC_MAX_BYTES,\n KNOWLEDGE_TOPICS_MAX_ITEMS,\n type KnowledgeRecord,\n type KnowledgeSource,\n} from \"@opengeni/contracts\";\n\ntype ProjectionField = KnowledgeRecord[\"projection\"][\"fields\"][number];\n\nexport type KnowledgeProjectionInput = {\n title: string;\n body: string | null;\n summary: string | null;\n topics: unknown;\n metadata: unknown;\n source: KnowledgeSource;\n};\n\nexport type KnowledgeProjectionResult = Pick<\n KnowledgeRecord,\n \"title\" | \"content\" | \"projection\"\n> & {\n source: KnowledgeSource;\n};\n\nconst utf8Bytes = (value: string): number => Buffer.byteLength(value, \"utf8\");\n\nfunction truncateUtf8(value: string, maxBytes: number): { value: string; truncated: boolean } {\n if (utf8Bytes(value) <= maxBytes) return { value, truncated: false };\n let low = 0;\n let high = value.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n const end =\n middle > 0 && middle < value.length && /[\\uD800-\\uDBFF]/u.test(value[middle - 1]!)\n ? middle - 1\n : middle;\n if (utf8Bytes(value.slice(0, end)) <= maxBytes) low = middle;\n else high = middle - 1;\n }\n let end = low;\n if (end > 0 && end < value.length && /[\\uD800-\\uDBFF]/u.test(value[end - 1]!)) end -= 1;\n while (end > 0 && utf8Bytes(value.slice(0, end)) > maxBytes) end -= 1;\n return { value: value.slice(0, end), truncated: true };\n}\n\nfunction projectNullableString(\n value: string | null,\n maxBytes: number,\n field: ProjectionField,\n fields: Set<ProjectionField>,\n): string | null {\n if (value === null) return null;\n const projected = truncateUtf8(value, maxBytes);\n if (projected.truncated) fields.add(field);\n return projected.value;\n}\n\nfunction projectSourceUri(value: string | null, fields: Set<ProjectionField>): string | null {\n if (value === null || value === \"\") return null;\n if (utf8Bytes(value) > KNOWLEDGE_SOURCE_URI_MAX_BYTES) {\n fields.add(\"provenance.source.uri\");\n return null;\n }\n return value;\n}\n\nfunction projectTopics(value: unknown, fields: Set<ProjectionField>): string[] {\n if (!Array.isArray(value)) {\n if (value !== null && value !== undefined) fields.add(\"content.topics\");\n return [];\n }\n const result: string[] = [];\n for (const candidate of value) {\n if (result.length >= KNOWLEDGE_TOPICS_MAX_ITEMS) {\n fields.add(\"content.topics\");\n break;\n }\n if (typeof candidate !== \"string\") {\n fields.add(\"content.topics\");\n continue;\n }\n const projected = truncateUtf8(candidate, KNOWLEDGE_TOPIC_MAX_BYTES);\n if (projected.truncated) fields.add(\"content.topics\");\n result.push(projected.value);\n }\n return result;\n}\n\nfunction projectMetadata(value: unknown): { value: Record<string, unknown>; truncated: boolean } {\n let remainingItems = KNOWLEDGE_METADATA_MAX_ITEMS;\n let truncated = false;\n\n const visit = (candidate: unknown, depth: number): unknown => {\n if (remainingItems <= 0 || depth > KNOWLEDGE_METADATA_MAX_DEPTH) {\n truncated = true;\n return undefined;\n }\n remainingItems -= 1;\n if (\n candidate === null ||\n typeof candidate === \"boolean\" ||\n (typeof candidate === \"number\" && Number.isFinite(candidate))\n ) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const projected = truncateUtf8(candidate, KNOWLEDGE_SOURCE_STRING_MAX_BYTES);\n if (projected.truncated) truncated = true;\n return projected.value;\n }\n if (Array.isArray(candidate)) {\n const result: unknown[] = [];\n for (const item of candidate) {\n const projected = visit(item, depth + 1);\n if (projected === undefined) break;\n result.push(projected);\n }\n return result;\n }\n if (candidate && typeof candidate === \"object\") {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(candidate as Record<string, unknown>).sort()) {\n if (utf8Bytes(key) > KNOWLEDGE_TOPIC_MAX_BYTES) {\n truncated = true;\n continue;\n }\n const projected = visit((candidate as Record<string, unknown>)[key], depth + 1);\n if (projected === undefined) break;\n result[key] = projected;\n }\n return result;\n }\n truncated = true;\n return undefined;\n };\n\n const root = visit(value, 0);\n let result = root && typeof root === \"object\" && !Array.isArray(root) ? root : {};\n if (result !== root) truncated = true;\n const bounded: Record<string, unknown> = {};\n for (const key of Object.keys(result as Record<string, unknown>).sort()) {\n bounded[key] = (result as Record<string, unknown>)[key];\n if (utf8Bytes(JSON.stringify(bounded)) > KNOWLEDGE_METADATA_MAX_BYTES) {\n delete bounded[key];\n truncated = true;\n break;\n }\n }\n result = bounded;\n return { value: result as Record<string, unknown>, truncated };\n}\n\n/** Deterministic, byte-bounded projection at the agent-facing Knowledge envelope. */\nexport function projectKnowledgeRecord(input: KnowledgeProjectionInput): KnowledgeProjectionResult {\n const fields = new Set<ProjectionField>();\n const title = truncateUtf8(input.title, KNOWLEDGE_TITLE_MAX_BYTES);\n if (title.truncated) fields.add(\"title\");\n const metadata = projectMetadata(input.metadata);\n if (metadata.truncated) fields.add(\"content.metadata\");\n const source: KnowledgeSource = {\n ...input.source,\n uri: projectSourceUri(input.source.uri, fields),\n externalId: projectNullableString(\n input.source.externalId,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.externalId\",\n fields,\n ),\n title: projectNullableString(\n input.source.title,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.title\",\n fields,\n ),\n author: projectNullableString(\n input.source.author,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.author\",\n fields,\n ),\n version: projectNullableString(\n input.source.version,\n KNOWLEDGE_SOURCE_STRING_MAX_BYTES,\n \"provenance.source.version\",\n fields,\n ),\n };\n return {\n title: title.value,\n content: {\n format: \"markdown\",\n body: projectNullableString(input.body, KNOWLEDGE_BODY_MAX_BYTES, \"content.body\", fields),\n summary: projectNullableString(\n input.summary,\n KNOWLEDGE_SUMMARY_MAX_BYTES,\n \"content.summary\",\n fields,\n ),\n topics: projectTopics(input.topics, fields),\n metadata: metadata.value,\n },\n source,\n projection: { truncated: fields.size > 0, fields: [...fields].sort() },\n };\n}\n"],"mappings":"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","names":["end","result","updated","row","rows","hasMore","page"]}
|