@happyvertical/smrt-ingestion 0.57.4 → 0.57.6
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/README.md +42 -0
- package/REVIEW.md +16 -0
- package/dist/manifest.json +1 -1
- package/dist/models.js +1 -1
- package/dist/models.js.map +1 -1
- package/dist/server.d.ts +37 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +183 -10
- package/dist/server.js.map +1 -1
- package/dist/smrt-knowledge.json +7 -7
- package/dist/svelte/components/InboxView.svelte +17 -4
- package/dist/svelte/components/InboxView.svelte.d.ts.map +1 -1
- package/package.json +17 -17
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["handler","item","asset","job"],"sources":["../src/review-analysis.ts","../src/review-summary.ts","../src/review-host.ts","../src/sources/common.ts","../src/sources/email.ts","../src/sources/http.ts","../src/sources/watch-folder.ts","../src/server.ts"],"sourcesContent":["import type { IntakeItemDTO } from './dto.js';\nimport type { CompletedAnalysisSnapshot } from './proposal-dto.js';\nimport { GenerationSnapshotStaleError } from './proposal-errors.js';\nimport type { ReviewPage } from './review-dto.js';\nimport type { IngestionService } from './server.js';\n/** Optional generation availability never substitutes for current saved-review authority. */\nexport async function loadReviewAnalysis(\n service: IngestionService,\n item: IntakeItemDTO,\n reviews: ReviewPage,\n cursor?: string,\n): Promise<{ reviews: ReviewPage; analysis?: CompletedAnalysisSnapshot }> {\n if (\n !['completed', 'partial'].includes(item.processingState) ||\n reviews.generationStale\n )\n return { reviews };\n try {\n return { reviews, analysis: await service.getCompletedAnalysis(item.id) };\n } catch (error) {\n if (!(error instanceof GenerationSnapshotStaleError)) throw error;\n // The old page is not a fallback: authority may have changed during snapshot reads.\n return { reviews: await service.listReviews(item.id, { cursor }) };\n }\n}\n","import type { IntakeItemDTO } from './dto.js';\nimport type { InboxState, ReviewPage } from './review-dto.js';\nimport type { IngestionService } from './server.js';\n\n/** Whole-item state requires each page's live handler, parent and target gates. */\nexport async function loadReviewSummary(\n service: IngestionService,\n item: IntakeItemDTO,\n requestedCursor?: string,\n): Promise<{ reviews: ReviewPage; state: InboxState }> {\n let requested: ReviewPage | undefined;\n if (requestedCursor !== undefined)\n requested = await service.listReviews(item.id, { cursor: requestedCursor });\n let cursor: string | undefined;\n let total = 0,\n succeeded = 0,\n deferred = 0,\n failed = 0;\n const cursors = new Set<string>();\n do {\n const page = await service.listReviews(item.id, { cursor });\n if (requestedCursor === undefined && cursor === undefined) requested = page;\n for (const action of page.actions) {\n total++;\n if (action.review.state === 'succeeded') succeeded++;\n if (action.review.state === 'deferred') deferred++;\n if (['failed', 'outcome_unknown'].includes(action.review.state)) failed++;\n }\n cursor = page.nextCursor;\n if (cursor && cursors.has(cursor))\n throw new Error('Repeated review cursor');\n if (cursor) cursors.add(cursor);\n // Other pages are discarded; only scalar state and the requested page survive.\n } while (cursor);\n const current = await service.getItem(item.id);\n if (!requested) throw new Error('Review page unavailable');\n const state: InboxState = total\n ? succeeded === total\n ? 'completed'\n : succeeded\n ? 'partially_completed'\n : deferred\n ? 'deferred'\n : failed\n ? 'failed'\n : 'waiting'\n : ['queued', 'running'].includes(current.processingState)\n ? 'processing'\n : current.processingState === 'needs_attention'\n ? 'failed'\n : 'unresolved';\n return { reviews: requested, state };\n}\n","/** Server-side implementation of the transport-neutral review callback contract. */\nimport type { IntakeEvidenceDTO, IntakeItemDTO } from './dto.js';\nimport type { GenerationAnalysisOutput } from './proposal-dto.js';\nimport { loadReviewAnalysis } from './review-analysis.js';\nimport type {\n Assignment,\n EvidenceView,\n InboxEntry,\n IntakeReviewHost,\n} from './review-dto.js';\nimport { loadReviewSummary } from './review-summary.js';\nimport type { IngestionService } from './server.js';\n\n/** Trusted application adapters, bound to the same authenticated session as service. */\nexport interface IntakeReviewHostOptions {\n /** Authenticate receipt, enforce upload limits, and request the first extraction. */\n upload: IntakeReviewHost['upload'];\n /** Read durable assignment state; assignment never grants ingestion permissions. */\n assignment(itemId: string): Promise<Assignment>;\n /** Authorize manager/assignee and enforce durable CAS plus request-id replay checks. */\n assign: IntakeReviewHost['assign'];\n /** Produce safe text or an authenticated same-origin URL; never storage keys. */\n evidence(\n evidence: IntakeEvidenceDTO,\n ): Promise<Omit<EvidenceView, 'evidence'>>;\n label?(item: IntakeItemDTO): string;\n /** Expose the optional feedback UI only when the service has feedback configured. */\n enableFeedback?: boolean;\n /** Optional wakeup after a durable logical split has queued extraction. */\n onSplit?(itemId: string, revision: number): Promise<void>;\n}\n\n/**\n * Create callbacks for one authenticated service scope. Create a fresh host when\n * the session changes; HTTP authentication and CSRF remain application duties.\n */\nexport function createIntakeReviewHost(\n service: IngestionService,\n options: IntakeReviewHostOptions,\n): IntakeReviewHost {\n const label =\n options.label ?? ((item: IntakeItemDTO) => `Intake ${item.id.slice(0, 8)}`);\n const entry = async (item: IntakeItemDTO): Promise<InboxEntry> => {\n const { state } = await loadReviewSummary(service, item);\n const assignment = await options.assignment(item.id);\n await service.getItem(item.id);\n return { item, label: label(item), state, assignment };\n };\n return {\n async list(input) {\n const items = (await service.listItems())\n .sort((a, b) => a.id.localeCompare(b.id))\n .filter((item) => !input.cursor || item.id > input.cursor)\n .slice(0, 21);\n const projected: InboxEntry[] = [];\n for (const item of items.slice(0, 20)) {\n const current = await entry(item);\n if (\n (!input.state || current.state === input.state) &&\n (!input.assigneeId ||\n current.assignment.assigneeId === input.assigneeId)\n )\n projected.push(current);\n }\n return {\n items: projected,\n ...(items.length > 20 ? { nextCursor: items[19].id } : {}),\n };\n },\n async load(itemId, cursor) {\n const item = await service.getItem(itemId);\n const summary = await loadReviewSummary(service, item, cursor);\n const { analysis, reviews } = await loadReviewAnalysis(\n service,\n item,\n summary.reviews,\n cursor,\n );\n const evidence: EvidenceView[] = [];\n for (const part of await service.getEvidence(itemId)) {\n evidence.push({ ...(await options.evidence(part)), evidence: part });\n }\n const assignment = await options.assignment(itemId);\n await service.getItem(itemId);\n return {\n entry: { item, label: label(item), state: summary.state, assignment },\n evidence,\n analysis,\n reviews,\n availability: 'available',\n ...(analysis?.configuration.stage === 'interpret'\n ? {\n generation: (\n analysis.result.output as unknown as GenerationAnalysisOutput\n ).proposals,\n }\n : {}),\n };\n },\n upload: (files, requestId) => options.upload(files, requestId),\n async preview(input) {\n if (\n !Number.isSafeInteger(input.index) ||\n input.index < 0 ||\n typeof input.attemptId !== 'string' ||\n !input.attemptId ||\n typeof input.requestId !== 'string' ||\n !input.requestId.trim()\n )\n throw new Error('Invalid preview');\n const analysis = await service.getCompletedAnalysis(\n input.itemId,\n input.attemptId,\n );\n const generation = (\n analysis.result.output as unknown as GenerationAnalysisOutput\n ).proposals;\n if (\n analysis.configuration.stage !== 'interpret' ||\n generation?.suggestions[input.index]?.disposition !== 'ready_for_review'\n )\n throw new Error('Preview unavailable');\n const suggestion = generation.suggestions[input.index];\n const handler = generation.offered.find(\n ({ handler }) =>\n handler.id === suggestion.handlerId &&\n handler.version === suggestion.handlerVersion,\n )?.handler;\n if (!handler) throw new Error('Preview unavailable');\n const intentionKey = `ui:${input.index}`;\n const actionId =\n handler.kind === 'plan'\n ? undefined\n : await service.createAction(input.itemId, intentionKey, {\n origin: 'generated-proposal',\n intentionKey,\n });\n let cursor: string | undefined;\n let expectedRevision = 0;\n const cursors = new Set<string>();\n do {\n const page = await service.listReviews(input.itemId, { cursor });\n const found = page.actions.find((action) =>\n handler.kind === 'plan'\n ? (action.plan?.key ?? action.stalePlan?.key) === intentionKey\n : action.review.actionId === actionId,\n );\n if (found) {\n const binding = handler.kind === 'plan' ? found.plan : found;\n expectedRevision =\n handler.kind === 'plan'\n ? (found.plan?.revision ?? found.stalePlan?.revision ?? 0)\n : found.review.revision;\n // Preparing an unchanged, currently authorized suggestion is idempotent.\n // State-only stale entries never satisfy this shortcut.\n if (\n binding?.attemptId === input.attemptId &&\n binding.handlerId === suggestion.handlerId &&\n binding.handlerVersion === suggestion.handlerVersion &&\n binding.args\n ) {\n const { intakeBindingDigest } = await import('./execution.js');\n if (\n intakeBindingDigest(binding.args) ===\n intakeBindingDigest(suggestion.args)\n )\n return;\n }\n break;\n }\n cursor = page.nextCursor;\n if (cursor && cursors.has(cursor))\n throw new Error('Repeated review cursor');\n if (cursor) cursors.add(cursor);\n } while (cursor);\n await service.previewGeneratedProposals({\n itemId: input.itemId,\n attemptId: input.attemptId,\n selections: [\n {\n index: input.index,\n intentionKey,\n expectedRevision,\n requestId: input.requestId,\n },\n ],\n });\n },\n async decide(input) {\n await service.submitDecision(input);\n },\n apply: (actionId) => service.applyAction(actionId),\n async editPlan(input) {\n await service.previewPlan(input);\n },\n async editAction(input) {\n await service.previewProposal(input);\n },\n candidates: (input) => service.findCandidates(input),\n async assign(input) {\n await service.getItem(input.itemId);\n await options.assign(input);\n },\n async split(input) {\n const result = await service.reviseLogicalSplit(input);\n await options.onSplit?.(input.itemId, result.revision);\n },\n ...(options.enableFeedback\n ? {\n feedback: (\n input: Parameters<NonNullable<IntakeReviewHost['feedback']>>[0],\n ) => service.recordFeedback(input),\n }\n : {}),\n };\n}\n","import type { ReceiptResult } from '../dto.js';\nimport type { IngestionService, IntakePart, ReceiveInput } from '../server.js';\n\n/** Host configuration, reconstructed from authenticated session/account state. */\nexport interface SourceBinding {\n enabled: boolean;\n service: Pick<IngestionService, 'receive'>;\n sourceId: string;\n sourceVersion: string;\n capturedCeiling: ReceiveInput['capturedCeiling'];\n retention: ReceiveInput['retention'];\n limits: ReceiveInput['limits'];\n allowedMediaTypes: readonly string[];\n}\nexport type SourceResult =\n | ReceiptResult\n | {\n kind: 'rejected';\n category: 'authentication' | 'unsupported_type' | 'unavailable_bytes';\n };\nexport class SourceInputError extends Error {\n constructor(\n public readonly category:\n | 'invalid'\n | 'limit'\n | 'unsupported_type'\n | 'unavailable_bytes',\n ) {\n super(category);\n }\n}\nexport function record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new SourceInputError('invalid');\n return value as Record<string, unknown>;\n}\nexport function keys(value: Record<string, unknown>, allowed: string[]): void {\n if (Object.keys(value).some((key) => !allowed.includes(key)))\n throw new SourceInputError('invalid');\n}\nexport function text(value: unknown): string {\n if (typeof value !== 'string' || !value || value.length > 1024)\n throw new SourceInputError('invalid');\n return value;\n}\nexport function timestamp(value: unknown): Date {\n const date = new Date(text(value));\n if (!Number.isFinite(date.getTime())) throw new SourceInputError('invalid');\n return date;\n}\n/** Bound bytes before parsing or handing them to the receipt service. */\nexport async function boundedBytes(\n stream: ReadableStream<Uint8Array> | null,\n limit: number,\n): Promise<Uint8Array> {\n if (!Number.isSafeInteger(limit) || limit < 1)\n throw new SourceInputError('limit');\n if (!stream) return new Uint8Array();\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > limit) {\n await reader.cancel();\n throw new SourceInputError('limit');\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks);\n}\n/** Intake validates signatures; decoding/format correctness belongs to extraction. */\nexport function validateMedia(\n bytes: Uint8Array,\n type: string,\n allowed: readonly string[],\n): void {\n if (!allowed.includes(type)) throw new SourceInputError('unsupported_type');\n const b = Buffer.from(bytes);\n const ascii = (start: number, end: number) =>\n b.subarray(start, end).toString('ascii');\n const valid: Record<string, boolean> = {\n 'application/pdf': ascii(0, 5) === '%PDF-',\n 'image/tiff':\n b.subarray(0, 4).equals(Buffer.from([73, 73, 42, 0])) ||\n b.subarray(0, 4).equals(Buffer.from([77, 77, 0, 42])),\n 'image/jpeg': b[0] === 255 && b[1] === 216 && b[2] === 255,\n 'image/png': b\n .subarray(0, 8)\n .equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])),\n 'image/webp': ascii(0, 4) === 'RIFF' && ascii(8, 12) === 'WEBP',\n 'audio/wav': ascii(0, 4) === 'RIFF' && ascii(8, 12) === 'WAVE',\n 'audio/ogg': ascii(0, 4) === 'OggS',\n 'audio/webm': b.subarray(0, 4).equals(Buffer.from([26, 69, 223, 163])),\n 'audio/mpeg':\n ascii(0, 3) === 'ID3' || (b[0] === 255 && (b[1] & 224) === 224),\n 'audio/mp4': ascii(4, 8) === 'ftyp',\n 'text/plain': true,\n 'text/html': true,\n 'application/json': true,\n };\n if (!Object.hasOwn(valid, type) || !valid[type])\n throw new SourceInputError('unsupported_type');\n if (type.startsWith('text/') || type === 'application/json') {\n try {\n const s = new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n if (type === 'application/json') JSON.parse(s);\n } catch {\n throw new SourceInputError('invalid');\n }\n }\n}\nexport async function deliver(\n binding: SourceBinding,\n deliveryKey: string,\n deliveredAt: Date,\n parts: IntakePart[],\n): Promise<SourceResult> {\n if (!binding.enabled) return { kind: 'rejected', category: 'authentication' };\n try {\n text(deliveryKey);\n if (!Number.isFinite(deliveredAt.getTime()))\n throw new SourceInputError('invalid');\n if (\n parts.length > binding.limits.maxParts ||\n parts.reduce((n, p) => n + p.bytes.byteLength, 0) >\n binding.limits.maxBytes\n )\n throw new SourceInputError('limit');\n for (const part of parts)\n validateMedia(part.bytes, part.mediaType, binding.allowedMediaTypes);\n return await binding.service.receive({\n sourceId: binding.sourceId,\n sourceVersion: binding.sourceVersion,\n capturedCeiling: binding.capturedCeiling,\n retention: binding.retention,\n limits: binding.limits,\n deliveryKey,\n deliveredAt,\n parts,\n });\n } catch (error) {\n return safeFailure(error);\n }\n}\nexport function safeFailure(error: unknown): SourceResult {\n return error instanceof SourceInputError\n ? { kind: 'rejected', category: error.category }\n : { kind: 'retry', category: 'unavailable' };\n}\n","import type { IntakePart } from '../server.js';\nimport {\n deliver,\n type SourceBinding,\n SourceInputError,\n type SourceResult,\n safeFailure,\n text,\n} from './common.js';\n\n/** Structural messages-owner seam; EmailAccount.readIntakeMessage implements this contract. */\nexport interface EmailIntakeSnapshot {\n accountId: string;\n messageId: string;\n threadId: string;\n inReplyTo: string;\n subject: string;\n text: string;\n html: string;\n date: string;\n attachments: Array<{\n partId: string;\n filename: string;\n mediaType: string;\n bytes: Uint8Array;\n }>;\n}\nexport interface EmailDelivery {\n /** Provider/account-unique locator (e.g. folder + UIDVALIDITY + UID), not sender Message-ID alone. */\n locator: string;\n /** Explicit immutable source revision, never an automatically substituted content hash. */\n revision: string;\n checkpoint: string;\n}\nexport interface EmailSourceOptions {\n binding: SourceBinding;\n accountId: string;\n readMessage(delivery: EmailDelivery): Promise<EmailIntakeSnapshot>;\n /** Durable host checkpoint; called in input order only after accepted/duplicate. */\n acknowledge(checkpoint: string): Promise<void>;\n}\n/** Opt-in intake: hosts enumerate configured accounts and supply resumable provider locators. */\nexport class EmailSourceAdapter {\n constructor(private readonly options: EmailSourceOptions) {}\n async receive(delivery: EmailDelivery): Promise<SourceResult> {\n const { binding } = this.options;\n if (!binding.enabled)\n return { kind: 'rejected', category: 'authentication' };\n try {\n text(delivery.locator);\n text(delivery.revision);\n text(delivery.checkpoint);\n const snapshot = await this.options.readMessage(delivery);\n if (snapshot.accountId !== this.options.accountId)\n return { kind: 'rejected', category: 'authentication' };\n const { attachments } = snapshot;\n // Transport objects may carry additional provider fields. Preserve only the contract.\n const body = {\n accountId: snapshot.accountId,\n messageId: snapshot.messageId,\n threadId: snapshot.threadId,\n inReplyTo: snapshot.inReplyTo,\n subject: snapshot.subject,\n text: snapshot.text,\n html: snapshot.html,\n date: snapshot.date,\n };\n if (Object.values(body).some((value) => typeof value !== 'string')) {\n throw new SourceInputError('invalid');\n }\n const parts: IntakePart[] = [\n {\n partId: 'message',\n mediaType: 'application/json',\n bytes: Buffer.from(JSON.stringify(body)),\n sourceReference: {\n owner: 'message',\n id: delivery.locator,\n version: delivery.revision,\n },\n },\n ];\n for (const attachment of attachments) {\n if (!(attachment.bytes instanceof Uint8Array))\n throw new SourceInputError('unavailable_bytes');\n parts.push({\n partId: `attachment:${text(attachment.partId)}`,\n parentPartId: 'message',\n mediaType: attachment.mediaType,\n bytes: attachment.bytes,\n sourceReference: {\n owner: 'message-attachment',\n id: `${delivery.locator}:${attachment.partId}`,\n version: delivery.revision,\n },\n });\n }\n // Filename and part mapping are retained alongside message/thread identity.\n parts[0].bytes = Buffer.from(\n JSON.stringify({\n ...body,\n attachments: attachments.map(({ partId, filename, mediaType }) => ({\n partId,\n filename,\n mediaType,\n })),\n }),\n );\n const result = await deliver(\n binding,\n JSON.stringify([\n this.options.accountId,\n delivery.locator,\n delivery.revision,\n ]),\n new Date(snapshot.date),\n parts,\n );\n if (result.kind === 'accepted' || result.kind === 'duplicate')\n await this.options.acknowledge(delivery.checkpoint);\n return result;\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === 'EmailIntakeSnapshotError' &&\n 'category' in error\n ) {\n const category = error.category;\n if (\n category === 'invalid' ||\n category === 'limit' ||\n category === 'unavailable_bytes'\n ) {\n return { kind: 'rejected', category };\n }\n }\n return safeFailure(error);\n }\n }\n async receiveBatch(\n deliveries: readonly EmailDelivery[],\n ): Promise<SourceResult[]> {\n const results: SourceResult[] = [];\n for (const delivery of deliveries) {\n const result = await this.receive(delivery);\n results.push(result);\n if (result.kind !== 'accepted' && result.kind !== 'duplicate') break;\n }\n return results;\n }\n}\n","import type { IntakePart } from '../server.js';\nimport {\n boundedBytes,\n deliver,\n keys,\n record,\n type SourceBinding,\n SourceInputError,\n type SourceResult,\n safeFailure,\n text,\n timestamp,\n} from './common.js';\n\nexport interface AuthenticatedSource extends SourceBinding {\n /** Explicit wire limit includes multipart framing and capture metadata. */\n maxRequestBytes: number;\n /** Host proves ownership/current access and copies immutable owner bytes. */\n snapshotReference?(reference: {\n owner: 'asset' | 'message';\n id: string;\n version: string;\n }): Promise<IntakePart[]>;\n}\nexport interface SourceHttpOptions {\n /** Authenticate and select enabled source from server configuration, never body fields. */\n authenticate(request: Request): Promise<AuthenticatedSource | null>;\n}\nfunction response(result: SourceResult): Response {\n return Response.json(result, {\n status:\n result.kind === 'accepted' || result.kind === 'duplicate'\n ? 200\n : result.kind === 'retry'\n ? 503\n : 'category' in result && result.category === 'authentication'\n ? 401\n : 'category' in result && result.category === 'limit'\n ? 413\n : 400,\n });\n}\n/** Reference Web Request handler; mobile clients reuse their durable UUID Idempotency-Key. */\nexport function createSourceDeliveryHandler(\n options: SourceHttpOptions,\n): (request: Request) => Promise<Response> {\n return async (request) => {\n try {\n const binding = await options.authenticate(request);\n if (!binding?.enabled)\n return response({ kind: 'rejected', category: 'authentication' });\n if (request.method !== 'POST') throw new SourceInputError('invalid');\n const key = text(request.headers.get('idempotency-key'));\n const length = request.headers.get('content-length');\n if (\n length &&\n (!/^\\d+$/.test(length) || Number(length) > binding.maxRequestBytes)\n )\n throw new SourceInputError('limit');\n const bytes = await boundedBytes(request.body, binding.maxRequestBytes);\n const type = request.headers.get('content-type') || '';\n let deliveredAt: Date;\n const parts: IntakePart[] = [];\n if (type.split(';')[0] === 'application/json') {\n let payload: Record<string, unknown>;\n try {\n payload = record(\n JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes)),\n );\n } catch {\n throw new SourceInputError('invalid');\n }\n keys(payload, ['capturedAt', 'text', 'structured', 'reference']);\n deliveredAt = timestamp(payload.capturedAt);\n if (\n ['text', 'structured', 'reference'].filter(\n (field) => payload[field] !== undefined,\n ).length !== 1\n )\n throw new SourceInputError('invalid');\n if (payload.text !== undefined) {\n if (typeof payload.text !== 'string')\n throw new SourceInputError('invalid');\n parts.push({\n partId: 'body',\n mediaType: 'text/plain',\n bytes: Buffer.from(payload.text),\n });\n } else if (payload.structured !== undefined) {\n parts.push({\n partId: 'body',\n mediaType: 'application/json',\n bytes: Buffer.from(JSON.stringify(record(payload.structured))),\n });\n } else {\n const ref = record(payload.reference);\n keys(ref, ['owner', 'id', 'version']);\n if (\n (ref.owner !== 'asset' && ref.owner !== 'message') ||\n !binding.snapshotReference\n )\n throw new SourceInputError('invalid');\n const reference = {\n owner: ref.owner,\n id: text(ref.id),\n version: text(ref.version),\n } as const;\n const snapshots = await binding.snapshotReference(reference);\n if (!snapshots.length)\n throw new SourceInputError('unavailable_bytes');\n for (const part of snapshots)\n parts.push({\n ...part,\n sourceReference: part.sourceReference ?? reference,\n });\n }\n } else if (type.startsWith('multipart/form-data;')) {\n let form: FormData;\n try {\n form = await new Response(Buffer.from(bytes), {\n headers: { 'content-type': type },\n }).formData();\n } catch {\n throw new SourceInputError('invalid');\n }\n const fields: Record<string, string> = {};\n for (const [name, value] of form.entries()) {\n if (typeof value === 'string') {\n if (\n !['captureId', 'capturedAt', 'captureSource', 'sha256'].includes(\n name,\n ) ||\n fields[name] !== undefined\n )\n throw new SourceInputError('invalid');\n fields[name] = value;\n } else {\n if (name !== 'file' || parts.length)\n throw new SourceInputError('invalid');\n parts.push({\n partId: 'file',\n parentPartId: 'capture',\n mediaType: value.type,\n bytes: await boundedBytes(\n value.stream(),\n binding.limits.maxBytes,\n ),\n });\n }\n }\n if (\n parts.length !== 1 ||\n text(fields.captureId) !== key ||\n !['camera', 'native_picker', 'audio', 'document'].includes(\n fields.captureSource,\n )\n )\n throw new SourceInputError('invalid');\n deliveredAt = timestamp(fields.capturedAt);\n if (fields.sha256) {\n if (!/^[a-f0-9]{64}$/.test(fields.sha256))\n throw new SourceInputError('invalid');\n parts[0].expectedHash = fields.sha256;\n }\n parts.unshift({\n partId: 'capture',\n mediaType: 'application/json',\n bytes: Buffer.from(\n JSON.stringify({\n captureId: fields.captureId,\n capturedAt: fields.capturedAt,\n captureSource: fields.captureSource,\n ...(fields.sha256 === undefined ? {} : { sha256: fields.sha256 }),\n }),\n ),\n });\n } else throw new SourceInputError('unsupported_type');\n return response(await deliver(binding, key, deliveredAt, parts));\n } catch (error) {\n return response(\n error instanceof SyntaxError\n ? { kind: 'rejected', category: 'invalid' }\n : safeFailure(error),\n );\n }\n };\n}\n\nexport interface VerifiedVendorDelivery {\n binding: SourceBinding;\n deliveryKey: string;\n deliveredAt: Date;\n parts: IntakePart[];\n}\n/** Vendor implementation owns signature/timestamp verification and replay identity. */\nexport function createVendorWebhookHandler(options: {\n maxRequestBytes: number;\n verify(\n request: Request,\n originalBytes: Uint8Array,\n ): Promise<VerifiedVendorDelivery | null>;\n}): (request: Request) => Promise<Response> {\n return async (request) => {\n try {\n if (request.method !== 'POST') throw new SourceInputError('invalid');\n const bytes = await boundedBytes(request.body, options.maxRequestBytes);\n const verified = await options.verify(request, bytes);\n if (!verified)\n return response({ kind: 'rejected', category: 'authentication' });\n return response(\n await deliver(\n verified.binding,\n verified.deliveryKey,\n verified.deliveredAt,\n verified.parts,\n ),\n );\n } catch (error) {\n return response(safeFailure(error));\n }\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { constants } from 'node:fs';\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n readFile,\n rename,\n writeFile,\n} from 'node:fs/promises';\nimport { join } from 'node:path';\nimport {\n deliver,\n type SourceBinding,\n SourceInputError,\n type SourceResult,\n safeFailure,\n} from './common.js';\n\nexport interface WatchFolderOptions {\n binding: SourceBinding;\n /** Private producer directory; claims and processed live on the same filesystem. */\n directory: string;\n stabilityMs: number;\n now?: () => number;\n /** Observability/crash injection. Never receives file content or credentials. */\n checkpoint?(boundary: 'claimed' | 'received', claimId: string): Promise<void>;\n}\nexport interface WatchFolderResult {\n claimId?: string;\n filename: string;\n result: SourceResult;\n}\ninterface Claim {\n id: string;\n filename: string;\n capturedAt: string;\n sourceId: string;\n sourceVersion: string;\n}\ninterface Observation {\n fingerprint: string;\n since: number;\n}\n/** Files remain in claims until the durable receipt succeeds. A restart safely replays them. */\nexport class WatchFolderSourceAdapter {\n private readonly observations = new Map<string, Observation>();\n private polling = false;\n constructor(private readonly options: WatchFolderOptions) {\n if (!Number.isSafeInteger(options.stabilityMs) || options.stabilityMs < 1)\n throw new Error('Positive stability interval required');\n }\n private async stable(path: string): Promise<boolean> {\n const stat = await lstat(path);\n if (!stat.isFile() || stat.isSymbolicLink())\n throw new SourceInputError('invalid');\n const fingerprint = [\n stat.dev,\n stat.ino,\n stat.size,\n stat.mtimeMs,\n stat.ctimeMs,\n ].join(':');\n const now = (this.options.now ?? Date.now)();\n const prior = this.observations.get(path);\n if (!prior || prior.fingerprint !== fingerprint) {\n this.observations.set(path, { fingerprint, since: now });\n return false;\n }\n return now - prior.since >= this.options.stabilityMs;\n }\n private async syncDirectory(path: string): Promise<void> {\n const directory = await open(path, constants.O_RDONLY);\n try {\n await directory.sync();\n } finally {\n await directory.close();\n }\n }\n private async importClaim(\n directory: string,\n claim: Claim,\n ): Promise<WatchFolderResult | null> {\n const path = join(directory, 'original');\n try {\n if (!(await this.stable(path))) return null;\n const handle = await open(\n path,\n constants.O_RDONLY | constants.O_NOFOLLOW,\n );\n let bytes: Buffer;\n try {\n const before = await handle.stat();\n if (before.size > this.options.binding.limits.maxBytes)\n throw new SourceInputError('limit');\n bytes = Buffer.alloc(before.size);\n let offset = 0;\n while (offset < bytes.length) {\n const { bytesRead } = await handle.read(\n bytes,\n offset,\n bytes.length - offset,\n offset,\n );\n if (!bytesRead) throw new SourceInputError('invalid');\n offset += bytesRead;\n }\n const after = await handle.stat();\n if (\n before.size !== after.size ||\n before.mtimeMs !== after.mtimeMs ||\n before.ctimeMs !== after.ctimeMs\n )\n throw new SourceInputError('invalid');\n } finally {\n await handle.close();\n }\n const mediaType = /\\.pdf$/i.test(claim.filename)\n ? 'application/pdf'\n : 'image/tiff';\n const result = await deliver(\n this.options.binding,\n claim.id,\n new Date(claim.capturedAt),\n [\n {\n partId: 'original',\n mediaType,\n bytes,\n sourceReference: {\n owner: 'watch-folder',\n id: claim.filename,\n version: claim.id,\n },\n },\n ],\n );\n if (result.kind === 'accepted' || result.kind === 'duplicate') {\n await this.options.checkpoint?.('received', claim.id);\n await rename(\n directory,\n join(this.options.directory, '.ingestion-processed', claim.id),\n );\n await this.syncDirectory(\n join(this.options.directory, '.ingestion-processed'),\n );\n await this.syncDirectory(\n join(this.options.directory, '.ingestion-claims'),\n );\n this.observations.delete(path);\n } else\n await writeFile(\n join(directory, 'failure.json'),\n JSON.stringify(result),\n { mode: 0o600 },\n );\n return { claimId: claim.id, filename: claim.filename, result };\n } catch (error) {\n const result = safeFailure(error);\n // Error categories only; no raw transport paths, secrets or exception text.\n await writeFile(join(directory, 'failure.json'), JSON.stringify(result), {\n mode: 0o600,\n }).catch(() => {});\n return { claimId: claim.id, filename: claim.filename, result };\n }\n }\n async poll(): Promise<WatchFolderResult[]> {\n if (!this.options.binding.enabled || this.polling) return [];\n this.polling = true;\n const results: WatchFolderResult[] = [];\n try {\n const root = this.options.directory;\n const claims = join(root, '.ingestion-claims');\n const processed = join(root, '.ingestion-processed');\n // Only an explicitly configured, existing directory is touched.\n const rootStat = await lstat(root);\n if (!rootStat.isDirectory() || rootStat.isSymbolicLink())\n throw new SourceInputError('invalid');\n await mkdir(claims, { recursive: true, mode: 0o700 });\n await mkdir(processed, { recursive: true, mode: 0o700 });\n for (const privatePath of [claims, processed])\n if ((await lstat(privatePath)).isSymbolicLink())\n throw new SourceInputError('invalid');\n for (const entry of await readdir(claims, { withFileTypes: true })) {\n if (!entry.isDirectory() || !/^[a-f0-9-]{36}$/.test(entry.name))\n continue;\n const directory = join(claims, entry.name);\n try {\n const claim = JSON.parse(\n await readFile(join(directory, 'claim.json'), 'utf8'),\n ) as Claim;\n if (\n claim.id !== entry.name ||\n claim.sourceId !== this.options.binding.sourceId ||\n claim.sourceVersion !== this.options.binding.sourceVersion\n )\n throw new SourceInputError('invalid');\n // A crash before rename leaves an intent without original; producer file remains untouched.\n try {\n await lstat(join(directory, 'original'));\n } catch {\n continue;\n }\n const result = await this.importClaim(directory, claim);\n if (result) results.push(result);\n } catch (error) {\n results.push({\n claimId: entry.name,\n filename: '',\n result: safeFailure(error),\n });\n }\n }\n for (const entry of await readdir(root, { withFileTypes: true })) {\n if (!/\\.(pdf|tiff?)$/i.test(entry.name)) continue;\n const path = join(root, entry.name);\n try {\n if (!(await this.stable(path))) continue;\n const stat = await lstat(path);\n const claim: Claim = {\n id: randomUUID(),\n filename: entry.name,\n capturedAt: new Date(stat.mtimeMs).toISOString(),\n sourceId: this.options.binding.sourceId,\n sourceVersion: this.options.binding.sourceVersion,\n };\n const directory = join(claims, claim.id);\n await mkdir(directory, { mode: 0o700 });\n const metadata = await open(\n join(directory, 'claim.json'),\n 'wx',\n 0o600,\n );\n try {\n await metadata.writeFile(JSON.stringify(claim));\n await metadata.sync();\n } finally {\n await metadata.close();\n }\n await this.syncDirectory(directory);\n await this.syncDirectory(claims);\n await rename(path, join(directory, 'original'));\n await this.syncDirectory(directory);\n await this.syncDirectory(root);\n this.observations.delete(path);\n await this.options.checkpoint?.('claimed', claim.id);\n // Re-observe after rename: a producer may still hold its writing descriptor.\n await this.stable(join(directory, 'original'));\n } catch (error) {\n results.push({ filename: entry.name, result: safeFailure(error) });\n }\n }\n return results;\n } finally {\n this.polling = false;\n }\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { Asset, type AssetRuntimeLike } from '@happyvertical/smrt-assets';\nimport {\n detectEngine,\n isEmbeddedDatabase,\n isTransientDatabaseError,\n withEmbeddedWriteTransaction,\n} from '@happyvertical/smrt-core';\nimport { SmrtJobCollection } from '@happyvertical/smrt-jobs';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport type {\n AnalysisOutput,\n IntakeEvidenceDTO,\n IntakeFailure,\n IntakeItemDTO,\n IntakeLimits,\n ReceiptResult,\n} from './dto.js';\nimport { generationSnapshotRead } from './execution-internal.js';\nimport { assertProposalLimits } from './proposal-limits.js';\nimport './models.js';\nimport type {\n IntakeExecutionOptions,\n PreviewPlanInput,\n PreviewProposalInput,\n ReviewInput,\n} from './execution-contracts.js';\nimport type { FeedbackConfiguration } from './feedback-contracts.js';\nimport type {\n AdoptRuleInput,\n ObserveFeedbackInput,\n ReadRuleInput,\n RecordFeedbackInput,\n RetrieveFeedbackInput,\n SuggestRuleInput,\n} from './feedback-dto.js';\nimport type { ProposalConfiguration } from './proposal-contracts.js';\nimport type {\n CompletedAnalysisSnapshot,\n PreviewGeneratedInput,\n} from './proposal-dto.js';\nimport type { LogicalSplitInput } from './review-dto.js';\n\n/** Authenticated host context. Never construct this from transport JSON. */\nexport interface IngestionScope {\n tenantId: string;\n actorId: string;\n confidentialScopeId: string;\n}\n/** A source part is already authenticated by the host/source adapter. */\nexport interface IntakePart {\n partId: string;\n parentPartId?: string;\n mediaType: string;\n bytes: Uint8Array;\n expectedHash?: string;\n sourceReference?: { owner: string; id: string; version: string };\n}\n/** Host-resolved delivery and retention policy, never untrusted content labels. */\nexport interface ReceiveInput {\n sourceId: string;\n sourceVersion: string;\n deliveryKey: string;\n deliveredAt: Date;\n parts: IntakePart[];\n capturedCeiling: Record<string, unknown>;\n retention: {\n version: string;\n expiresAt: Date;\n replayUntil: Date;\n acceptAfter: Date;\n };\n limits: IntakeLimits;\n traceId?: string;\n}\n/** Durable attempt claim. Its fence and token are verified on every completion. */\nexport interface AnalysisLease {\n itemId: string;\n analysisId: string;\n attemptId: string;\n revision: number;\n fence: number;\n token: string;\n}\n/** Trusted integration points; no provider or application-policy implementation. */\nexport interface IngestionOptions {\n /** Optional server-owned interpretation configuration; independent of execution. */\n proposals?: ProposalConfiguration;\n /** Explicit scoped learning; never inferred from analysis or execution success. */\n feedback?: FeedbackConfiguration;\n /** Optional application-owned review/execution catalog and live authority. */\n execution?: IntakeExecutionOptions;\n db: DatabaseInterface;\n assets: AssetRuntimeLike;\n scope: IngestionScope;\n /** Recheck current access for EVERY boundary, including worker completion. */\n authorize(input: {\n scope: IngestionScope;\n operation: 'receive' | 'read' | 'process' | 'delete';\n capturedCeiling: Record<string, unknown>;\n db: DatabaseInterface;\n }): Promise<boolean>;\n /** Registered job handler supplied by the host; dispatch arguments contain IDs only. */\n jobTarget: { objectType: string; method: string };\n /** Purge host-owned embeddings/previews/caches; retries must be idempotent. */\n purgeDerived(input: { tenantId: string; itemId: string }): Promise<void>;\n now?: () => Date;\n /** Fault injection/observability; never changes authority or persistence. */\n checkpoint?: (boundary: string) => Promise<void>;\n}\n\ntype Row = Record<string, unknown>;\nconst TABLES = [\n 'intake_items',\n 'intake_evidence',\n 'intake_analyses',\n 'intake_analysis_attempts',\n 'intake_plans',\n 'intake_actions',\n 'intake_proposals',\n 'intake_review_decisions',\n 'intake_executions',\n 'intake_feedback',\n 'intake_dispatches',\n 'intake_deletions',\n] as const;\nconst failures = new Set([\n 'unsupported_type',\n 'malformed_output',\n 'limit',\n 'timeout',\n 'unavailable',\n 'authentication',\n 'cancelled',\n 'integrity',\n]);\nconst uuid =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nfunction object(value: unknown): Record<string, unknown> {\n const parsed: unknown = typeof value === 'string' ? JSON.parse(value) : value;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n throw new Error('Invalid intake payload');\n return parsed as Record<string, unknown>;\n}\nfunction canonical(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean')\n return JSON.stringify(value);\n if (typeof value === 'number' && Number.isFinite(value))\n return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;\n if (\n value &&\n typeof value === 'object' &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n return `{${Object.keys(value)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${canonical((value as Row)[k])}`)\n .join(',')}}`;\n }\n throw new Error('Invalid canonical intake value');\n}\nfunction digest(value: unknown): string {\n return createHash('sha256').update(canonical(value)).digest('hex');\n}\nfunction bytesHash(value: Uint8Array): string {\n return createHash('sha256').update(value).digest('hex');\n}\nfunction nonempty(value: unknown): asserts value is string {\n if (typeof value !== 'string' || !value.trim() || value.length > 512)\n throw new Error('Invalid intake identifier');\n}\nfunction integer(value: unknown, max = 2_147_483_647): asserts value is number {\n if (\n typeof value !== 'number' ||\n !Number.isSafeInteger(value) ||\n value <= 0 ||\n value > max\n )\n throw new Error('Invalid intake limit');\n}\nfunction persistedDate(value: unknown): Date {\n return value instanceof Date ? value : new Date(String(value));\n}\nfunction date(value: Date): string {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime()))\n throw new Error('Invalid intake date');\n return value.toISOString();\n}\n\n/** Server-only durable lifecycle. Domain approval/execution remains a later layer. */\nexport class IngestionService {\n private readonly db: DatabaseInterface;\n private readonly scope: IngestionScope;\n constructor(private readonly options: IngestionOptions) {\n if (options.proposals) assertProposalLimits(options.proposals.limits);\n this.db = options.db;\n this.scope = Object.freeze({ ...options.scope });\n if (!uuid.test(this.scope.tenantId))\n throw new Error('Required tenant UUID');\n nonempty(this.scope.actorId);\n nonempty(this.scope.confidentialScopeId);\n const configured = this.db as DatabaseInterface & {\n type?: string;\n config?: { type?: string; url?: string };\n };\n const engine = detectEngine(\n this.db.url || configured.config?.url || '',\n configured.type || configured.config?.type,\n );\n if (!['sqlite', 'postgres'].includes(engine) || !this.db.transaction)\n throw new Error('Ingestion requires transactional SQLite or PostgreSQL');\n nonempty(options.jobTarget.objectType);\n nonempty(options.jobTarget.method);\n }\n private async execution() {\n if (!this.options.execution)\n throw new Error('Intake execution is not configured');\n const { IntakeExecutionService } = await import('./execution.js');\n return new IntakeExecutionService(this.options, this.options.execution);\n }\n async previewProposal(input: PreviewProposalInput) {\n return (await this.execution()).previewProposal(input);\n }\n async submitDecision(input: ReviewInput) {\n return (await this.execution()).submitDecision(input);\n }\n async applyAction(actionId: string) {\n return (await this.execution()).applyAction(actionId);\n }\n async reconcileAction(actionId: string) {\n return (await this.execution()).reconcileAction(actionId);\n }\n async listReviews(\n itemId: string,\n input: { cursor?: string; limit?: number } = {},\n ) {\n return (await this.execution()).listReviews(itemId, input);\n }\n async getAction(actionId: string) {\n return (await this.execution()).getAction(actionId);\n }\n async authorizeAutomatic(actionId: string) {\n return (await this.execution()).authorizeAutomatic(actionId);\n }\n async previewPlan(input: PreviewPlanInput) {\n return (await this.execution()).previewPlan(input);\n }\n async applyPlan(planId: string) {\n return (await this.execution()).applyPlan(planId);\n }\n private async proposals() {\n if (!this.options.proposals)\n throw new Error('Intake proposals are not configured');\n const { IngestionProposalService } = await import('./proposals.js');\n return new IngestionProposalService(\n this,\n this.options,\n this.options.proposals,\n );\n }\n async listHandlers(itemId: string) {\n return (await this.proposals()).listHandlers(itemId);\n }\n async findCandidates(input: {\n itemId: string;\n handlerId: string;\n handlerVersion: string;\n query: string;\n limit?: number;\n }) {\n return (await this.proposals()).findCandidates(input);\n }\n async prepareGeneration(itemId: string, attemptId: string) {\n return (await this.proposals()).prepareGeneration(itemId, attemptId);\n }\n async generateProposals(lease: AnalysisLease) {\n return (await this.proposals()).generate(lease);\n }\n async previewGeneratedProposals(input: PreviewGeneratedInput) {\n return (await this.proposals()).preview(input);\n }\n private async feedback() {\n const { IntakeFeedbackService } = await import('./feedback.js');\n return new IntakeFeedbackService(this.options);\n }\n async recordFeedback(input: RecordFeedbackInput) {\n return (await this.feedback()).record(input);\n }\n async observeFeedback(input: ObserveFeedbackInput) {\n return (await this.feedback()).observe(input);\n }\n async retrieveFeedback(input: RetrieveFeedbackInput) {\n return (await this.proposals()).retrieveFeedback(input);\n }\n async suggestRoutingRule(input: SuggestRuleInput) {\n return (await this.feedback()).suggest(input);\n }\n async getRoutingRule(input: ReadRuleInput) {\n return (await this.feedback()).readRule(input);\n }\n async adoptRoutingRule(input: AdoptRuleInput) {\n return (await this.feedback()).adopt(input);\n }\n private now(): Date {\n return this.options.now?.() ?? new Date();\n }\n private async point(name: string): Promise<void> {\n await this.options.checkpoint?.(name);\n }\n private async authorize(\n operation: 'receive' | 'read' | 'process' | 'delete',\n data: Row,\n db = this.db,\n ): Promise<void> {\n if (\n !(await this.options.authorize({\n scope: this.scope,\n operation,\n capturedCeiling: object(data.capturedCeiling ?? {}),\n db,\n }))\n )\n throw new Error('Intake unavailable');\n }\n private async rows(\n db: DatabaseInterface,\n table: (typeof TABLES)[number],\n where = '',\n params: unknown[] = [],\n ): Promise<Row[]> {\n return (\n await db.query(\n `SELECT * FROM ${table} WHERE tenant_id = ? AND confidential_scope_id = ?${where ? ` AND ${where}` : ''}`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n ...params,\n )\n ).rows as Row[];\n }\n private async item(\n id: string,\n operation: 'read' | 'process' | 'delete',\n db = this.db,\n allowExpired = false,\n ): Promise<Row> {\n const [item] = await this.rows(db, 'intake_items', 'id = ?', [id]);\n if (!item) throw new Error('Intake unavailable');\n await this.authorize(operation, object(item.data), db);\n if (\n !allowExpired &&\n (item.visibility !== 'active' ||\n persistedDate(item.expires_at).getTime() <= this.now().getTime())\n )\n throw new Error('Intake unavailable');\n return item;\n }\n private async tx<T>(work: (db: DatabaseInterface) => Promise<T>): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n return await withEmbeddedWriteTransaction(\n this.db,\n isEmbeddedDatabase(this.db),\n work,\n );\n } catch (error) {\n if (attempt >= 3 || !isTransientDatabaseError(error)) throw error;\n await new Promise((resolve) => setTimeout(resolve, 10 * 2 ** attempt));\n }\n }\n }\n private async lock(db: DatabaseInterface, itemId: string): Promise<void> {\n const result = await db.query(\n 'UPDATE intake_items SET analysis_revision = analysis_revision WHERE tenant_id = ? AND confidential_scope_id = ? AND id = ? RETURNING id',\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n if (!result.rows.length) throw new Error('Intake unavailable');\n }\n private async insert(\n db: DatabaseInterface,\n table: (typeof TABLES)[number],\n values: Row,\n conflict?: string,\n ): Promise<Row[]> {\n const now = this.now().toISOString();\n const row = {\n id: randomUUID(),\n slug: randomUUID(),\n context: '',\n created_at: now,\n updated_at: now,\n tenant_id: this.scope.tenantId,\n confidential_scope_id: this.scope.confidentialScopeId,\n ...values,\n };\n const keys = Object.keys(row);\n return (\n await db.query(\n `INSERT INTO ${table} (${keys.join(',')}) VALUES (${keys.map(() => '?').join(',')})${conflict ? ` ON CONFLICT (${conflict}) DO NOTHING` : ''} RETURNING *`,\n ...Object.values(row),\n )\n ).rows as Row[];\n }\n /** Diagnostic only: deploy manifest migrations before starting ingestion. */\n async assertReady(): Promise<void> {\n for (const table of TABLES)\n await this.db.query(`SELECT id FROM ${table} WHERE 1 = 0`);\n }\n /** Preserve every original before acknowledgment; retries retain receipt identity. */\n async receive(input: ReceiveInput): Promise<ReceiptResult> {\n await this.authorize('receive', { capturedCeiling: input.capturedCeiling });\n const now = this.now();\n let parts: Array<IntakePart & { hash: string }>;\n try {\n for (const value of [\n input.sourceId,\n input.sourceVersion,\n input.deliveryKey,\n input.retention.version,\n ])\n nonempty(value);\n for (const value of Object.values(input.limits)) integer(value);\n date(input.deliveredAt);\n date(input.retention.expiresAt);\n date(input.retention.replayUntil);\n date(input.retention.acceptAfter);\n if (\n input.deliveredAt < input.retention.acceptAfter ||\n input.retention.expiresAt <= now ||\n input.retention.replayUntil < input.retention.expiresAt\n )\n return { kind: 'rejected', category: 'expired' };\n if (!input.parts.length || input.parts.length > input.limits.maxParts)\n return { kind: 'rejected', category: 'limit' };\n const ids = new Set<string>();\n let total = 0;\n parts = input.parts.map((part) => {\n nonempty(part.partId);\n nonempty(part.mediaType);\n if (ids.has(part.partId) || !(part.bytes instanceof Uint8Array))\n throw new Error('Invalid part');\n ids.add(part.partId);\n total += part.bytes.byteLength;\n const hash = bytesHash(part.bytes);\n if (part.expectedHash && part.expectedHash !== hash)\n throw new Error('Invalid hash');\n return { ...part, bytes: Buffer.from(part.bytes), hash };\n });\n if (total > input.limits.maxBytes)\n return { kind: 'rejected', category: 'limit' };\n for (const part of parts)\n if (\n part.parentPartId &&\n (!ids.has(part.parentPartId) || part.parentPartId === part.partId)\n )\n throw new Error('Invalid parent');\n for (const part of parts) {\n const seen = new Set([part.partId]);\n let parent = part.parentPartId;\n while (parent) {\n if (seen.has(parent)) throw new Error('Cyclic evidence');\n seen.add(parent);\n parent = parts.find((p) => p.partId === parent)?.parentPartId;\n }\n }\n } catch {\n return { kind: 'rejected', category: 'invalid' };\n }\n const identity = parts\n .map((p) => ({\n partId: p.partId,\n parentPartId: p.parentPartId ?? null,\n mediaType: p.mediaType,\n hash: p.hash,\n length: p.bytes.byteLength,\n sourceReference: p.sourceReference ?? null,\n }))\n .sort((a, b) => a.partId.localeCompare(b.partId));\n const payloadDigest = digest(identity);\n const scopeDigest = digest({\n scope: this.scope,\n ceiling: input.capturedCeiling,\n sourceVersion: input.sourceVersion,\n });\n const reservation = await this.tx(async (db) => {\n await this.authorize(\n 'receive',\n { capturedCeiling: input.capturedCeiling },\n db,\n );\n const inserted = await this.insert(\n db,\n 'intake_items',\n {\n source_id: input.sourceId,\n source_version: input.sourceVersion,\n delivery_key: input.deliveryKey,\n payload_digest: payloadDigest,\n scope_digest: scopeDigest,\n receipt_state: 'reserved',\n processing_state: 'queued',\n visibility: 'active',\n receipt_version: 1,\n analysis_revision: 0,\n fence: 0,\n lease_token: '',\n lease_until: null,\n expires_at: date(input.retention.expiresAt),\n replay_until: date(input.retention.replayUntil),\n cancelled: false,\n trace_id: input.traceId ?? randomUUID(),\n data: canonical({\n capturedCeiling: input.capturedCeiling,\n limits: input.limits,\n retentionVersion: input.retention.version,\n deliveredAt: date(input.deliveredAt),\n }),\n },\n 'tenant_id,source_id,delivery_key',\n );\n const matches = await db.query(\n 'SELECT * FROM intake_items WHERE tenant_id = ? AND source_id = ? AND delivery_key = ?',\n this.scope.tenantId,\n input.sourceId,\n input.deliveryKey,\n );\n const item = matches.rows[0] as Row;\n if (\n item.scope_digest !== scopeDigest ||\n item.payload_digest !== payloadDigest\n )\n return { kind: 'conflict' as const };\n if (\n item.visibility !== 'active' ||\n persistedDate(item.replay_until) <= now ||\n persistedDate(item.expires_at) <= now\n )\n return { kind: 'expired' as const };\n if (inserted.length) {\n const evidenceIds = new Map(parts.map((p) => [p.partId, randomUUID()]));\n const ordered = [...parts].sort((a, b) => {\n const depth = (p: IntakePart): number =>\n p.parentPartId\n ? 1 + depth(parts.find((x) => x.partId === p.parentPartId)!)\n : 0;\n return depth(a) - depth(b);\n });\n for (const part of ordered)\n await this.insert(db, 'intake_evidence', {\n id: evidenceIds.get(part.partId),\n item_id: item.id,\n part_id: part.partId,\n parent_evidence_id: part.parentPartId\n ? evidenceIds.get(part.parentPartId)\n : null,\n asset_id: randomUUID(),\n state: 'intent',\n content_hash: part.hash,\n byte_length: part.bytes.byteLength,\n media_type: part.mediaType,\n source_uri: '',\n data: canonical({ sourceReference: part.sourceReference ?? null }),\n });\n }\n return { kind: 'reserved' as const, item, created: !!inserted.length };\n });\n if (reservation.kind !== 'reserved')\n return { kind: 'rejected', category: reservation.kind };\n const item = reservation.item;\n const itemId = String(item.id);\n await this.point('reserved');\n if (item.receipt_state === 'ready') {\n try {\n await this.repairDispatches();\n } catch {\n return { kind: 'retry', category: 'unavailable' };\n }\n return {\n kind: 'duplicate',\n itemId,\n receiptVersion: Number(item.receipt_version),\n };\n }\n const token = randomUUID();\n const claimed = await this.tx((db) =>\n db.query(\n `UPDATE intake_items SET receipt_state = 'preserving', fence = fence + 1, lease_token = ?, lease_until = ? WHERE tenant_id = ? AND confidential_scope_id = ? AND id = ? AND visibility = 'active' AND receipt_state <> 'ready' AND (lease_until IS NULL OR lease_until <= ?) RETURNING fence`,\n token,\n new Date(now.getTime() + input.limits.leaseMs).toISOString(),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n now.toISOString(),\n ),\n );\n if (!claimed.rows.length) return { kind: 'retry', category: 'busy' };\n try {\n for (const part of parts) await this.preserve(itemId, part, token);\n await this.point('evidence');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'process', db);\n const evidence = await this.rows(db, 'intake_evidence', 'item_id = ?', [\n itemId,\n ]);\n if (\n evidence.length !== parts.length ||\n evidence.some((e) => e.state !== 'durable')\n )\n throw new Error('Incomplete evidence');\n const updated = await db.query(\n `UPDATE intake_items SET receipt_state='ready',lease_token='',lease_until=NULL WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND lease_token=? AND lease_until>? AND visibility='active' RETURNING id`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n token,\n this.now().toISOString(),\n );\n if (!updated.rows.length) throw new Error('Lease lost');\n await this.insert(\n db,\n 'intake_dispatches',\n {\n item_id: itemId,\n stage: 'analyze',\n revision: 1,\n state: 'pending',\n job_id: '',\n deliveries: 0,\n data: '{}',\n },\n 'tenant_id,item_id,stage,revision',\n );\n });\n await this.point('ready');\n await this.repairDispatches();\n await this.point('ack');\n return {\n kind: reservation.created ? 'accepted' : 'duplicate',\n itemId,\n receiptVersion: 1,\n };\n } catch {\n await this.tx((db) =>\n db.query(\n `UPDATE intake_items SET receipt_state='needs_attention',lease_token='',lease_until=NULL WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND lease_token=? AND receipt_state<>'ready'`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n token,\n ),\n );\n return { kind: 'retry', category: 'unavailable' };\n }\n }\n private async preserve(\n itemId: string,\n part: IntakePart & { hash: string },\n token: string,\n ): Promise<void> {\n const [evidence] = await this.rows(\n this.db,\n 'intake_evidence',\n 'item_id=? AND part_id=?',\n [itemId, part.partId],\n );\n if (!evidence) throw new Error('Missing storage intent');\n await this.item(itemId, 'process');\n const asset = await withTenant(\n { tenantId: this.scope.tenantId },\n async () => {\n let asset = await this.options.assets.collection.get({\n id: String(evidence.asset_id),\n });\n if (!asset)\n asset = await this.options.assets.collection.create({\n id: String(evidence.asset_id),\n tenantId: this.scope.tenantId,\n name: String(evidence.id),\n mimeType: part.mediaType,\n typeSlug: 'intake',\n statusSlug: 'active',\n sourceUri: '',\n });\n if (asset.tenantId !== this.scope.tenantId)\n throw new Error('Asset unavailable');\n return asset;\n },\n );\n const uri = await this.options.assets.store.planFile(asset, {\n mimeType: part.mediaType,\n typeSlug: 'intake',\n });\n if (evidence.source_uri && evidence.source_uri !== uri)\n throw new Error('Storage plan changed');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (\n item.lease_token !== token ||\n persistedDate(item.lease_until) <= this.now()\n )\n throw new Error('Lease lost');\n await db.query(\n 'UPDATE intake_evidence SET source_uri=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n uri,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n evidence.id,\n );\n });\n asset.sourceUri = uri;\n await asset.save();\n await this.point('storage_intent');\n await this.options.assets.store.preserveFile(\n asset,\n Buffer.from(part.bytes),\n { mimeType: part.mediaType, typeSlug: 'intake' },\n );\n await this.point('storage');\n const actual = await this.options.assets.store.read(asset);\n if (\n actual.length !== Number(evidence.byte_length) ||\n bytesHash(actual) !== evidence.content_hash\n )\n throw new Error('Storage integrity');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (\n item.lease_token !== token ||\n persistedDate(item.lease_until) <= this.now()\n )\n throw new Error('Lease lost');\n await db.query(\n \"UPDATE intake_evidence SET state='durable' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n evidence.id,\n );\n });\n }\n /** Repair lost enqueue/mark writes and deleted/failed jobs. Duplicate jobs are safe. */\n async repairDispatches(): Promise<number> {\n let repaired = 0;\n const intents = await this.rows(\n this.db,\n 'intake_dispatches',\n \"state <> 'completed'\",\n );\n const jobs = await SmrtJobCollection.create({ db: this.db });\n for (const intent of intents) {\n const item = await this.item(\n String(intent.item_id),\n 'process',\n this.db,\n true,\n );\n if (\n item.visibility !== 'active' ||\n item.cancelled ||\n persistedDate(item.expires_at) <= this.now()\n )\n continue;\n if (\n intent.job_id &&\n Number(intent.revision) === Math.max(1, Number(item.analysis_revision))\n ) {\n const job = await withTenant({ tenantId: this.scope.tenantId }, () =>\n jobs.get({ id: String(intent.job_id) }),\n );\n if (job && ['pending', 'running'].includes(job.status)) continue;\n }\n const allocation = await this.tx(async (db) => {\n await this.lock(db, String(item.id));\n const currentItem = await this.item(String(item.id), 'process', db);\n const [currentIntent] = await this.rows(\n db,\n 'intake_dispatches',\n 'id=? AND item_id=?',\n [intent.id, item.id],\n );\n if (!currentIntent || currentIntent.state === 'completed') return false;\n // Revision 1 is queued at receipt, before the first analysis exists.\n if (\n currentItem.cancelled ||\n Number(currentIntent.revision) !==\n Math.max(1, Number(currentItem.analysis_revision))\n ) {\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n currentIntent.id,\n );\n return false;\n }\n const limits = object(\n object(currentItem.data).limits,\n ) as unknown as IntakeLimits;\n if (Number(currentIntent.deliveries) >= limits.maxAttempts) {\n await db.query(\n \"UPDATE intake_items SET processing_state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n item.id,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n );\n return false;\n }\n const result = await db.query(\n \"UPDATE intake_dispatches SET deliveries=deliveries+1 WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND state<>'completed' AND deliveries<? RETURNING id\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n currentIntent.id,\n limits.maxAttempts,\n );\n return result.rows.length === 1;\n });\n if (!allocation) continue;\n const job = await withTenant({ tenantId: this.scope.tenantId }, () =>\n jobs.enqueueJob({\n tenantId: this.scope.tenantId,\n objectType: this.options.jobTarget.objectType,\n method: this.options.jobTarget.method,\n args: {\n itemId: intent.item_id,\n revision: Number(intent.revision),\n dispatchId: intent.id,\n },\n queue: 'ingestion',\n maxAttempts: 1,\n }),\n );\n await this.point('enqueued');\n await this.tx((db) =>\n db.query(\n \"UPDATE intake_dispatches SET state='delivered',job_id=? WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND state<>'completed'\",\n job.id,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n ),\n );\n repaired++;\n }\n return repaired;\n }\n /** List only authorized active items; omitted items do not contribute counts. */\n async listItems(): Promise<IntakeItemDTO[]> {\n const rows = await this.rows(\n this.db,\n 'intake_items',\n \"visibility='active' AND expires_at>?\",\n [this.now().toISOString()],\n );\n const result: IntakeItemDTO[] = [];\n for (const row of rows) {\n try {\n await this.authorize('read', object(row.data));\n result.push(this.itemDTO(row));\n } catch {\n /* no existence disclosure */\n }\n }\n return result;\n }\n private itemDTO(row: Row): IntakeItemDTO {\n return {\n id: String(row.id),\n receiptState: String(row.receipt_state),\n processingState: String(row.processing_state),\n analysisRevision: Number(row.analysis_revision),\n cancelled: !!row.cancelled,\n traceId: String(row.trace_id),\n };\n }\n async getItem(id: string): Promise<IntakeItemDTO> {\n return this.itemDTO(await this.item(id, 'read'));\n }\n async getEvidence(itemId: string): Promise<IntakeEvidenceDTO[]> {\n await this.item(itemId, 'read');\n return (\n await this.rows(\n this.db,\n 'intake_evidence',\n \"item_id=? AND state='durable'\",\n [itemId],\n )\n ).map((e) => ({\n id: String(e.id),\n partId: String(e.part_id),\n parentEvidenceId: e.parent_evidence_id\n ? String(e.parent_evidence_id)\n : null,\n mediaType: String(e.media_type),\n contentHash: String(e.content_hash),\n byteLength: Number(e.byte_length),\n }));\n }\n async readEvidence(itemId: string, evidenceId: string): Promise<Uint8Array> {\n await this.item(itemId, 'read');\n const [e] = await this.rows(\n this.db,\n 'intake_evidence',\n \"item_id=? AND id=? AND state='durable'\",\n [itemId, evidenceId],\n );\n if (!e) throw new Error('Intake unavailable');\n const asset = await withTenant({ tenantId: this.scope.tenantId }, () =>\n this.options.assets.collection.get({ id: String(e.asset_id) }),\n );\n if (\n !asset ||\n asset.tenantId !== this.scope.tenantId ||\n asset.sourceUri !== e.source_uri\n )\n throw new Error('Intake unavailable');\n const bytes = await this.options.assets.store.read(asset);\n if (\n bytes.length !== Number(e.byte_length) ||\n bytesHash(bytes) !== e.content_hash\n )\n throw new Error('Intake integrity');\n await this.item(itemId, 'read');\n return bytes;\n }\n /** Append an immutable input revision. Reprocessing never creates actions. */\n async analyze(\n itemId: string,\n configuration: Record<string, unknown>,\n requestKey: string,\n ): Promise<{ id: string; revision: number }> {\n const frozen = structuredClone(configuration);\n if (\n Object.hasOwn(frozen, 'humanCorrection') &&\n frozen.stage !== 'interpret'\n )\n throw new Error('Human corrections require authenticated split revision');\n return this.tx((db) => this.appendAnalysis(db, itemId, frozen, requestKey));\n }\n private async appendAnalysis(\n db: DatabaseInterface,\n itemId: string,\n configuration: Record<string, unknown>,\n requestKey: string,\n ): Promise<{ id: string; revision: number }> {\n nonempty(requestKey);\n const configDigest = digest(configuration);\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (item.receipt_state !== 'ready' || item.cancelled)\n throw new Error('Intake not processable');\n const previous = await this.rows(db, 'intake_analyses', 'item_id=?', [\n itemId,\n ]);\n const replay = previous.find(\n (a) => object(a.data).requestKey === requestKey,\n );\n if (replay) {\n if (object(replay.data).configDigest !== configDigest)\n throw new Error('Analysis request conflict');\n return { id: String(replay.id), revision: Number(replay.revision) };\n }\n const evidence = await this.rows(\n db,\n 'intake_evidence',\n \"item_id=? AND state='durable'\",\n [itemId],\n );\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n const revision = Number(item.analysis_revision) + 1;\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision<? AND state<>'completed'\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n revision,\n );\n const inputs = evidence\n .map((e) => ({ id: e.id, hash: e.content_hash }))\n .sort((a, b) => String(a.id).localeCompare(String(b.id)));\n const [analysis] = await this.insert(db, 'intake_analyses', {\n item_id: itemId,\n revision,\n fence: 0,\n attempt_number: 0,\n current_attempt_id: null,\n state: 'queued',\n input_digest: digest({ inputs, configuration }),\n data: canonical({ inputs, configuration, requestKey, configDigest }),\n });\n await db.query(\n \"UPDATE intake_items SET analysis_revision=?,processing_state='queued' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n revision,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await this.insert(\n db,\n 'intake_dispatches',\n {\n item_id: itemId,\n stage: 'analyze',\n revision,\n state: 'pending',\n job_id: '',\n deliveries: 0,\n data: '{}',\n },\n 'tenant_id,item_id,stage,revision',\n );\n return { id: String(analysis.id), revision };\n }\n\n /** Record an authenticated split correction and queue fresh extraction, never copy model output. */\n async reviseLogicalSplit(\n input: LogicalSplitInput,\n ): Promise<{ id: string; revision: number }> {\n const frozen = structuredClone(input);\n nonempty(frozen.requestId);\n integer(frozen.expectedRevision);\n if (\n !Array.isArray(frozen.groups) ||\n !frozen.groups.length ||\n frozen.groups.length > 100 ||\n frozen.groups.some(\n (group) =>\n !Array.isArray(group) ||\n !group.length ||\n group.length > 1000 ||\n group.some((page) => !Number.isSafeInteger(page) || page < 1),\n )\n )\n throw new Error('Invalid logical split');\n const pages = frozen.groups.flat();\n if (pages.length > 1000 || new Set(pages).size !== pages.length)\n throw new Error('Invalid logical split');\n const requestKey = `split:${frozen.requestId}`;\n const correction = {\n ...frozen,\n actorId: this.scope.actorId,\n kind: 'logical_split',\n };\n const replay = await this.tx(async (db) => {\n await this.lock(db, frozen.itemId);\n await this.item(frozen.itemId, 'process', db);\n const found = (\n await this.rows(db, 'intake_analyses', 'item_id=?', [frozen.itemId])\n ).find((row) => object(row.data).requestKey === requestKey);\n if (!found) return null;\n if (\n digest(object(object(found.data).configuration).humanCorrection) !==\n digest(correction)\n )\n throw new Error('Split request conflict');\n return { id: String(found.id), revision: Number(found.revision) };\n });\n if (replay) {\n // Idempotency acknowledges only an intent the current reviewer may still access.\n await (await this.proposals())[generationSnapshotRead](\n frozen.itemId,\n (work) => this.tx(work),\n (db) =>\n this.completedAnalysisSnapshot(\n db,\n frozen.itemId,\n frozen.attemptId,\n false,\n ),\n undefined,\n true,\n );\n return replay;\n }\n let result: { id: string; revision: number } | undefined;\n await (await this.proposals())[generationSnapshotRead](\n frozen.itemId,\n (work) => this.tx(work),\n (db) =>\n this.completedAnalysisSnapshot(\n db,\n frozen.itemId,\n frozen.attemptId,\n true,\n ),\n async (db, current) => {\n if (current.revision !== frozen.expectedRevision)\n throw new Error('Stale logical split');\n const pin = object(object(current.configuration.proposals).source);\n const source = await this.completedAnalysisSnapshot(\n db,\n frozen.itemId,\n String(pin.attemptId),\n false,\n );\n for (const key of [\n 'attemptId',\n 'revision',\n 'inputDigest',\n 'outputDigest',\n 'evidenceDigest',\n ] as const)\n if (pin[key] !== source[key]) throw new Error('Split source changed');\n const extraction = source.result.output.results;\n if (!Array.isArray(extraction))\n throw new Error('Split source unavailable');\n const evidence = extraction.find(\n (value) => object(object(value).evidence).id === frozen.evidenceId,\n );\n if (!evidence) throw new Error('Split evidence unavailable');\n const observed = new Set<number>();\n for (const value of object(evidence).segments as unknown[]) {\n const location = object(object(value).location);\n if (location.kind === 'page') observed.add(Number(location.page));\n if (location.kind === 'pages') {\n const from = Number(location.startPage),\n to = Number(location.endPage);\n if (\n !Number.isSafeInteger(from) ||\n !Number.isSafeInteger(to) ||\n to - from > 1000\n )\n throw new Error('Invalid source range');\n for (let page = from; page <= to; page++) observed.add(page);\n }\n }\n if (\n !observed.size ||\n pages.length !== observed.size ||\n pages.some((page) => !observed.has(page))\n )\n throw new Error('Split must cover observed pages exactly');\n // Re-extraction retains the supported immediate-predecessor interpretation pin.\n result = await this.appendAnalysis(\n db,\n frozen.itemId,\n { ...source.configuration, humanCorrection: correction },\n requestKey,\n );\n },\n true,\n );\n if (!result) throw new Error('Split unavailable');\n return result;\n }\n /** Allocate a fenced attempt; active leases cannot be stolen before expiry. */\n async claimAnalysis(\n itemId: string,\n revision: number,\n workerId: string,\n ): Promise<AnalysisLease | null> {\n integer(revision);\n nonempty(workerId);\n return this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (\n item.cancelled ||\n item.receipt_state !== 'ready' ||\n Number(item.analysis_revision) !== revision\n )\n return null;\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'item_id=? AND revision=?',\n [itemId, revision],\n );\n if (\n !analysis ||\n ['completed', 'partial'].includes(String(analysis.state))\n )\n return null;\n const limits = object(\n object(item.data).limits,\n ) as unknown as IntakeLimits;\n const attempts = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'analysis_id=?',\n [analysis.id],\n );\n const prior = attempts.find((a) => a.id === analysis.current_attempt_id);\n if (\n prior?.state === 'running' &&\n persistedDate(prior.lease_until) > this.now()\n )\n return null;\n if (Number(analysis.attempt_number) >= limits.maxAttempts) {\n if (prior?.state === 'running')\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='needs_attention',safe_error='limit' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n prior.id,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n analysis.id,\n );\n await db.query(\n \"UPDATE intake_items SET processing_state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND analysis_revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n revision,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n revision,\n );\n return null;\n }\n if (prior && ['running', 'queued'].includes(String(prior.state)))\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n prior.id,\n );\n const fence = Number(analysis.fence) + 1;\n const attempt = Number(analysis.attempt_number) + 1;\n const token = randomUUID();\n const [row] = await this.insert(db, 'intake_analysis_attempts', {\n item_id: itemId,\n analysis_id: analysis.id,\n attempt_number: attempt,\n fence,\n state: 'running',\n lease_token: token,\n lease_until: new Date(\n this.now().getTime() + limits.leaseMs,\n ).toISOString(),\n output_digest: '',\n safe_error: '',\n confidence: null,\n data: canonical({\n workerId,\n startedAt: this.now().toISOString(),\n limits,\n }),\n });\n await db.query(\n \"UPDATE intake_analyses SET fence=?,attempt_number=?,current_attempt_id=?,state='running' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n fence,\n attempt,\n row.id,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n analysis.id,\n );\n await db.query(\n \"UPDATE intake_items SET processing_state='running' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n return {\n itemId,\n analysisId: String(analysis.id),\n attemptId: String(row.id),\n revision,\n fence,\n token,\n };\n });\n }\n private async completedAnalysisSnapshot(\n db: DatabaseInterface,\n itemId: string,\n attemptId: string | undefined,\n current: boolean,\n ): Promise<CompletedAnalysisSnapshot> {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (item.cancelled) throw new Error('Analysis unavailable');\n if (attemptId === undefined) {\n if (!current) throw new Error('Historical attempt required');\n const [latest] = await this.rows(\n db,\n 'intake_analyses',\n 'item_id=? AND revision=?',\n [itemId, item.analysis_revision],\n );\n if (!latest?.current_attempt_id) throw new Error('Analysis unavailable');\n attemptId = String(latest.current_attempt_id);\n }\n\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'item_id=? AND id=?',\n [itemId, attemptId],\n );\n if (\n !attempt ||\n !['completed', 'partial'].includes(String(attempt.state)) ||\n !attempt.output_digest\n )\n throw new Error('Analysis unavailable');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'item_id=? AND id=?',\n [itemId, attempt.analysis_id],\n );\n if (\n !analysis ||\n analysis.current_attempt_id !== attemptId ||\n (current && Number(item.analysis_revision) !== Number(analysis.revision))\n )\n throw new Error('Analysis unavailable');\n const data = object(analysis.data);\n const configuration = object(data.configuration);\n if (\n !Array.isArray(data.inputs) ||\n !data.inputs.length ||\n digest({ inputs: data.inputs, configuration }) !==\n analysis.input_digest ||\n digest(configuration) !== data.configDigest\n )\n throw new Error('Analysis input integrity');\n const resultData = object(attempt.data);\n const result = {\n status: resultData.status,\n provider: resultData.provider,\n model: resultData.model,\n version: resultData.version,\n output: resultData.output,\n usage: resultData.usage,\n ...(Object.hasOwn(resultData, 'error')\n ? { error: resultData.error }\n : {}),\n ...(Object.hasOwn(resultData, 'confidence')\n ? { confidence: resultData.confidence }\n : {}),\n } as AnalysisOutput;\n if (\n result.status !== attempt.state ||\n digest(result) !== attempt.output_digest\n )\n throw new Error('Analysis output integrity');\n const evidence: IntakeEvidenceDTO[] = [];\n for (const input of data.inputs) {\n const frozen = object(input);\n const [row] = await this.rows(\n db,\n 'intake_evidence',\n \"item_id=? AND id=? AND state='durable'\",\n [itemId, frozen.id],\n );\n if (!row || row.content_hash !== frozen.hash)\n throw new Error('Analysis input integrity');\n evidence.push({\n id: String(row.id),\n partId: String(row.part_id),\n parentEvidenceId: row.parent_evidence_id\n ? String(row.parent_evidence_id)\n : null,\n mediaType: String(row.media_type),\n contentHash: String(row.content_hash),\n byteLength: Number(row.byte_length),\n });\n }\n if (new Set(evidence.map((entry) => entry.id)).size !== evidence.length)\n throw new Error('Analysis input integrity');\n await this.item(itemId, 'process', db);\n return structuredClone({\n itemId,\n attemptId,\n revision: Number(analysis.revision),\n inputDigest: String(analysis.input_digest),\n outputDigest: String(attempt.output_digest),\n evidenceDigest: digest(data.inputs),\n configuration,\n evidence,\n result,\n });\n }\n /** Detached successful current revision; always current-scope/process authorized. */\n async getCompletedAnalysis(\n itemId: string,\n attemptId?: string,\n ): Promise<CompletedAnalysisSnapshot> {\n const snapshot = await this.tx((db) =>\n this.completedAnalysisSnapshot(db, itemId, attemptId, true),\n );\n await this.point('analysis:snapshot-read');\n const read = async (db: DatabaseInterface) => {\n const current = await this.completedAnalysisSnapshot(\n db,\n itemId,\n snapshot.attemptId,\n true,\n );\n if (\n current.inputDigest !== snapshot.inputDigest ||\n current.outputDigest !== snapshot.outputDigest\n )\n throw new Error('Analysis changed');\n return current;\n };\n if (snapshot.configuration.stage === 'interpret')\n return (await this.proposals())[generationSnapshotRead](\n itemId,\n (work) => this.tx(work),\n read,\n );\n return this.tx(read);\n }\n /** Historical source is readable only through its frozen pin on a live generation lease. */\n async getGenerationInput(lease: AnalysisLease) {\n const generation = await this.getAnalysisInput(lease);\n const configuration = generation.configuration;\n const pin = object(object(configuration.proposals).source);\n if (\n configuration.stage !== 'interpret' ||\n typeof pin.attemptId !== 'string'\n )\n throw new Error('Invalid generation source');\n const source = await this.tx((db) =>\n this.completedAnalysisSnapshot(\n db,\n lease.itemId,\n String(pin.attemptId),\n false,\n ),\n );\n for (const key of [\n 'attemptId',\n 'revision',\n 'inputDigest',\n 'outputDigest',\n 'evidenceDigest',\n ] as const)\n if (pin[key] !== source[key])\n throw new Error('Generation source changed');\n if (\n source.result.provider !== 'smrt-ingestion-extraction' ||\n source.configuration.stage === 'interpret' ||\n source.revision !== generation.revision - 1 ||\n digest(configuration.humanCorrection ?? null) !==\n digest(source.configuration.humanCorrection ?? null) ||\n digest(\n generation.evidence.map((entry) => ({\n id: entry.id,\n hash: entry.contentHash,\n })),\n ) !== source.evidenceDigest\n )\n throw new Error('Generation evidence changed');\n await this.getAnalysisInput(lease);\n return { generation, source };\n }\n /** Reload immutable inputs only through the current live processing lease. */\n async getAnalysisInput(lease: AnalysisLease): Promise<{\n revision: number;\n attemptId: string;\n fence: number;\n inputDigest: string;\n maxOutputBytes: number;\n configuration: Record<string, unknown>;\n evidence: IntakeEvidenceDTO[];\n }> {\n return this.tx(async (db) => {\n await this.lock(db, lease.itemId);\n const item = await this.item(lease.itemId, 'process', db);\n if (item.cancelled || Number(item.analysis_revision) !== lease.revision)\n throw new Error('Analysis lease unavailable');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [lease.analysisId, lease.itemId],\n );\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'id=? AND analysis_id=? AND item_id=?',\n [lease.attemptId, lease.analysisId, lease.itemId],\n );\n if (\n !analysis ||\n !attempt ||\n Number(analysis.revision) !== lease.revision ||\n analysis.current_attempt_id !== lease.attemptId ||\n Number(analysis.fence) !== lease.fence ||\n Number(attempt.fence) !== lease.fence ||\n attempt.state !== 'running' ||\n attempt.lease_token !== lease.token ||\n persistedDate(attempt.lease_until) <= this.now()\n )\n throw new Error('Analysis lease unavailable');\n const data = object(analysis.data);\n const configuration = object(data.configuration);\n if (\n !Array.isArray(data.inputs) ||\n !data.inputs.length ||\n digest({ inputs: data.inputs, configuration }) !==\n analysis.input_digest ||\n digest(configuration) !== data.configDigest\n )\n throw new Error('Analysis input integrity');\n const evidence: IntakeEvidenceDTO[] = [];\n for (const input of data.inputs) {\n const frozen = object(input);\n const [row] = await this.rows(\n db,\n 'intake_evidence',\n \"item_id=? AND id=? AND state='durable'\",\n [lease.itemId, frozen.id],\n );\n if (!row || row.content_hash !== frozen.hash)\n throw new Error('Analysis input integrity');\n evidence.push({\n id: String(row.id),\n partId: String(row.part_id),\n parentEvidenceId: row.parent_evidence_id\n ? String(row.parent_evidence_id)\n : null,\n mediaType: String(row.media_type),\n contentHash: String(row.content_hash),\n byteLength: Number(row.byte_length),\n });\n }\n if (new Set(evidence.map((entry) => entry.id)).size !== evidence.length)\n throw new Error('Analysis input integrity');\n return {\n revision: lease.revision,\n attemptId: lease.attemptId,\n fence: lease.fence,\n inputDigest: String(analysis.input_digest),\n maxOutputBytes: Number(object(object(item.data).limits).maxOutputBytes),\n configuration,\n evidence,\n };\n });\n }\n /** Publish once, only through the current unexpired fence and captured scope. */\n async completeAnalysis(\n lease: AnalysisLease,\n output: AnalysisOutput,\n ): Promise<boolean> {\n if (\n !['completed', 'partial', 'failed', 'needs_attention'].includes(\n output.status,\n ) ||\n !output.provider ||\n !output.model ||\n !output.version ||\n (output.error && !failures.has(output.error))\n )\n throw new Error('Invalid analysis output');\n if (\n output.confidence !== undefined &&\n (!Number.isFinite(output.confidence) ||\n output.confidence < 0 ||\n output.confidence > 1)\n )\n throw new Error('Invalid confidence');\n for (const value of Object.values(output.usage))\n if (!Number.isFinite(value) || value < 0)\n throw new Error('Invalid usage');\n const serialized = canonical(output);\n const outputDigest = digest(output);\n return this.tx(async (db) => {\n await this.lock(db, lease.itemId);\n const item = await this.item(lease.itemId, 'process', db);\n if (item.cancelled || Number(item.analysis_revision) !== lease.revision)\n return false;\n const limits = object(\n object(item.data).limits,\n ) as unknown as IntakeLimits;\n if (Buffer.byteLength(serialized) > limits.maxOutputBytes)\n throw new Error('Analysis output budget exceeded');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [lease.analysisId, lease.itemId],\n );\n if (\n !analysis ||\n analysis.current_attempt_id !== lease.attemptId ||\n Number(analysis.fence) !== lease.fence\n )\n return false;\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'id=? AND analysis_id=?',\n [lease.attemptId, lease.analysisId],\n );\n if (\n !attempt ||\n attempt.state !== 'running' ||\n attempt.lease_token !== lease.token ||\n persistedDate(attempt.lease_until) <= this.now()\n )\n return false;\n const attemptData = {\n ...object(attempt.data),\n ...output,\n completedAt: this.now().toISOString(),\n };\n await db.query(\n 'UPDATE intake_analysis_attempts SET state=?,output_digest=?,safe_error=?,confidence=?,data=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n output.status,\n outputDigest,\n output.error ?? '',\n output.confidence ?? null,\n canonical(attemptData),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.attemptId,\n );\n await db.query(\n 'UPDATE intake_analyses SET state=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n output.status,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.analysisId,\n );\n await db.query(\n 'UPDATE intake_items SET processing_state=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n output.status,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n );\n if (['completed', 'partial', 'needs_attention'].includes(output.status))\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n lease.revision,\n );\n return true;\n });\n }\n /** Terminal failure accounting without a provider payload. The fixed safe error\n * and lifecycle metadata are not charged to the provider-output byte ceiling. */\n async failAnalysis(\n lease: AnalysisLease,\n category: IntakeFailure,\n ): Promise<boolean> {\n if (!failures.has(category)) throw new Error('Invalid analysis failure');\n return this.tx(async (db) => {\n await this.lock(db, lease.itemId);\n const item = await this.item(lease.itemId, 'process', db);\n if (item.cancelled || Number(item.analysis_revision) !== lease.revision)\n return false;\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [lease.analysisId, lease.itemId],\n );\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'id=? AND analysis_id=? AND item_id=?',\n [lease.attemptId, lease.analysisId, lease.itemId],\n );\n if (\n !analysis ||\n !attempt ||\n Number(analysis.revision) !== lease.revision ||\n analysis.current_attempt_id !== lease.attemptId ||\n Number(analysis.fence) !== lease.fence ||\n Number(attempt.fence) !== lease.fence ||\n attempt.state !== 'running' ||\n attempt.lease_token !== lease.token ||\n persistedDate(attempt.lease_until) <= this.now()\n )\n return false;\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='needs_attention',safe_error=?,data=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n category,\n canonical({\n ...object(attempt.data),\n completedAt: this.now().toISOString(),\n }),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.attemptId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.analysisId,\n );\n await db.query(\n \"UPDATE intake_items SET processing_state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n lease.revision,\n );\n return true;\n });\n }\n /** Cancel pending processing immediately; original receipt remains ready. */\n async cancel(itemId: string): Promise<void> {\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'process', db);\n await db.query(\n \"UPDATE intake_items SET cancelled=?,processing_state='cancelled' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n true,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded',safe_error='cancelled' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n });\n }\n /** Mint an action only on an explicit host intention, never during reanalysis. */\n async createAction(\n itemId: string,\n actionKey: string,\n provenance: Record<string, unknown>,\n ): Promise<string> {\n nonempty(actionKey);\n const payload = canonical(provenance);\n return this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (item.cancelled) throw new Error('Intake cancelled');\n const [existing] = await this.rows(\n db,\n 'intake_actions',\n 'item_id=? AND action_key=?',\n [itemId, actionKey],\n );\n if (existing) {\n if (canonical(object(existing.data)) !== payload)\n throw new Error('Action identity conflict');\n return String(existing.id);\n }\n const [action] = await this.insert(db, 'intake_actions', {\n item_id: itemId,\n action_key: actionKey,\n state: 'proposed',\n proposal_revision: 0,\n review_version: 0,\n execution_attempt: 0,\n fence: 0,\n result_digest: '',\n data: payload,\n });\n return String(action.id);\n });\n }\n /** Append a proposal pinned to a completed attempt. Policy/preview is host-owned. */\n async publishProposal(input: {\n itemId: string;\n actionId: string;\n attemptId: string;\n expectedRevision: number;\n binding: Record<string, unknown>;\n }): Promise<{ id: string; revision: number; bindingHash: string }> {\n canonical(input.binding);\n return this.tx(async (db) => {\n await this.lock(db, input.itemId);\n const item = await this.item(input.itemId, 'process', db);\n if (item.cancelled) throw new Error('Intake cancelled');\n const [action] = await this.rows(\n db,\n 'intake_actions',\n 'item_id=? AND id=?',\n [input.itemId, input.actionId],\n );\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'item_id=? AND id=?',\n [input.itemId, input.attemptId],\n );\n if (\n !action ||\n !attempt ||\n !['completed', 'partial'].includes(String(attempt.state)) ||\n !attempt.output_digest\n )\n throw new Error('Invalid proposal evidence');\n if (\n Number(action.proposal_revision) !== input.expectedRevision ||\n ['succeeded', 'executing', 'outcome_unknown'].includes(\n String(action.state),\n )\n )\n throw new Error('Proposal conflict');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [attempt.analysis_id, input.itemId],\n );\n if (\n !analysis ||\n Number(analysis.revision) !== Number(item.analysis_revision)\n )\n throw new Error('Proposal conflict');\n const bindingHash = digest({\n binding: input.binding,\n attemptId: attempt.id,\n attemptDigest: attempt.output_digest,\n inputDigest: analysis.input_digest,\n });\n const revision = input.expectedRevision + 1;\n const [proposal] = await this.insert(db, 'intake_proposals', {\n item_id: input.itemId,\n action_id: input.actionId,\n analysis_id: attempt.analysis_id,\n analysis_attempt_id: attempt.id,\n revision,\n binding_hash: bindingHash,\n data: canonical({\n binding: input.binding,\n attemptDigest: attempt.output_digest,\n }),\n });\n await db.query(\n \"UPDATE intake_actions SET proposal_revision=?,state='waiting_review',review_version=review_version+1 WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n revision,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n input.actionId,\n );\n return { id: String(proposal.id), revision, bindingHash };\n });\n }\n /** Persist frozen plan structure; no expansion or apply authority is implied. */\n async appendPlan(\n itemId: string,\n planKey: string,\n revision: number,\n steps: Array<{ actionId: string; proposalRevision: number }>,\n definition: Record<string, unknown>,\n ): Promise<string> {\n nonempty(planKey);\n integer(revision);\n return this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'process', db);\n if (\n !steps.length ||\n new Set(steps.map((s) => s.actionId)).size !== steps.length\n )\n throw new Error('Invalid plan');\n for (const step of steps) {\n const [proposal] = await this.rows(\n db,\n 'intake_proposals',\n 'item_id=? AND action_id=? AND revision=?',\n [itemId, step.actionId, step.proposalRevision],\n );\n if (!proposal) throw new Error('Invalid plan binding');\n }\n const data = canonical({ steps, definition });\n const hash = digest({ steps, definition });\n const previous = await this.rows(\n db,\n 'intake_plans',\n 'item_id=? AND plan_key=?',\n [itemId, planKey],\n );\n const replay = previous.find((p) => Number(p.revision) === revision);\n if (replay) {\n if (replay.digest !== hash) throw new Error('Plan conflict');\n return String(replay.id);\n }\n if (\n revision !==\n Math.max(0, ...previous.map((p) => Number(p.revision))) + 1\n )\n throw new Error('Plan revision conflict');\n const [plan] = await this.insert(db, 'intake_plans', {\n item_id: itemId,\n plan_key: planKey,\n revision,\n digest: hash,\n data,\n });\n return String(plan.id);\n });\n }\n /** Revoke immediately and durably schedule deletion before external I/O. */\n async expire(itemId: string): Promise<void> {\n await this.scheduleExpiry(itemId);\n await this.repairDeletions();\n }\n private async scheduleExpiry(itemId: string): Promise<void> {\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'delete', db, true);\n await db.query(\n \"UPDATE intake_items SET visibility='expired',processing_state='expired',cancelled=?,lease_token='',lease_until=NULL WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n true,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_evidence SET state='revoked' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n const originals = await this.rows(db, 'intake_evidence', 'item_id=?', [\n itemId,\n ]);\n const cleanup = originals\n .filter((e) => e.asset_id && e.source_uri)\n .map((e) => ({ assetId: e.asset_id, sourceUri: e.source_uri }));\n await this.insert(\n db,\n 'intake_deletions',\n { item_id: itemId, state: 'pending', data: canonical({ cleanup }) },\n 'tenant_id,item_id',\n );\n });\n }\n /** Retry privacy propagation. Minimal receipt/action identities remain replay-safe. */\n async repairDeletions(): Promise<number> {\n let completed = 0;\n const pending = await this.rows(this.db, 'intake_deletions');\n for (const intent of pending) {\n const itemId = String(intent.item_id);\n await this.item(itemId, 'delete', this.db, true);\n const evidence = await this.rows(\n this.db,\n 'intake_evidence',\n 'item_id=?',\n [itemId],\n );\n for (const row of evidence) {\n if (!row.asset_id) continue;\n const asset = await withTenant({ tenantId: this.scope.tenantId }, () =>\n this.options.assets.collection.get({ id: String(row.asset_id) }),\n );\n if (asset) {\n if (asset.tenantId !== this.scope.tenantId)\n throw new Error('Asset unavailable');\n await this.options.assets.store.remove(asset);\n }\n }\n // Retain cleanup locators after revocation: a killed stale writer may finish\n // storage I/O after owner deletion. Repeated sweeps remove those bytes too.\n const cleanup = object(intent.data).cleanup;\n if (Array.isArray(cleanup))\n for (const entry of cleanup) {\n const locator = object(entry);\n const asset = new Asset({ db: this.db });\n asset.id = String(locator.assetId);\n asset.tenantId = this.scope.tenantId;\n asset.sourceUri = String(locator.sourceUri);\n // Remove the object directly through the public store, even when its\n // database record has already been pruned.\n await this.options.assets.store.removeFile(asset);\n }\n if (intent.state === 'completed') continue;\n await this.options.purgeDerived({\n tenantId: this.scope.tenantId,\n itemId,\n });\n await this.point('deleted');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'delete', db, true);\n for (const table of TABLES.filter(\n (t) => t !== 'intake_items' && t !== 'intake_deletions',\n ))\n await db.query(\n `UPDATE ${table} SET data='{}' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_evidence SET source_uri='',content_hash='',media_type='',byte_length=0 WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_items SET data=?,trace_id='' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n canonical({\n capturedCeiling: object(item.data).capturedCeiling ?? {},\n }),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_deletions SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n );\n });\n completed++;\n }\n return completed;\n }\n /** Run host-configured expiry policy and retry interrupted deletion propagation. */\n async sweepRetention(): Promise<number> {\n const expired = await this.rows(\n this.db,\n 'intake_items',\n \"visibility='active' AND expires_at<=?\",\n [this.now().toISOString()],\n );\n try {\n for (const item of expired) await this.scheduleExpiry(String(item.id));\n } catch (error) {\n // A later denial must not strand already committed deletion intents.\n // Preserve the scheduling failure even if cleanup also needs a retry.\n try {\n await this.repairDeletions();\n } catch {\n // Durable intents remain available to the next authorized repair.\n }\n throw error;\n }\n await this.repairDeletions();\n return expired.length;\n }\n}\n\nexport * from './extraction.js';\nexport type * from './feedback-contracts.js';\nexport { GenerationSnapshotStaleError } from './proposal-errors.js';\nexport {\n createIntakeReviewHost,\n type IntakeReviewHostOptions,\n} from './review-host.js';\nexport * from './sources/index.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":["handler","item","asset","job"],"sources":["../src/review-analysis.ts","../src/review-summary.ts","../src/review-host.ts","../src/sources/common.ts","../src/sources/email.ts","../src/sources/http.ts","../src/sources/watch-folder.ts","../src/server.ts"],"sourcesContent":["import type { IntakeItemDTO } from './dto.js';\nimport type { CompletedAnalysisSnapshot } from './proposal-dto.js';\nimport { GenerationSnapshotStaleError } from './proposal-errors.js';\nimport type { ReviewPage } from './review-dto.js';\nimport type { IngestionService } from './server.js';\n/** Optional generation availability never substitutes for current saved-review authority. */\nexport async function loadReviewAnalysis(\n service: IngestionService,\n item: IntakeItemDTO,\n reviews: ReviewPage,\n cursor?: string,\n): Promise<{ reviews: ReviewPage; analysis?: CompletedAnalysisSnapshot }> {\n if (\n !['completed', 'partial'].includes(item.processingState) ||\n reviews.generationStale\n )\n return { reviews };\n try {\n return { reviews, analysis: await service.getCompletedAnalysis(item.id) };\n } catch (error) {\n if (!(error instanceof GenerationSnapshotStaleError)) throw error;\n // The old page is not a fallback: authority may have changed during snapshot reads.\n return { reviews: await service.listReviews(item.id, { cursor }) };\n }\n}\n","import type { IntakeItemDTO } from './dto.js';\nimport type { InboxState, ReviewPage } from './review-dto.js';\nimport type { IngestionService } from './server.js';\n\n/** Whole-item state requires each page's live handler, parent and target gates. */\nexport async function loadReviewSummary(\n service: IngestionService,\n item: IntakeItemDTO,\n requestedCursor?: string,\n): Promise<{ reviews: ReviewPage; state: InboxState }> {\n let requested: ReviewPage | undefined;\n if (requestedCursor !== undefined)\n requested = await service.listReviews(item.id, { cursor: requestedCursor });\n let cursor: string | undefined;\n let total = 0,\n succeeded = 0,\n deferred = 0,\n failed = 0;\n const cursors = new Set<string>();\n do {\n const page = await service.listReviews(item.id, { cursor });\n if (requestedCursor === undefined && cursor === undefined) requested = page;\n for (const action of page.actions) {\n total++;\n if (action.review.state === 'succeeded') succeeded++;\n if (action.review.state === 'deferred') deferred++;\n if (['failed', 'outcome_unknown'].includes(action.review.state)) failed++;\n }\n cursor = page.nextCursor;\n if (cursor && cursors.has(cursor))\n throw new Error('Repeated review cursor');\n if (cursor) cursors.add(cursor);\n // Other pages are discarded; only scalar state and the requested page survive.\n } while (cursor);\n const current = await service.getItem(item.id);\n if (!requested) throw new Error('Review page unavailable');\n const state: InboxState = total\n ? succeeded === total\n ? 'completed'\n : succeeded\n ? 'partially_completed'\n : deferred\n ? 'deferred'\n : failed\n ? 'failed'\n : 'waiting'\n : ['queued', 'running'].includes(current.processingState)\n ? 'processing'\n : current.processingState === 'needs_attention'\n ? 'failed'\n : 'unresolved';\n return { reviews: requested, state };\n}\n","/** Server-side implementation of the transport-neutral review callback contract. */\nimport type { IntakeEvidenceDTO, IntakeItemDTO } from './dto.js';\nimport type { GenerationAnalysisOutput } from './proposal-dto.js';\nimport { loadReviewAnalysis } from './review-analysis.js';\nimport type {\n Assignment,\n EvidenceView,\n InboxEntry,\n IntakeReviewHost,\n} from './review-dto.js';\nimport { loadReviewSummary } from './review-summary.js';\nimport type { IngestionService } from './server.js';\n\n/** Trusted application adapters, bound to the same authenticated session as service. */\nexport interface IntakeReviewHostOptions {\n /** Authenticate receipt, enforce upload limits, and request the first extraction. */\n upload: IntakeReviewHost['upload'];\n /** Read durable assignment state; assignment never grants ingestion permissions. */\n assignment(itemId: string): Promise<Assignment>;\n /** Authorize manager/assignee and enforce durable CAS plus request-id replay checks. */\n assign: IntakeReviewHost['assign'];\n /** Produce safe text or an authenticated same-origin URL; never storage keys. */\n evidence(\n evidence: IntakeEvidenceDTO,\n ): Promise<Omit<EvidenceView, 'evidence'>>;\n label?(item: IntakeItemDTO): string;\n /** Expose the optional feedback UI only when the service has feedback configured. */\n enableFeedback?: boolean;\n /** Optional wakeup after a durable logical split has queued extraction. */\n onSplit?(itemId: string, revision: number): Promise<void>;\n}\n\n/**\n * Create callbacks for one authenticated service scope. Create a fresh host when\n * the session changes; HTTP authentication and CSRF remain application duties.\n */\nexport function createIntakeReviewHost(\n service: IngestionService,\n options: IntakeReviewHostOptions,\n): IntakeReviewHost {\n const label =\n options.label ?? ((item: IntakeItemDTO) => `Intake ${item.id.slice(0, 8)}`);\n const entry = async (item: IntakeItemDTO): Promise<InboxEntry> => {\n const { state } = await loadReviewSummary(service, item);\n const assignment = await options.assignment(item.id);\n await service.getItem(item.id);\n return { item, label: label(item), state, assignment };\n };\n return {\n async list(input) {\n const items = (await service.listItems())\n .sort((a, b) => a.id.localeCompare(b.id))\n .filter((item) => !input.cursor || item.id > input.cursor)\n .slice(0, 21);\n const projected: InboxEntry[] = [];\n for (const item of items.slice(0, 20)) {\n const current = await entry(item);\n if (\n (!input.state || current.state === input.state) &&\n (!input.assigneeId ||\n current.assignment.assigneeId === input.assigneeId)\n )\n projected.push(current);\n }\n return {\n items: projected,\n ...(items.length > 20 ? { nextCursor: items[19].id } : {}),\n };\n },\n async load(itemId, cursor) {\n const item = await service.getItem(itemId);\n const summary = await loadReviewSummary(service, item, cursor);\n const { analysis, reviews } = await loadReviewAnalysis(\n service,\n item,\n summary.reviews,\n cursor,\n );\n const evidence: EvidenceView[] = [];\n for (const part of await service.getEvidence(itemId)) {\n evidence.push({ ...(await options.evidence(part)), evidence: part });\n }\n const assignment = await options.assignment(itemId);\n await service.getItem(itemId);\n return {\n entry: { item, label: label(item), state: summary.state, assignment },\n evidence,\n analysis,\n reviews,\n availability: 'available',\n ...(analysis?.configuration.stage === 'interpret'\n ? {\n generation: (\n analysis.result.output as unknown as GenerationAnalysisOutput\n ).proposals,\n }\n : {}),\n };\n },\n upload: (files, requestId) => options.upload(files, requestId),\n async preview(input) {\n if (\n !Number.isSafeInteger(input.index) ||\n input.index < 0 ||\n typeof input.attemptId !== 'string' ||\n !input.attemptId ||\n typeof input.requestId !== 'string' ||\n !input.requestId.trim()\n )\n throw new Error('Invalid preview');\n const analysis = await service.getCompletedAnalysis(\n input.itemId,\n input.attemptId,\n );\n const generation = (\n analysis.result.output as unknown as GenerationAnalysisOutput\n ).proposals;\n if (\n analysis.configuration.stage !== 'interpret' ||\n generation?.suggestions[input.index]?.disposition !== 'ready_for_review'\n )\n throw new Error('Preview unavailable');\n const suggestion = generation.suggestions[input.index];\n const handler = generation.offered.find(\n ({ handler }) =>\n handler.id === suggestion.handlerId &&\n handler.version === suggestion.handlerVersion,\n )?.handler;\n if (!handler) throw new Error('Preview unavailable');\n const intentionKey = `ui:${input.index}`;\n const actionId =\n handler.kind === 'plan'\n ? undefined\n : await service.createAction(input.itemId, intentionKey, {\n origin: 'generated-proposal',\n intentionKey,\n });\n let cursor: string | undefined;\n let expectedRevision = 0;\n const cursors = new Set<string>();\n do {\n const page = await service.listReviews(input.itemId, { cursor });\n const found = page.actions.find((action) =>\n handler.kind === 'plan'\n ? (action.plan?.key ?? action.stalePlan?.key) === intentionKey\n : action.review.actionId === actionId,\n );\n if (found) {\n const binding = handler.kind === 'plan' ? found.plan : found;\n expectedRevision =\n handler.kind === 'plan'\n ? (found.plan?.revision ?? found.stalePlan?.revision ?? 0)\n : found.review.revision;\n // Preparing an unchanged, currently authorized suggestion is idempotent.\n // State-only stale entries never satisfy this shortcut.\n if (\n binding?.attemptId === input.attemptId &&\n binding.handlerId === suggestion.handlerId &&\n binding.handlerVersion === suggestion.handlerVersion &&\n binding.args\n ) {\n const { intakeBindingDigest } = await import('./execution.js');\n if (\n intakeBindingDigest(binding.args) ===\n intakeBindingDigest(suggestion.args)\n )\n return;\n }\n break;\n }\n cursor = page.nextCursor;\n if (cursor && cursors.has(cursor))\n throw new Error('Repeated review cursor');\n if (cursor) cursors.add(cursor);\n } while (cursor);\n await service.previewGeneratedProposals({\n itemId: input.itemId,\n attemptId: input.attemptId,\n selections: [\n {\n index: input.index,\n intentionKey,\n expectedRevision,\n requestId: input.requestId,\n },\n ],\n });\n },\n async decide(input) {\n await service.submitDecision(input);\n },\n apply: (actionId) => service.applyAction(actionId),\n async editPlan(input) {\n await service.previewPlan(input);\n },\n async editAction(input) {\n await service.previewProposal(input);\n },\n candidates: (input) => service.findCandidates(input),\n async assign(input) {\n await service.getItem(input.itemId);\n await options.assign(input);\n },\n async split(input) {\n const result = await service.reviseLogicalSplit(input);\n await options.onSplit?.(input.itemId, result.revision);\n },\n ...(options.enableFeedback\n ? {\n feedback: (\n input: Parameters<NonNullable<IntakeReviewHost['feedback']>>[0],\n ) => service.recordFeedback(input),\n }\n : {}),\n };\n}\n","import type { ReceiptResult } from '../dto.js';\nimport type { IngestionService, IntakePart, ReceiveInput } from '../server.js';\n\n/** Host configuration, reconstructed from authenticated session/account state. */\nexport interface SourceBinding {\n enabled: boolean;\n service: Pick<IngestionService, 'receive'>;\n sourceId: string;\n sourceVersion: string;\n capturedCeiling: ReceiveInput['capturedCeiling'];\n retention: ReceiveInput['retention'];\n limits: ReceiveInput['limits'];\n allowedMediaTypes: readonly string[];\n}\nexport type SourceResult =\n | ReceiptResult\n | {\n kind: 'rejected';\n category: 'authentication' | 'unsupported_type' | 'unavailable_bytes';\n };\nexport class SourceInputError extends Error {\n constructor(\n public readonly category:\n | 'invalid'\n | 'limit'\n | 'unsupported_type'\n | 'unavailable_bytes',\n ) {\n super(category);\n }\n}\nexport function record(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new SourceInputError('invalid');\n return value as Record<string, unknown>;\n}\nexport function keys(value: Record<string, unknown>, allowed: string[]): void {\n if (Object.keys(value).some((key) => !allowed.includes(key)))\n throw new SourceInputError('invalid');\n}\nexport function text(value: unknown): string {\n if (typeof value !== 'string' || !value || value.length > 1024)\n throw new SourceInputError('invalid');\n return value;\n}\nexport function timestamp(value: unknown): Date {\n const date = new Date(text(value));\n if (!Number.isFinite(date.getTime())) throw new SourceInputError('invalid');\n return date;\n}\n/** Bound bytes before parsing or handing them to the receipt service. */\nexport async function boundedBytes(\n stream: ReadableStream<Uint8Array> | null,\n limit: number,\n): Promise<Uint8Array> {\n if (!Number.isSafeInteger(limit) || limit < 1)\n throw new SourceInputError('limit');\n if (!stream) return new Uint8Array();\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > limit) {\n await reader.cancel();\n throw new SourceInputError('limit');\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n return Buffer.concat(chunks);\n}\n/** Intake validates signatures; decoding/format correctness belongs to extraction. */\nexport function validateMedia(\n bytes: Uint8Array,\n type: string,\n allowed: readonly string[],\n): void {\n if (!allowed.includes(type)) throw new SourceInputError('unsupported_type');\n const b = Buffer.from(bytes);\n const ascii = (start: number, end: number) =>\n b.subarray(start, end).toString('ascii');\n const valid: Record<string, boolean> = {\n 'application/pdf': ascii(0, 5) === '%PDF-',\n 'image/tiff':\n b.subarray(0, 4).equals(Buffer.from([73, 73, 42, 0])) ||\n b.subarray(0, 4).equals(Buffer.from([77, 77, 0, 42])),\n 'image/jpeg': b[0] === 255 && b[1] === 216 && b[2] === 255,\n 'image/png': b\n .subarray(0, 8)\n .equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10])),\n 'image/webp': ascii(0, 4) === 'RIFF' && ascii(8, 12) === 'WEBP',\n 'audio/wav': ascii(0, 4) === 'RIFF' && ascii(8, 12) === 'WAVE',\n 'audio/ogg': ascii(0, 4) === 'OggS',\n 'audio/webm': b.subarray(0, 4).equals(Buffer.from([26, 69, 223, 163])),\n 'audio/mpeg':\n ascii(0, 3) === 'ID3' || (b[0] === 255 && (b[1] & 224) === 224),\n 'audio/mp4': ascii(4, 8) === 'ftyp',\n 'text/plain': true,\n 'text/html': true,\n 'application/json': true,\n };\n if (!Object.hasOwn(valid, type) || !valid[type])\n throw new SourceInputError('unsupported_type');\n if (type.startsWith('text/') || type === 'application/json') {\n try {\n const s = new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n if (type === 'application/json') JSON.parse(s);\n } catch {\n throw new SourceInputError('invalid');\n }\n }\n}\nexport async function deliver(\n binding: SourceBinding,\n deliveryKey: string,\n deliveredAt: Date,\n parts: IntakePart[],\n): Promise<SourceResult> {\n if (!binding.enabled) return { kind: 'rejected', category: 'authentication' };\n try {\n text(deliveryKey);\n if (!Number.isFinite(deliveredAt.getTime()))\n throw new SourceInputError('invalid');\n if (\n parts.length > binding.limits.maxParts ||\n parts.reduce((n, p) => n + p.bytes.byteLength, 0) >\n binding.limits.maxBytes\n )\n throw new SourceInputError('limit');\n for (const part of parts)\n validateMedia(part.bytes, part.mediaType, binding.allowedMediaTypes);\n return await binding.service.receive({\n sourceId: binding.sourceId,\n sourceVersion: binding.sourceVersion,\n capturedCeiling: binding.capturedCeiling,\n retention: binding.retention,\n limits: binding.limits,\n deliveryKey,\n deliveredAt,\n parts,\n });\n } catch (error) {\n return safeFailure(error);\n }\n}\nexport function safeFailure(error: unknown): SourceResult {\n return error instanceof SourceInputError\n ? { kind: 'rejected', category: error.category }\n : { kind: 'retry', category: 'unavailable' };\n}\n","import type { IntakePart } from '../server.js';\nimport {\n deliver,\n type SourceBinding,\n SourceInputError,\n type SourceResult,\n safeFailure,\n text,\n} from './common.js';\n\n/** Structural messages-owner seam; EmailAccount.readIntakeMessage implements this contract. */\nexport interface EmailIntakeSnapshot {\n accountId: string;\n messageId: string;\n threadId: string;\n inReplyTo: string;\n subject: string;\n text: string;\n html: string;\n date: string;\n attachments: Array<{\n partId: string;\n filename: string;\n mediaType: string;\n bytes: Uint8Array;\n }>;\n}\nexport interface EmailDelivery {\n /** Provider/account-unique locator (e.g. folder + UIDVALIDITY + UID), not sender Message-ID alone. */\n locator: string;\n /** Explicit immutable source revision, never an automatically substituted content hash. */\n revision: string;\n checkpoint: string;\n}\nexport interface EmailSourceOptions {\n binding: SourceBinding;\n accountId: string;\n readMessage(delivery: EmailDelivery): Promise<EmailIntakeSnapshot>;\n /** Durable host checkpoint; called in input order only after accepted/duplicate. */\n acknowledge(checkpoint: string): Promise<void>;\n}\n/** Opt-in intake: hosts enumerate configured accounts and supply resumable provider locators. */\nexport class EmailSourceAdapter {\n constructor(private readonly options: EmailSourceOptions) {}\n async receive(delivery: EmailDelivery): Promise<SourceResult> {\n const { binding } = this.options;\n if (!binding.enabled)\n return { kind: 'rejected', category: 'authentication' };\n try {\n text(delivery.locator);\n text(delivery.revision);\n text(delivery.checkpoint);\n const snapshot = await this.options.readMessage(delivery);\n if (snapshot.accountId !== this.options.accountId)\n return { kind: 'rejected', category: 'authentication' };\n const { attachments } = snapshot;\n // Transport objects may carry additional provider fields. Preserve only the contract.\n const body = {\n accountId: snapshot.accountId,\n messageId: snapshot.messageId,\n threadId: snapshot.threadId,\n inReplyTo: snapshot.inReplyTo,\n subject: snapshot.subject,\n text: snapshot.text,\n html: snapshot.html,\n date: snapshot.date,\n };\n if (Object.values(body).some((value) => typeof value !== 'string')) {\n throw new SourceInputError('invalid');\n }\n const parts: IntakePart[] = [\n {\n partId: 'message',\n mediaType: 'application/json',\n bytes: Buffer.from(JSON.stringify(body)),\n sourceReference: {\n owner: 'message',\n id: delivery.locator,\n version: delivery.revision,\n },\n },\n ];\n for (const attachment of attachments) {\n if (!(attachment.bytes instanceof Uint8Array))\n throw new SourceInputError('unavailable_bytes');\n parts.push({\n partId: `attachment:${text(attachment.partId)}`,\n parentPartId: 'message',\n mediaType: attachment.mediaType,\n bytes: attachment.bytes,\n sourceReference: {\n owner: 'message-attachment',\n id: `${delivery.locator}:${attachment.partId}`,\n version: delivery.revision,\n },\n });\n }\n // Filename and part mapping are retained alongside message/thread identity.\n parts[0].bytes = Buffer.from(\n JSON.stringify({\n ...body,\n attachments: attachments.map(({ partId, filename, mediaType }) => ({\n partId,\n filename,\n mediaType,\n })),\n }),\n );\n const result = await deliver(\n binding,\n JSON.stringify([\n this.options.accountId,\n delivery.locator,\n delivery.revision,\n ]),\n new Date(snapshot.date),\n parts,\n );\n if (result.kind === 'accepted' || result.kind === 'duplicate')\n await this.options.acknowledge(delivery.checkpoint);\n return result;\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === 'EmailIntakeSnapshotError' &&\n 'category' in error\n ) {\n const category = error.category;\n if (\n category === 'invalid' ||\n category === 'limit' ||\n category === 'unavailable_bytes'\n ) {\n return { kind: 'rejected', category };\n }\n }\n return safeFailure(error);\n }\n }\n async receiveBatch(\n deliveries: readonly EmailDelivery[],\n ): Promise<SourceResult[]> {\n const results: SourceResult[] = [];\n for (const delivery of deliveries) {\n const result = await this.receive(delivery);\n results.push(result);\n if (result.kind !== 'accepted' && result.kind !== 'duplicate') break;\n }\n return results;\n }\n}\n","import type { IntakePart } from '../server.js';\nimport {\n boundedBytes,\n deliver,\n keys,\n record,\n type SourceBinding,\n SourceInputError,\n type SourceResult,\n safeFailure,\n text,\n timestamp,\n} from './common.js';\n\nexport interface AuthenticatedSource extends SourceBinding {\n /** Explicit wire limit includes multipart framing and capture metadata. */\n maxRequestBytes: number;\n /** Host proves ownership/current access and copies immutable owner bytes. */\n snapshotReference?(reference: {\n owner: 'asset' | 'message';\n id: string;\n version: string;\n }): Promise<IntakePart[]>;\n}\nexport interface SourceHttpOptions {\n /** Authenticate and select enabled source from server configuration, never body fields. */\n authenticate(request: Request): Promise<AuthenticatedSource | null>;\n}\nfunction response(result: SourceResult): Response {\n return Response.json(result, {\n status:\n result.kind === 'accepted' || result.kind === 'duplicate'\n ? 200\n : result.kind === 'retry'\n ? 503\n : 'category' in result && result.category === 'authentication'\n ? 401\n : 'category' in result && result.category === 'limit'\n ? 413\n : 400,\n });\n}\n/** Reference Web Request handler; mobile clients reuse their durable UUID Idempotency-Key. */\nexport function createSourceDeliveryHandler(\n options: SourceHttpOptions,\n): (request: Request) => Promise<Response> {\n return async (request) => {\n try {\n const binding = await options.authenticate(request);\n if (!binding?.enabled)\n return response({ kind: 'rejected', category: 'authentication' });\n if (request.method !== 'POST') throw new SourceInputError('invalid');\n const key = text(request.headers.get('idempotency-key'));\n const length = request.headers.get('content-length');\n if (\n length &&\n (!/^\\d+$/.test(length) || Number(length) > binding.maxRequestBytes)\n )\n throw new SourceInputError('limit');\n const bytes = await boundedBytes(request.body, binding.maxRequestBytes);\n const type = request.headers.get('content-type') || '';\n let deliveredAt: Date;\n const parts: IntakePart[] = [];\n if (type.split(';')[0] === 'application/json') {\n let payload: Record<string, unknown>;\n try {\n payload = record(\n JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes)),\n );\n } catch {\n throw new SourceInputError('invalid');\n }\n keys(payload, ['capturedAt', 'text', 'structured', 'reference']);\n deliveredAt = timestamp(payload.capturedAt);\n if (\n ['text', 'structured', 'reference'].filter(\n (field) => payload[field] !== undefined,\n ).length !== 1\n )\n throw new SourceInputError('invalid');\n if (payload.text !== undefined) {\n if (typeof payload.text !== 'string')\n throw new SourceInputError('invalid');\n parts.push({\n partId: 'body',\n mediaType: 'text/plain',\n bytes: Buffer.from(payload.text),\n });\n } else if (payload.structured !== undefined) {\n parts.push({\n partId: 'body',\n mediaType: 'application/json',\n bytes: Buffer.from(JSON.stringify(record(payload.structured))),\n });\n } else {\n const ref = record(payload.reference);\n keys(ref, ['owner', 'id', 'version']);\n if (\n (ref.owner !== 'asset' && ref.owner !== 'message') ||\n !binding.snapshotReference\n )\n throw new SourceInputError('invalid');\n const reference = {\n owner: ref.owner,\n id: text(ref.id),\n version: text(ref.version),\n } as const;\n const snapshots = await binding.snapshotReference(reference);\n if (!snapshots.length)\n throw new SourceInputError('unavailable_bytes');\n for (const part of snapshots)\n parts.push({\n ...part,\n sourceReference: part.sourceReference ?? reference,\n });\n }\n } else if (type.startsWith('multipart/form-data;')) {\n let form: FormData;\n try {\n form = await new Response(Buffer.from(bytes), {\n headers: { 'content-type': type },\n }).formData();\n } catch {\n throw new SourceInputError('invalid');\n }\n const fields: Record<string, string> = {};\n for (const [name, value] of form.entries()) {\n if (typeof value === 'string') {\n if (\n !['captureId', 'capturedAt', 'captureSource', 'sha256'].includes(\n name,\n ) ||\n fields[name] !== undefined\n )\n throw new SourceInputError('invalid');\n fields[name] = value;\n } else {\n if (name !== 'file' || parts.length)\n throw new SourceInputError('invalid');\n parts.push({\n partId: 'file',\n parentPartId: 'capture',\n mediaType: value.type,\n bytes: await boundedBytes(\n value.stream(),\n binding.limits.maxBytes,\n ),\n });\n }\n }\n if (\n parts.length !== 1 ||\n text(fields.captureId) !== key ||\n !['camera', 'native_picker', 'audio', 'document'].includes(\n fields.captureSource,\n )\n )\n throw new SourceInputError('invalid');\n deliveredAt = timestamp(fields.capturedAt);\n if (fields.sha256) {\n if (!/^[a-f0-9]{64}$/.test(fields.sha256))\n throw new SourceInputError('invalid');\n parts[0].expectedHash = fields.sha256;\n }\n parts.unshift({\n partId: 'capture',\n mediaType: 'application/json',\n bytes: Buffer.from(\n JSON.stringify({\n captureId: fields.captureId,\n capturedAt: fields.capturedAt,\n captureSource: fields.captureSource,\n ...(fields.sha256 === undefined ? {} : { sha256: fields.sha256 }),\n }),\n ),\n });\n } else throw new SourceInputError('unsupported_type');\n return response(await deliver(binding, key, deliveredAt, parts));\n } catch (error) {\n return response(\n error instanceof SyntaxError\n ? { kind: 'rejected', category: 'invalid' }\n : safeFailure(error),\n );\n }\n };\n}\n\nexport interface VerifiedVendorDelivery {\n binding: SourceBinding;\n deliveryKey: string;\n deliveredAt: Date;\n parts: IntakePart[];\n}\n/** Vendor implementation owns signature/timestamp verification and replay identity. */\nexport function createVendorWebhookHandler(options: {\n maxRequestBytes: number;\n verify(\n request: Request,\n originalBytes: Uint8Array,\n ): Promise<VerifiedVendorDelivery | null>;\n}): (request: Request) => Promise<Response> {\n return async (request) => {\n try {\n if (request.method !== 'POST') throw new SourceInputError('invalid');\n const bytes = await boundedBytes(request.body, options.maxRequestBytes);\n const verified = await options.verify(request, bytes);\n if (!verified)\n return response({ kind: 'rejected', category: 'authentication' });\n return response(\n await deliver(\n verified.binding,\n verified.deliveryKey,\n verified.deliveredAt,\n verified.parts,\n ),\n );\n } catch (error) {\n return response(safeFailure(error));\n }\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { constants } from 'node:fs';\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n readFile,\n rename,\n writeFile,\n} from 'node:fs/promises';\nimport { join } from 'node:path';\nimport {\n deliver,\n type SourceBinding,\n SourceInputError,\n type SourceResult,\n safeFailure,\n} from './common.js';\n\nexport interface WatchFolderOptions {\n binding: SourceBinding;\n /** Private producer directory; claims and processed live on the same filesystem. */\n directory: string;\n stabilityMs: number;\n now?: () => number;\n /** Observability/crash injection. Never receives file content or credentials. */\n checkpoint?(boundary: 'claimed' | 'received', claimId: string): Promise<void>;\n}\nexport interface WatchFolderResult {\n claimId?: string;\n filename: string;\n result: SourceResult;\n}\ninterface Claim {\n id: string;\n filename: string;\n capturedAt: string;\n sourceId: string;\n sourceVersion: string;\n}\ninterface Observation {\n fingerprint: string;\n since: number;\n}\n/** Files remain in claims until the durable receipt succeeds. A restart safely replays them. */\nexport class WatchFolderSourceAdapter {\n private readonly observations = new Map<string, Observation>();\n private polling = false;\n constructor(private readonly options: WatchFolderOptions) {\n if (!Number.isSafeInteger(options.stabilityMs) || options.stabilityMs < 1)\n throw new Error('Positive stability interval required');\n }\n private async stable(path: string): Promise<boolean> {\n const stat = await lstat(path);\n if (!stat.isFile() || stat.isSymbolicLink())\n throw new SourceInputError('invalid');\n const fingerprint = [\n stat.dev,\n stat.ino,\n stat.size,\n stat.mtimeMs,\n stat.ctimeMs,\n ].join(':');\n const now = (this.options.now ?? Date.now)();\n const prior = this.observations.get(path);\n if (!prior || prior.fingerprint !== fingerprint) {\n this.observations.set(path, { fingerprint, since: now });\n return false;\n }\n return now - prior.since >= this.options.stabilityMs;\n }\n private async syncDirectory(path: string): Promise<void> {\n const directory = await open(path, constants.O_RDONLY);\n try {\n await directory.sync();\n } finally {\n await directory.close();\n }\n }\n private async importClaim(\n directory: string,\n claim: Claim,\n ): Promise<WatchFolderResult | null> {\n const path = join(directory, 'original');\n try {\n if (!(await this.stable(path))) return null;\n const handle = await open(\n path,\n constants.O_RDONLY | constants.O_NOFOLLOW,\n );\n let bytes: Buffer;\n try {\n const before = await handle.stat();\n if (before.size > this.options.binding.limits.maxBytes)\n throw new SourceInputError('limit');\n bytes = Buffer.alloc(before.size);\n let offset = 0;\n while (offset < bytes.length) {\n const { bytesRead } = await handle.read(\n bytes,\n offset,\n bytes.length - offset,\n offset,\n );\n if (!bytesRead) throw new SourceInputError('invalid');\n offset += bytesRead;\n }\n const after = await handle.stat();\n if (\n before.size !== after.size ||\n before.mtimeMs !== after.mtimeMs ||\n before.ctimeMs !== after.ctimeMs\n )\n throw new SourceInputError('invalid');\n } finally {\n await handle.close();\n }\n const mediaType = /\\.pdf$/i.test(claim.filename)\n ? 'application/pdf'\n : 'image/tiff';\n const result = await deliver(\n this.options.binding,\n claim.id,\n new Date(claim.capturedAt),\n [\n {\n partId: 'original',\n mediaType,\n bytes,\n sourceReference: {\n owner: 'watch-folder',\n id: claim.filename,\n version: claim.id,\n },\n },\n ],\n );\n if (result.kind === 'accepted' || result.kind === 'duplicate') {\n await this.options.checkpoint?.('received', claim.id);\n await rename(\n directory,\n join(this.options.directory, '.ingestion-processed', claim.id),\n );\n await this.syncDirectory(\n join(this.options.directory, '.ingestion-processed'),\n );\n await this.syncDirectory(\n join(this.options.directory, '.ingestion-claims'),\n );\n this.observations.delete(path);\n } else\n await writeFile(\n join(directory, 'failure.json'),\n JSON.stringify(result),\n { mode: 0o600 },\n );\n return { claimId: claim.id, filename: claim.filename, result };\n } catch (error) {\n const result = safeFailure(error);\n // Error categories only; no raw transport paths, secrets or exception text.\n await writeFile(join(directory, 'failure.json'), JSON.stringify(result), {\n mode: 0o600,\n }).catch(() => {});\n return { claimId: claim.id, filename: claim.filename, result };\n }\n }\n async poll(): Promise<WatchFolderResult[]> {\n if (!this.options.binding.enabled || this.polling) return [];\n this.polling = true;\n const results: WatchFolderResult[] = [];\n try {\n const root = this.options.directory;\n const claims = join(root, '.ingestion-claims');\n const processed = join(root, '.ingestion-processed');\n // Only an explicitly configured, existing directory is touched.\n const rootStat = await lstat(root);\n if (!rootStat.isDirectory() || rootStat.isSymbolicLink())\n throw new SourceInputError('invalid');\n await mkdir(claims, { recursive: true, mode: 0o700 });\n await mkdir(processed, { recursive: true, mode: 0o700 });\n for (const privatePath of [claims, processed])\n if ((await lstat(privatePath)).isSymbolicLink())\n throw new SourceInputError('invalid');\n for (const entry of await readdir(claims, { withFileTypes: true })) {\n if (!entry.isDirectory() || !/^[a-f0-9-]{36}$/.test(entry.name))\n continue;\n const directory = join(claims, entry.name);\n try {\n const claim = JSON.parse(\n await readFile(join(directory, 'claim.json'), 'utf8'),\n ) as Claim;\n if (\n claim.id !== entry.name ||\n claim.sourceId !== this.options.binding.sourceId ||\n claim.sourceVersion !== this.options.binding.sourceVersion\n )\n throw new SourceInputError('invalid');\n // A crash before rename leaves an intent without original; producer file remains untouched.\n try {\n await lstat(join(directory, 'original'));\n } catch {\n continue;\n }\n const result = await this.importClaim(directory, claim);\n if (result) results.push(result);\n } catch (error) {\n results.push({\n claimId: entry.name,\n filename: '',\n result: safeFailure(error),\n });\n }\n }\n for (const entry of await readdir(root, { withFileTypes: true })) {\n if (!/\\.(pdf|tiff?)$/i.test(entry.name)) continue;\n const path = join(root, entry.name);\n try {\n if (!(await this.stable(path))) continue;\n const stat = await lstat(path);\n const claim: Claim = {\n id: randomUUID(),\n filename: entry.name,\n capturedAt: new Date(stat.mtimeMs).toISOString(),\n sourceId: this.options.binding.sourceId,\n sourceVersion: this.options.binding.sourceVersion,\n };\n const directory = join(claims, claim.id);\n await mkdir(directory, { mode: 0o700 });\n const metadata = await open(\n join(directory, 'claim.json'),\n 'wx',\n 0o600,\n );\n try {\n await metadata.writeFile(JSON.stringify(claim));\n await metadata.sync();\n } finally {\n await metadata.close();\n }\n await this.syncDirectory(directory);\n await this.syncDirectory(claims);\n await rename(path, join(directory, 'original'));\n await this.syncDirectory(directory);\n await this.syncDirectory(root);\n this.observations.delete(path);\n await this.options.checkpoint?.('claimed', claim.id);\n // Re-observe after rename: a producer may still hold its writing descriptor.\n await this.stable(join(directory, 'original'));\n } catch (error) {\n results.push({ filename: entry.name, result: safeFailure(error) });\n }\n }\n return results;\n } finally {\n this.polling = false;\n }\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { Asset, type AssetRuntimeLike } from '@happyvertical/smrt-assets';\nimport {\n detectEngine,\n isEmbeddedDatabase,\n isTransientDatabaseError,\n withEmbeddedWriteTransaction,\n} from '@happyvertical/smrt-core';\nimport { SmrtJobCollection } from '@happyvertical/smrt-jobs';\nimport { withTenant } from '@happyvertical/smrt-tenancy';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport type {\n AnalysisOutput,\n IntakeEvidenceDTO,\n IntakeFailure,\n IntakeItemDTO,\n IntakeLimits,\n ReceiptResult,\n} from './dto.js';\nimport { generationSnapshotRead } from './execution-internal.js';\nimport { assertProposalLimits } from './proposal-limits.js';\nimport './models.js';\nimport type {\n IntakeExecutionOptions,\n PreviewPlanInput,\n PreviewProposalInput,\n ReviewInput,\n} from './execution-contracts.js';\nimport type { FeedbackConfiguration } from './feedback-contracts.js';\nimport type {\n AdoptRuleInput,\n ObserveFeedbackInput,\n ReadRuleInput,\n RecordFeedbackInput,\n RetrieveFeedbackInput,\n SuggestRuleInput,\n} from './feedback-dto.js';\nimport type { ProposalConfiguration } from './proposal-contracts.js';\nimport type {\n CompletedAnalysisSnapshot,\n PreviewGeneratedInput,\n} from './proposal-dto.js';\nimport type { LogicalSplitInput } from './review-dto.js';\n\n/** Authenticated host context. Never construct this from transport JSON. */\nexport interface IngestionScope {\n tenantId: string;\n actorId: string;\n confidentialScopeId: string;\n}\n/** A source part is already authenticated by the host/source adapter. */\nexport interface IntakePart {\n partId: string;\n parentPartId?: string;\n mediaType: string;\n bytes: Uint8Array;\n expectedHash?: string;\n sourceReference?: { owner: string; id: string; version: string };\n}\n/** Host-resolved delivery and retention policy, never untrusted content labels. */\nexport interface ReceiveInput {\n sourceId: string;\n sourceVersion: string;\n deliveryKey: string;\n deliveredAt: Date;\n parts: IntakePart[];\n capturedCeiling: Record<string, unknown>;\n retention: {\n version: string;\n expiresAt: Date;\n replayUntil: Date;\n acceptAfter: Date;\n };\n limits: IntakeLimits;\n traceId?: string;\n}\n/** Durable attempt claim. Its fence and token are verified on every completion. */\nexport interface AnalysisLease {\n itemId: string;\n analysisId: string;\n attemptId: string;\n revision: number;\n fence: number;\n token: string;\n}\n/** A server-owned dispatch route, retained independently of source metadata. */\nexport interface IntakeDispatchTarget {\n version: 1;\n objectType: string;\n method: string;\n}\nexport interface DispatchRouteInspection {\n status: 'bound' | 'unknown' | 'conflict';\n fingerprint: string;\n target: IntakeDispatchTarget | null;\n}\n/** Trusted integration points; no provider or application-policy implementation. */\nexport interface IngestionOptions {\n /** Optional server-owned interpretation configuration; independent of execution. */\n proposals?: ProposalConfiguration;\n /** Explicit scoped learning; never inferred from analysis or execution success. */\n feedback?: FeedbackConfiguration;\n /** Optional application-owned review/execution catalog and live authority. */\n execution?: IntakeExecutionOptions;\n db: DatabaseInterface;\n assets: AssetRuntimeLike;\n scope: IngestionScope;\n /** Recheck current access for EVERY boundary, including worker completion. */\n authorize(input: {\n scope: IngestionScope;\n operation: 'receive' | 'read' | 'process' | 'delete';\n capturedCeiling: Record<string, unknown>;\n db: DatabaseInterface;\n }): Promise<boolean>;\n /** Registered job handler supplied by the host; dispatch arguments contain IDs only. */\n jobTarget: { objectType: string; method: string };\n /** Explicit operator authority for provenance-free legacy receipts; closed when omitted.\n * Does not replace the normal current/captured process authorization.\n */\n dispatchRecovery?: {\n authorize(input: {\n scope: IngestionScope;\n itemId: string;\n capturedCeiling: Record<string, unknown>;\n evidenceRef: string;\n db: DatabaseInterface;\n }): Promise<boolean>;\n };\n /** Purge host-owned embeddings/previews/caches; retries must be idempotent. */\n purgeDerived(input: { tenantId: string; itemId: string }): Promise<void>;\n now?: () => Date;\n /** Fault injection/observability; never changes authority or persistence. */\n checkpoint?: (boundary: string) => Promise<void>;\n}\n\ntype Row = Record<string, unknown>;\nconst TABLES = [\n 'intake_items',\n 'intake_evidence',\n 'intake_analyses',\n 'intake_analysis_attempts',\n 'intake_plans',\n 'intake_actions',\n 'intake_proposals',\n 'intake_review_decisions',\n 'intake_executions',\n 'intake_feedback',\n 'intake_dispatches',\n 'intake_deletions',\n] as const;\nconst failures = new Set([\n 'unsupported_type',\n 'malformed_output',\n 'limit',\n 'timeout',\n 'unavailable',\n 'authentication',\n 'cancelled',\n 'integrity',\n]);\nconst uuid =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nfunction object(value: unknown): Record<string, unknown> {\n const parsed: unknown = typeof value === 'string' ? JSON.parse(value) : value;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))\n throw new Error('Invalid intake payload');\n return parsed as Record<string, unknown>;\n}\nfunction canonical(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean')\n return JSON.stringify(value);\n if (typeof value === 'number' && Number.isFinite(value))\n return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;\n if (\n value &&\n typeof value === 'object' &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n return `{${Object.keys(value)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${canonical((value as Row)[k])}`)\n .join(',')}}`;\n }\n throw new Error('Invalid canonical intake value');\n}\nfunction digest(value: unknown): string {\n return createHash('sha256').update(canonical(value)).digest('hex');\n}\nfunction bytesHash(value: Uint8Array): string {\n return createHash('sha256').update(value).digest('hex');\n}\nfunction nonempty(value: unknown): asserts value is string {\n if (typeof value !== 'string' || !value.trim() || value.length > 512)\n throw new Error('Invalid intake identifier');\n}\nfunction integer(value: unknown, max = 2_147_483_647): asserts value is number {\n if (\n typeof value !== 'number' ||\n !Number.isSafeInteger(value) ||\n value <= 0 ||\n value > max\n )\n throw new Error('Invalid intake limit');\n}\nfunction persistedDate(value: unknown): Date {\n return value instanceof Date ? value : new Date(String(value));\n}\nfunction date(value: Date): string {\n if (!(value instanceof Date) || !Number.isFinite(value.getTime()))\n throw new Error('Invalid intake date');\n return value.toISOString();\n}\n\n/** Server-only durable lifecycle. Domain approval/execution remains a later layer. */\nexport class IngestionService {\n private readonly db: DatabaseInterface;\n private readonly scope: IngestionScope;\n private readonly dispatchTarget: IntakeDispatchTarget;\n constructor(private readonly options: IngestionOptions) {\n if (options.proposals) assertProposalLimits(options.proposals.limits);\n this.db = options.db;\n this.scope = Object.freeze({ ...options.scope });\n if (!uuid.test(this.scope.tenantId))\n throw new Error('Required tenant UUID');\n nonempty(this.scope.actorId);\n nonempty(this.scope.confidentialScopeId);\n const configured = this.db as DatabaseInterface & {\n type?: string;\n config?: { type?: string; url?: string };\n };\n const engine = detectEngine(\n this.db.url || configured.config?.url || '',\n configured.type || configured.config?.type,\n );\n if (!['sqlite', 'postgres'].includes(engine) || !this.db.transaction)\n throw new Error('Ingestion requires transactional SQLite or PostgreSQL');\n nonempty(options.jobTarget.objectType);\n nonempty(options.jobTarget.method);\n this.dispatchTarget = Object.freeze({\n version: 1,\n objectType: options.jobTarget.objectType,\n method: options.jobTarget.method,\n });\n }\n private async execution() {\n if (!this.options.execution)\n throw new Error('Intake execution is not configured');\n const { IntakeExecutionService } = await import('./execution.js');\n return new IntakeExecutionService(this.options, this.options.execution);\n }\n async previewProposal(input: PreviewProposalInput) {\n return (await this.execution()).previewProposal(input);\n }\n async submitDecision(input: ReviewInput) {\n return (await this.execution()).submitDecision(input);\n }\n async applyAction(actionId: string) {\n return (await this.execution()).applyAction(actionId);\n }\n async reconcileAction(actionId: string) {\n return (await this.execution()).reconcileAction(actionId);\n }\n async listReviews(\n itemId: string,\n input: { cursor?: string; limit?: number } = {},\n ) {\n return (await this.execution()).listReviews(itemId, input);\n }\n async getAction(actionId: string) {\n return (await this.execution()).getAction(actionId);\n }\n async authorizeAutomatic(actionId: string) {\n return (await this.execution()).authorizeAutomatic(actionId);\n }\n async previewPlan(input: PreviewPlanInput) {\n return (await this.execution()).previewPlan(input);\n }\n async applyPlan(planId: string) {\n return (await this.execution()).applyPlan(planId);\n }\n private async proposals() {\n if (!this.options.proposals)\n throw new Error('Intake proposals are not configured');\n const { IngestionProposalService } = await import('./proposals.js');\n return new IngestionProposalService(\n this,\n this.options,\n this.options.proposals,\n );\n }\n async listHandlers(itemId: string) {\n return (await this.proposals()).listHandlers(itemId);\n }\n async findCandidates(input: {\n itemId: string;\n handlerId: string;\n handlerVersion: string;\n query: string;\n limit?: number;\n }) {\n return (await this.proposals()).findCandidates(input);\n }\n async prepareGeneration(itemId: string, attemptId: string) {\n return (await this.proposals()).prepareGeneration(itemId, attemptId);\n }\n async generateProposals(lease: AnalysisLease) {\n return (await this.proposals()).generate(lease);\n }\n async previewGeneratedProposals(input: PreviewGeneratedInput) {\n return (await this.proposals()).preview(input);\n }\n private async feedback() {\n const { IntakeFeedbackService } = await import('./feedback.js');\n return new IntakeFeedbackService(this.options);\n }\n async recordFeedback(input: RecordFeedbackInput) {\n return (await this.feedback()).record(input);\n }\n async observeFeedback(input: ObserveFeedbackInput) {\n return (await this.feedback()).observe(input);\n }\n async retrieveFeedback(input: RetrieveFeedbackInput) {\n return (await this.proposals()).retrieveFeedback(input);\n }\n async suggestRoutingRule(input: SuggestRuleInput) {\n return (await this.feedback()).suggest(input);\n }\n async getRoutingRule(input: ReadRuleInput) {\n return (await this.feedback()).readRule(input);\n }\n async adoptRoutingRule(input: AdoptRuleInput) {\n return (await this.feedback()).adopt(input);\n }\n private now(): Date {\n return this.options.now?.() ?? new Date();\n }\n private async point(name: string): Promise<void> {\n await this.options.checkpoint?.(name);\n }\n private async authorize(\n operation: 'receive' | 'read' | 'process' | 'delete',\n data: Row,\n db = this.db,\n ): Promise<void> {\n if (\n !(await this.options.authorize({\n scope: this.scope,\n operation,\n capturedCeiling: object(data.capturedCeiling ?? {}),\n db,\n }))\n )\n throw new Error('Intake unavailable');\n }\n private async rows(\n db: DatabaseInterface,\n table: (typeof TABLES)[number],\n where = '',\n params: unknown[] = [],\n ): Promise<Row[]> {\n return (\n await db.query(\n `SELECT * FROM ${table} WHERE tenant_id = ? AND confidential_scope_id = ?${where ? ` AND ${where}` : ''}`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n ...params,\n )\n ).rows as Row[];\n }\n private async item(\n id: string,\n operation: 'read' | 'process' | 'delete',\n db = this.db,\n allowExpired = false,\n ): Promise<Row> {\n const [item] = await this.rows(db, 'intake_items', 'id = ?', [id]);\n if (!item) throw new Error('Intake unavailable');\n await this.authorize(operation, object(item.data), db);\n if (\n !allowExpired &&\n (item.visibility !== 'active' ||\n persistedDate(item.expires_at).getTime() <= this.now().getTime())\n )\n throw new Error('Intake unavailable');\n return item;\n }\n private async tx<T>(work: (db: DatabaseInterface) => Promise<T>): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n return await withEmbeddedWriteTransaction(\n this.db,\n isEmbeddedDatabase(this.db),\n work,\n );\n } catch (error) {\n if (attempt >= 3 || !isTransientDatabaseError(error)) throw error;\n await new Promise((resolve) => setTimeout(resolve, 10 * 2 ** attempt));\n }\n }\n }\n private async lock(db: DatabaseInterface, itemId: string): Promise<void> {\n const result = await db.query(\n 'UPDATE intake_items SET analysis_revision = analysis_revision WHERE tenant_id = ? AND confidential_scope_id = ? AND id = ? RETURNING id',\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n if (!result.rows.length) throw new Error('Intake unavailable');\n }\n private async insert(\n db: DatabaseInterface,\n table: (typeof TABLES)[number],\n values: Row,\n conflict?: string,\n ): Promise<Row[]> {\n const now = this.now().toISOString();\n const row = {\n id: randomUUID(),\n slug: randomUUID(),\n context: '',\n created_at: now,\n updated_at: now,\n tenant_id: this.scope.tenantId,\n confidential_scope_id: this.scope.confidentialScopeId,\n ...values,\n };\n const keys = Object.keys(row);\n return (\n await db.query(\n `INSERT INTO ${table} (${keys.join(',')}) VALUES (${keys.map(() => '?').join(',')})${conflict ? ` ON CONFLICT (${conflict}) DO NOTHING` : ''} RETURNING *`,\n ...Object.values(row),\n )\n ).rows as Row[];\n }\n /** Diagnostic only: deploy manifest migrations before starting ingestion. */\n async assertReady(): Promise<void> {\n for (const table of TABLES)\n await this.db.query(`SELECT id FROM ${table} WHERE 1 = 0`);\n }\n /** Preserve every original before acknowledgment; retries retain receipt identity. */\n async receive(input: ReceiveInput): Promise<ReceiptResult> {\n await this.authorize('receive', { capturedCeiling: input.capturedCeiling });\n const now = this.now();\n let parts: Array<IntakePart & { hash: string }>;\n try {\n for (const value of [\n input.sourceId,\n input.sourceVersion,\n input.deliveryKey,\n input.retention.version,\n ])\n nonempty(value);\n for (const value of Object.values(input.limits)) integer(value);\n date(input.deliveredAt);\n date(input.retention.expiresAt);\n date(input.retention.replayUntil);\n date(input.retention.acceptAfter);\n if (\n input.deliveredAt < input.retention.acceptAfter ||\n input.retention.expiresAt <= now ||\n input.retention.replayUntil < input.retention.expiresAt\n )\n return { kind: 'rejected', category: 'expired' };\n if (!input.parts.length || input.parts.length > input.limits.maxParts)\n return { kind: 'rejected', category: 'limit' };\n const ids = new Set<string>();\n let total = 0;\n parts = input.parts.map((part) => {\n nonempty(part.partId);\n nonempty(part.mediaType);\n if (ids.has(part.partId) || !(part.bytes instanceof Uint8Array))\n throw new Error('Invalid part');\n ids.add(part.partId);\n total += part.bytes.byteLength;\n const hash = bytesHash(part.bytes);\n if (part.expectedHash && part.expectedHash !== hash)\n throw new Error('Invalid hash');\n return { ...part, bytes: Buffer.from(part.bytes), hash };\n });\n if (total > input.limits.maxBytes)\n return { kind: 'rejected', category: 'limit' };\n for (const part of parts)\n if (\n part.parentPartId &&\n (!ids.has(part.parentPartId) || part.parentPartId === part.partId)\n )\n throw new Error('Invalid parent');\n for (const part of parts) {\n const seen = new Set([part.partId]);\n let parent = part.parentPartId;\n while (parent) {\n if (seen.has(parent)) throw new Error('Cyclic evidence');\n seen.add(parent);\n parent = parts.find((p) => p.partId === parent)?.parentPartId;\n }\n }\n } catch {\n return { kind: 'rejected', category: 'invalid' };\n }\n const identity = parts\n .map((p) => ({\n partId: p.partId,\n parentPartId: p.parentPartId ?? null,\n mediaType: p.mediaType,\n hash: p.hash,\n length: p.bytes.byteLength,\n sourceReference: p.sourceReference ?? null,\n }))\n .sort((a, b) => a.partId.localeCompare(b.partId));\n const payloadDigest = digest(identity);\n const scopeDigest = digest({\n scope: this.scope,\n ceiling: input.capturedCeiling,\n sourceVersion: input.sourceVersion,\n });\n const reservation = await this.tx(async (db) => {\n await this.authorize(\n 'receive',\n { capturedCeiling: input.capturedCeiling },\n db,\n );\n const inserted = await this.insert(\n db,\n 'intake_items',\n {\n source_id: input.sourceId,\n source_version: input.sourceVersion,\n delivery_key: input.deliveryKey,\n payload_digest: payloadDigest,\n scope_digest: scopeDigest,\n receipt_state: 'reserved',\n processing_state: 'queued',\n visibility: 'active',\n receipt_version: 1,\n analysis_revision: 0,\n fence: 0,\n lease_token: '',\n lease_until: null,\n expires_at: date(input.retention.expiresAt),\n replay_until: date(input.retention.replayUntil),\n cancelled: false,\n trace_id: input.traceId ?? randomUUID(),\n data: canonical({\n capturedCeiling: input.capturedCeiling,\n limits: input.limits,\n retentionVersion: input.retention.version,\n deliveredAt: date(input.deliveredAt),\n dispatchTarget: this.dispatchTarget,\n }),\n },\n 'tenant_id,source_id,delivery_key',\n );\n const matches = await db.query(\n 'SELECT * FROM intake_items WHERE tenant_id = ? AND source_id = ? AND delivery_key = ?',\n this.scope.tenantId,\n input.sourceId,\n input.deliveryKey,\n );\n const item = matches.rows[0] as Row;\n if (\n item.scope_digest !== scopeDigest ||\n item.payload_digest !== payloadDigest ||\n !(await this.matchesDispatchRoute(db, item))\n )\n return { kind: 'conflict' as const };\n if (\n item.visibility !== 'active' ||\n persistedDate(item.replay_until) <= now ||\n persistedDate(item.expires_at) <= now\n )\n return { kind: 'expired' as const };\n if (inserted.length) {\n const evidenceIds = new Map(parts.map((p) => [p.partId, randomUUID()]));\n const ordered = [...parts].sort((a, b) => {\n const depth = (p: IntakePart): number =>\n p.parentPartId\n ? 1 + depth(parts.find((x) => x.partId === p.parentPartId)!)\n : 0;\n return depth(a) - depth(b);\n });\n for (const part of ordered)\n await this.insert(db, 'intake_evidence', {\n id: evidenceIds.get(part.partId),\n item_id: item.id,\n part_id: part.partId,\n parent_evidence_id: part.parentPartId\n ? evidenceIds.get(part.parentPartId)\n : null,\n asset_id: randomUUID(),\n state: 'intent',\n content_hash: part.hash,\n byte_length: part.bytes.byteLength,\n media_type: part.mediaType,\n source_uri: '',\n data: canonical({ sourceReference: part.sourceReference ?? null }),\n });\n }\n return { kind: 'reserved' as const, item, created: !!inserted.length };\n });\n if (reservation.kind !== 'reserved')\n return { kind: 'rejected', category: reservation.kind };\n const item = reservation.item;\n const itemId = String(item.id);\n await this.point('reserved');\n if (item.receipt_state === 'ready') {\n try {\n await this.repairDispatches();\n } catch {\n return { kind: 'retry', category: 'unavailable' };\n }\n return {\n kind: 'duplicate',\n itemId,\n receiptVersion: Number(item.receipt_version),\n };\n }\n const token = randomUUID();\n const claimed = await this.tx((db) =>\n db.query(\n `UPDATE intake_items SET receipt_state = 'preserving', fence = fence + 1, lease_token = ?, lease_until = ? WHERE tenant_id = ? AND confidential_scope_id = ? AND id = ? AND visibility = 'active' AND receipt_state <> 'ready' AND (lease_until IS NULL OR lease_until <= ?) RETURNING fence`,\n token,\n new Date(now.getTime() + input.limits.leaseMs).toISOString(),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n now.toISOString(),\n ),\n );\n if (!claimed.rows.length) return { kind: 'retry', category: 'busy' };\n try {\n for (const part of parts) await this.preserve(itemId, part, token);\n await this.point('evidence');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'process', db);\n const evidence = await this.rows(db, 'intake_evidence', 'item_id = ?', [\n itemId,\n ]);\n if (\n evidence.length !== parts.length ||\n evidence.some((e) => e.state !== 'durable')\n )\n throw new Error('Incomplete evidence');\n const updated = await db.query(\n `UPDATE intake_items SET receipt_state='ready',lease_token='',lease_until=NULL WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND lease_token=? AND lease_until>? AND visibility='active' RETURNING id`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n token,\n this.now().toISOString(),\n );\n if (!updated.rows.length) throw new Error('Lease lost');\n await this.insert(\n db,\n 'intake_dispatches',\n {\n item_id: itemId,\n stage: 'analyze',\n revision: 1,\n state: 'pending',\n job_id: '',\n deliveries: 0,\n data: canonical({ dispatchTarget: this.dispatchTarget }),\n },\n 'tenant_id,item_id,stage,revision',\n );\n });\n await this.point('ready');\n await this.repairDispatches();\n await this.point('ack');\n return {\n kind: reservation.created ? 'accepted' : 'duplicate',\n itemId,\n receiptVersion: 1,\n };\n } catch {\n await this.tx((db) =>\n db.query(\n `UPDATE intake_items SET receipt_state='needs_attention',lease_token='',lease_until=NULL WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND lease_token=? AND receipt_state<>'ready'`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n token,\n ),\n );\n return { kind: 'retry', category: 'unavailable' };\n }\n }\n private async preserve(\n itemId: string,\n part: IntakePart & { hash: string },\n token: string,\n ): Promise<void> {\n const [evidence] = await this.rows(\n this.db,\n 'intake_evidence',\n 'item_id=? AND part_id=?',\n [itemId, part.partId],\n );\n if (!evidence) throw new Error('Missing storage intent');\n await this.item(itemId, 'process');\n const asset = await withTenant(\n { tenantId: this.scope.tenantId },\n async () => {\n let asset = await this.options.assets.collection.get({\n id: String(evidence.asset_id),\n });\n if (!asset)\n asset = await this.options.assets.collection.create({\n id: String(evidence.asset_id),\n tenantId: this.scope.tenantId,\n name: String(evidence.id),\n mimeType: part.mediaType,\n typeSlug: 'intake',\n statusSlug: 'active',\n sourceUri: '',\n });\n if (asset.tenantId !== this.scope.tenantId)\n throw new Error('Asset unavailable');\n return asset;\n },\n );\n const uri = await this.options.assets.store.planFile(asset, {\n mimeType: part.mediaType,\n typeSlug: 'intake',\n });\n if (evidence.source_uri && evidence.source_uri !== uri)\n throw new Error('Storage plan changed');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (\n item.lease_token !== token ||\n persistedDate(item.lease_until) <= this.now()\n )\n throw new Error('Lease lost');\n await db.query(\n 'UPDATE intake_evidence SET source_uri=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n uri,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n evidence.id,\n );\n });\n asset.sourceUri = uri;\n await asset.save();\n await this.point('storage_intent');\n await this.options.assets.store.preserveFile(\n asset,\n Buffer.from(part.bytes),\n { mimeType: part.mediaType, typeSlug: 'intake' },\n );\n await this.point('storage');\n const actual = await this.options.assets.store.read(asset);\n if (\n actual.length !== Number(evidence.byte_length) ||\n bytesHash(actual) !== evidence.content_hash\n )\n throw new Error('Storage integrity');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (\n item.lease_token !== token ||\n persistedDate(item.lease_until) <= this.now()\n )\n throw new Error('Lease lost');\n await db.query(\n \"UPDATE intake_evidence SET state='durable' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n evidence.id,\n );\n });\n }\n /** Inspect retained route provenance without changing state or enqueuing work. */\n async inspectDispatchRoute(itemId: string): Promise<DispatchRouteInspection> {\n const item = await this.item(itemId, 'read');\n return this.dispatchRouteState(this.db, item);\n }\n\n /** Explicitly bind a provenance-free legacy receipt to this trusted host's route.\n * Never accepts a route from the caller, rewrites original authority, or enqueues.\n */\n async recoverDispatchRoute(input: {\n itemId: string;\n expectedFingerprint: string;\n evidenceRef: string;\n }): Promise<DispatchRouteInspection> {\n nonempty(input.evidenceRef);\n if (!/^[a-f0-9]{64}$/.test(input.expectedFingerprint))\n throw new Error('Invalid dispatch recovery fingerprint');\n if (!this.options.dispatchRecovery)\n throw new Error('Dispatch recovery unavailable');\n return this.tx(async (db) => {\n await this.lock(db, input.itemId);\n const item = await this.item(input.itemId, 'process', db);\n const data = object(item.data);\n if (\n !(await this.options.dispatchRecovery!.authorize({\n scope: this.scope,\n itemId: input.itemId,\n capturedCeiling: object(data.capturedCeiling),\n evidenceRef: input.evidenceRef,\n db,\n }))\n )\n throw new Error('Dispatch recovery unavailable');\n const current = await this.dispatchRouteState(db, item);\n const recovery =\n data.dispatchRecovery === undefined\n ? null\n : object(data.dispatchRecovery);\n if (\n recovery &&\n recovery.expectedFingerprint === input.expectedFingerprint &&\n recovery.evidenceRef === input.evidenceRef &&\n current.status === 'bound' &&\n canonical(current.target) === canonical(this.dispatchTarget)\n ) {\n return current;\n }\n if (\n current.status !== 'unknown' ||\n current.fingerprint !== input.expectedFingerprint\n )\n throw new Error('Dispatch recovery conflict');\n data.dispatchRecovery = {\n version: 1,\n expectedFingerprint: input.expectedFingerprint,\n evidenceRef: input.evidenceRef,\n actorId: this.scope.actorId,\n recordedAt: date(this.now()),\n target: this.dispatchTarget,\n };\n item.data = canonical(data);\n await this.bindDispatchRoute(db, item);\n await this.point('dispatch:recovered');\n const [updated] = await this.rows(db, 'intake_items', 'id=?', [item.id]);\n return this.dispatchRouteState(db, updated);\n });\n }\n\n private async matchesDispatchRoute(\n db: DatabaseInterface,\n item: Row,\n ): Promise<boolean> {\n const route = await this.dispatchRouteState(db, item);\n return (\n route.status === 'bound' &&\n canonical(route.target) === canonical(this.dispatchTarget)\n );\n }\n\n private async bindDispatchRoute(\n db: DatabaseInterface,\n item: Row,\n ): Promise<void> {\n const data = object(item.data);\n if (data.dispatchTarget === undefined) {\n await db.query(\n 'UPDATE intake_items SET data=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n canonical({ ...data, dispatchTarget: this.dispatchTarget }),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n item.id,\n );\n }\n const intents = await this.rows(db, 'intake_dispatches', 'item_id=?', [\n item.id,\n ]);\n for (const intent of intents) {\n const retained = object(intent.data);\n if (retained.dispatchTarget === undefined)\n await db.query(\n 'UPDATE intake_dispatches SET data=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n canonical({ ...retained, dispatchTarget: this.dispatchTarget }),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n );\n }\n }\n\n private async dispatchRouteState(\n db: DatabaseInterface,\n item: Row,\n ): Promise<DispatchRouteInspection> {\n let invalid = false;\n const malformed: string[] = [];\n const payload = (value: unknown): Row => {\n try {\n return object(value);\n } catch {\n invalid = true;\n malformed.push(digest(value));\n return {};\n }\n };\n const data = payload(item.data);\n const intents = (\n await this.rows(db, 'intake_dispatches', 'item_id=?', [item.id])\n ).sort((a, b) => String(a.id).localeCompare(String(b.id)));\n const targets: IntakeDispatchTarget[] = [];\n const lineage: unknown[] = [];\n const retain = (value: unknown) => {\n if (value === undefined) return;\n try {\n const target = object(value);\n nonempty(target.objectType);\n nonempty(target.method);\n if (target.version !== 1) throw new Error('Unsupported dispatch route');\n targets.push({\n version: 1,\n objectType: target.objectType,\n method: target.method,\n });\n } catch {\n invalid = true;\n }\n };\n retain(data.dispatchTarget);\n if (data.dispatchRecovery !== undefined) {\n const recovery = payload(data.dispatchRecovery);\n if (recovery.version !== 1 || recovery.target === undefined)\n invalid = true;\n retain(recovery.target);\n }\n const jobs = await SmrtJobCollection.create({ db });\n for (const intent of intents) {\n retain(payload(intent.data).dispatchTarget);\n if (!intent.job_id) continue;\n const job = await withTenant({ tenantId: this.scope.tenantId }, () =>\n jobs.get({ id: String(intent.job_id) }),\n );\n // Missing jobs are absent provenance, not affirmative conflicting authority.\n // A retained route survives job retention; otherwise explicit recovery is required.\n if (!job) {\n lineage.push({ id: intent.job_id, missing: true });\n continue;\n }\n const args = payload(job.args);\n if (\n job.tenantId !== this.scope.tenantId ||\n job.queue !== 'ingestion' ||\n job.objectId ||\n args.itemId !== item.id ||\n args.dispatchId !== intent.id ||\n args.revision !== Number(intent.revision)\n ) {\n invalid = true;\n lineage.push({ id: intent.job_id, valid: false });\n continue;\n }\n const target = {\n version: 1,\n objectType: job.objectType,\n method: job.method,\n };\n retain(target);\n lineage.push({ id: job.id, target, args });\n }\n if (targets.some((target) => canonical(target) !== canonical(targets[0])))\n invalid = true;\n const status = invalid ? 'conflict' : targets.length ? 'bound' : 'unknown';\n return {\n status,\n target: status === 'bound' ? targets[0] : null,\n fingerprint: digest({\n itemId: item.id,\n tenantId: item.tenant_id,\n confidentialScopeId: item.confidential_scope_id,\n sourceId: item.source_id,\n sourceVersion: item.source_version,\n payloadDigest: item.payload_digest,\n scopeDigest: item.scope_digest,\n revision: item.analysis_revision,\n data,\n intents: intents.map((intent) => ({\n id: intent.id,\n revision: intent.revision,\n data: payload(intent.data),\n jobId: intent.job_id,\n })),\n lineage,\n malformed,\n }),\n };\n }\n\n /** Repair lost enqueue/mark writes and deleted/failed jobs. Duplicate jobs are safe. */\n async repairDispatches(): Promise<number> {\n let repaired = 0;\n const intents = await this.rows(\n this.db,\n 'intake_dispatches',\n \"state <> 'completed'\",\n );\n const jobs = await SmrtJobCollection.create({ db: this.db });\n for (const intent of intents) {\n // Scope and protected route are checked before this host's authorization:\n // unrelated hosts must not spend budgets or block one another's receipt.\n const [candidate] = await this.rows(this.db, 'intake_items', 'id=?', [\n intent.item_id,\n ]);\n if (!candidate || !(await this.matchesDispatchRoute(this.db, candidate)))\n continue;\n const item = await this.item(\n String(intent.item_id),\n 'process',\n this.db,\n true,\n );\n if (\n item.visibility !== 'active' ||\n item.cancelled ||\n persistedDate(item.expires_at) <= this.now()\n )\n continue;\n const allocation = await this.tx(async (db) => {\n await this.lock(db, String(item.id));\n const [routedItem] = await this.rows(db, 'intake_items', 'id=?', [\n item.id,\n ]);\n if (!routedItem || !(await this.matchesDispatchRoute(db, routedItem)))\n return false;\n await this.bindDispatchRoute(db, routedItem);\n const currentItem = await this.item(String(item.id), 'process', db);\n const [currentIntent] = await this.rows(\n db,\n 'intake_dispatches',\n 'id=? AND item_id=?',\n [intent.id, item.id],\n );\n if (!currentIntent || currentIntent.state === 'completed') return false;\n if (\n currentIntent.job_id &&\n Number(currentIntent.revision) ===\n Math.max(1, Number(currentItem.analysis_revision))\n ) {\n const currentJobs = await SmrtJobCollection.create({ db });\n const job = await withTenant({ tenantId: this.scope.tenantId }, () =>\n currentJobs.get({ id: String(currentIntent.job_id) }),\n );\n if (job && ['pending', 'running'].includes(job.status)) return false;\n }\n // Revision 1 is queued at receipt, before the first analysis exists.\n if (\n currentItem.cancelled ||\n Number(currentIntent.revision) !==\n Math.max(1, Number(currentItem.analysis_revision))\n ) {\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n currentIntent.id,\n );\n return false;\n }\n const limits = object(\n object(currentItem.data).limits,\n ) as unknown as IntakeLimits;\n if (Number(currentIntent.deliveries) >= limits.maxAttempts) {\n await db.query(\n \"UPDATE intake_items SET processing_state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n item.id,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n );\n return false;\n }\n const result = await db.query(\n \"UPDATE intake_dispatches SET deliveries=deliveries+1 WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND state<>'completed' AND deliveries<? RETURNING id\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n currentIntent.id,\n limits.maxAttempts,\n );\n return result.rows.length === 1;\n });\n if (!allocation) continue;\n const job = await withTenant({ tenantId: this.scope.tenantId }, () =>\n jobs.enqueueJob({\n tenantId: this.scope.tenantId,\n objectType: this.dispatchTarget.objectType,\n method: this.dispatchTarget.method,\n args: {\n itemId: intent.item_id,\n revision: Number(intent.revision),\n dispatchId: intent.id,\n },\n queue: 'ingestion',\n maxAttempts: 1,\n }),\n );\n await this.point('enqueued');\n await this.tx((db) =>\n db.query(\n \"UPDATE intake_dispatches SET state='delivered',job_id=? WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND state<>'completed'\",\n job.id,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n ),\n );\n repaired++;\n }\n return repaired;\n }\n /** List only authorized active items; omitted items do not contribute counts. */\n async listItems(): Promise<IntakeItemDTO[]> {\n const rows = await this.rows(\n this.db,\n 'intake_items',\n \"visibility='active' AND expires_at>?\",\n [this.now().toISOString()],\n );\n const result: IntakeItemDTO[] = [];\n for (const row of rows) {\n try {\n await this.authorize('read', object(row.data));\n result.push(this.itemDTO(row));\n } catch {\n /* no existence disclosure */\n }\n }\n return result;\n }\n private itemDTO(row: Row): IntakeItemDTO {\n return {\n id: String(row.id),\n receiptState: String(row.receipt_state),\n processingState: String(row.processing_state),\n analysisRevision: Number(row.analysis_revision),\n cancelled: !!row.cancelled,\n traceId: String(row.trace_id),\n };\n }\n async getItem(id: string): Promise<IntakeItemDTO> {\n return this.itemDTO(await this.item(id, 'read'));\n }\n async getEvidence(itemId: string): Promise<IntakeEvidenceDTO[]> {\n await this.item(itemId, 'read');\n return (\n await this.rows(\n this.db,\n 'intake_evidence',\n \"item_id=? AND state='durable'\",\n [itemId],\n )\n ).map((e) => ({\n id: String(e.id),\n partId: String(e.part_id),\n parentEvidenceId: e.parent_evidence_id\n ? String(e.parent_evidence_id)\n : null,\n mediaType: String(e.media_type),\n contentHash: String(e.content_hash),\n byteLength: Number(e.byte_length),\n }));\n }\n async readEvidence(itemId: string, evidenceId: string): Promise<Uint8Array> {\n await this.item(itemId, 'read');\n const [e] = await this.rows(\n this.db,\n 'intake_evidence',\n \"item_id=? AND id=? AND state='durable'\",\n [itemId, evidenceId],\n );\n if (!e) throw new Error('Intake unavailable');\n const asset = await withTenant({ tenantId: this.scope.tenantId }, () =>\n this.options.assets.collection.get({ id: String(e.asset_id) }),\n );\n if (\n !asset ||\n asset.tenantId !== this.scope.tenantId ||\n asset.sourceUri !== e.source_uri\n )\n throw new Error('Intake unavailable');\n const bytes = await this.options.assets.store.read(asset);\n if (\n bytes.length !== Number(e.byte_length) ||\n bytesHash(bytes) !== e.content_hash\n )\n throw new Error('Intake integrity');\n await this.item(itemId, 'read');\n return bytes;\n }\n /** Append an immutable input revision. Reprocessing never creates actions. */\n async analyze(\n itemId: string,\n configuration: Record<string, unknown>,\n requestKey: string,\n ): Promise<{ id: string; revision: number }> {\n const frozen = structuredClone(configuration);\n if (\n Object.hasOwn(frozen, 'humanCorrection') &&\n frozen.stage !== 'interpret'\n )\n throw new Error('Human corrections require authenticated split revision');\n return this.tx((db) => this.appendAnalysis(db, itemId, frozen, requestKey));\n }\n private async appendAnalysis(\n db: DatabaseInterface,\n itemId: string,\n configuration: Record<string, unknown>,\n requestKey: string,\n ): Promise<{ id: string; revision: number }> {\n nonempty(requestKey);\n const configDigest = digest(configuration);\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (!(await this.matchesDispatchRoute(db, item)))\n throw new Error('Intake dispatch route unavailable');\n await this.bindDispatchRoute(db, item);\n if (item.receipt_state !== 'ready' || item.cancelled)\n throw new Error('Intake not processable');\n const previous = await this.rows(db, 'intake_analyses', 'item_id=?', [\n itemId,\n ]);\n const replay = previous.find(\n (a) => object(a.data).requestKey === requestKey,\n );\n if (replay) {\n if (object(replay.data).configDigest !== configDigest)\n throw new Error('Analysis request conflict');\n return { id: String(replay.id), revision: Number(replay.revision) };\n }\n const evidence = await this.rows(\n db,\n 'intake_evidence',\n \"item_id=? AND state='durable'\",\n [itemId],\n );\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n const revision = Number(item.analysis_revision) + 1;\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision<? AND state<>'completed'\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n revision,\n );\n const inputs = evidence\n .map((e) => ({ id: e.id, hash: e.content_hash }))\n .sort((a, b) => String(a.id).localeCompare(String(b.id)));\n const [analysis] = await this.insert(db, 'intake_analyses', {\n item_id: itemId,\n revision,\n fence: 0,\n attempt_number: 0,\n current_attempt_id: null,\n state: 'queued',\n input_digest: digest({ inputs, configuration }),\n data: canonical({ inputs, configuration, requestKey, configDigest }),\n });\n await db.query(\n \"UPDATE intake_items SET analysis_revision=?,processing_state='queued' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n revision,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await this.insert(\n db,\n 'intake_dispatches',\n {\n item_id: itemId,\n stage: 'analyze',\n revision,\n state: 'pending',\n job_id: '',\n deliveries: 0,\n data: canonical({ dispatchTarget: this.dispatchTarget }),\n },\n 'tenant_id,item_id,stage,revision',\n );\n return { id: String(analysis.id), revision };\n }\n\n /** Record an authenticated split correction and queue fresh extraction, never copy model output. */\n async reviseLogicalSplit(\n input: LogicalSplitInput,\n ): Promise<{ id: string; revision: number }> {\n const frozen = structuredClone(input);\n nonempty(frozen.requestId);\n integer(frozen.expectedRevision);\n if (\n !Array.isArray(frozen.groups) ||\n !frozen.groups.length ||\n frozen.groups.length > 100 ||\n frozen.groups.some(\n (group) =>\n !Array.isArray(group) ||\n !group.length ||\n group.length > 1000 ||\n group.some((page) => !Number.isSafeInteger(page) || page < 1),\n )\n )\n throw new Error('Invalid logical split');\n const pages = frozen.groups.flat();\n if (pages.length > 1000 || new Set(pages).size !== pages.length)\n throw new Error('Invalid logical split');\n const requestKey = `split:${frozen.requestId}`;\n const correction = {\n ...frozen,\n actorId: this.scope.actorId,\n kind: 'logical_split',\n };\n const replay = await this.tx(async (db) => {\n await this.lock(db, frozen.itemId);\n await this.item(frozen.itemId, 'process', db);\n const found = (\n await this.rows(db, 'intake_analyses', 'item_id=?', [frozen.itemId])\n ).find((row) => object(row.data).requestKey === requestKey);\n if (!found) return null;\n if (\n digest(object(object(found.data).configuration).humanCorrection) !==\n digest(correction)\n )\n throw new Error('Split request conflict');\n return { id: String(found.id), revision: Number(found.revision) };\n });\n if (replay) {\n // Idempotency acknowledges only an intent the current reviewer may still access.\n await (await this.proposals())[generationSnapshotRead](\n frozen.itemId,\n (work) => this.tx(work),\n (db) =>\n this.completedAnalysisSnapshot(\n db,\n frozen.itemId,\n frozen.attemptId,\n false,\n ),\n undefined,\n true,\n );\n return replay;\n }\n let result: { id: string; revision: number } | undefined;\n await (await this.proposals())[generationSnapshotRead](\n frozen.itemId,\n (work) => this.tx(work),\n (db) =>\n this.completedAnalysisSnapshot(\n db,\n frozen.itemId,\n frozen.attemptId,\n true,\n ),\n async (db, current) => {\n if (current.revision !== frozen.expectedRevision)\n throw new Error('Stale logical split');\n const pin = object(object(current.configuration.proposals).source);\n const source = await this.completedAnalysisSnapshot(\n db,\n frozen.itemId,\n String(pin.attemptId),\n false,\n );\n for (const key of [\n 'attemptId',\n 'revision',\n 'inputDigest',\n 'outputDigest',\n 'evidenceDigest',\n ] as const)\n if (pin[key] !== source[key]) throw new Error('Split source changed');\n const extraction = source.result.output.results;\n if (!Array.isArray(extraction))\n throw new Error('Split source unavailable');\n const evidence = extraction.find(\n (value) => object(object(value).evidence).id === frozen.evidenceId,\n );\n if (!evidence) throw new Error('Split evidence unavailable');\n const observed = new Set<number>();\n for (const value of object(evidence).segments as unknown[]) {\n const location = object(object(value).location);\n if (location.kind === 'page') observed.add(Number(location.page));\n if (location.kind === 'pages') {\n const from = Number(location.startPage),\n to = Number(location.endPage);\n if (\n !Number.isSafeInteger(from) ||\n !Number.isSafeInteger(to) ||\n to - from > 1000\n )\n throw new Error('Invalid source range');\n for (let page = from; page <= to; page++) observed.add(page);\n }\n }\n if (\n !observed.size ||\n pages.length !== observed.size ||\n pages.some((page) => !observed.has(page))\n )\n throw new Error('Split must cover observed pages exactly');\n // Re-extraction retains the supported immediate-predecessor interpretation pin.\n result = await this.appendAnalysis(\n db,\n frozen.itemId,\n { ...source.configuration, humanCorrection: correction },\n requestKey,\n );\n },\n true,\n );\n if (!result) throw new Error('Split unavailable');\n return result;\n }\n /** Allocate a fenced attempt; active leases cannot be stolen before expiry. */\n async claimAnalysis(\n itemId: string,\n revision: number,\n workerId: string,\n ): Promise<AnalysisLease | null> {\n integer(revision);\n nonempty(workerId);\n return this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (\n item.cancelled ||\n item.receipt_state !== 'ready' ||\n Number(item.analysis_revision) !== revision\n )\n return null;\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'item_id=? AND revision=?',\n [itemId, revision],\n );\n if (\n !analysis ||\n ['completed', 'partial'].includes(String(analysis.state))\n )\n return null;\n const limits = object(\n object(item.data).limits,\n ) as unknown as IntakeLimits;\n const attempts = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'analysis_id=?',\n [analysis.id],\n );\n const prior = attempts.find((a) => a.id === analysis.current_attempt_id);\n if (\n prior?.state === 'running' &&\n persistedDate(prior.lease_until) > this.now()\n )\n return null;\n if (Number(analysis.attempt_number) >= limits.maxAttempts) {\n if (prior?.state === 'running')\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='needs_attention',safe_error='limit' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n prior.id,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n analysis.id,\n );\n await db.query(\n \"UPDATE intake_items SET processing_state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=? AND analysis_revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n revision,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n revision,\n );\n return null;\n }\n if (prior && ['running', 'queued'].includes(String(prior.state)))\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n prior.id,\n );\n const fence = Number(analysis.fence) + 1;\n const attempt = Number(analysis.attempt_number) + 1;\n const token = randomUUID();\n const [row] = await this.insert(db, 'intake_analysis_attempts', {\n item_id: itemId,\n analysis_id: analysis.id,\n attempt_number: attempt,\n fence,\n state: 'running',\n lease_token: token,\n lease_until: new Date(\n this.now().getTime() + limits.leaseMs,\n ).toISOString(),\n output_digest: '',\n safe_error: '',\n confidence: null,\n data: canonical({\n workerId,\n startedAt: this.now().toISOString(),\n limits,\n }),\n });\n await db.query(\n \"UPDATE intake_analyses SET fence=?,attempt_number=?,current_attempt_id=?,state='running' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n fence,\n attempt,\n row.id,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n analysis.id,\n );\n await db.query(\n \"UPDATE intake_items SET processing_state='running' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n return {\n itemId,\n analysisId: String(analysis.id),\n attemptId: String(row.id),\n revision,\n fence,\n token,\n };\n });\n }\n private async completedAnalysisSnapshot(\n db: DatabaseInterface,\n itemId: string,\n attemptId: string | undefined,\n current: boolean,\n ): Promise<CompletedAnalysisSnapshot> {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (item.cancelled) throw new Error('Analysis unavailable');\n if (attemptId === undefined) {\n if (!current) throw new Error('Historical attempt required');\n const [latest] = await this.rows(\n db,\n 'intake_analyses',\n 'item_id=? AND revision=?',\n [itemId, item.analysis_revision],\n );\n if (!latest?.current_attempt_id) throw new Error('Analysis unavailable');\n attemptId = String(latest.current_attempt_id);\n }\n\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'item_id=? AND id=?',\n [itemId, attemptId],\n );\n if (\n !attempt ||\n !['completed', 'partial'].includes(String(attempt.state)) ||\n !attempt.output_digest\n )\n throw new Error('Analysis unavailable');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'item_id=? AND id=?',\n [itemId, attempt.analysis_id],\n );\n if (\n !analysis ||\n analysis.current_attempt_id !== attemptId ||\n (current && Number(item.analysis_revision) !== Number(analysis.revision))\n )\n throw new Error('Analysis unavailable');\n const data = object(analysis.data);\n const configuration = object(data.configuration);\n if (\n !Array.isArray(data.inputs) ||\n !data.inputs.length ||\n digest({ inputs: data.inputs, configuration }) !==\n analysis.input_digest ||\n digest(configuration) !== data.configDigest\n )\n throw new Error('Analysis input integrity');\n const resultData = object(attempt.data);\n const result = {\n status: resultData.status,\n provider: resultData.provider,\n model: resultData.model,\n version: resultData.version,\n output: resultData.output,\n usage: resultData.usage,\n ...(Object.hasOwn(resultData, 'error')\n ? { error: resultData.error }\n : {}),\n ...(Object.hasOwn(resultData, 'confidence')\n ? { confidence: resultData.confidence }\n : {}),\n } as AnalysisOutput;\n if (\n result.status !== attempt.state ||\n digest(result) !== attempt.output_digest\n )\n throw new Error('Analysis output integrity');\n const evidence: IntakeEvidenceDTO[] = [];\n for (const input of data.inputs) {\n const frozen = object(input);\n const [row] = await this.rows(\n db,\n 'intake_evidence',\n \"item_id=? AND id=? AND state='durable'\",\n [itemId, frozen.id],\n );\n if (!row || row.content_hash !== frozen.hash)\n throw new Error('Analysis input integrity');\n evidence.push({\n id: String(row.id),\n partId: String(row.part_id),\n parentEvidenceId: row.parent_evidence_id\n ? String(row.parent_evidence_id)\n : null,\n mediaType: String(row.media_type),\n contentHash: String(row.content_hash),\n byteLength: Number(row.byte_length),\n });\n }\n if (new Set(evidence.map((entry) => entry.id)).size !== evidence.length)\n throw new Error('Analysis input integrity');\n await this.item(itemId, 'process', db);\n return structuredClone({\n itemId,\n attemptId,\n revision: Number(analysis.revision),\n inputDigest: String(analysis.input_digest),\n outputDigest: String(attempt.output_digest),\n evidenceDigest: digest(data.inputs),\n configuration,\n evidence,\n result,\n });\n }\n /** Detached successful current revision; always current-scope/process authorized. */\n async getCompletedAnalysis(\n itemId: string,\n attemptId?: string,\n ): Promise<CompletedAnalysisSnapshot> {\n const snapshot = await this.tx((db) =>\n this.completedAnalysisSnapshot(db, itemId, attemptId, true),\n );\n await this.point('analysis:snapshot-read');\n const read = async (db: DatabaseInterface) => {\n const current = await this.completedAnalysisSnapshot(\n db,\n itemId,\n snapshot.attemptId,\n true,\n );\n if (\n current.inputDigest !== snapshot.inputDigest ||\n current.outputDigest !== snapshot.outputDigest\n )\n throw new Error('Analysis changed');\n return current;\n };\n if (snapshot.configuration.stage === 'interpret')\n return (await this.proposals())[generationSnapshotRead](\n itemId,\n (work) => this.tx(work),\n read,\n );\n return this.tx(read);\n }\n /** Historical source is readable only through its frozen pin on a live generation lease. */\n async getGenerationInput(lease: AnalysisLease) {\n const generation = await this.getAnalysisInput(lease);\n const configuration = generation.configuration;\n const pin = object(object(configuration.proposals).source);\n if (\n configuration.stage !== 'interpret' ||\n typeof pin.attemptId !== 'string'\n )\n throw new Error('Invalid generation source');\n const source = await this.tx((db) =>\n this.completedAnalysisSnapshot(\n db,\n lease.itemId,\n String(pin.attemptId),\n false,\n ),\n );\n for (const key of [\n 'attemptId',\n 'revision',\n 'inputDigest',\n 'outputDigest',\n 'evidenceDigest',\n ] as const)\n if (pin[key] !== source[key])\n throw new Error('Generation source changed');\n if (\n source.result.provider !== 'smrt-ingestion-extraction' ||\n source.configuration.stage === 'interpret' ||\n source.revision !== generation.revision - 1 ||\n digest(configuration.humanCorrection ?? null) !==\n digest(source.configuration.humanCorrection ?? null) ||\n digest(\n generation.evidence.map((entry) => ({\n id: entry.id,\n hash: entry.contentHash,\n })),\n ) !== source.evidenceDigest\n )\n throw new Error('Generation evidence changed');\n await this.getAnalysisInput(lease);\n return { generation, source };\n }\n /** Reload immutable inputs only through the current live processing lease. */\n async getAnalysisInput(lease: AnalysisLease): Promise<{\n revision: number;\n attemptId: string;\n fence: number;\n inputDigest: string;\n maxOutputBytes: number;\n configuration: Record<string, unknown>;\n evidence: IntakeEvidenceDTO[];\n }> {\n return this.tx(async (db) => {\n await this.lock(db, lease.itemId);\n const item = await this.item(lease.itemId, 'process', db);\n if (item.cancelled || Number(item.analysis_revision) !== lease.revision)\n throw new Error('Analysis lease unavailable');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [lease.analysisId, lease.itemId],\n );\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'id=? AND analysis_id=? AND item_id=?',\n [lease.attemptId, lease.analysisId, lease.itemId],\n );\n if (\n !analysis ||\n !attempt ||\n Number(analysis.revision) !== lease.revision ||\n analysis.current_attempt_id !== lease.attemptId ||\n Number(analysis.fence) !== lease.fence ||\n Number(attempt.fence) !== lease.fence ||\n attempt.state !== 'running' ||\n attempt.lease_token !== lease.token ||\n persistedDate(attempt.lease_until) <= this.now()\n )\n throw new Error('Analysis lease unavailable');\n const data = object(analysis.data);\n const configuration = object(data.configuration);\n if (\n !Array.isArray(data.inputs) ||\n !data.inputs.length ||\n digest({ inputs: data.inputs, configuration }) !==\n analysis.input_digest ||\n digest(configuration) !== data.configDigest\n )\n throw new Error('Analysis input integrity');\n const evidence: IntakeEvidenceDTO[] = [];\n for (const input of data.inputs) {\n const frozen = object(input);\n const [row] = await this.rows(\n db,\n 'intake_evidence',\n \"item_id=? AND id=? AND state='durable'\",\n [lease.itemId, frozen.id],\n );\n if (!row || row.content_hash !== frozen.hash)\n throw new Error('Analysis input integrity');\n evidence.push({\n id: String(row.id),\n partId: String(row.part_id),\n parentEvidenceId: row.parent_evidence_id\n ? String(row.parent_evidence_id)\n : null,\n mediaType: String(row.media_type),\n contentHash: String(row.content_hash),\n byteLength: Number(row.byte_length),\n });\n }\n if (new Set(evidence.map((entry) => entry.id)).size !== evidence.length)\n throw new Error('Analysis input integrity');\n return {\n revision: lease.revision,\n attemptId: lease.attemptId,\n fence: lease.fence,\n inputDigest: String(analysis.input_digest),\n maxOutputBytes: Number(object(object(item.data).limits).maxOutputBytes),\n configuration,\n evidence,\n };\n });\n }\n /** Publish once, only through the current unexpired fence and captured scope. */\n async completeAnalysis(\n lease: AnalysisLease,\n output: AnalysisOutput,\n ): Promise<boolean> {\n if (\n !['completed', 'partial', 'failed', 'needs_attention'].includes(\n output.status,\n ) ||\n !output.provider ||\n !output.model ||\n !output.version ||\n (output.error && !failures.has(output.error))\n )\n throw new Error('Invalid analysis output');\n if (\n output.confidence !== undefined &&\n (!Number.isFinite(output.confidence) ||\n output.confidence < 0 ||\n output.confidence > 1)\n )\n throw new Error('Invalid confidence');\n for (const value of Object.values(output.usage))\n if (!Number.isFinite(value) || value < 0)\n throw new Error('Invalid usage');\n const serialized = canonical(output);\n const outputDigest = digest(output);\n return this.tx(async (db) => {\n await this.lock(db, lease.itemId);\n const item = await this.item(lease.itemId, 'process', db);\n if (item.cancelled || Number(item.analysis_revision) !== lease.revision)\n return false;\n const limits = object(\n object(item.data).limits,\n ) as unknown as IntakeLimits;\n if (Buffer.byteLength(serialized) > limits.maxOutputBytes)\n throw new Error('Analysis output budget exceeded');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [lease.analysisId, lease.itemId],\n );\n if (\n !analysis ||\n analysis.current_attempt_id !== lease.attemptId ||\n Number(analysis.fence) !== lease.fence\n )\n return false;\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'id=? AND analysis_id=?',\n [lease.attemptId, lease.analysisId],\n );\n if (\n !attempt ||\n attempt.state !== 'running' ||\n attempt.lease_token !== lease.token ||\n persistedDate(attempt.lease_until) <= this.now()\n )\n return false;\n const attemptData = {\n ...object(attempt.data),\n ...output,\n completedAt: this.now().toISOString(),\n };\n await db.query(\n 'UPDATE intake_analysis_attempts SET state=?,output_digest=?,safe_error=?,confidence=?,data=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n output.status,\n outputDigest,\n output.error ?? '',\n output.confidence ?? null,\n canonical(attemptData),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.attemptId,\n );\n await db.query(\n 'UPDATE intake_analyses SET state=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n output.status,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.analysisId,\n );\n await db.query(\n 'UPDATE intake_items SET processing_state=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?',\n output.status,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n );\n if (['completed', 'partial', 'needs_attention'].includes(output.status))\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n lease.revision,\n );\n return true;\n });\n }\n /** Terminal failure accounting without a provider payload. The fixed safe error\n * and lifecycle metadata are not charged to the provider-output byte ceiling. */\n async failAnalysis(\n lease: AnalysisLease,\n category: IntakeFailure,\n ): Promise<boolean> {\n if (!failures.has(category)) throw new Error('Invalid analysis failure');\n return this.tx(async (db) => {\n await this.lock(db, lease.itemId);\n const item = await this.item(lease.itemId, 'process', db);\n if (item.cancelled || Number(item.analysis_revision) !== lease.revision)\n return false;\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [lease.analysisId, lease.itemId],\n );\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'id=? AND analysis_id=? AND item_id=?',\n [lease.attemptId, lease.analysisId, lease.itemId],\n );\n if (\n !analysis ||\n !attempt ||\n Number(analysis.revision) !== lease.revision ||\n analysis.current_attempt_id !== lease.attemptId ||\n Number(analysis.fence) !== lease.fence ||\n Number(attempt.fence) !== lease.fence ||\n attempt.state !== 'running' ||\n attempt.lease_token !== lease.token ||\n persistedDate(attempt.lease_until) <= this.now()\n )\n return false;\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='needs_attention',safe_error=?,data=? WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n category,\n canonical({\n ...object(attempt.data),\n completedAt: this.now().toISOString(),\n }),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.attemptId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.analysisId,\n );\n await db.query(\n \"UPDATE intake_items SET processing_state='needs_attention' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND revision=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n lease.itemId,\n lease.revision,\n );\n return true;\n });\n }\n /** Cancel pending processing immediately; original receipt remains ready. */\n async cancel(itemId: string): Promise<void> {\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'process', db);\n await db.query(\n \"UPDATE intake_items SET cancelled=?,processing_state='cancelled' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n true,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded',safe_error='cancelled' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n });\n }\n /** Mint an action only on an explicit host intention, never during reanalysis. */\n async createAction(\n itemId: string,\n actionKey: string,\n provenance: Record<string, unknown>,\n ): Promise<string> {\n nonempty(actionKey);\n const payload = canonical(provenance);\n return this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'process', db);\n if (item.cancelled) throw new Error('Intake cancelled');\n const [existing] = await this.rows(\n db,\n 'intake_actions',\n 'item_id=? AND action_key=?',\n [itemId, actionKey],\n );\n if (existing) {\n if (canonical(object(existing.data)) !== payload)\n throw new Error('Action identity conflict');\n return String(existing.id);\n }\n const [action] = await this.insert(db, 'intake_actions', {\n item_id: itemId,\n action_key: actionKey,\n state: 'proposed',\n proposal_revision: 0,\n review_version: 0,\n execution_attempt: 0,\n fence: 0,\n result_digest: '',\n data: payload,\n });\n return String(action.id);\n });\n }\n /** Append a proposal pinned to a completed attempt. Policy/preview is host-owned. */\n async publishProposal(input: {\n itemId: string;\n actionId: string;\n attemptId: string;\n expectedRevision: number;\n binding: Record<string, unknown>;\n }): Promise<{ id: string; revision: number; bindingHash: string }> {\n canonical(input.binding);\n return this.tx(async (db) => {\n await this.lock(db, input.itemId);\n const item = await this.item(input.itemId, 'process', db);\n if (item.cancelled) throw new Error('Intake cancelled');\n const [action] = await this.rows(\n db,\n 'intake_actions',\n 'item_id=? AND id=?',\n [input.itemId, input.actionId],\n );\n const [attempt] = await this.rows(\n db,\n 'intake_analysis_attempts',\n 'item_id=? AND id=?',\n [input.itemId, input.attemptId],\n );\n if (\n !action ||\n !attempt ||\n !['completed', 'partial'].includes(String(attempt.state)) ||\n !attempt.output_digest\n )\n throw new Error('Invalid proposal evidence');\n if (\n Number(action.proposal_revision) !== input.expectedRevision ||\n ['succeeded', 'executing', 'outcome_unknown'].includes(\n String(action.state),\n )\n )\n throw new Error('Proposal conflict');\n const [analysis] = await this.rows(\n db,\n 'intake_analyses',\n 'id=? AND item_id=?',\n [attempt.analysis_id, input.itemId],\n );\n if (\n !analysis ||\n Number(analysis.revision) !== Number(item.analysis_revision)\n )\n throw new Error('Proposal conflict');\n const bindingHash = digest({\n binding: input.binding,\n attemptId: attempt.id,\n attemptDigest: attempt.output_digest,\n inputDigest: analysis.input_digest,\n });\n const revision = input.expectedRevision + 1;\n const [proposal] = await this.insert(db, 'intake_proposals', {\n item_id: input.itemId,\n action_id: input.actionId,\n analysis_id: attempt.analysis_id,\n analysis_attempt_id: attempt.id,\n revision,\n binding_hash: bindingHash,\n data: canonical({\n binding: input.binding,\n attemptDigest: attempt.output_digest,\n }),\n });\n await db.query(\n \"UPDATE intake_actions SET proposal_revision=?,state='waiting_review',review_version=review_version+1 WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n revision,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n input.actionId,\n );\n return { id: String(proposal.id), revision, bindingHash };\n });\n }\n /** Persist frozen plan structure; no expansion or apply authority is implied. */\n async appendPlan(\n itemId: string,\n planKey: string,\n revision: number,\n steps: Array<{ actionId: string; proposalRevision: number }>,\n definition: Record<string, unknown>,\n ): Promise<string> {\n nonempty(planKey);\n integer(revision);\n return this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'process', db);\n if (\n !steps.length ||\n new Set(steps.map((s) => s.actionId)).size !== steps.length\n )\n throw new Error('Invalid plan');\n for (const step of steps) {\n const [proposal] = await this.rows(\n db,\n 'intake_proposals',\n 'item_id=? AND action_id=? AND revision=?',\n [itemId, step.actionId, step.proposalRevision],\n );\n if (!proposal) throw new Error('Invalid plan binding');\n }\n const data = canonical({ steps, definition });\n const hash = digest({ steps, definition });\n const previous = await this.rows(\n db,\n 'intake_plans',\n 'item_id=? AND plan_key=?',\n [itemId, planKey],\n );\n const replay = previous.find((p) => Number(p.revision) === revision);\n if (replay) {\n if (replay.digest !== hash) throw new Error('Plan conflict');\n return String(replay.id);\n }\n if (\n revision !==\n Math.max(0, ...previous.map((p) => Number(p.revision))) + 1\n )\n throw new Error('Plan revision conflict');\n const [plan] = await this.insert(db, 'intake_plans', {\n item_id: itemId,\n plan_key: planKey,\n revision,\n digest: hash,\n data,\n });\n return String(plan.id);\n });\n }\n /** Revoke immediately and durably schedule deletion before external I/O. */\n async expire(itemId: string): Promise<void> {\n await this.scheduleExpiry(itemId);\n await this.repairDeletions();\n }\n private async scheduleExpiry(itemId: string): Promise<void> {\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n await this.item(itemId, 'delete', db, true);\n await db.query(\n \"UPDATE intake_items SET visibility='expired',processing_state='expired',cancelled=?,lease_token='',lease_until=NULL WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n true,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_evidence SET state='revoked' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_dispatches SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analyses SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_analysis_attempts SET state='superseded' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=? AND state IN ('queued','running')\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n const originals = await this.rows(db, 'intake_evidence', 'item_id=?', [\n itemId,\n ]);\n const cleanup = originals\n .filter((e) => e.asset_id && e.source_uri)\n .map((e) => ({ assetId: e.asset_id, sourceUri: e.source_uri }));\n await this.insert(\n db,\n 'intake_deletions',\n { item_id: itemId, state: 'pending', data: canonical({ cleanup }) },\n 'tenant_id,item_id',\n );\n });\n }\n /** Retry privacy propagation. Minimal receipt/action identities remain replay-safe. */\n async repairDeletions(): Promise<number> {\n let completed = 0;\n const pending = await this.rows(this.db, 'intake_deletions');\n for (const intent of pending) {\n const itemId = String(intent.item_id);\n await this.item(itemId, 'delete', this.db, true);\n const evidence = await this.rows(\n this.db,\n 'intake_evidence',\n 'item_id=?',\n [itemId],\n );\n for (const row of evidence) {\n if (!row.asset_id) continue;\n const asset = await withTenant({ tenantId: this.scope.tenantId }, () =>\n this.options.assets.collection.get({ id: String(row.asset_id) }),\n );\n if (asset) {\n if (asset.tenantId !== this.scope.tenantId)\n throw new Error('Asset unavailable');\n await this.options.assets.store.remove(asset);\n }\n }\n // Retain cleanup locators after revocation: a killed stale writer may finish\n // storage I/O after owner deletion. Repeated sweeps remove those bytes too.\n const cleanup = object(intent.data).cleanup;\n if (Array.isArray(cleanup))\n for (const entry of cleanup) {\n const locator = object(entry);\n const asset = new Asset({ db: this.db });\n asset.id = String(locator.assetId);\n asset.tenantId = this.scope.tenantId;\n asset.sourceUri = String(locator.sourceUri);\n // Remove the object directly through the public store, even when its\n // database record has already been pruned.\n await this.options.assets.store.removeFile(asset);\n }\n if (intent.state === 'completed') continue;\n await this.options.purgeDerived({\n tenantId: this.scope.tenantId,\n itemId,\n });\n await this.point('deleted');\n await this.tx(async (db) => {\n await this.lock(db, itemId);\n const item = await this.item(itemId, 'delete', db, true);\n for (const table of TABLES.filter(\n (t) => t !== 'intake_items' && t !== 'intake_deletions',\n ))\n await db.query(\n `UPDATE ${table} SET data='{}' WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?`,\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_evidence SET source_uri='',content_hash='',media_type='',byte_length=0 WHERE tenant_id=? AND confidential_scope_id=? AND item_id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_items SET data=?,trace_id='' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n canonical({\n capturedCeiling: object(item.data).capturedCeiling ?? {},\n }),\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n itemId,\n );\n await db.query(\n \"UPDATE intake_deletions SET state='completed' WHERE tenant_id=? AND confidential_scope_id=? AND id=?\",\n this.scope.tenantId,\n this.scope.confidentialScopeId,\n intent.id,\n );\n });\n completed++;\n }\n return completed;\n }\n /** Run host-configured expiry policy and retry interrupted deletion propagation. */\n async sweepRetention(): Promise<number> {\n const expired = await this.rows(\n this.db,\n 'intake_items',\n \"visibility='active' AND expires_at<=?\",\n [this.now().toISOString()],\n );\n try {\n for (const item of expired) await this.scheduleExpiry(String(item.id));\n } catch (error) {\n // A later denial must not strand already committed deletion intents.\n // Preserve the scheduling failure even if cleanup also needs a retry.\n try {\n await this.repairDeletions();\n } catch {\n // Durable intents remain available to the next authorized repair.\n }\n throw error;\n }\n await this.repairDeletions();\n return expired.length;\n }\n}\n\nexport * from './extraction.js';\nexport type * from './feedback-contracts.js';\nexport { GenerationSnapshotStaleError } from './proposal-errors.js';\nexport {\n createIntakeReviewHost,\n type IntakeReviewHostOptions,\n} from './review-host.js';\nexport * from './sources/index.js';\n"],"mappings":"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"}
|