@yielded/agent-storage-memory 0.1.0-beta.173 → 0.1.0-beta.175
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MemoryMessageDeliveryStore.mjs +1 -1
- package/dist/MemoryMessageDeliveryStore.mjs.map +1 -1
- package/dist/MemorySubmissionLedger.mjs +1179 -1177
- package/dist/MemorySubmissionLedger.mjs.map +1 -1
- package/dist/MemoryThreadStore.mjs +14 -14
- package/dist/MemoryThreadStore.mjs.map +1 -1
- package/package.json +1 -1
- package/src/MemoryMessageDeliveryStore.ts +24 -25
- package/src/MemorySubmissionLedger.ts +49 -49
- package/src/MemoryThreadStore.ts +42 -31
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryThreadStore.mjs","names":["importSubmissionId"],"sources":["../src/MemoryThreadStore.ts"],"sourcesContent":["import { canonicalJson, utf8ByteLength } from \"@yielded/agent/digest\";\nimport { ThreadId, RunId, SubmissionId as importSubmissionId } from \"@yielded/agent/identifiers\";\nimport type { IdempotencyKey } from \"@yielded/agent/receipt\";\nimport {\n ExportBatch,\n ExportedRecord,\n ExportRecord,\n ReadRecord,\n} from \"@yielded/agent/record-format\";\nimport {\n CURRENT_RECORD_FORMAT,\n RecordEnvelope,\n type RecordId,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n ObservationOffset,\n type BatchId,\n MAX_RUN_EVIDENCE_RECORDS,\n MAX_RUN_EVIDENCE_BYTES,\n MAX_RUN_TERMINAL_BYTES,\n RUN_TERMINAL_RESERVE_RECORDS,\n MAX_RUN_RECOVERY_SUFFIX_RECORDS,\n MAX_RUN_RECOVERY_SUFFIX_BYTES,\n PromptRecord,\n type PromptRecordEnvelope,\n} from \"@yielded/agent/records\";\nimport {\n canonicalRunIds,\n canonicalRecordBytes,\n isWorkHandoff,\n prepareProgressAppend,\n ProgressAppendReader,\n validateProgressAppend,\n verifyRunContinuations,\n} from \"@yielded/agent/run-continuation\";\nimport {\n runIdForSubmission,\n subagentLineageRecordId,\n workerOriginRecordId,\n workerInputRecordId,\n toolCallSettledRecordId,\n} from \"@yielded/agent/run-journal\";\nimport { StorageOwner, makeStorageOwner } from \"@yielded/agent/run-storage\";\nimport {\n submissionAbortRecordId,\n submissionInputRecordId,\n submissionSettlementRecordId,\n} from \"@yielded/agent/submission-ledger\";\nimport {\n ThreadArchiveRange,\n ThreadArchiveRangeRead,\n ThreadArchiveRangeSeal,\n ThreadArchiveRangePublish,\n ThreadArchiveRangeRequest,\n MAX_ARCHIVE_RANGE_RECORDS,\n MAX_ARCHIVE_RANGE_BYTES,\n type ThreadArchiveStorage,\n} from \"@yielded/agent/thread-archive-range\";\nimport {\n makeThreadImportProgress,\n captureImportSource,\n prepareImportPage,\n finishThreadImport,\n verifyImportedReferences,\n validateClosedRun,\n rebuildClosedSubmission,\n invalidThreadArchive,\n ThreadImportReader,\n ThreadDeliveryImportReader,\n ThreadImport,\n ThreadImportRejected,\n} from \"@yielded/agent/thread-import\";\nimport { verifyThreadInvariants } from \"@yielded/agent/thread-invariants\";\nimport {\n type AppendRequest,\n type ExecutionCheckpoint,\n type ThreadCheckpoint,\n ThreadPeerCountRequest,\n ThreadIdentity,\n ThreadIdentityRequest,\n AppendConflict,\n AppendResult,\n CheckpointRejected,\n ThreadExportRecord,\n ThreadExportRejected,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadObservation,\n ThreadReadRequest,\n ThreadPromptRead,\n ThreadStore,\n ThreadReader,\n type ThreadCheckpoints,\n ThreadStoreError,\n ThreadTail,\n ThreadTailRequest,\n PreparedAppend,\n type CommitBatch,\n LoadCheckpointRequest,\n SaveCheckpointRequest,\n PROMPT_EVIDENCE_TAGS,\n ThreadVerificationRequest,\n ThreadWorkerCapacityRequest,\n ThreadWorkerCapacity,\n streamExport,\n ThreadExportSource,\n canonicalBatchFitsTransfer,\n transferPageFits,\n} from \"@yielded/agent/thread-store\";\nimport {\n checkExportSource,\n exportThreadPage,\n ThreadExporterReader,\n type TransferManifest,\n} from \"@yielded/agent/thread-transfer\";\nimport {\n WORK_INDEX_VERSION,\n MAX_WORK_REBUILD_RECORDS,\n MAX_WORK_REBUILD_BYTES,\n WorkDiscoveryUnavailable,\n ThreadWorkRequest,\n WorkThreadsRequest,\n WorkIndexRebuildRequest,\n decodeWorkCursor,\n encodeWorkCursor,\n validateWorkPage,\n workIndexChanges,\n advanceWorkEntry,\n type CanonicalWorkEntry,\n type WorkerReportingMode,\n type ThreadWorkStorage,\n} from \"@yielded/agent/thread-work\";\nimport {\n Context,\n Crypto,\n Effect,\n Layer,\n MutableRef,\n Option,\n PubSub,\n Ref,\n Schema,\n Semaphore,\n Stream,\n} from \"effect\";\nimport { Base64 } from \"effect/encoding\";\n\nimport {\n MemoryThreadStoreKernel,\n type MemoryLedgerTransfer,\n type MemoryLedgerImport,\n type MemoryDeliveryTransfer,\n type MemoryDeliveryImport,\n type MemoryWorkOwner,\n type PreparedMemoryAppend,\n} from \"./internal/MemoryThreadStoreKernel.ts\";\nimport { boundedWorkSelection } from \"./internal/WorkSelection.ts\";\n\nconst MAX_THREADS = 256;\nconst RECORD_CHUNK_SIZE = 1_024;\nconst READ_PAGE_SIZE = 8;\nconst MAX_CHECKPOINTS_PER_THREAD = 1_024;\n\nconst ThreadCapacity = Context.Reference<number>(\n \"@effect-agent/storage-memory/MemoryThreadStore/ThreadCapacity\",\n { defaultValue: () => MAX_THREADS },\n);\n\ninterface StoredBatch {\n /** Preserve the exact destination wire, including additive fields unknown to this reader. */\n readonly batchJson: string;\n readonly result: AppendResult;\n}\n\ninterface StoredThread {\n /** Append-only owner indexes; readers must constrain them to their captured canonical tail. */\n readonly runRecords: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly operationRecords: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly handoffs: Array<CanonicalRecordEnvelope>;\n readonly agentUpdates: Array<CanonicalRecordEnvelope>;\n readonly deliveryPredecessors: Array<CanonicalRecordEnvelope>;\n readonly toolDeclarations: Map<string, CanonicalRecordEnvelope | null>;\n readonly promptEvidence: Array<CanonicalRecordEnvelope>;\n readonly modelCompletions: Array<CanonicalRecordEnvelope>;\n readonly applicationInputs: Array<CanonicalRecordEnvelope>;\n readonly durableOwners: Array<CanonicalRecordEnvelope>;\n readonly windowBoundaries: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly workerRecords: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly byId: Map<string, CanonicalRecordEnvelope>;\n readonly runInputs: Map<string, CanonicalRecordEnvelope | null>;\n readonly tailSequence: CanonicalSequence;\n readonly ranges: Map<number, ThreadArchiveRange>;\n readonly rangeStarts: Array<number>;\n readonly archiveContents: Map<number, Map<BatchId, string>>;\n readonly chunks: Map<\n number,\n { readonly records: Array<CanonicalRecordEnvelope>; readonly bytes: Array<number> }\n >;\n readonly batches: Map<BatchId, StoredBatch>;\n readonly executions: Map<RunId, ExecutionCheckpoint>;\n readonly executionCommits: Map<\n RunId,\n { readonly batchId: BatchId; readonly intent: string; readonly result: AppendResult }\n >;\n readonly batchesByFirst: Map<number, BatchId>;\n readonly checkpoints: Map<CanonicalSequence, ThreadCheckpoint>;\n}\n\nconst storedRecord = (thread: StoredThread, sequence: number) =>\n thread.chunks.get(Math.floor((sequence - 1) / RECORD_CHUNK_SIZE))?.records[\n (sequence - 1) % RECORD_CHUNK_SIZE\n ];\n\nconst isBatchBoundary = (thread: StoredThread, sequence: CanonicalSequence): boolean => {\n if (sequence === 0) return true;\n const record = storedRecord(thread, sequence);\n\n return (\n record !== undefined && thread.batches.get(record.batchId)?.result.lastSequence === sequence\n );\n};\n\nconst storedBytes = (thread: StoredThread, sequence: number) =>\n thread.chunks.get(Math.floor((sequence - 1) / RECORD_CHUNK_SIZE))?.bytes[\n (sequence - 1) % RECORD_CHUNK_SIZE\n ];\n\nconst storedPage = (thread: StoredThread, after: number, limit: number) => {\n const page: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n\n for (\n let sequence = after + 1;\n sequence <= Math.min(thread.tailSequence, after + limit);\n sequence++\n ) {\n const record = storedRecord(thread, sequence);\n\n if (record === undefined) throw new Error(\"Incomplete canonical chunk table\");\n const size = storedBytes(thread, sequence) ?? 0;\n\n if (bytes + size > 32 * 1024 * 1024) break;\n bytes += size;\n page.push(record);\n }\n\n return page;\n};\n\nconst retainRecords = (thread: StoredThread, records: ReadonlyArray<CanonicalRecordEnvelope>) => {\n for (const entry of records) {\n const chunkId = Math.floor((entry.sequence - 1) / RECORD_CHUNK_SIZE);\n let chunk = thread.chunks.get(chunkId);\n\n if (chunk === undefined) {\n chunk = { records: [], bytes: [] };\n thread.chunks.set(chunkId, chunk);\n }\n chunk.records.push(entry);\n chunk.bytes.push(canonicalRecordBytes(entry.record));\n }\n};\n\ninterface MemoryState {\n readonly threads: Map<ThreadId, StoredThread>;\n}\n\ntype NativeIndexes = Pick<\n StoredThread,\n | \"toolDeclarations\"\n | \"promptEvidence\"\n | \"modelCompletions\"\n | \"applicationInputs\"\n | \"durableOwners\"\n | \"windowBoundaries\"\n | \"workerRecords\"\n | \"byId\"\n | \"runInputs\"\n | \"runRecords\"\n | \"handoffs\"\n | \"operationRecords\"\n | \"agentUpdates\"\n | \"deliveryPredecessors\"\n>;\n\nconst emptyIndexes = (): NativeIndexes => ({\n toolDeclarations: new Map(),\n promptEvidence: [],\n modelCompletions: [],\n applicationInputs: [],\n durableOwners: [],\n windowBoundaries: new Map(),\n workerRecords: new Map(),\n byId: new Map(),\n runInputs: new Map(),\n runRecords: new Map(),\n handoffs: [],\n agentUpdates: [],\n deliveryPredecessors: [],\n operationRecords: new Map(),\n});\n\ninterface WorkIndex {\n readonly version: number;\n readonly state: \"ready\" | \"rebuilding\";\n readonly through: CanonicalSequence;\n readonly reporting: WorkerReportingMode;\n readonly entryCount: number;\n readonly entries: Map<string, CanonicalWorkEntry>;\n readonly messages: Map<IdempotencyKey, Set<string>>;\n readonly foreign: { child: number; worker: number; delivery: number; peer: number };\n readonly workers: Map<ThreadId, { ordinary: number; update: number; effects: number }>;\n readonly liveInputs: Array<LiveInputLocator>;\n readonly inputsByWorker: Map<ThreadId, Array<LiveInputLocator>>;\n readonly rebuildingIndexes?: NativeIndexes;\n}\n\ninterface LiveInputLocator {\n readonly sequence: CanonicalSequence;\n readonly id: string;\n}\n\nconst liveInputPosition = (entries: ReadonlyArray<LiveInputLocator>, sequence: number) => {\n let low = 0;\n let high = entries.length;\n\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n\n if (entries[middle].sequence < sequence) low = middle + 1;\n else high = middle;\n }\n\n return low;\n};\n\nconst changeLiveInput = (\n entries: Array<LiveInputLocator>,\n entry: CanonicalWorkEntry,\n change: 1 | -1,\n) => {\n const at = liveInputPosition(entries, entry.createdSequence);\n\n if (change === 1) entries.splice(at, 0, { sequence: entry.createdSequence, id: entry.id });\n else if (entries[at]?.id === entry.id) entries.splice(at, 1);\n};\n\nconst emptyWorkIndex = (): WorkIndex => ({\n version: WORK_INDEX_VERSION,\n state: \"ready\",\n through: ZERO_CANONICAL_SEQUENCE,\n reporting: \"none\",\n entryCount: 0,\n entries: new Map(),\n messages: new Map(),\n foreign: { child: 0, worker: 0, delivery: 0, peer: 0 },\n workers: new Map(),\n liveInputs: [],\n inputsByWorker: new Map(),\n});\n\nconst changeWorkCounts = (index: WorkIndex, entry: CanonicalWorkEntry, change: 1 | -1) => {\n const owner = entry.owner;\n\n if (\n owner._tag === \"Child\" ||\n (owner._tag === \"Handoff\" &&\n (owner.kind === \"reservation\" || owner.kind === \"child-accounting\"))\n )\n index.foreign.child += change;\n if (\n [\"WorkerInput\", \"WorkerEffects\", \"Report\"].includes(owner._tag) ||\n (owner._tag === \"Handoff\" && owner.kind === \"worker-stop\")\n )\n index.foreign.worker += change;\n if (owner._tag === \"Handoff\" && [\"peer\", \"update\", \"report\"].includes(owner.kind))\n index.foreign.delivery += change;\n if (owner._tag === \"Handoff\" && owner.kind === \"peer\") index.foreign.peer += change;\n if (owner._tag === \"WorkerInput\") {\n changeLiveInput(index.liveInputs, entry, change);\n let inputs = index.inputsByWorker.get(owner.workerThreadId);\n\n if (inputs === undefined) index.inputsByWorker.set(owner.workerThreadId, (inputs = []));\n changeLiveInput(inputs, entry, change);\n if (inputs.length === 0) index.inputsByWorker.delete(owner.workerThreadId);\n let worker = index.workers.get(owner.workerThreadId);\n\n if (worker === undefined)\n index.workers.set(owner.workerThreadId, (worker = { ordinary: 0, update: 0, effects: 0 }));\n if (owner.update) worker.update += change;\n else worker.ordinary += change;\n if (worker.ordinary + worker.update + worker.effects === 0)\n index.workers.delete(owner.workerThreadId);\n }\n};\n\n/** Prepare only this batch's changes; commit under the writer gate with canonical publication. */\nconst prepareWork = Effect.fnUntraced(function* (\n previous: WorkIndex,\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n retained: (threadId: ThreadId, messageId: IdempotencyKey) => boolean,\n) {\n const changes = new Map<string, CanonicalWorkEntry | undefined>();\n let reporting = previous.reporting;\n let through = previous.through;\n\n for (const record of records) {\n for (const change of yield* workIndexChanges(record, reporting)) {\n if (change._tag === \"WorkerMode\") reporting = change.mode;\n else if (change._tag === \"Remove\") {\n const entry = changes.has(change.id)\n ? changes.get(change.id)\n : previous.entries.get(change.id);\n\n if (\n change.stateRecordId === undefined ||\n (entry?.stateReference._tag === \"Canonical\" &&\n entry.stateReference.recordId === change.stateRecordId)\n )\n changes.set(change.id, undefined);\n } else {\n const entry = advanceWorkEntry(\n changes.has(change.entry.id)\n ? changes.get(change.entry.id)\n : previous.entries.get(change.entry.id),\n change.entry,\n );\n\n changes.set(\n entry.id,\n entry.owner._tag === \"Handoff\" &&\n entry.owner.messageId !== undefined &&\n retained(record.threadId, entry.owner.messageId)\n ? undefined\n : entry,\n );\n }\n }\n through = record.sequence;\n }\n\n return (): WorkIndex => {\n const { entries, messages } = previous;\n\n for (const [id, entry] of changes) {\n const old = entries.get(id);\n\n if (old !== undefined) changeWorkCounts(previous, old, -1);\n\n if (old?.owner._tag === \"Handoff\" && old.owner.messageId !== undefined) {\n const ids = messages.get(old.owner.messageId);\n\n ids?.delete(id);\n if (ids?.size === 0) messages.delete(old.owner.messageId);\n }\n if (entry === undefined) entries.delete(id);\n else {\n entries.set(id, entry);\n changeWorkCounts(previous, entry, 1);\n if (entry.owner._tag === \"Handoff\" && entry.owner.messageId !== undefined) {\n const ids = messages.get(entry.owner.messageId);\n\n if (ids === undefined) messages.set(entry.owner.messageId, new Set([id]));\n else ids.add(id);\n }\n }\n }\n\n return { ...previous, through, reporting, entryCount: entries.size };\n };\n});\n\n/** First sequence strictly after the cursor, without traversing a Run's earlier facts. */\nconst upperSequence = (records: ReadonlyArray<CanonicalRecordEnvelope>, sequence: number) => {\n let low = 0;\n let high = records.length;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n\n if (records[mid].sequence <= sequence) low = mid + 1;\n else high = mid;\n }\n\n return low;\n};\n\nconst appendToIndex = (\n index: Map<string, Array<CanonicalRecordEnvelope>>,\n key: string,\n entry: CanonicalRecordEnvelope,\n) => {\n const records = index.get(key);\n\n if (records === undefined) index.set(key, [entry]);\n else records.push(entry);\n};\n\n/** Only call at successful synchronous publication, or on indexes not yet reachable by readers. */\nconst commitIndex = (\n index: Map<string, Array<CanonicalRecordEnvelope>>,\n additions: ReadonlyMap<string, Array<CanonicalRecordEnvelope>>,\n) => {\n for (const [key, entries] of additions) {\n const records = index.get(key);\n\n if (records === undefined) index.set(key, entries);\n else for (const entry of entries) records.push(entry);\n }\n};\n\nconst prepareIndexes = (\n previous: NativeIndexes,\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n) => {\n // Latest execution entries are replaced in this private map; owner histories only append.\n // Rebuild staging is private: reuse it only in the synchronous cursor publication step.\n const workerRecords = new Map<string, Array<CanonicalRecordEnvelope>>();\n\n const wasWorker = (previous.workerRecords.get(\"worker\") ?? []).some(\n ({ record }) => record.payload._tag === \"WorkerOriginRecorded\",\n );\n\n const isWorker =\n wasWorker || records.some(({ record }) => record.payload._tag === \"WorkerOriginRecorded\");\n\n // A Thread can gain a Worker origin after its initial history. Initialize once on that boundary.\n if (isWorker && !wasWorker)\n for (const entry of previous.byId.values()) {\n const payload = entry.record.payload;\n\n if (\n (payload._tag === \"UserInputRecorded\" || payload._tag === \"SubmissionSettled\") &&\n payload.runId !== undefined\n ) {\n const key = `execution:${payload._tag}`;\n\n if ((workerRecords.get(key)?.[0]?.sequence ?? 0) < entry.sequence)\n workerRecords.set(key, [entry]);\n }\n }\n const workerAppends = new Map<string, Array<CanonicalRecordEnvelope>>();\n const byId = new Map<string, CanonicalRecordEnvelope>();\n const runInputs = new Map<string, CanonicalRecordEnvelope | null>();\n const runRecords = new Map<string, Array<CanonicalRecordEnvelope>>();\n const handoffs: Array<CanonicalRecordEnvelope> = [];\n const agentUpdates: Array<CanonicalRecordEnvelope> = [];\n\n const deliveryPredecessors: Array<CanonicalRecordEnvelope> = [];\n\n const nativeAdds = emptyIndexes();\n const operationAppends = new Map<string, Array<CanonicalRecordEnvelope>>();\n\n for (const entry of records) {\n byId.set(entry.record.recordId, entry);\n const payload = entry.record.payload;\n\n if (payload._tag === \"ModelResponseRecorded\")\n for (const operation of payload.toolOperations) {\n const id = toolCallSettledRecordId(payload.runId, payload.turn, operation.toolCallId);\n\n nativeAdds.toolDeclarations.set(\n id,\n previous.toolDeclarations.has(id) || nativeAdds.toolDeclarations.has(id) ? null : entry,\n );\n }\n if (PROMPT_EVIDENCE_TAGS.some((tag) => tag === payload._tag))\n nativeAdds.promptEvidence.push(entry);\n if (payload._tag === \"ModelCompleted\") nativeAdds.modelCompletions.push(entry);\n if (payload._tag === \"UserInputRecorded\") {\n const message = payload.messageAdmission;\n\n if (\n message === undefined ||\n !(\"_tag\" in message) ||\n (message._tag !== \"WorkerCompletion\" && message._tag !== \"WorkerUpdate\")\n )\n nativeAdds.applicationInputs.push(entry);\n }\n if (\n (payload._tag === \"UserInputRecorded\" && payload.submissionId !== undefined) ||\n [\n \"RunStarted\",\n \"SubmissionSettled\",\n \"AbortRequested\",\n \"WorkerOriginRecorded\",\n \"SubagentLineageRecorded\",\n ].includes(payload._tag)\n )\n nativeAdds.durableOwners.push(entry);\n if (payload._tag === \"CompactionCreated\" && payload.kind === \"rollover\")\n for (let height = 0; height < 53; height++)\n appendToIndex(\n nativeAdds.windowBoundaries,\n `${height}:${Math.floor(payload.coversThrough / 2 ** height)}`,\n entry,\n );\n\n for (const runId of canonicalRunIds(entry.record)) appendToIndex(runRecords, runId, entry);\n if (isWorkHandoff(entry.record)) handoffs.push(entry);\n if (payload._tag === \"AgentUpdateEmitted\") agentUpdates.push(entry);\n if (\n payload._tag === \"WorkerReportPrepared\" ||\n (payload._tag === \"AgentUpdateEmitted\" && payload.delivery !== undefined)\n )\n deliveryPredecessors.push(entry);\n if (\"runId\" in payload && payload.runId !== undefined && \"toolCallId\" in payload) {\n appendToIndex(operationAppends, JSON.stringify([payload.runId, payload.toolCallId]), entry);\n if (payload._tag === \"ToolApprovalRequested\" || payload._tag === \"ToolApprovalDecided\")\n appendToIndex(\n operationAppends,\n JSON.stringify([payload.runId, payload.toolCallId, \"approval\"]),\n entry,\n );\n if (payload._tag === \"ToolCallSettled\")\n appendToIndex(\n operationAppends,\n JSON.stringify([payload.runId, payload.toolCallId, \"settled\"]),\n entry,\n );\n }\n\n if (\n isWorker &&\n (payload._tag === \"UserInputRecorded\" || payload._tag === \"SubmissionSettled\") &&\n payload.runId !== undefined\n )\n workerRecords.set(`execution:${payload._tag}`, [entry]);\n\n const workerKey =\n payload._tag === \"SubtreeBudgetReserved\"\n ? `subtree:${payload.sourceSubmissionId ?? \"\"}`\n : payload._tag === \"SubagentJoined\"\n ? `joined:${payload.runId}`\n : [\"ThreadCreated\", \"WorkerOriginRecorded\", \"SubagentLineageRecorded\"].includes(\n payload._tag,\n )\n ? \"worker\"\n : undefined;\n\n if (workerKey !== undefined) appendToIndex(workerAppends, workerKey, entry);\n if (payload._tag === \"WorkerStopRequested\")\n appendToIndex(workerAppends, `stop:${payload.command.worker.threadId}`, entry);\n if (\n payload._tag === \"WorkerInputRequested\" &&\n payload.admission.sourceSubmissionId !== undefined\n )\n appendToIndex(workerAppends, `funding:${payload.admission.sourceSubmissionId}`, entry);\n if (payload._tag === \"WorkerInputCompleted\") {\n const requested =\n previous.byId.get(workerInputRecordId(payload.messageId)) ??\n byId.get(workerInputRecordId(payload.messageId));\n\n const admission = requested?.record.payload;\n\n if (\n admission?._tag === \"WorkerInputRequested\" &&\n admission.admission.sourceSubmissionId !== undefined\n )\n appendToIndex(workerAppends, `funding:${admission.admission.sourceSubmissionId}`, entry);\n }\n if (payload._tag === \"WorkerInputRefused\") {\n const reserved = (\n previous.byId.get(payload.reservation.recordId) ?? byId.get(payload.reservation.recordId)\n )?.record.payload;\n\n const sourceSubmissionId =\n reserved?._tag === \"WorkerInputRequested\"\n ? reserved.admission.sourceSubmissionId\n : reserved?._tag === \"SubtreeBudgetReserved\"\n ? reserved.sourceSubmissionId\n : undefined;\n\n if (sourceSubmissionId !== undefined)\n appendToIndex(workerAppends, `funding:${sourceSubmissionId}`, entry);\n }\n if (\n payload._tag === \"UserInputRecorded\" &&\n payload.kind === \"user\" &&\n payload.runId !== undefined\n )\n runInputs.set(\n payload.runId,\n runInputs.has(payload.runId) || previous.runInputs.has(payload.runId) ? null : entry,\n );\n }\n\n return {\n indexes: previous,\n commit: () => {\n commitIndex(previous.runRecords, runRecords);\n commitIndex(previous.operationRecords, operationAppends);\n for (const [id, entry] of nativeAdds.toolDeclarations)\n previous.toolDeclarations.set(id, entry);\n for (const key of [\"promptEvidence\", \"modelCompletions\", \"applicationInputs\"] as const)\n for (const entry of nativeAdds[key]) previous[key].push(entry);\n commitIndex(previous.windowBoundaries, nativeAdds.windowBoundaries);\n if (previous.durableOwners.length === 0 && nativeAdds.durableOwners[0] !== undefined)\n previous.durableOwners.push(nativeAdds.durableOwners[0]);\n for (const [id, entry] of byId) previous.byId.set(id, entry);\n for (const [id, entry] of runInputs) previous.runInputs.set(id, entry);\n for (const [key, entries] of workerRecords) previous.workerRecords.set(key, entries);\n commitIndex(previous.workerRecords, workerAppends);\n for (const entry of handoffs) previous.handoffs.push(entry);\n for (const entry of agentUpdates) previous.agentUpdates.push(entry);\n for (const entry of deliveryPredecessors) previous.deliveryPredecessors.push(entry);\n },\n };\n};\n\ntype AppendDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadStoreError | ThreadNotMaterialized | AppendConflict;\n }\n | {\n readonly _tag: \"success\";\n readonly result: AppendResult;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n };\n\ntype MaterializeDecision =\n | { readonly _tag: \"failure\"; readonly error: ThreadStoreError }\n | { readonly _tag: \"success\" };\n\ntype CheckpointDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadNotMaterialized | ThreadStoreError | CheckpointRejected;\n }\n | { readonly _tag: \"success\" };\n\nconst storeError = (operation: string, message: string, cause?: unknown): ThreadStoreError =>\n cause === undefined\n ? ThreadStoreError.make({ operation, message })\n : ThreadStoreError.make({ operation, message, cause });\n\nconst validate = <A, I>(\n schema: Schema.Codec<A, I>,\n operation: string,\n value: unknown,\n): Effect.Effect<A, ThreadStoreError> =>\n Schema.encodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError((error) => storeError(operation, `Invalid ${operation} request`, error)),\n );\n\nconst decodeCanonicalSequence = Schema.decodeSync(CanonicalSequence);\nconst ZERO_CANONICAL_SEQUENCE = decodeCanonicalSequence(0);\n\nconst offsetSequence = Effect.fnUntraced(function* (\n threadId: ThreadId,\n offset: ObservationOffset | undefined,\n): Effect.fn.Return<CanonicalSequence, ThreadStoreError> {\n if (offset === undefined) return yield* Effect.succeed(ZERO_CANONICAL_SEQUENCE);\n const prefix = `memory:v1:${Base64.encode(threadId)}:`;\n const encodedSequence = offset.startsWith(prefix) ? offset.slice(prefix.length) : \"\";\n\n if (!/^\\d+$/.test(encodedSequence)) {\n return yield* Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n }\n const sequence = Number(encodedSequence);\n\n return yield* Number.isSafeInteger(sequence)\n ? Schema.decodeEffect(CanonicalSequence)(sequence).pipe(\n Effect.mapError(() => storeError(\"observe\", \"Malformed observation offset\")),\n )\n : Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n});\n\nconst observationOffset = (threadId: ThreadId, sequence: CanonicalSequence): ObservationOffset =>\n Schema.decodeSync(ObservationOffset)(`memory:v1:${Base64.encode(threadId)}:${sequence}`);\n\nconst batchEnvelopes = (\n threadId: ThreadId,\n batch: CommitBatch,\n firstSequence: CanonicalSequence,\n): ReadonlyArray<CanonicalRecordEnvelope> =>\n batch.records.map((record, index) => {\n const sequence = decodeCanonicalSequence(firstSequence + index);\n\n return CanonicalRecordEnvelope.make({\n threadId,\n batchId: batch.batchId,\n sequence,\n offset: observationOffset(threadId, sequence),\n record,\n });\n });\n\nconst decodeStoredBatch = (batchJson: string, operation: string) =>\n Schema.decodeEffect(Schema.fromJsonString(ExportBatch))(batchJson).pipe(\n Effect.mapError((cause) => storeError(operation, \"Invalid canonical batch JSON\", cause)),\n );\n\nconst findThread = Effect.fnUntraced(function* (\n state: MemoryState,\n threadId: ThreadId,\n): Effect.fn.Return<StoredThread, ThreadNotMaterialized> {\n const thread = state.threads.get(threadId);\n\n return yield* thread === undefined\n ? Effect.fail(ThreadNotMaterialized.make({ threadId }))\n : Effect.succeed(thread);\n});\n\nconst CheckpointVersionEnvelope = Schema.Struct({\n checkpoint: Schema.Struct({\n threadId: ThreadId,\n schemaVersion: Schema.Natural,\n }),\n});\n\nconst validateCheckpointVersion = Effect.fnUntraced(function* (\n value: unknown,\n): Effect.fn.Return<void, ThreadStoreError | CheckpointRejected> {\n const envelope = yield* Schema.decodeUnknownEffect(CheckpointVersionEnvelope)(value).pipe(\n Effect.mapError(() => storeError(\"saveCheckpoint\", \"Invalid saveCheckpoint request\")),\n );\n\n if (envelope.checkpoint.schemaVersion !== 1) {\n return yield* CheckpointRejected.make({\n threadId: envelope.checkpoint.threadId,\n reason: \"unsupported-version\",\n });\n }\n});\n\nconst makeThreadStore = Effect.gen(function* () {\n const maxThreads = yield* ThreadCapacity;\n const crypto = yield* Crypto.Crypto;\n const state = yield* Ref.make<MemoryState>({ threads: new Map() });\n const gate = yield* Semaphore.make(1);\n const owner = yield* makeStorageOwner(gate.withPermits(1));\n const withMutation = owner.withMutation;\n const updates = yield* PubSub.sliding<void>(1);\n let ledgerTransfer: MemoryLedgerTransfer | undefined;\n let deliveryTransfer: MemoryDeliveryTransfer | undefined;\n\n const workState = yield* Ref.make(new Map<ThreadId, WorkIndex>());\n const workOwners = new Map<\"admissions\" | \"deliveries\", MemoryWorkOwner>();\n let deliveryLookup: ((threadId: ThreadId, messageId: IdempotencyKey) => boolean) | undefined;\n\n const retainedDelivery = (threadId: ThreadId, messageId: IdempotencyKey) =>\n deliveryLookup?.(threadId, messageId) ?? false;\n\n const publishWork = (threadId: ThreadId, index: WorkIndex) =>\n MutableRef.get(workState.ref).set(threadId, index);\n\n const retainDelivery = (threadId: ThreadId, messageId: IdempotencyKey) => {\n const index = MutableRef.get(workState.ref).get(threadId);\n const ids = index?.messages.get(messageId);\n\n if (\n index === undefined ||\n index.version !== WORK_INDEX_VERSION ||\n index.entryCount !== index.entries.size ||\n ids === undefined\n )\n return;\n const { entries, messages } = index;\n\n for (const id of ids) {\n const entry = entries.get(id);\n\n if (entry !== undefined) changeWorkCounts(index, entry, -1);\n entries.delete(id);\n }\n messages.delete(messageId);\n publishWork(threadId, { ...index, entryCount: entries.size });\n };\n\n const readyIndex = (\n threadId: ThreadId,\n tail: number,\n ): Effect.Effect<WorkIndex, WorkDiscoveryUnavailable> => {\n const index = MutableRef.get(workState.ref).get(threadId);\n\n if (\n index === undefined ||\n index.version !== WORK_INDEX_VERSION ||\n index.entries.size !== index.entryCount\n )\n return Effect.fail(WorkDiscoveryUnavailable.make({ threadId, reason: \"missing-index\" }));\n if (index.state !== \"ready\" || index.through !== tail)\n return Effect.fail(WorkDiscoveryUnavailable.make({ threadId, reason: \"incomplete-rebuild\" }));\n\n return Effect.succeed(index);\n };\n\n const work: ThreadWorkStorage = {\n threads: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(WorkThreadsRequest, \"work threads\", unvalidated);\n const current = yield* Ref.get(state);\n const catalogue = yield* Ref.get(workState);\n\n const candidates = boundedWorkSelection<ThreadId>(\n request.limit,\n (id) => id,\n request.afterThreadId,\n );\n\n for (const [threadId, thread] of current.threads) {\n const index = catalogue.get(threadId);\n\n if (\n index === undefined ||\n index.version !== WORK_INDEX_VERSION ||\n index.state !== \"ready\" ||\n index.through !== thread.tailSequence ||\n index.entryCount !== index.entries.size ||\n index.entryCount > 0\n )\n candidates.add(threadId);\n }\n for (const owner of workOwners.values()) {\n const page = yield* owner.threads(request);\n\n for (const threadId of page.threadIds) candidates.add(threadId);\n }\n const threadIds = candidates.values;\n const afterThreadId = threadIds.length === request.limit ? threadIds.at(-1) : undefined;\n\n // A full page may have more owner rows; the next bounded call proves exhaustion.\n return {\n threadIds,\n ...(afterThreadId === undefined ? {} : { afterThreadId }),\n };\n }),\n ),\n page: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadWorkRequest, \"work page\", unvalidated);\n\n const cursor = yield* decodeWorkCursor(request).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const thread = (yield* Ref.get(state)).threads.get(request.threadId);\n // Accepted input can precede canonical Thread materialization entirely.\n const index = yield* readyIndex(request.threadId, thread?.tailSequence ?? 0);\n\n if (cursor.source === \"canonical\") {\n const candidates = boundedWorkSelection<CanonicalWorkEntry>(\n request.limit + 1,\n (entry) => entry.id,\n cursor.after,\n );\n\n for (const entry of index.entries.values()) candidates.add(entry);\n const selected = candidates.values;\n\n const entries = selected.slice(0, request.limit);\n const after = selected.length > request.limit ? entries.at(-1)?.id : undefined;\n\n return yield* validateWorkPage(\n {\n entries,\n cursor: encodeWorkCursor({\n version: WORK_INDEX_VERSION,\n threadDigest: cursor.threadDigest,\n source: after === undefined ? \"deliveries\" : \"canonical\",\n ...(after === undefined ? {} : { after }),\n }),\n },\n request.limit,\n );\n }\n\n const page = yield* (\n workOwners.get(cursor.source)?.page(request.threadId, cursor.after, request.limit) ??\n Effect.succeed<Effect.Success<ReturnType<MemoryWorkOwner[\"page\"]>>>({ entries: [] })\n );\n\n const next =\n page.after === undefined\n ? cursor.source === \"admissions\"\n ? \"canonical\"\n : undefined\n : cursor.source;\n\n return yield* validateWorkPage(\n {\n entries: [...page.entries],\n ...(next === undefined\n ? {}\n : {\n cursor: encodeWorkCursor({\n version: WORK_INDEX_VERSION,\n threadDigest: cursor.threadDigest,\n source: next,\n ...(page.after === undefined ? {} : { after: page.after }),\n }),\n }),\n },\n request.limit,\n );\n }),\n ),\n rebuild: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(WorkIndexRebuildRequest, \"rebuild work\", unvalidated);\n const current = yield* Ref.get(state);\n const thread = current.threads.get(request.threadId);\n const tail = thread?.tailSequence ?? ZERO_CANONICAL_SEQUENCE;\n const prior = (yield* Ref.get(workState)).get(request.threadId);\n\n const index: WorkIndex =\n request.restart ||\n prior === undefined ||\n prior.version !== WORK_INDEX_VERSION ||\n prior.entries.size !== prior.entryCount ||\n (prior.state === \"ready\" && prior.through !== tail)\n ? { ...emptyWorkIndex(), state: \"rebuilding\", rebuildingIndexes: emptyIndexes() }\n : prior;\n\n if (index.state === \"ready\")\n return {\n version: WORK_INDEX_VERSION,\n threadId: request.threadId,\n state: \"ready\",\n throughSequence: index.through,\n tailSequence: tail,\n processedRecords: 0,\n processedBytes: 0,\n };\n if (index.rebuildingIndexes === undefined)\n return yield* WorkDiscoveryUnavailable.make({\n threadId: request.threadId,\n reason: \"incomplete-rebuild\",\n });\n const rebuildingIndexes = index.rebuildingIndexes;\n const records: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n const end = Math.min(tail, index.through + (request.limit ?? MAX_WORK_REBUILD_RECORDS));\n\n for (let position = index.through; position < end; position++) {\n const size = thread === undefined ? undefined : storedBytes(thread, position + 1);\n\n if (size === undefined)\n return yield* storeError(\"rebuild work\", \"Canonical record byte length is missing\");\n if (bytes + size > MAX_WORK_REBUILD_BYTES) break;\n const record = thread === undefined ? undefined : storedRecord(thread, position + 1);\n\n if (record === undefined || record.sequence !== position + 1)\n return yield* storeError(\"rebuild work\", \"Canonical rebuild sequence is incomplete\");\n bytes += size;\n records.push(record);\n }\n if (index.through < tail && records.length === 0)\n return yield* storeError(\n \"rebuild work\",\n \"Canonical rebuild cannot advance within its byte bound\",\n );\n\n const commitWork = yield* prepareWork(index, records, retainedDelivery).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n // Shared writer gate fences the current tail; publish native locators and catalogue together.\n const next = yield* Effect.sync(() => {\n const native = prepareIndexes(rebuildingIndexes, records);\n const rebuilt = commitWork();\n const complete = rebuilt.through === tail;\n\n const next: WorkIndex = {\n version: rebuilt.version,\n through: rebuilt.through,\n reporting: rebuilt.reporting,\n entryCount: rebuilt.entryCount,\n entries: rebuilt.entries,\n messages: rebuilt.messages,\n foreign: rebuilt.foreign,\n workers: rebuilt.workers,\n liveInputs: rebuilt.liveInputs,\n inputsByWorker: rebuilt.inputsByWorker,\n state: complete ? \"ready\" : \"rebuilding\",\n ...(complete ? {} : { rebuildingIndexes: native.indexes }),\n };\n\n native.commit();\n if (thread !== undefined && complete)\n MutableRef.set(state.ref, {\n threads: new Map(current.threads).set(request.threadId, {\n ...thread,\n ...native.indexes,\n }),\n });\n publishWork(request.threadId, next);\n\n return next;\n });\n\n return {\n version: WORK_INDEX_VERSION,\n threadId: request.threadId,\n state: next.state,\n throughSequence: next.through,\n tailSequence: tail,\n processedRecords: records.length,\n processedBytes: bytes,\n };\n }),\n ),\n };\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(updates));\n\n const materialize: ThreadStore[\"Service\"][\"materialize\"] = Effect.fnUntraced(\n function* (unvalidated) {\n const request = yield* validate(ThreadMaterialization, \"materialize\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [MaterializeDecision, MemoryState] => {\n const existing = current.threads.get(request.threadId);\n\n if (existing !== undefined) return [{ _tag: \"success\" }, current];\n if (\n !MutableRef.get(workState.ref).has(request.threadId) &&\n MutableRef.get(workState.ref).size >= maxThreads\n ) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\"materialize\", `In-memory thread limit ${maxThreads} exceeded`),\n },\n current,\n ];\n }\n if (!transferPageFits(request.threadId))\n return [\n {\n _tag: \"failure\",\n error: storeError(\n \"materialize\",\n \"Thread identity exceeds its bounded transfer representation\",\n ),\n },\n current,\n ];\n const threads = new Map(current.threads);\n\n threads.set(request.threadId, {\n tailSequence: ZERO_CANONICAL_SEQUENCE,\n byId: new Map(),\n workerRecords: new Map(),\n runInputs: new Map(),\n runRecords: new Map(),\n operationRecords: new Map(),\n handoffs: [],\n agentUpdates: [],\n deliveryPredecessors: [],\n toolDeclarations: new Map(),\n promptEvidence: [],\n modelCompletions: [],\n applicationInputs: [],\n durableOwners: [],\n windowBoundaries: new Map(),\n ranges: new Map(),\n rangeStarts: [],\n archiveContents: new Map(),\n chunks: new Map(),\n batchesByFirst: new Map(),\n batches: new Map(),\n executions: new Map(),\n executionCommits: new Map(),\n checkpoints: new Map(),\n });\n\n publishWork(request.threadId, emptyWorkIndex());\n\n return [{ _tag: \"success\" }, { threads }];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n },\n );\n\n const prepareAppend = Effect.fnUntraced(function* (unvalidated: AppendRequest) {\n const captured = yield* PreparedAppend.capture(unvalidated);\n const request = captured;\n const batchJson = captured.batchJson;\n\n const batchBytes = new TextEncoder().encode(batchJson).byteLength;\n\n if (batchBytes > 16 * 1024 * 1024)\n return yield* storeError(\"append\", \"Canonical batch exceeds 16 MiB\");\n\n const offsetBytes = 4 * Math.ceil(utf8ByteLength(request.threadId) / 3) + 36;\n\n if (!canonicalBatchFitsTransfer(request.threadId, request.batch, batchBytes, offsetBytes))\n return yield* storeError(\n \"append\",\n \"Canonical batch exceeds its bounded transfer representation\",\n );\n\n return { request, batchJson };\n });\n\n const appendPrepared = Effect.fnUntraced(function* ({\n request,\n batchJson,\n }: PreparedMemoryAppend) {\n // Every caller holds the shared kernel mutation gate across validation and Ref publication.\n const current = yield* Ref.get(state);\n const thread = current.threads.get(request.threadId);\n\n const executionIntent = JSON.stringify({\n batch: batchJson,\n operational: (request.executions ?? []).flatMap((update) =>\n update.facts.map((fact) => Schema.encodeSync(RecordEnvelope)(fact)),\n ),\n });\n\n const latestIntent =\n thread === undefined\n ? undefined\n : [...thread.executionCommits.values()].find(\n (entry) => entry.batchId === request.batch.batchId,\n );\n\n if (thread !== undefined && latestIntent === undefined && request.batch.records.length === 0) {\n for (const update of request.executions ?? []) {\n const prior = thread.executions.get(update.checkpoint.progress.runId);\n\n if (\n prior !== undefined &&\n update.previousRevision < prior.progress.revision &&\n update.facts.every((fact) =>\n prior.operational.some((known) => known.recordId === fact.recordId),\n )\n )\n return yield* AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"stale-command\",\n });\n }\n }\n if (\n thread !== undefined &&\n thread.tailSequence === request.expectedTailSequence &&\n !thread.batches.has(request.batch.batchId) &&\n latestIntent === undefined\n ) {\n const executions = request.executions ?? [];\n\n if (\n new Set(executions.map((update) => update.checkpoint.progress.runId)).size !==\n executions.length\n )\n return yield* storeError(\"append\", \"Duplicate active execution identity\");\n for (const update of request.executions ?? []) {\n const prior = thread.executions.get(update.checkpoint.progress.runId);\n\n if ((prior?.progress.revision ?? 0) !== update.previousRevision)\n return yield* AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"tail\",\n actualTailSequence: thread.tailSequence,\n });\n if (\n update.checkpoint.throughSequence !==\n thread.tailSequence + request.batch.records.length ||\n update.checkpoint.batchId !== request.batch.batchId ||\n (prior !== undefined && update.checkpoint.originalSequence !== prior.originalSequence)\n )\n return yield* storeError(\n \"append\",\n \"Active checkpoint differs from its committed history boundary\",\n );\n if (\n update.retire &&\n ![\n ...request.batch.records,\n ...(thread.runRecords.get(update.checkpoint.progress.runId) ?? []).map(\n (entry) => entry.record,\n ),\n ].some(\n ({ payload }) =>\n payload._tag === \"SubmissionSettled\" &&\n payload.runId === update.checkpoint.progress.runId &&\n payload.submissionId === update.checkpoint.progress.submissionId,\n )\n )\n return yield* storeError(\n \"append\",\n \"Active state cannot retire without a canonical terminal outcome\",\n );\n }\n yield* validateProgressAppend(\n prepareProgressAppend(request.batch.records),\n request.executions,\n ).pipe(\n Effect.provideService(ProgressAppendReader, {\n previous: (runId) => Effect.succeed(thread.executions.get(runId)?.progress),\n initial: (next) =>\n Effect.succeed((thread.runRecords.get(next.runId) ?? []).map((entry) => entry.record)),\n }),\n );\n }\n\n const currentWork = (yield* Ref.get(workState)).get(request.threadId);\n\n const preparedWork =\n thread !== undefined &&\n thread.tailSequence === request.expectedTailSequence &&\n !thread.batches.has(request.batch.batchId) &&\n latestIntent === undefined &&\n currentWork?.version === WORK_INDEX_VERSION &&\n currentWork.state === \"ready\" &&\n currentWork.through === thread.tailSequence &&\n currentWork.entryCount === currentWork.entries.size\n ? yield* prepareWork(\n currentWork,\n batchEnvelopes(\n request.threadId,\n request.batch,\n decodeCanonicalSequence(thread.tailSequence + 1),\n ),\n retainedDelivery,\n ).pipe(Effect.provideService(Crypto.Crypto, crypto))\n : undefined;\n\n const decision = yield* Effect.uninterruptible(\n Ref.modify(state, (current): readonly [AppendDecision, MemoryState] => {\n const thread = current.threads.get(request.threadId);\n\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: request.threadId,\n }),\n },\n current,\n ];\n }\n const priorExecution = latestIntent;\n\n if (priorExecution !== undefined) {\n if (priorExecution.intent !== executionIntent)\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"batch-content\",\n }),\n },\n current,\n ];\n\n return [\n {\n _tag: \"success\",\n result: AppendResult.make({ ...priorExecution.result, replayed: true }),\n records: [],\n },\n current,\n ];\n }\n const previous = thread.batches.get(request.batch.batchId);\n\n if (previous !== undefined) {\n if (previous.batchJson !== batchJson) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"batch-content\",\n }),\n },\n current,\n ];\n }\n\n return [\n {\n _tag: \"success\",\n result: AppendResult.make({\n firstSequence: previous.result.firstSequence,\n lastSequence: previous.result.lastSequence,\n replayed: true,\n }),\n records: [],\n },\n current,\n ];\n }\n if (request.expectedTailSequence !== thread.tailSequence) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"tail\",\n actualTailSequence: thread.tailSequence,\n }),\n },\n current,\n ];\n }\n const batchRecordIds = new Set<RecordId>();\n\n for (const record of request.batch.records) {\n if (thread.byId.has(record.recordId) || batchRecordIds.has(record.recordId)) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"record-identity\",\n }),\n },\n current,\n ];\n }\n batchRecordIds.add(record.recordId);\n }\n\n const records = batchEnvelopes(\n request.threadId,\n request.batch,\n decodeCanonicalSequence(thread.tailSequence + 1),\n );\n\n const lastSequence = decodeCanonicalSequence(thread.tailSequence + records.length);\n\n const result = AppendResult.make({\n firstSequence: decodeCanonicalSequence(\n thread.tailSequence + (records.length > 0 ? 1 : 0),\n ),\n lastSequence,\n replayed: false,\n });\n\n const indexes = prepareIndexes(thread, records);\n\n const next: StoredThread = {\n ...thread,\n ...indexes.indexes,\n tailSequence: lastSequence,\n };\n\n // Every rejection and asynchronous validation precedes this synchronous publication.\n if (records.length > 0) {\n thread.batches.set(request.batch.batchId, { result, batchJson });\n thread.batchesByFirst.set(result.firstSequence, request.batch.batchId);\n retainRecords(thread, records);\n }\n for (const update of request.executions ?? []) {\n const runId = update.checkpoint.progress.runId;\n\n if (update.retire) {\n thread.executions.delete(runId);\n thread.executionCommits.delete(runId);\n } else {\n thread.executions.set(runId, update.checkpoint);\n thread.executionCommits.set(runId, {\n batchId: request.batch.batchId,\n intent: executionIntent,\n result,\n });\n }\n }\n indexes.commit();\n if (preparedWork !== undefined) publishWork(request.threadId, preparedWork());\n current.threads.set(request.threadId, next);\n\n const publication: readonly [AppendDecision, MemoryState] = [\n { _tag: \"success\", result, records },\n current,\n ];\n\n return publication;\n }).pipe(\n Effect.tap((decision) =>\n decision._tag === \"success\" && decision.records.length > 0\n ? PubSub.publish(updates, undefined)\n : Effect.void,\n ),\n ),\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.result;\n });\n\n const append: ThreadStore[\"Service\"][\"append\"] = Effect.fn(\"MemoryThreadStore.append\")(\n (request) =>\n prepareAppend(request).pipe(\n Effect.flatMap((prepared) =>\n owner.withProgress(prepared.request.threadId, withMutation(appendPrepared(prepared))),\n ),\n ),\n );\n\n const countPeerMessages: NonNullable<ThreadStore[\"Service\"][\"countPeerMessages\"]> =\n Effect.fnUntraced(function* (request) {\n yield* validate(ThreadPeerCountRequest, \"countPeerMessages\", request);\n const thread = yield* findThread(yield* Ref.get(state), request.threadId);\n\n const index = yield* readyIndex(request.threadId, thread.tailSequence).pipe(\n Effect.mapError((cause) => storeError(\"countPeerMessages\", cause.message)),\n );\n\n return Math.min(\n index.foreign.peer +\n (deliveryTransfer?.peerCount(request.threadId, request.nowMillis, request.limit) ?? 0),\n request.limit,\n );\n });\n\n const readSnapshot = (\n threadId: ThreadId,\n afterSequence: CanonicalSequence | undefined,\n limit: number,\n ) =>\n Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, threadId)),\n Effect.map((thread) => {\n // Append assigns gap-free sequences starting at 1, so the exclusive cursor is an index.\n const start = afterSequence ?? ZERO_CANONICAL_SEQUENCE;\n\n return storedPage(thread, start, limit);\n }),\n );\n\n const selectedStream = (\n sources: ReadonlyArray<ReadonlyArray<CanonicalRecordEnvelope>>,\n after: number,\n through: number,\n maximum: number,\n ) =>\n Stream.paginate({ after, count: 0 }, (cursor) =>\n Effect.gen(function* () {\n const page: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n let last = cursor.after;\n\n while (page.length < Math.min(READ_PAGE_SIZE, maximum - cursor.count)) {\n let selected: CanonicalRecordEnvelope | undefined;\n\n for (const source of sources) {\n const next = source[upperSequence(source, last)];\n\n if (\n next !== undefined &&\n next.sequence <= through &&\n (selected === undefined || next.sequence < selected.sequence)\n )\n selected = next;\n }\n if (selected === undefined) break;\n const size = canonicalRecordBytes(selected.record);\n\n if (size > 32 * 1024 * 1024)\n return yield* storeError(\"read\", \"Canonical value exceeds the page byte bound\");\n if (bytes + size > 32 * 1024 * 1024) break;\n bytes += size;\n page.push(selected);\n last = selected.sequence;\n }\n const next = { after: last, count: cursor.count + page.length };\n\n return [\n page,\n page.length === 0 || next.count >= maximum\n ? Option.none<typeof next>()\n : Option.some(next),\n ] as const;\n }),\n );\n\n const readFromThread = (threadId: ThreadId, thread: StoredThread, request: ThreadReadRequest) =>\n Stream.unwrap(\n Effect.gen(function* () {\n if (request.threadId !== threadId)\n return yield* storeError(\"read snapshot\", \"Thread differs from the captured snapshot\");\n\n if (!(\"selection\" in request))\n return Stream.paginate(\n { after: request.afterSequence ?? ZERO_CANONICAL_SEQUENCE, count: 0 },\n (cursor) =>\n Effect.gen(function* () {\n const page = storedPage(\n thread,\n cursor.after,\n Math.min(READ_PAGE_SIZE, request.limit - cursor.count),\n );\n\n const next = {\n after: page.at(-1)?.sequence ?? cursor.after,\n count: cursor.count + page.length,\n };\n\n return [\n page,\n page.length === 0 || next.count >= request.limit\n ? Option.none<typeof next>()\n : Option.some(next),\n ] as const;\n }),\n );\n const selection = request.selection;\n\n if (\n \"expectedTailSequence\" in selection &&\n selection.expectedTailSequence !== thread.tailSequence\n )\n return yield* storeError(\"selected read\", \"Canonical tail changed\");\n if (\"throughSequence\" in selection && selection.throughSequence > thread.tailSequence)\n return yield* storeError(\"selected read\", \"Captured sequence is ahead of canonical tail\");\n\n const through =\n \"throughSequence\" in selection ? selection.throughSequence : thread.tailSequence;\n\n const after = request.page.afterSequence ?? 0;\n let sources: ReadonlyArray<ReadonlyArray<CanonicalRecordEnvelope>> = [];\n\n const one = (entry: CanonicalRecordEnvelope | null | undefined) =>\n entry === undefined || entry === null ? [] : [entry];\n\n const latest = (entries: ReadonlyArray<CanonicalRecordEnvelope>) =>\n one(entries[upperSequence(entries, through) - 1]);\n\n switch (selection._tag) {\n case \"RecordId\":\n sources = [one(thread.byId.get(selection.recordId))];\n break;\n case \"RunInput\": {\n const entry = thread.runInputs.get(selection.runId);\n\n if (entry === null)\n return yield* storeError(\"selected read\", \"Ambiguous original Run input\");\n sources = [one(entry)];\n break;\n }\n case \"ToolDeclaration\": {\n const entry = thread.toolDeclarations.get(selection.settlementRecordId);\n\n if (entry === null)\n return yield* storeError(\"selected read\", \"Ambiguous original tool declaration\");\n if (entry !== undefined) {\n const payload = entry.record.payload;\n\n if (\n payload._tag !== \"ModelResponseRecorded\" ||\n !payload.toolOperations.some(\n (operation) =>\n toolCallSettledRecordId(payload.runId, payload.turn, operation.toolCallId) ===\n selection.settlementRecordId,\n )\n )\n return yield* storeError(\"selected read\", \"Invalid exact tool declaration pointer\");\n }\n sources = [one(entry)];\n break;\n }\n case \"RunEvidence\":\n sources = [\n thread.runRecords.get(selection.runId) ?? [],\n [\n submissionInputRecordId(selection.submissionId),\n submissionAbortRecordId(selection.submissionId),\n submissionSettlementRecordId(selection.submissionId),\n ]\n .flatMap((id) => one(thread.byId.get(id)))\n .sort((a, b) => a.sequence - b.sequence),\n ];\n break;\n case \"OperationEvidence\":\n sources = [\n thread.operationRecords.get(\n JSON.stringify([selection.runId, selection.toolCallId]),\n ) ?? [],\n ...selection.approvalToolCallIds.flatMap((toolCallId) =>\n toolCallId === selection.toolCallId\n ? []\n : [\n thread.operationRecords.get(\n JSON.stringify([selection.runId, toolCallId, \"approval\"]),\n ) ?? [],\n ],\n ),\n one(thread.byId.get(selection.originRecordId)),\n ];\n break;\n case \"LastAgentUpdate\":\n sources = [latest(thread.agentUpdates)];\n break;\n case \"DeliveryPredecessor\":\n sources = [latest(thread.deliveryPredecessors)];\n break;\n case \"LatestModelCompleted\":\n sources = [latest(thread.modelCompletions)];\n break;\n case \"LatestApplicationInput\":\n sources = [latest(thread.applicationInputs)];\n break;\n case \"DurableHistoryOwner\":\n sources = [one(thread.durableOwners[0])];\n break;\n case \"PromptEvidence\":\n sources = [thread.promptEvidence];\n break;\n case \"WorkHandoffs\":\n sources = [thread.handoffs];\n break;\n case \"ContextWindowBoundary\": {\n // Match native SQL's disjoint coverage-prefix seeks. Each bucket contains\n // canonical sequence order; captured-tail reads never assume monotone coverage.\n let start = 0;\n let selected: CanonicalRecordEnvelope | undefined;\n\n while (start < selection.atSequence) {\n const remaining = selection.atSequence - start;\n let height = Math.floor(Math.log2(remaining));\n\n while (2 ** height > remaining) height--;\n const width = 2 ** height;\n const entries = thread.windowBoundaries.get(`${height}:${start / width}`) ?? [];\n const candidate = entries[upperSequence(entries, through) - 1];\n\n if (\n candidate !== undefined &&\n (selected === undefined || candidate.sequence > selected.sequence)\n )\n selected = candidate;\n start += width;\n }\n sources = [one(selected)];\n break;\n }\n case \"WorkerStop\":\n sources = [latest(thread.workerRecords.get(`stop:${selection.workerThreadId}`) ?? [])];\n break;\n case \"WorkerExecution\":\n sources = [\n thread.workerRecords.get(\"execution:UserInputRecorded\") ?? [],\n thread.workerRecords.get(\"execution:SubmissionSettled\") ?? [],\n ];\n break;\n case \"WorkerState\":\n sources = [\n thread.workerRecords.get(\"worker\") ?? [],\n ...(selection.sourceSubmissionId === undefined\n ? []\n : [\n thread.workerRecords.get(`subtree:${selection.sourceSubmissionId}`) ?? [],\n thread.workerRecords.get(\n `joined:${runIdForSubmission(selection.sourceSubmissionId)}`,\n ) ?? [],\n thread.workerRecords.get(`funding:${selection.sourceSubmissionId}`) ?? [],\n ]),\n ];\n break;\n case \"LiveWorkerInputs\": {\n const index = yield* readyIndex(request.threadId, thread.tailSequence).pipe(\n Effect.mapError((e) => storeError(\"selected read\", e.message)),\n );\n\n if (selection.throughSequence !== thread.tailSequence)\n return yield* storeError(\n \"selected read\",\n \"Live work requires the current exact tail\",\n );\n\n const locators =\n selection.workerThreadId === undefined\n ? index.liveInputs\n : (index.inputsByWorker.get(selection.workerThreadId) ?? []);\n\n const start = liveInputPosition(locators, after + 1);\n const selected: Array<CanonicalRecordEnvelope> = [];\n\n for (let at = start; at < Math.min(locators.length, start + request.page.limit); at++) {\n const entry = index.entries.get(locators[at].id);\n\n const origin =\n entry === undefined ? undefined : thread.byId.get(entry.originRecordId);\n\n if (\n entry?.owner._tag !== \"WorkerInput\" ||\n origin?.record.payload._tag !== \"WorkerInputRequested\" ||\n origin.sequence !== locators[at].sequence ||\n origin.record.payload.admission.origin.worker.threadId !==\n entry.owner.workerThreadId ||\n (origin.record.payload.admission.reportKind === \"update\") !== entry.owner.update\n )\n return yield* storeError(\n \"selected read\",\n \"Invalid live worker input locator or origin\",\n );\n selected.push(origin);\n }\n sources = [selected];\n break;\n }\n }\n\n return selectedStream(sources, after, through, request.page.limit);\n }),\n );\n\n const read: ThreadStore[\"Service\"][\"read\"] = (input) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadReadRequest, \"read\", input);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n return readFromThread(request.threadId, thread, request);\n }),\n );\n\n const decodePromptRecord = Schema.decodeUnknownEffect(PromptRecord);\n\n const readPrompt: ThreadStore[\"Service\"][\"readPrompt\"] = (input) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadPromptRead, \"readPrompt\", input);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n if (request.throughSequence > thread.tailSequence)\n return yield* storeError(\"readPrompt\", \"Captured sequence is ahead of canonical tail\");\n const start = upperSequence(thread.promptEvidence, request.afterSequence ?? 0);\n const records: Array<PromptRecordEnvelope> = [];\n\n for (\n let at = start;\n at < Math.min(thread.promptEvidence.length, start + request.limit);\n at++\n ) {\n const entry = thread.promptEvidence[at];\n\n if (entry.sequence > request.throughSequence) break;\n\n const record = yield* decodePromptRecord(\n entry.record instanceof ExportedRecord ? entry.record.wire : entry.record,\n ).pipe(\n Effect.mapError((cause) => storeError(\"readPrompt\", \"Invalid prompt record\", cause)),\n );\n\n records.push({ threadId: request.threadId, sequence: entry.sequence, record });\n }\n\n return Stream.fromIterable(records);\n }),\n );\n\n const observe: ThreadStore[\"Service\"][\"observe\"] = (unvalidated) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadObservation, \"observe\", unvalidated);\n let after = yield* offsetSequence(request.threadId, request.afterOffset);\n const subscription = yield* PubSub.subscribe(updates);\n\n const drain = () =>\n Stream.paginate(after, (cursor) =>\n readSnapshot(request.threadId, cursor, READ_PAGE_SIZE).pipe(\n Effect.map((records) => {\n after = records.at(-1)?.sequence ?? cursor;\n\n return [\n records,\n records.length > 0 ? Option.some(after) : Option.none<CanonicalSequence>(),\n ] as const;\n }),\n ),\n );\n\n return drain().pipe(\n Stream.concat(\n Stream.fromEffectRepeat(PubSub.take(subscription)).pipe(Stream.flatMap(drain)),\n ),\n );\n }),\n );\n\n const emptyThread = (): StoredThread => ({\n ...emptyIndexes(),\n tailSequence: ZERO_CANONICAL_SEQUENCE,\n ranges: new Map(),\n rangeStarts: [],\n archiveContents: new Map(),\n chunks: new Map(),\n batches: new Map(),\n executions: new Map(),\n executionCommits: new Map(),\n batchesByFirst: new Map(),\n checkpoints: new Map(),\n });\n\n const makeExportReader = (idleOnly: boolean) =>\n ThreadExporterReader.of({\n snapshot: Effect.fnUntraced(function* (threadId: ThreadId, captured?: TransferManifest) {\n const thread = MutableRef.get(state.ref).threads.get(threadId);\n\n const facts =\n ledgerTransfer === undefined\n ? { idle: true, admissions: 0, aborts: 0, approvals: 0, resolutions: 0 }\n : yield* ledgerTransfer.snapshot(threadId);\n\n const delivered = deliveryTransfer?.snapshot(threadId) ?? { idle: true, deliveries: 0 };\n\n if (thread === undefined && facts.admissions === 0 && delivered.deliveries === 0)\n return yield* ThreadNotMaterialized.make({ threadId });\n if (idleOnly) {\n const index = yield* readyIndex(threadId, thread?.tailSequence ?? 0).pipe(\n Effect.mapError((e) => storeError(\"export\", e.message)),\n );\n\n if (\n owner.hasOwner(threadId) ||\n (thread?.executions.size ?? 0) > 0 ||\n index.entries.size > 0 ||\n !facts.idle ||\n !delivered.idle\n )\n return yield* ThreadExportRejected.make({ threadId, reason: \"non-idle\" });\n // Only the first page performs the full closed-receipt proof. The caller keeps\n // the source quiescent; subsequent pages still check current work and the tail.\n if (captured === undefined && thread !== undefined) {\n yield* Effect.gen(function* () {\n for (const runId of thread.runRecords.keys())\n yield* validateClosedRun(threadId, Schema.decodeSync(RunId)(runId));\n if (ledgerTransfer !== undefined) {\n const ledger = ledgerTransfer;\n\n yield* Stream.runForEach(ledger.submissions(threadId), (submission) =>\n Effect.gen(function* () {\n const admission = yield* ledger.admission(threadId, submission.submissionId);\n\n if (admission === undefined)\n return yield* storeError(\"export\", \"Missing immutable admission\");\n yield* rebuildClosedSubmission(admission);\n }),\n );\n }\n }).pipe(\n Effect.provide(ThreadImportReader.layer(importReader(threadId, thread))),\n Effect.mapError((cause) =>\n Schema.is(ThreadImportRejected)(cause)\n ? ThreadExportRejected.make({ threadId, reason: \"non-idle\" })\n : cause,\n ),\n );\n }\n }\n\n return {\n format: CURRENT_RECORD_FORMAT,\n threadId,\n tailSequence: thread?.tailSequence ?? ZERO_CANONICAL_SEQUENCE,\n snapshot: {\n admissions: facts.admissions,\n aborts: facts.aborts,\n approvals: facts.approvals,\n resolutions: facts.resolutions,\n deliveries: delivered.deliveries,\n },\n ...(facts.workerSeal === undefined ? {} : { workerSeal: facts.workerSeal }),\n };\n }),\n batch: Effect.fnUntraced(function* (threadId: ThreadId, fromSequence: number) {\n const thread = yield* findThread(MutableRef.get(state.ref), threadId);\n const batchId = thread.batchesByFirst.get(fromSequence);\n const stored = batchId === undefined ? undefined : thread.batches.get(batchId);\n\n if (\n stored === undefined ||\n new TextEncoder().encode(stored.batchJson).byteLength > 16 * 1024 * 1024\n )\n return yield* storeError(\"export\", \"Missing or oversized canonical batch wire\");\n const batch = yield* decodeStoredBatch(stored.batchJson, \"export\");\n const records: Array<ThreadExportRecord> = [];\n\n for (const [index, record] of batch.records.entries()) {\n const sequence = decodeCanonicalSequence(fromSequence + index);\n const exact = storedRecord(thread, sequence);\n\n if (\n exact === undefined ||\n exact.batchId !== batch.batchId ||\n exact.record.recordId !== record.recordId\n )\n return yield* storeError(\"export\", \"Canonical batch index differs from its wire\");\n records.push(\n ThreadExportRecord.make({\n threadId,\n batchId: batch.batchId,\n sequence,\n offset: observationOffset(threadId, sequence),\n record,\n }),\n );\n }\n\n return { batches: [{ batchId: batch.batchId, producerId: batch.producerId }], records };\n }),\n facts: (threadId, section, after) => {\n const empty = Effect.succeed({\n facts: {\n admissions: [],\n commands: { aborts: [], approvals: [], resolutions: [] },\n deliveries: [],\n },\n after: after ?? \"\",\n });\n\n return section === \"deliveries\"\n ? (deliveryTransfer?.facts(threadId, after) ?? empty)\n : (ledgerTransfer?.facts(threadId, section, after) ?? empty);\n },\n });\n\n const exportReader = makeExportReader(true);\n const verificationReader = makeExportReader(false);\n\n const exportThread: ThreadStore[\"Service\"][\"export\"] = (request) =>\n exportThreadPage(request).pipe(Effect.provideService(ThreadExporterReader, exportReader));\n\n const verificationPage: ThreadStore[\"Service\"][\"export\"] = (request) =>\n exportThreadPage(request).pipe(Effect.provideService(ThreadExporterReader, verificationReader));\n\n const exactRunRecords = (thread: StoredThread, runId: RunId) =>\n Effect.gen(function* () {\n const records: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n const facts = thread.runRecords.get(runId) ?? [];\n\n if (\n facts.length >\n MAX_RUN_EVIDENCE_RECORDS + RUN_TERMINAL_RESERVE_RECORDS + MAX_RUN_RECOVERY_SUFFIX_RECORDS\n )\n return yield* storeError(\"Run evidence\", \"Run record bounds exceeded\");\n for (const entry of facts) {\n bytes += canonicalRecordBytes(entry.record);\n if (bytes > MAX_RUN_EVIDENCE_BYTES + MAX_RUN_TERMINAL_BYTES + MAX_RUN_RECOVERY_SUFFIX_BYTES)\n return yield* storeError(\"Run evidence\", \"Run byte bounds exceeded\");\n records.push(entry);\n }\n\n return records.sort((a, b) => a.sequence - b.sequence);\n });\n\n const exactRecordReader = (\n threadId: ThreadId,\n thread: StoredThread,\n ): Pick<\n ThreadImportReader[\"Service\"],\n \"read\" | \"record\" | \"runRecords\" | \"execution\" | \"hasAgent\"\n > => ({\n read: (input) =>\n Stream.unwrap(\n validate(ThreadReadRequest, \"read snapshot\", input).pipe(\n Effect.map((request) => readFromThread(threadId, thread, request)),\n ),\n ),\n record: (id) => Effect.succeed(thread.byId.get(id)),\n runRecords: (id) => exactRunRecords(thread, id),\n execution: (id) => Effect.succeed(thread.executions.get(id)),\n hasAgent: (id) =>\n Effect.succeed(\n (thread.workerRecords.get(\"worker\") ?? []).some(\n ({ record }) => record.payload._tag === \"ThreadCreated\" && record.payload.agentId === id,\n ),\n ),\n });\n\n const importReader = (id: ThreadId, thread: StoredThread): ThreadImportReader[\"Service\"] => ({\n ...exactRecordReader(id, thread),\n admission: (sid) => ledgerTransfer?.admission(id, sid) ?? Effect.succeed(undefined),\n runOwner: (runId) =>\n runId.startsWith(\"run:\")\n ? (ledgerTransfer?.admission(id, Schema.decodeSync(importSubmissionId)(runId.slice(4))) ??\n Effect.succeed(undefined))\n : Effect.succeed(undefined),\n commands: (sid) =>\n ledgerTransfer?.commands(sid) ??\n Effect.succeed({ aborts: [], approvals: [], resolutions: [] }),\n delivery: (messageId) => deliveryTransfer?.record(id, messageId) ?? Effect.succeed(undefined),\n });\n\n const importThread: ThreadImport[\"Service\"][\"import\"] = (pages) =>\n captureImportSource(pages, (captured) =>\n withMutation(\n Effect.gen(function* () {\n const progress = makeThreadImportProgress();\n let staged: StoredThread | undefined;\n let stagedWork = emptyWorkIndex();\n let stagedLedger: MemoryLedgerImport | undefined;\n let stagedDelivery: MemoryDeliveryImport | undefined;\n let existing: StoredThread | undefined;\n\n yield* Stream.runForEach(captured, (input) =>\n Effect.gen(function* () {\n const page = yield* prepareImportPage(progress, input).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const id = page.archive.threadId;\n\n if (staged === undefined) {\n const current = MutableRef.get(state.ref);\n\n existing = current.threads.get(id);\n const existingWork = MutableRef.get(workState.ref).get(id);\n\n if (\n (existing !== undefined &&\n (existing.tailSequence > 0 ||\n existing.batches.size > 0 ||\n existing.executions.size > 0 ||\n existing.executionCommits.size > 0 ||\n existing.checkpoints.size > 0 ||\n existing.ranges.size > 0 ||\n existing.archiveContents.size > 0)) ||\n (existingWork !== undefined &&\n (existingWork.entries.size > 0 ||\n existingWork.state !== \"ready\" ||\n existingWork.through !== 0))\n )\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"target-not-empty\",\n message: \"Destination canonical Thread is not empty\",\n });\n if (\n !MutableRef.get(workState.ref).has(id) &&\n MutableRef.get(workState.ref).size >= maxThreads\n )\n return yield* storeError(\"import\", \"Destination Thread capacity exceeded\");\n staged = emptyThread();\n stagedLedger =\n ledgerTransfer === undefined ? undefined : yield* ledgerTransfer.startImport(id);\n stagedDelivery =\n deliveryTransfer === undefined\n ? undefined\n : yield* deliveryTransfer.startImport(id);\n if (page.archive.workerSeal !== undefined && stagedLedger === undefined)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"A paired ledger is required to preserve the worker seal\",\n });\n }\n if (page.archive.admissions.length > 0 && stagedLedger === undefined)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"A paired ledger is required for admission restore\",\n });\n if (page.archive.deliveries.length > 0 && stagedDelivery === undefined)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"A paired delivery store is required for delivery restore\",\n });\n for (const batch of page.batches) {\n if (\n !canonicalBatchFitsTransfer(\n id,\n batch.batch,\n utf8ByteLength(batch.batchJson),\n 4 * Math.ceil(utf8ByteLength(id) / 3) + 36,\n )\n )\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-capacity\",\n message: \"Canonical batch exceeds its bounded transfer representation\",\n });\n\n if (staged.batches.has(batch.batch.batchId))\n return yield* invalidThreadArchive(\"Duplicate canonical batch identity\", id);\n\n const records = page.records\n .filter((entry) => entry.batchId === batch.batch.batchId)\n .map((entry) =>\n CanonicalRecordEnvelope.make({\n ...entry,\n offset: observationOffset(id, entry.sequence),\n }),\n );\n\n for (const entry of records)\n if (staged.byId.has(entry.record.recordId))\n return yield* invalidThreadArchive(\"Duplicate canonical record identity\", id);\n const native = prepareIndexes(staged, records);\n\n const commitWork = yield* prepareWork(\n stagedWork,\n records,\n (_, messageId) => stagedDelivery?.has(messageId) ?? false,\n ).pipe(Effect.provideService(Crypto.Crypto, crypto));\n\n retainRecords(staged, records);\n native.commit();\n staged = {\n ...staged,\n ...native.indexes,\n tailSequence: batch.lastSequence,\n };\n staged.batches.set(batch.batch.batchId, {\n batchJson: batch.batchJson,\n result: AppendResult.make({\n firstSequence: batch.firstSequence,\n lastSequence: batch.lastSequence,\n replayed: false,\n }),\n });\n staged.batchesByFirst.set(batch.firstSequence, batch.batch.batchId);\n stagedWork = commitWork();\n }\n if (stagedLedger !== undefined) yield* stagedLedger.stage(page);\n if (stagedDelivery !== undefined) yield* stagedDelivery.stage(page);\n for (const delivery of page.archive.deliveries) {\n for (const workId of stagedWork.messages.get(delivery.key.messageId) ?? []) {\n const entry = stagedWork.entries.get(workId);\n\n if (entry !== undefined) changeWorkCounts(stagedWork, entry, -1);\n stagedWork.entries.delete(workId);\n }\n stagedWork.messages.delete(delivery.key.messageId);\n stagedWork = { ...stagedWork, entryCount: stagedWork.entries.size };\n }\n }),\n );\n const result = yield* finishThreadImport(progress);\n\n if (staged === undefined) return yield* invalidThreadArchive(\"Missing transfer pages\");\n const restoredThread = staged;\n const id = result.threadId;\n\n const fallback = {\n admission: () => Effect.succeed(undefined),\n runOwner: () => Effect.succeed(undefined),\n commands: () => Effect.succeed({ aborts: [], approvals: [], resolutions: [] }),\n };\n\n const reader: ThreadImportReader[\"Service\"] = {\n ...exactRecordReader(id, restoredThread),\n ...(stagedLedger?.reader ?? fallback),\n delivery: stagedDelivery?.record ?? (() => Effect.succeed(undefined)),\n };\n\n return yield* Effect.gen(function* () {\n for (const runId of restoredThread.runRecords.keys()) {\n yield* verifyRunContinuations(\n yield* reader.runRecords(Schema.decodeSync(RunId)(runId)),\n { verifyContext: false },\n ).pipe(Effect.mapError((e) => invalidThreadArchive(e.message, id)));\n yield* validateClosedRun(id, Schema.decodeSync(RunId)(runId));\n }\n let lastInputQueue = -1;\n\n for (let sequence = 1; sequence <= restoredThread.tailSequence; sequence++) {\n const entry = storedRecord(restoredThread, sequence);\n\n if (entry === undefined)\n return yield* invalidThreadArchive(\"Incomplete canonical staging\", id);\n yield* verifyImportedReferences(entry);\n const payload = entry.record.payload;\n\n if (payload._tag === \"UserInputRecorded\" && payload.submissionId !== undefined) {\n const admission = yield* reader.admission(payload.submissionId);\n\n if (admission === undefined || admission.queueSequence <= lastInputQueue)\n return yield* invalidThreadArchive(\n \"Canonical inputs violate immutable admission order\",\n id,\n );\n lastInputQueue = admission.queueSequence;\n }\n\n if (\n payload._tag === \"UserInputRecorded\" &&\n payload.submissionId !== undefined &&\n entry.record.recordId !== submissionInputRecordId(payload.submissionId)\n )\n return yield* invalidThreadArchive(\"Canonical input identity is ambiguous\", id);\n if (\n payload._tag === \"SubmissionSettled\" &&\n entry.record.recordId !== submissionSettlementRecordId(payload.submissionId)\n )\n return yield* invalidThreadArchive(\n \"Canonical settlement identity is ambiguous\",\n id,\n );\n if (\n payload._tag !== \"WorkerInputCompleted\" &&\n \"submissionId\" in payload &&\n payload.submissionId !== undefined &&\n (yield* reader.admission(payload.submissionId)) === undefined\n )\n return yield* invalidThreadArchive(\"Canonical submission has no admission\", id);\n }\n if (stagedWork.entries.size > 0)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"Transfer contains unresolved work\",\n });\n\n const commitLedger =\n stagedLedger === undefined\n ? undefined\n : yield* stagedLedger.prepareCommit(progress.manifest?.workerSeal);\n\n const commitDelivery =\n stagedDelivery === undefined ? undefined : yield* stagedDelivery.prepareCommit();\n\n const installed = restoredThread;\n\n yield* Effect.uninterruptible(\n Effect.sync(() => {\n commitLedger?.();\n commitDelivery?.();\n publishWork(id, stagedWork);\n MutableRef.get(state.ref).threads.set(id, installed);\n }).pipe(Effect.andThen(PubSub.publish(updates, undefined))),\n );\n\n return result;\n }).pipe(\n Effect.provide(ThreadImportReader.layer(reader)),\n Effect.provideService(ThreadDeliveryImportReader, {\n admission: (threadId, sid) =>\n threadId === id\n ? reader.admission(sid)\n : (ledgerTransfer?.admission(threadId, sid) ?? Effect.succeed(undefined)),\n record: (threadId, recordId) =>\n Effect.succeed(\n threadId === id\n ? restoredThread.byId.get(recordId)?.record\n : MutableRef.get(state.ref).threads.get(threadId)?.byId.get(recordId)?.record,\n ),\n }),\n );\n }).pipe(Effect.provideService(Crypto.Crypto, crypto)),\n ),\n );\n\n const inspectTail: ThreadStore[\"Service\"][\"inspectTail\"] = Effect.fnUntraced(\n function* (unvalidated) {\n const request = yield* validate(ThreadTailRequest, \"inspectTail\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n return ThreadTail.make({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n });\n },\n );\n\n const readIdentity: ThreadStore[\"Service\"][\"readIdentity\"] = Effect.fnUntraced(\n function* (unvalidated) {\n const request = yield* validate(ThreadIdentityRequest, \"readIdentity\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n const selected = [\n storedRecord(thread, 1),\n thread.byId.get(workerOriginRecordId(request.threadId)),\n thread.byId.get(subagentLineageRecordId(request.threadId)),\n ].filter((entry) => entry !== undefined);\n\n return yield* ThreadIdentity.makeEffect({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n hasAdmissions:\n ledgerTransfer !== undefined &&\n (yield* ledgerTransfer.snapshot(request.threadId)).admissions > 0,\n records: selected.filter(\n (entry, index) =>\n selected.findIndex((other) => other.record.recordId === entry.record.recordId) ===\n index,\n ),\n }).pipe(\n Effect.mapError((cause) => storeError(\"readIdentity\", \"Invalid canonical identity\", cause)),\n );\n },\n );\n\n const saveCheckpoint: ThreadCheckpoints[\"save\"] = Effect.fnUntraced(function* (unvalidated) {\n yield* validateCheckpointVersion(unvalidated);\n const request = yield* validate(SaveCheckpointRequest, \"saveCheckpoint\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [CheckpointDecision, MemoryState] => {\n const checkpoint = request.checkpoint;\n const thread = current.threads.get(checkpoint.threadId);\n\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: checkpoint.threadId,\n }),\n },\n current,\n ];\n }\n if (checkpoint.throughSequence > thread.tailSequence) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"ahead-of-tail\",\n }),\n },\n current,\n ];\n }\n if (!isBatchBoundary(thread, checkpoint.throughSequence)) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"not-batch-boundary\",\n }),\n },\n current,\n ];\n }\n const checkpoints = thread.checkpoints;\n\n checkpoints.set(checkpoint.throughSequence, checkpoint);\n // Checkpoints are disposable cache entries; history never fails when this cache fills.\n if (checkpoints.size > MAX_CHECKPOINTS_PER_THREAD) {\n let oldest = checkpoint.throughSequence;\n\n for (const sequence of checkpoints.keys()) if (sequence < oldest) oldest = sequence;\n checkpoints.delete(oldest);\n }\n\n return [{ _tag: \"success\" }, current];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n });\n\n const loadCheckpoint: ThreadCheckpoints[\"load\"] = Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(LoadCheckpointRequest, \"loadCheckpoint\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n const maximum = request.atOrBeforeSequence ?? thread.tailSequence;\n let selected: ThreadCheckpoint | undefined;\n\n for (const [sequence, checkpoint] of thread.checkpoints) {\n if (sequence <= maximum && (selected === undefined || sequence > selected.throughSequence)) {\n selected = checkpoint;\n }\n }\n if (selected !== undefined && !isBatchBoundary(thread, selected.throughSequence)) {\n return yield* CheckpointRejected.make({\n threadId: request.threadId,\n reason: \"not-batch-boundary\",\n });\n }\n\n return Option.fromNullishOr(selected);\n });\n\n // Range contents remain volatile RAM. Publishing an archive locator adds no durability.\n const verifyRange = Effect.fnUntraced(function* (\n thread: StoredThread,\n range: ThreadArchiveRange,\n source?: Map<BatchId, string>,\n ) {\n let sequence = range.firstSequence;\n let bytes = 0;\n let batches = 0;\n const captured = new Map<BatchId, string>();\n\n while (sequence <= range.lastSequence) {\n const id = thread.batchesByFirst.get(sequence);\n const batch = id === undefined ? undefined : thread.batches.get(id);\n\n const text =\n id === undefined ? undefined : source === undefined ? batch?.batchJson : source.get(id);\n\n if (\n id === undefined ||\n batch === undefined ||\n text === undefined ||\n batch.result.lastSequence > range.lastSequence\n )\n return yield* storeError(\"verify range\", \"Incomplete canonical batch range\");\n bytes += new TextEncoder().encode(text).byteLength;\n batches++;\n if (\n bytes > MAX_ARCHIVE_RANGE_BYTES ||\n batches > MAX_ARCHIVE_RANGE_RECORDS ||\n text !== batch.batchJson\n )\n return yield* storeError(\n \"verify range\",\n \"Range wire or bounds differ from canonical storage\",\n );\n\n const wire = yield* Schema.decodeEffect(Schema.fromJsonString(ExportBatch))(text).pipe(\n Effect.mapError((cause) => storeError(\"verify range\", \"Invalid range wire\", cause)),\n );\n\n if (\n wire.batchId !== id ||\n batch.result.firstSequence !== sequence ||\n batch.result.lastSequence !== sequence + wire.records.length - 1\n )\n return yield* storeError(\"verify range\", \"Canonical batch span or identity differs\");\n\n for (const [index, record] of wire.records.entries()) {\n const expected = storedRecord(thread, sequence + index);\n\n if (\n expected === undefined ||\n expected.threadId !== range.threadId ||\n expected.sequence !== sequence + index ||\n expected.batchId !== id ||\n expected.record.recordId !== record.recordId\n )\n return yield* storeError(\"verify range\", \"Canonical record identity or order differs\");\n\n const canonical = yield* Schema.encodeEffect(ReadRecord)(expected.record).pipe(\n Effect.mapError((cause) => storeError(\"verify range\", \"Invalid canonical record\", cause)),\n );\n\n const archived = yield* Schema.encodeEffect(ExportRecord)(record).pipe(\n Effect.mapError((cause) => storeError(\"verify range\", \"Invalid archive record\", cause)),\n );\n\n if (canonicalJson(canonical) !== canonicalJson(archived))\n return yield* storeError(\"verify range\", \"Archive and canonical record bytes differ\");\n }\n captured.set(id, text);\n sequence = decodeCanonicalSequence(batch.result.lastSequence + 1);\n }\n if (\n bytes !== range.byteCount ||\n batches !== range.batchCount ||\n range.recordCount !== range.lastSequence - range.firstSequence + 1\n )\n return yield* storeError(\"verify range\", \"Range spans or counts differ\");\n\n return captured;\n });\n\n const archiveTarget = Effect.fnUntraced(function* (\n request: import(\"@yielded/agent/thread-archive-range\").ThreadArchiveRangeSeal,\n ) {\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n return thread;\n });\n\n const archives: ThreadArchiveStorage = {\n page: Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(ThreadArchiveRangeRead, \"range page\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n let low = 0;\n let high = thread.rangeStarts.length;\n\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n const range = thread.ranges.get(thread.rangeStarts[middle]);\n\n if (range === undefined)\n return yield* storeError(\"page ranges\", \"Range locator has no exact range\");\n if (range.lastSequence <= (request.afterSequence ?? 0)) low = middle + 1;\n else high = middle;\n }\n const ranges: Array<ThreadArchiveRange> = [];\n const limit = request.limit ?? 32;\n\n for (let at = low; at < Math.min(thread.rangeStarts.length, low + limit); at++) {\n const range = thread.ranges.get(thread.rangeStarts[at]);\n\n if (range === undefined)\n return yield* storeError(\"page ranges\", \"Range locator has no exact range\");\n ranges.push(range);\n }\n\n const afterSequence =\n low + ranges.length < thread.rangeStarts.length ? ranges.at(-1)?.lastSequence : undefined;\n\n return { ranges, ...(afterSequence === undefined ? {} : { afterSequence }) };\n }),\n seal: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadArchiveRangeSeal, \"seal range\", unvalidated);\n const thread = yield* archiveTarget(request);\n const previousStart = thread.rangeStarts.at(-1);\n\n const previous =\n previousStart === undefined ? undefined : thread.ranges.get(previousStart);\n\n if (previousStart !== undefined && previous === undefined)\n return yield* storeError(\"seal range\", \"Range locator has no exact range\");\n const firstSequence = (previous?.lastSequence ?? 0) + 1;\n\n if (firstSequence > thread.tailSequence) return Option.none<ThreadArchiveRange>();\n let nextSequence = firstSequence;\n let byteCount = 0;\n let batchCount = 0;\n\n while (nextSequence <= thread.tailSequence) {\n const batchId = thread.batchesByFirst.get(nextSequence);\n const batch = batchId === undefined ? undefined : thread.batches.get(batchId);\n\n if (batch === undefined)\n return yield* storeError(\"seal range\", \"Missing exact canonical batch\");\n const bytes = utf8ByteLength(batch.batchJson);\n\n if (\n batchCount > 0 &&\n (batch.result.lastSequence - firstSequence + 1 > MAX_ARCHIVE_RANGE_RECORDS ||\n byteCount + bytes > MAX_ARCHIVE_RANGE_BYTES)\n )\n break;\n byteCount += bytes;\n batchCount++;\n nextSequence = batch.result.lastSequence + 1;\n }\n\n const range = ThreadArchiveRange.make({\n format: \"effect-agent/thread-range@2\",\n threadId: request.threadId,\n firstSequence: decodeCanonicalSequence(firstSequence),\n lastSequence: decodeCanonicalSequence(nextSequence - 1),\n recordCount: nextSequence - firstSequence,\n batchCount,\n byteCount,\n state: \"sealed\",\n });\n\n yield* verifyRange(thread, range);\n thread.ranges.set(firstSequence, range);\n thread.rangeStarts.push(firstSequence);\n\n return Option.some(range);\n }),\n ),\n verify: Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(ThreadArchiveRangeRequest, \"verify range\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n const range = thread.ranges.get(request.firstSequence);\n\n if (range === undefined) return yield* storeError(\"verify range\", \"Unknown sealed range\");\n yield* verifyRange(\n thread,\n range,\n range.state === \"archived\" ? thread.archiveContents.get(range.firstSequence) : undefined,\n );\n if (range.state === \"archived\" && !thread.archiveContents.has(range.firstSequence))\n return yield* storeError(\"verify range\", \"Published archive contents are missing\");\n\n return range;\n }),\n archive: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadArchiveRangePublish, \"archive range\", unvalidated);\n const thread = yield* archiveTarget(request);\n const range = thread.ranges.get(request.firstSequence);\n\n if (range === undefined)\n return yield* storeError(\"archive range\", \"Unknown sealed range\");\n if (range.state === \"archived\") {\n const contents = thread.archiveContents.get(range.firstSequence);\n\n if (contents === undefined)\n return yield* storeError(\"archive range\", \"Published archive contents are missing\");\n yield* verifyRange(thread, range, contents);\n\n return range;\n }\n const contents = yield* verifyRange(thread, range);\n\n yield* verifyRange(thread, range, contents);\n\n const published = ThreadArchiveRange.make({\n ...range,\n state: \"archived\",\n locator: `memory:${encodeURIComponent(request.threadId)}:${range.firstSequence}`,\n });\n\n thread.archiveContents.set(range.firstSequence, contents);\n thread.ranges.set(range.firstSequence, published);\n\n return published;\n }),\n ),\n };\n\n const readWorkerCapacity: NonNullable<ThreadStore[\"Service\"][\"readWorkerCapacity\"]> =\n Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(ThreadWorkerCapacityRequest, \"worker capacity\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n if (request.expectedTailSequence !== thread.tailSequence)\n return yield* storeError(\"worker capacity\", \"Canonical tail changed\");\n\n const index = yield* readyIndex(request.threadId, thread.tailSequence).pipe(\n Effect.mapError((e) => storeError(\"worker capacity\", e.message)),\n );\n\n const worker = index.workers.get(request.workerThreadId);\n\n return ThreadWorkerCapacity.make({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n activeWorkers: Math.min(index.workers.size, request.activeLimit + 1),\n workerActive: worker !== undefined,\n pendingInputs: Math.min(\n request.update ? (worker?.update ?? 0) : (worker?.ordinary ?? 0),\n request.pendingLimit + 1,\n ),\n });\n });\n\n const verification = {\n verify: (unvalidated: import(\"@yielded/agent/thread-store\").ThreadVerificationRequest) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadVerificationRequest, \"verify Thread\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n const id = request.threadId;\n\n const reader = importReader(id, thread);\n\n const submissions = () => ledgerTransfer?.submissions(id) ?? Stream.empty;\n\n const runs = Stream.fromIterable(thread.runRecords.keys()).pipe(\n Stream.map((runId) => Schema.decodeSync(RunId)(runId)),\n );\n\n const checkpoint = yield* loadCheckpoint(\n LoadCheckpointRequest.make({ threadId: id }),\n ).pipe(\n Effect.mapError((cause) =>\n Schema.is(CheckpointRejected)(cause)\n ? storeError(\"verify checkpoint\", \"Invalid checkpoint anchor\", cause)\n : cause,\n ),\n );\n\n return yield* verifyThreadInvariants({\n threadId: id,\n runs,\n executions: Stream.fromIterable(thread.executions.values()),\n submissions: submissions(),\n pages: streamExport({ threadId: id }).pipe(\n Stream.provideService(ThreadExportSource, { export: verificationPage }),\n Stream.mapError((cause) =>\n Schema.is(ThreadExportRejected)(cause)\n ? storeError(\"verify Thread\", \"Internal verification snapshot changed\")\n : cause,\n ),\n ),\n ...(Option.isNone(checkpoint) ? {} : { checkpoint: checkpoint.value }),\n checkpointsSupported: true,\n ...(request.requireAllSettled === undefined\n ? {}\n : { requireAllSettled: request.requireAllSettled }),\n }).pipe(\n Effect.provide(ThreadImportReader.layer(reader)),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n }),\n ),\n };\n\n const threadStore = ThreadStore.of({\n work,\n archives,\n verification,\n readWorkerCapacity,\n readIdentity,\n countPeerMessages,\n materialize: (request) => withMutation(materialize(request)),\n append,\n readExecution: (request) =>\n withMutation(\n Effect.gen(function* () {\n const thread = (yield* Ref.get(state)).threads.get(request.threadId);\n\n if (thread === undefined)\n return yield* ThreadNotMaterialized.make({ threadId: request.threadId });\n\n return Option.fromUndefinedOr(thread.executions.get(request.runId));\n }),\n ),\n read,\n readPrompt,\n observe,\n export: (request) =>\n checkExportSource(request.threadId).pipe(Effect.andThen(withMutation(exportThread(request)))),\n inspectTail,\n checkpoints: { save: (request) => withMutation(saveCheckpoint(request)), load: loadCheckpoint },\n });\n\n return Context.make(ThreadStore, threadStore).pipe(\n Context.add(StorageOwner, owner),\n Context.add(ThreadImport, { import: importThread }),\n Context.add(MemoryThreadStoreKernel, {\n owner,\n withMutation,\n retainDelivery,\n checkThreadCapacity: (threadId) =>\n Effect.suspend(() =>\n !MutableRef.get(workState.ref).has(threadId) &&\n MutableRef.get(workState.ref).size >= maxThreads\n ? Effect.fail(storeError(\"Thread capacity\", \"Retained Thread quota exceeded\"))\n : Effect.void,\n ),\n initializeWork: (threadId) => {\n if (\n !MutableRef.get(state.ref).threads.has(threadId) &&\n !MutableRef.get(workState.ref).has(threadId)\n )\n publishWork(threadId, emptyWorkIndex());\n },\n registerWorkOwner: (kind, owner) =>\n withMutation(\n Effect.sync(() => {\n if (workOwners.has(kind))\n throw new Error(`MemoryThreadStore already has a ${kind} work owner`);\n workOwners.set(kind, owner);\n }),\n ),\n registerDeliveryLookup: (lookup) =>\n withMutation(\n Effect.sync(() => {\n if (deliveryLookup !== undefined)\n throw new Error(\"MemoryThreadStore already has a delivery lookup\");\n deliveryLookup = lookup;\n }),\n ),\n registerLedgerTransfer: (transfer) =>\n withMutation(\n Effect.sync(() => {\n if (ledgerTransfer !== undefined)\n throw new Error(\"MemoryThreadStore already has a paired SubmissionLedger\");\n ledgerTransfer = transfer;\n }),\n ),\n registerDeliveryTransfer: (transfer) =>\n withMutation(\n Effect.sync(() => {\n if (deliveryTransfer !== undefined)\n throw new Error(\"MemoryThreadStore already has a paired delivery store\");\n deliveryTransfer = transfer;\n }),\n ),\n prepareAppend,\n appendPrepared,\n record: (threadId, recordId) =>\n Ref.get(state).pipe(\n Effect.map((current) => current.threads.get(threadId)?.byId.get(recordId)?.record),\n ),\n toolCallResults: (threadId, runId, toolCallId) =>\n Ref.get(state).pipe(\n Effect.map((current) =>\n (\n current.threads\n .get(threadId)\n ?.operationRecords.get(JSON.stringify([runId, toolCallId, \"settled\"])) ?? []\n )\n .slice(0, 2)\n .map((entry) => entry.record),\n ),\n ),\n tail: (threadId) => inspectTail(ThreadTailRequest.make({ threadId })),\n }),\n );\n});\n\n/**\n * In-memory canonical Thread persistence. Durable accepted work is served by the separate\n * SubmissionLedger port; this Layer provides ThreadStore, ThreadReader, and ThreadImport.\n * Importing admissions requires a MemorySubmissionLedger paired with this store.\n */\nexport const MemoryThreadStoreLive = ThreadReader.layer().pipe(\n Layer.provideMerge(Layer.effectContext(makeThreadStore)),\n);\n\n/** Configure a finite retained Thread capacity. Invalid construction options throw immediately. */\nexport const memoryThreadStoreLayer = (options: { readonly maxThreads?: number } = {}) =>\n MemoryThreadStoreLive.pipe(\n Layer.provide(\n Layer.succeed(ThreadCapacity)(\n Schema.decodeSync(\n Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(65_536)),\n )(options.maxThreads ?? MAX_THREADS),\n ),\n ),\n );\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MemoryThreadStore.mjs","names":["importSubmissionId"],"sources":["../src/MemoryThreadStore.ts"],"sourcesContent":["import { canonicalJson, utf8ByteLength } from \"@yielded/agent/digest\";\nimport { ThreadId, RunId, SubmissionId as importSubmissionId } from \"@yielded/agent/identifiers\";\nimport type { IdempotencyKey } from \"@yielded/agent/receipt\";\nimport {\n ExportBatch,\n ExportedRecord,\n ExportRecord,\n ReadRecord,\n} from \"@yielded/agent/record-format\";\nimport {\n CURRENT_RECORD_FORMAT,\n RecordEnvelope,\n type RecordId,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n ObservationOffset,\n type BatchId,\n MAX_RUN_EVIDENCE_RECORDS,\n MAX_RUN_EVIDENCE_BYTES,\n MAX_RUN_TERMINAL_BYTES,\n RUN_TERMINAL_RESERVE_RECORDS,\n MAX_RUN_RECOVERY_SUFFIX_RECORDS,\n MAX_RUN_RECOVERY_SUFFIX_BYTES,\n PromptRecord,\n type PromptRecordEnvelope,\n} from \"@yielded/agent/records\";\nimport {\n canonicalRunIds,\n canonicalRecordBytes,\n isWorkHandoff,\n prepareProgressAppend,\n ProgressAppendReader,\n validateProgressAppend,\n verifyRunContinuations,\n} from \"@yielded/agent/run-continuation\";\nimport {\n runIdForSubmission,\n subagentLineageRecordId,\n workerOriginRecordId,\n workerInputRecordId,\n toolCallSettledRecordId,\n} from \"@yielded/agent/run-journal\";\nimport { StorageOwner, makeStorageOwner } from \"@yielded/agent/run-storage\";\nimport {\n submissionAbortRecordId,\n submissionInputRecordId,\n submissionSettlementRecordId,\n} from \"@yielded/agent/submission-ledger\";\nimport {\n ThreadArchiveRange,\n ThreadArchiveRangeRead,\n ThreadArchiveRangeSeal,\n ThreadArchiveRangePublish,\n ThreadArchiveRangeRequest,\n MAX_ARCHIVE_RANGE_RECORDS,\n MAX_ARCHIVE_RANGE_BYTES,\n type ThreadArchiveStorage,\n} from \"@yielded/agent/thread-archive-range\";\nimport {\n makeThreadImportProgress,\n captureImportSource,\n prepareImportPage,\n finishThreadImport,\n verifyImportedReferences,\n validateClosedRun,\n rebuildClosedSubmission,\n invalidThreadArchive,\n ThreadImportReader,\n ThreadDeliveryImportReader,\n ThreadImport,\n ThreadImportRejected,\n} from \"@yielded/agent/thread-import\";\nimport { verifyThreadInvariants } from \"@yielded/agent/thread-invariants\";\nimport {\n type AppendRequest,\n type ExecutionCheckpoint,\n type ThreadCheckpoint,\n ThreadPeerCountRequest,\n ThreadIdentity,\n ThreadIdentityRequest,\n AppendConflict,\n AppendResult,\n CheckpointRejected,\n ThreadExportRecord,\n ThreadExportRejected,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadObservation,\n ThreadReadRequest,\n ThreadPromptRead,\n ThreadStore,\n ThreadReader,\n type ThreadCheckpoints,\n ThreadStoreError,\n ThreadTail,\n ThreadTailRequest,\n PreparedAppend,\n type CommitBatch,\n LoadCheckpointRequest,\n SaveCheckpointRequest,\n PROMPT_EVIDENCE_TAGS,\n ThreadVerificationRequest,\n ThreadWorkerCapacityRequest,\n ThreadWorkerCapacity,\n streamExport,\n ThreadExportSource,\n canonicalBatchFitsTransfer,\n transferPageFits,\n} from \"@yielded/agent/thread-store\";\nimport {\n checkExportSource,\n exportThreadPage,\n ThreadExporterReader,\n type TransferManifest,\n} from \"@yielded/agent/thread-transfer\";\nimport {\n WORK_INDEX_VERSION,\n MAX_WORK_REBUILD_RECORDS,\n MAX_WORK_REBUILD_BYTES,\n WorkDiscoveryUnavailable,\n ThreadWorkRequest,\n WorkThreadsRequest,\n WorkIndexRebuildRequest,\n decodeWorkCursor,\n encodeWorkCursor,\n validateWorkPage,\n workIndexChanges,\n advanceWorkEntry,\n type CanonicalWorkEntry,\n type WorkerReportingMode,\n type ThreadWorkStorage,\n} from \"@yielded/agent/thread-work\";\nimport {\n Context,\n Crypto,\n Effect,\n Layer,\n MutableRef,\n Option,\n PubSub,\n Ref,\n Schema,\n Semaphore,\n Stream,\n} from \"effect\";\nimport { Base64 } from \"effect/encoding\";\n\nimport {\n MemoryThreadStoreKernel,\n type MemoryLedgerTransfer,\n type MemoryLedgerImport,\n type MemoryDeliveryTransfer,\n type MemoryDeliveryImport,\n type MemoryWorkOwner,\n type PreparedMemoryAppend,\n} from \"./internal/MemoryThreadStoreKernel.ts\";\nimport { boundedWorkSelection } from \"./internal/WorkSelection.ts\";\n\nconst MAX_THREADS = 256;\nconst RECORD_CHUNK_SIZE = 1_024;\nconst READ_PAGE_SIZE = 8;\nconst MAX_CHECKPOINTS_PER_THREAD = 1_024;\n\nconst ThreadCapacity = Context.Reference<number>(\n \"@effect-agent/storage-memory/MemoryThreadStore/ThreadCapacity\",\n { defaultValue: () => MAX_THREADS },\n);\n\ninterface StoredBatch {\n /** Preserve the exact destination wire, including additive fields unknown to this reader. */\n readonly batchJson: string;\n readonly result: AppendResult;\n}\n\ninterface StoredThread {\n /** Append-only owner indexes; readers must constrain them to their captured canonical tail. */\n readonly runRecords: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly operationRecords: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly handoffs: Array<CanonicalRecordEnvelope>;\n readonly agentUpdates: Array<CanonicalRecordEnvelope>;\n readonly deliveryPredecessors: Array<CanonicalRecordEnvelope>;\n readonly toolDeclarations: Map<string, CanonicalRecordEnvelope | null>;\n readonly promptEvidence: Array<CanonicalRecordEnvelope>;\n readonly modelCompletions: Array<CanonicalRecordEnvelope>;\n readonly applicationInputs: Array<CanonicalRecordEnvelope>;\n readonly durableOwners: Array<CanonicalRecordEnvelope>;\n readonly windowBoundaries: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly workerRecords: Map<string, Array<CanonicalRecordEnvelope>>;\n readonly byId: Map<string, CanonicalRecordEnvelope>;\n readonly runInputs: Map<string, CanonicalRecordEnvelope | null>;\n readonly tailSequence: CanonicalSequence;\n readonly ranges: Map<number, ThreadArchiveRange>;\n readonly rangeStarts: Array<number>;\n readonly archiveContents: Map<number, Map<BatchId, string>>;\n readonly chunks: Map<\n number,\n { readonly records: Array<CanonicalRecordEnvelope>; readonly bytes: Array<number> }\n >;\n readonly batches: Map<BatchId, StoredBatch>;\n readonly executions: Map<RunId, ExecutionCheckpoint>;\n readonly executionCommits: Map<\n RunId,\n { readonly batchId: BatchId; readonly intent: string; readonly result: AppendResult }\n >;\n readonly batchesByFirst: Map<number, BatchId>;\n readonly checkpoints: Map<CanonicalSequence, ThreadCheckpoint>;\n}\n\nconst storedRecord = (thread: StoredThread, sequence: number) =>\n thread.chunks.get(Math.floor((sequence - 1) / RECORD_CHUNK_SIZE))?.records[\n (sequence - 1) % RECORD_CHUNK_SIZE\n ];\n\nconst isBatchBoundary = (thread: StoredThread, sequence: CanonicalSequence): boolean => {\n if (sequence === 0) return true;\n const record = storedRecord(thread, sequence);\n\n return (\n record !== undefined && thread.batches.get(record.batchId)?.result.lastSequence === sequence\n );\n};\n\nconst storedBytes = (thread: StoredThread, sequence: number) =>\n thread.chunks.get(Math.floor((sequence - 1) / RECORD_CHUNK_SIZE))?.bytes[\n (sequence - 1) % RECORD_CHUNK_SIZE\n ];\n\nconst storedPage = Effect.fnUntraced(function* (\n thread: StoredThread,\n after: number,\n limit: number,\n) {\n const page: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n\n for (\n let sequence = after + 1;\n sequence <= Math.min(thread.tailSequence, after + limit);\n sequence++\n ) {\n const record = storedRecord(thread, sequence);\n\n if (record === undefined) return yield* storeError(\"read\", \"Incomplete canonical chunk table\");\n const size = storedBytes(thread, sequence) ?? 0;\n\n if (bytes + size > 32 * 1024 * 1024) break;\n bytes += size;\n page.push(record);\n }\n\n return page;\n});\n\nconst retainRecords = (thread: StoredThread, records: ReadonlyArray<CanonicalRecordEnvelope>) => {\n for (const entry of records) {\n const chunkId = Math.floor((entry.sequence - 1) / RECORD_CHUNK_SIZE);\n let chunk = thread.chunks.get(chunkId);\n\n if (chunk === undefined) {\n chunk = { records: [], bytes: [] };\n thread.chunks.set(chunkId, chunk);\n }\n chunk.records.push(entry);\n chunk.bytes.push(canonicalRecordBytes(entry.record));\n }\n};\n\ninterface MemoryState {\n readonly threads: Map<ThreadId, StoredThread>;\n}\n\ntype NativeIndexes = Pick<\n StoredThread,\n | \"toolDeclarations\"\n | \"promptEvidence\"\n | \"modelCompletions\"\n | \"applicationInputs\"\n | \"durableOwners\"\n | \"windowBoundaries\"\n | \"workerRecords\"\n | \"byId\"\n | \"runInputs\"\n | \"runRecords\"\n | \"handoffs\"\n | \"operationRecords\"\n | \"agentUpdates\"\n | \"deliveryPredecessors\"\n>;\n\nconst emptyIndexes = (): NativeIndexes => ({\n toolDeclarations: new Map(),\n promptEvidence: [],\n modelCompletions: [],\n applicationInputs: [],\n durableOwners: [],\n windowBoundaries: new Map(),\n workerRecords: new Map(),\n byId: new Map(),\n runInputs: new Map(),\n runRecords: new Map(),\n handoffs: [],\n agentUpdates: [],\n deliveryPredecessors: [],\n operationRecords: new Map(),\n});\n\ninterface WorkIndex {\n readonly version: number;\n readonly state: \"ready\" | \"rebuilding\";\n readonly through: CanonicalSequence;\n readonly reporting: WorkerReportingMode;\n readonly entryCount: number;\n readonly entries: Map<string, CanonicalWorkEntry>;\n readonly messages: Map<IdempotencyKey, Set<string>>;\n readonly foreign: { child: number; worker: number; delivery: number; peer: number };\n readonly workers: Map<ThreadId, { ordinary: number; update: number; effects: number }>;\n readonly liveInputs: Array<LiveInputLocator>;\n readonly inputsByWorker: Map<ThreadId, Array<LiveInputLocator>>;\n readonly rebuildingIndexes?: NativeIndexes;\n}\n\ninterface LiveInputLocator {\n readonly sequence: CanonicalSequence;\n readonly id: string;\n}\n\nconst liveInputPosition = (entries: ReadonlyArray<LiveInputLocator>, sequence: number) => {\n let low = 0;\n let high = entries.length;\n\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n\n if (entries[middle].sequence < sequence) low = middle + 1;\n else high = middle;\n }\n\n return low;\n};\n\nconst changeLiveInput = (\n entries: Array<LiveInputLocator>,\n entry: CanonicalWorkEntry,\n change: 1 | -1,\n) => {\n const at = liveInputPosition(entries, entry.createdSequence);\n\n if (change === 1) entries.splice(at, 0, { sequence: entry.createdSequence, id: entry.id });\n else if (entries[at]?.id === entry.id) entries.splice(at, 1);\n};\n\nconst emptyWorkIndex = (): WorkIndex => ({\n version: WORK_INDEX_VERSION,\n state: \"ready\",\n through: ZERO_CANONICAL_SEQUENCE,\n reporting: \"none\",\n entryCount: 0,\n entries: new Map(),\n messages: new Map(),\n foreign: { child: 0, worker: 0, delivery: 0, peer: 0 },\n workers: new Map(),\n liveInputs: [],\n inputsByWorker: new Map(),\n});\n\nconst changeWorkCounts = (index: WorkIndex, entry: CanonicalWorkEntry, change: 1 | -1) => {\n const owner = entry.owner;\n\n if (\n owner._tag === \"Child\" ||\n (owner._tag === \"Handoff\" &&\n (owner.kind === \"reservation\" || owner.kind === \"child-accounting\"))\n )\n index.foreign.child += change;\n if (\n [\"WorkerInput\", \"WorkerEffects\", \"Report\"].includes(owner._tag) ||\n (owner._tag === \"Handoff\" && owner.kind === \"worker-stop\")\n )\n index.foreign.worker += change;\n if (owner._tag === \"Handoff\" && [\"peer\", \"update\", \"report\"].includes(owner.kind))\n index.foreign.delivery += change;\n if (owner._tag === \"Handoff\" && owner.kind === \"peer\") index.foreign.peer += change;\n if (owner._tag === \"WorkerInput\") {\n changeLiveInput(index.liveInputs, entry, change);\n let inputs = index.inputsByWorker.get(owner.workerThreadId);\n\n if (inputs === undefined) index.inputsByWorker.set(owner.workerThreadId, (inputs = []));\n changeLiveInput(inputs, entry, change);\n if (inputs.length === 0) index.inputsByWorker.delete(owner.workerThreadId);\n let worker = index.workers.get(owner.workerThreadId);\n\n if (worker === undefined)\n index.workers.set(owner.workerThreadId, (worker = { ordinary: 0, update: 0, effects: 0 }));\n if (owner.update) worker.update += change;\n else worker.ordinary += change;\n if (worker.ordinary + worker.update + worker.effects === 0)\n index.workers.delete(owner.workerThreadId);\n }\n};\n\n/** Prepare only this batch's changes; commit under the writer gate with canonical publication. */\nconst prepareWork = Effect.fnUntraced(function* (\n previous: WorkIndex,\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n retained: (threadId: ThreadId, messageId: IdempotencyKey) => boolean,\n) {\n const changes = new Map<string, CanonicalWorkEntry | undefined>();\n let reporting = previous.reporting;\n let through = previous.through;\n\n for (const record of records) {\n for (const change of yield* workIndexChanges(record, reporting)) {\n if (change._tag === \"WorkerMode\") reporting = change.mode;\n else if (change._tag === \"Remove\") {\n const entry = changes.has(change.id)\n ? changes.get(change.id)\n : previous.entries.get(change.id);\n\n if (\n change.stateRecordId === undefined ||\n (entry?.stateReference._tag === \"Canonical\" &&\n entry.stateReference.recordId === change.stateRecordId)\n )\n changes.set(change.id, undefined);\n } else {\n const entry = advanceWorkEntry(\n changes.has(change.entry.id)\n ? changes.get(change.entry.id)\n : previous.entries.get(change.entry.id),\n change.entry,\n );\n\n changes.set(\n entry.id,\n entry.owner._tag === \"Handoff\" &&\n entry.owner.messageId !== undefined &&\n retained(record.threadId, entry.owner.messageId)\n ? undefined\n : entry,\n );\n }\n }\n through = record.sequence;\n }\n\n return (): WorkIndex => {\n const { entries, messages } = previous;\n\n for (const [id, entry] of changes) {\n const old = entries.get(id);\n\n if (old !== undefined) changeWorkCounts(previous, old, -1);\n\n if (old?.owner._tag === \"Handoff\" && old.owner.messageId !== undefined) {\n const ids = messages.get(old.owner.messageId);\n\n ids?.delete(id);\n if (ids?.size === 0) messages.delete(old.owner.messageId);\n }\n if (entry === undefined) entries.delete(id);\n else {\n entries.set(id, entry);\n changeWorkCounts(previous, entry, 1);\n if (entry.owner._tag === \"Handoff\" && entry.owner.messageId !== undefined) {\n const ids = messages.get(entry.owner.messageId);\n\n if (ids === undefined) messages.set(entry.owner.messageId, new Set([id]));\n else ids.add(id);\n }\n }\n }\n\n return { ...previous, through, reporting, entryCount: entries.size };\n };\n});\n\n/** First sequence strictly after the cursor, without traversing a Run's earlier facts. */\nconst upperSequence = (records: ReadonlyArray<CanonicalRecordEnvelope>, sequence: number) => {\n let low = 0;\n let high = records.length;\n\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n\n if (records[mid].sequence <= sequence) low = mid + 1;\n else high = mid;\n }\n\n return low;\n};\n\nconst appendToIndex = (\n index: Map<string, Array<CanonicalRecordEnvelope>>,\n key: string,\n entry: CanonicalRecordEnvelope,\n) => {\n const records = index.get(key);\n\n if (records === undefined) index.set(key, [entry]);\n else records.push(entry);\n};\n\n/** Only call at successful synchronous publication, or on indexes not yet reachable by readers. */\nconst commitIndex = (\n index: Map<string, Array<CanonicalRecordEnvelope>>,\n additions: ReadonlyMap<string, Array<CanonicalRecordEnvelope>>,\n) => {\n for (const [key, entries] of additions) {\n const records = index.get(key);\n\n if (records === undefined) index.set(key, entries);\n else for (const entry of entries) records.push(entry);\n }\n};\n\nconst prepareIndexes = (\n previous: NativeIndexes,\n records: ReadonlyArray<CanonicalRecordEnvelope>,\n) => {\n // Latest execution entries are replaced in this private map; owner histories only append.\n // Rebuild staging is private: reuse it only in the synchronous cursor publication step.\n const workerRecords = new Map<string, Array<CanonicalRecordEnvelope>>();\n\n const wasWorker = (previous.workerRecords.get(\"worker\") ?? []).some(\n ({ record }) => record.payload._tag === \"WorkerOriginRecorded\",\n );\n\n const isWorker =\n wasWorker || records.some(({ record }) => record.payload._tag === \"WorkerOriginRecorded\");\n\n // A Thread can gain a Worker origin after its initial history. Initialize once on that boundary.\n if (isWorker && !wasWorker)\n for (const entry of previous.byId.values()) {\n const payload = entry.record.payload;\n\n if (\n (payload._tag === \"UserInputRecorded\" || payload._tag === \"SubmissionSettled\") &&\n payload.runId !== undefined\n ) {\n const key = `execution:${payload._tag}`;\n\n if ((workerRecords.get(key)?.[0]?.sequence ?? 0) < entry.sequence)\n workerRecords.set(key, [entry]);\n }\n }\n const workerAppends = new Map<string, Array<CanonicalRecordEnvelope>>();\n const byId = new Map<string, CanonicalRecordEnvelope>();\n const runInputs = new Map<string, CanonicalRecordEnvelope | null>();\n const runRecords = new Map<string, Array<CanonicalRecordEnvelope>>();\n const handoffs: Array<CanonicalRecordEnvelope> = [];\n const agentUpdates: Array<CanonicalRecordEnvelope> = [];\n\n const deliveryPredecessors: Array<CanonicalRecordEnvelope> = [];\n\n const nativeAdds = emptyIndexes();\n const operationAppends = new Map<string, Array<CanonicalRecordEnvelope>>();\n\n for (const entry of records) {\n byId.set(entry.record.recordId, entry);\n const payload = entry.record.payload;\n\n if (payload._tag === \"ModelResponseRecorded\")\n for (const operation of payload.toolOperations) {\n const id = toolCallSettledRecordId(payload.runId, payload.turn, operation.toolCallId);\n\n nativeAdds.toolDeclarations.set(\n id,\n previous.toolDeclarations.has(id) || nativeAdds.toolDeclarations.has(id) ? null : entry,\n );\n }\n if (PROMPT_EVIDENCE_TAGS.some((tag) => tag === payload._tag))\n nativeAdds.promptEvidence.push(entry);\n if (payload._tag === \"ModelCompleted\") nativeAdds.modelCompletions.push(entry);\n if (payload._tag === \"UserInputRecorded\") {\n const message = payload.messageAdmission;\n\n if (\n message === undefined ||\n !(\"_tag\" in message) ||\n (message._tag !== \"WorkerCompletion\" && message._tag !== \"WorkerUpdate\")\n )\n nativeAdds.applicationInputs.push(entry);\n }\n if (\n (payload._tag === \"UserInputRecorded\" && payload.submissionId !== undefined) ||\n [\n \"RunStarted\",\n \"SubmissionSettled\",\n \"AbortRequested\",\n \"WorkerOriginRecorded\",\n \"SubagentLineageRecorded\",\n ].includes(payload._tag)\n )\n nativeAdds.durableOwners.push(entry);\n if (payload._tag === \"CompactionCreated\" && payload.kind === \"rollover\")\n for (let height = 0; height < 53; height++)\n appendToIndex(\n nativeAdds.windowBoundaries,\n `${height}:${Math.floor(payload.coversThrough / 2 ** height)}`,\n entry,\n );\n\n for (const runId of canonicalRunIds(entry.record)) appendToIndex(runRecords, runId, entry);\n if (isWorkHandoff(entry.record)) handoffs.push(entry);\n if (payload._tag === \"AgentUpdateEmitted\") agentUpdates.push(entry);\n if (\n payload._tag === \"WorkerReportPrepared\" ||\n (payload._tag === \"AgentUpdateEmitted\" && payload.delivery !== undefined)\n )\n deliveryPredecessors.push(entry);\n if (\"runId\" in payload && payload.runId !== undefined && \"toolCallId\" in payload) {\n appendToIndex(operationAppends, JSON.stringify([payload.runId, payload.toolCallId]), entry);\n if (payload._tag === \"ToolApprovalRequested\" || payload._tag === \"ToolApprovalDecided\")\n appendToIndex(\n operationAppends,\n JSON.stringify([payload.runId, payload.toolCallId, \"approval\"]),\n entry,\n );\n if (payload._tag === \"ToolCallSettled\")\n appendToIndex(\n operationAppends,\n JSON.stringify([payload.runId, payload.toolCallId, \"settled\"]),\n entry,\n );\n }\n\n if (\n isWorker &&\n (payload._tag === \"UserInputRecorded\" || payload._tag === \"SubmissionSettled\") &&\n payload.runId !== undefined\n )\n workerRecords.set(`execution:${payload._tag}`, [entry]);\n\n const workerKey =\n payload._tag === \"SubtreeBudgetReserved\"\n ? `subtree:${payload.sourceSubmissionId ?? \"\"}`\n : payload._tag === \"SubagentJoined\"\n ? `joined:${payload.runId}`\n : [\"ThreadCreated\", \"WorkerOriginRecorded\", \"SubagentLineageRecorded\"].includes(\n payload._tag,\n )\n ? \"worker\"\n : undefined;\n\n if (workerKey !== undefined) appendToIndex(workerAppends, workerKey, entry);\n if (payload._tag === \"WorkerStopRequested\")\n appendToIndex(workerAppends, `stop:${payload.command.worker.threadId}`, entry);\n if (\n payload._tag === \"WorkerInputRequested\" &&\n payload.admission.sourceSubmissionId !== undefined\n )\n appendToIndex(workerAppends, `funding:${payload.admission.sourceSubmissionId}`, entry);\n if (payload._tag === \"WorkerInputCompleted\") {\n const requested =\n previous.byId.get(workerInputRecordId(payload.messageId)) ??\n byId.get(workerInputRecordId(payload.messageId));\n\n const admission = requested?.record.payload;\n\n if (\n admission?._tag === \"WorkerInputRequested\" &&\n admission.admission.sourceSubmissionId !== undefined\n )\n appendToIndex(workerAppends, `funding:${admission.admission.sourceSubmissionId}`, entry);\n }\n if (payload._tag === \"WorkerInputRefused\") {\n const reserved = (\n previous.byId.get(payload.reservation.recordId) ?? byId.get(payload.reservation.recordId)\n )?.record.payload;\n\n const sourceSubmissionId =\n reserved?._tag === \"WorkerInputRequested\"\n ? reserved.admission.sourceSubmissionId\n : reserved?._tag === \"SubtreeBudgetReserved\"\n ? reserved.sourceSubmissionId\n : undefined;\n\n if (sourceSubmissionId !== undefined)\n appendToIndex(workerAppends, `funding:${sourceSubmissionId}`, entry);\n }\n if (\n payload._tag === \"UserInputRecorded\" &&\n payload.kind === \"user\" &&\n payload.runId !== undefined\n )\n runInputs.set(\n payload.runId,\n runInputs.has(payload.runId) || previous.runInputs.has(payload.runId) ? null : entry,\n );\n }\n\n return {\n indexes: previous,\n commit: () => {\n commitIndex(previous.runRecords, runRecords);\n commitIndex(previous.operationRecords, operationAppends);\n for (const [id, entry] of nativeAdds.toolDeclarations)\n previous.toolDeclarations.set(id, entry);\n for (const key of [\"promptEvidence\", \"modelCompletions\", \"applicationInputs\"] as const)\n for (const entry of nativeAdds[key]) previous[key].push(entry);\n commitIndex(previous.windowBoundaries, nativeAdds.windowBoundaries);\n if (previous.durableOwners.length === 0 && nativeAdds.durableOwners[0] !== undefined)\n previous.durableOwners.push(nativeAdds.durableOwners[0]);\n for (const [id, entry] of byId) previous.byId.set(id, entry);\n for (const [id, entry] of runInputs) previous.runInputs.set(id, entry);\n for (const [key, entries] of workerRecords) previous.workerRecords.set(key, entries);\n commitIndex(previous.workerRecords, workerAppends);\n for (const entry of handoffs) previous.handoffs.push(entry);\n for (const entry of agentUpdates) previous.agentUpdates.push(entry);\n for (const entry of deliveryPredecessors) previous.deliveryPredecessors.push(entry);\n },\n };\n};\n\ntype AppendDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadStoreError | ThreadNotMaterialized | AppendConflict;\n }\n | {\n readonly _tag: \"success\";\n readonly result: AppendResult;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n };\n\ntype MaterializeDecision =\n | { readonly _tag: \"failure\"; readonly error: ThreadStoreError }\n | { readonly _tag: \"success\" };\n\ntype CheckpointDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadNotMaterialized | ThreadStoreError | CheckpointRejected;\n }\n | { readonly _tag: \"success\" };\n\nconst storeError = (operation: string, message: string, cause?: unknown): ThreadStoreError =>\n cause === undefined\n ? ThreadStoreError.make({ operation, message })\n : ThreadStoreError.make({ operation, message, cause });\n\nconst validate = <A, I>(\n schema: Schema.Codec<A, I>,\n operation: string,\n value: unknown,\n): Effect.Effect<A, ThreadStoreError> =>\n Schema.encodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError((error) => storeError(operation, `Invalid ${operation} request`, error)),\n );\n\nconst decodeCanonicalSequence = Schema.decodeSync(CanonicalSequence);\nconst ZERO_CANONICAL_SEQUENCE = decodeCanonicalSequence(0);\n\nconst offsetSequence = Effect.fnUntraced(function* (\n threadId: ThreadId,\n offset: ObservationOffset | undefined,\n): Effect.fn.Return<CanonicalSequence, ThreadStoreError> {\n if (offset === undefined) return yield* Effect.succeed(ZERO_CANONICAL_SEQUENCE);\n const prefix = `memory:v1:${Base64.encode(threadId)}:`;\n const encodedSequence = offset.startsWith(prefix) ? offset.slice(prefix.length) : \"\";\n\n if (!/^\\d+$/.test(encodedSequence)) {\n return yield* Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n }\n const sequence = Number(encodedSequence);\n\n return yield* Number.isSafeInteger(sequence)\n ? Schema.decodeEffect(CanonicalSequence)(sequence).pipe(\n Effect.mapError(() => storeError(\"observe\", \"Malformed observation offset\")),\n )\n : Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n});\n\nconst observationOffset = (threadId: ThreadId, sequence: CanonicalSequence): ObservationOffset =>\n Schema.decodeSync(ObservationOffset)(`memory:v1:${Base64.encode(threadId)}:${sequence}`);\n\nconst batchEnvelopes = (\n threadId: ThreadId,\n batch: CommitBatch,\n firstSequence: CanonicalSequence,\n): ReadonlyArray<CanonicalRecordEnvelope> =>\n batch.records.map((record, index) => {\n const sequence = decodeCanonicalSequence(firstSequence + index);\n\n return CanonicalRecordEnvelope.make({\n threadId,\n batchId: batch.batchId,\n sequence,\n offset: observationOffset(threadId, sequence),\n record,\n });\n });\n\nconst decodeStoredBatch = (batchJson: string, operation: string) =>\n Schema.decodeEffect(Schema.fromJsonString(ExportBatch))(batchJson).pipe(\n Effect.mapError((cause) => storeError(operation, \"Invalid canonical batch JSON\", cause)),\n );\n\nconst findThread = Effect.fnUntraced(function* (\n state: MemoryState,\n threadId: ThreadId,\n): Effect.fn.Return<StoredThread, ThreadNotMaterialized> {\n const thread = state.threads.get(threadId);\n\n return yield* thread === undefined\n ? Effect.fail(ThreadNotMaterialized.make({ threadId }))\n : Effect.succeed(thread);\n});\n\nconst CheckpointVersionEnvelope = Schema.Struct({\n checkpoint: Schema.Struct({\n threadId: ThreadId,\n schemaVersion: Schema.Natural,\n }),\n});\n\nconst validateCheckpointVersion = Effect.fnUntraced(function* (\n value: unknown,\n): Effect.fn.Return<void, ThreadStoreError | CheckpointRejected> {\n const envelope = yield* Schema.decodeUnknownEffect(CheckpointVersionEnvelope)(value).pipe(\n Effect.mapError(() => storeError(\"saveCheckpoint\", \"Invalid saveCheckpoint request\")),\n );\n\n if (envelope.checkpoint.schemaVersion !== 1) {\n return yield* CheckpointRejected.make({\n threadId: envelope.checkpoint.threadId,\n reason: \"unsupported-version\",\n });\n }\n});\n\nconst makeThreadStore = Effect.gen(function* () {\n const maxThreads = yield* ThreadCapacity;\n const crypto = yield* Crypto.Crypto;\n const state = yield* Ref.make<MemoryState>({ threads: new Map() });\n const gate = yield* Semaphore.make(1);\n const owner = yield* makeStorageOwner(gate.withPermits(1));\n const withMutation = owner.withMutation;\n const updates = yield* PubSub.sliding<void>(1);\n let ledgerTransfer: MemoryLedgerTransfer | undefined;\n let deliveryTransfer: MemoryDeliveryTransfer | undefined;\n\n const workState = yield* Ref.make(new Map<ThreadId, WorkIndex>());\n const workOwners = new Map<\"admissions\" | \"deliveries\", MemoryWorkOwner>();\n let deliveryLookup: ((threadId: ThreadId, messageId: IdempotencyKey) => boolean) | undefined;\n\n const retainedDelivery = (threadId: ThreadId, messageId: IdempotencyKey) =>\n deliveryLookup?.(threadId, messageId) ?? false;\n\n const publishWork = (threadId: ThreadId, index: WorkIndex) =>\n MutableRef.get(workState.ref).set(threadId, index);\n\n const retainDelivery = (threadId: ThreadId, messageId: IdempotencyKey) => {\n const index = MutableRef.get(workState.ref).get(threadId);\n const ids = index?.messages.get(messageId);\n\n if (\n index === undefined ||\n index.version !== WORK_INDEX_VERSION ||\n index.entryCount !== index.entries.size ||\n ids === undefined\n )\n return;\n const { entries, messages } = index;\n\n for (const id of ids) {\n const entry = entries.get(id);\n\n if (entry !== undefined) changeWorkCounts(index, entry, -1);\n entries.delete(id);\n }\n messages.delete(messageId);\n publishWork(threadId, { ...index, entryCount: entries.size });\n };\n\n const readyIndex = (\n threadId: ThreadId,\n tail: number,\n ): Effect.Effect<WorkIndex, WorkDiscoveryUnavailable> => {\n const index = MutableRef.get(workState.ref).get(threadId);\n\n if (\n index === undefined ||\n index.version !== WORK_INDEX_VERSION ||\n index.entries.size !== index.entryCount\n )\n return Effect.fail(WorkDiscoveryUnavailable.make({ threadId, reason: \"missing-index\" }));\n if (index.state !== \"ready\" || index.through !== tail)\n return Effect.fail(WorkDiscoveryUnavailable.make({ threadId, reason: \"incomplete-rebuild\" }));\n\n return Effect.succeed(index);\n };\n\n const work: ThreadWorkStorage = {\n threads: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(WorkThreadsRequest, \"work threads\", unvalidated);\n const current = yield* Ref.get(state);\n const catalogue = yield* Ref.get(workState);\n\n const candidates = boundedWorkSelection<ThreadId>(\n request.limit,\n (id) => id,\n request.afterThreadId,\n );\n\n for (const [threadId, thread] of current.threads) {\n const index = catalogue.get(threadId);\n\n if (\n index === undefined ||\n index.version !== WORK_INDEX_VERSION ||\n index.state !== \"ready\" ||\n index.through !== thread.tailSequence ||\n index.entryCount !== index.entries.size ||\n index.entryCount > 0\n )\n candidates.add(threadId);\n }\n for (const owner of workOwners.values()) {\n const page = yield* owner.threads(request);\n\n for (const threadId of page.threadIds) candidates.add(threadId);\n }\n const threadIds = candidates.values;\n const afterThreadId = threadIds.length === request.limit ? threadIds.at(-1) : undefined;\n\n // A full page may have more owner rows; the next bounded call proves exhaustion.\n return {\n threadIds,\n ...(afterThreadId === undefined ? {} : { afterThreadId }),\n };\n }),\n ),\n page: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadWorkRequest, \"work page\", unvalidated);\n\n const cursor = yield* decodeWorkCursor(request).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const thread = (yield* Ref.get(state)).threads.get(request.threadId);\n // Accepted input can precede canonical Thread materialization entirely.\n const index = yield* readyIndex(request.threadId, thread?.tailSequence ?? 0);\n\n if (cursor.source === \"canonical\") {\n const candidates = boundedWorkSelection<CanonicalWorkEntry>(\n request.limit + 1,\n (entry) => entry.id,\n cursor.after,\n );\n\n for (const entry of index.entries.values()) candidates.add(entry);\n const selected = candidates.values;\n\n const entries = selected.slice(0, request.limit);\n const after = selected.length > request.limit ? entries.at(-1)?.id : undefined;\n\n return yield* validateWorkPage(\n {\n entries,\n cursor: encodeWorkCursor({\n version: WORK_INDEX_VERSION,\n threadDigest: cursor.threadDigest,\n source: after === undefined ? \"deliveries\" : \"canonical\",\n ...(after === undefined ? {} : { after }),\n }),\n },\n request.limit,\n );\n }\n\n const page = yield* (\n workOwners.get(cursor.source)?.page(request.threadId, cursor.after, request.limit) ??\n Effect.succeed<Effect.Success<ReturnType<MemoryWorkOwner[\"page\"]>>>({ entries: [] })\n );\n\n const next =\n page.after === undefined\n ? cursor.source === \"admissions\"\n ? \"canonical\"\n : undefined\n : cursor.source;\n\n return yield* validateWorkPage(\n {\n entries: [...page.entries],\n ...(next === undefined\n ? {}\n : {\n cursor: encodeWorkCursor({\n version: WORK_INDEX_VERSION,\n threadDigest: cursor.threadDigest,\n source: next,\n ...(page.after === undefined ? {} : { after: page.after }),\n }),\n }),\n },\n request.limit,\n );\n }),\n ),\n rebuild: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(WorkIndexRebuildRequest, \"rebuild work\", unvalidated);\n const current = yield* Ref.get(state);\n const thread = current.threads.get(request.threadId);\n const tail = thread?.tailSequence ?? ZERO_CANONICAL_SEQUENCE;\n const prior = (yield* Ref.get(workState)).get(request.threadId);\n\n const index: WorkIndex =\n request.restart ||\n prior === undefined ||\n prior.version !== WORK_INDEX_VERSION ||\n prior.entries.size !== prior.entryCount ||\n (prior.state === \"ready\" && prior.through !== tail)\n ? { ...emptyWorkIndex(), state: \"rebuilding\", rebuildingIndexes: emptyIndexes() }\n : prior;\n\n if (index.state === \"ready\")\n return {\n version: WORK_INDEX_VERSION,\n threadId: request.threadId,\n state: \"ready\",\n throughSequence: index.through,\n tailSequence: tail,\n processedRecords: 0,\n processedBytes: 0,\n };\n if (index.rebuildingIndexes === undefined)\n return yield* WorkDiscoveryUnavailable.make({\n threadId: request.threadId,\n reason: \"incomplete-rebuild\",\n });\n const rebuildingIndexes = index.rebuildingIndexes;\n const records: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n const end = Math.min(tail, index.through + (request.limit ?? MAX_WORK_REBUILD_RECORDS));\n\n for (let position = index.through; position < end; position++) {\n const size = thread === undefined ? undefined : storedBytes(thread, position + 1);\n\n if (size === undefined)\n return yield* storeError(\"rebuild work\", \"Canonical record byte length is missing\");\n if (bytes + size > MAX_WORK_REBUILD_BYTES) break;\n const record = thread === undefined ? undefined : storedRecord(thread, position + 1);\n\n if (record === undefined || record.sequence !== position + 1)\n return yield* storeError(\"rebuild work\", \"Canonical rebuild sequence is incomplete\");\n bytes += size;\n records.push(record);\n }\n if (index.through < tail && records.length === 0)\n return yield* storeError(\n \"rebuild work\",\n \"Canonical rebuild cannot advance within its byte bound\",\n );\n\n const commitWork = yield* prepareWork(index, records, retainedDelivery).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n // Shared writer gate fences the current tail; publish native locators and catalogue together.\n const next = yield* Effect.sync(() => {\n const native = prepareIndexes(rebuildingIndexes, records);\n const rebuilt = commitWork();\n const complete = rebuilt.through === tail;\n\n const next: WorkIndex = {\n version: rebuilt.version,\n through: rebuilt.through,\n reporting: rebuilt.reporting,\n entryCount: rebuilt.entryCount,\n entries: rebuilt.entries,\n messages: rebuilt.messages,\n foreign: rebuilt.foreign,\n workers: rebuilt.workers,\n liveInputs: rebuilt.liveInputs,\n inputsByWorker: rebuilt.inputsByWorker,\n state: complete ? \"ready\" : \"rebuilding\",\n ...(complete ? {} : { rebuildingIndexes: native.indexes }),\n };\n\n native.commit();\n if (thread !== undefined && complete)\n MutableRef.set(state.ref, {\n threads: new Map(current.threads).set(request.threadId, {\n ...thread,\n ...native.indexes,\n }),\n });\n publishWork(request.threadId, next);\n\n return next;\n });\n\n return {\n version: WORK_INDEX_VERSION,\n threadId: request.threadId,\n state: next.state,\n throughSequence: next.through,\n tailSequence: tail,\n processedRecords: records.length,\n processedBytes: bytes,\n };\n }),\n ),\n };\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(updates));\n\n const materialize: ThreadStore[\"Service\"][\"materialize\"] = Effect.fnUntraced(\n function* (unvalidated) {\n const request = yield* validate(ThreadMaterialization, \"materialize\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [MaterializeDecision, MemoryState] => {\n const existing = current.threads.get(request.threadId);\n\n if (existing !== undefined) return [{ _tag: \"success\" }, current];\n if (\n !MutableRef.get(workState.ref).has(request.threadId) &&\n MutableRef.get(workState.ref).size >= maxThreads\n ) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\"materialize\", `In-memory thread limit ${maxThreads} exceeded`),\n },\n current,\n ];\n }\n if (!transferPageFits(request.threadId))\n return [\n {\n _tag: \"failure\",\n error: storeError(\n \"materialize\",\n \"Thread identity exceeds its bounded transfer representation\",\n ),\n },\n current,\n ];\n const threads = new Map(current.threads);\n\n threads.set(request.threadId, {\n tailSequence: ZERO_CANONICAL_SEQUENCE,\n byId: new Map(),\n workerRecords: new Map(),\n runInputs: new Map(),\n runRecords: new Map(),\n operationRecords: new Map(),\n handoffs: [],\n agentUpdates: [],\n deliveryPredecessors: [],\n toolDeclarations: new Map(),\n promptEvidence: [],\n modelCompletions: [],\n applicationInputs: [],\n durableOwners: [],\n windowBoundaries: new Map(),\n ranges: new Map(),\n rangeStarts: [],\n archiveContents: new Map(),\n chunks: new Map(),\n batchesByFirst: new Map(),\n batches: new Map(),\n executions: new Map(),\n executionCommits: new Map(),\n checkpoints: new Map(),\n });\n\n publishWork(request.threadId, emptyWorkIndex());\n\n return [{ _tag: \"success\" }, { threads }];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n },\n );\n\n const prepareAppend = Effect.fnUntraced(function* (unvalidated: AppendRequest) {\n const captured = yield* PreparedAppend.capture(unvalidated);\n const request = captured;\n const batchJson = captured.batchJson;\n\n const batchBytes = new TextEncoder().encode(batchJson).byteLength;\n\n if (batchBytes > 16 * 1024 * 1024)\n return yield* storeError(\"append\", \"Canonical batch exceeds 16 MiB\");\n\n const offsetBytes = 4 * Math.ceil(utf8ByteLength(request.threadId) / 3) + 36;\n\n if (!canonicalBatchFitsTransfer(request.threadId, request.batch, batchBytes, offsetBytes))\n return yield* storeError(\n \"append\",\n \"Canonical batch exceeds its bounded transfer representation\",\n );\n\n return { request, batchJson };\n });\n\n const appendPrepared = Effect.fnUntraced(function* ({\n request,\n batchJson,\n }: PreparedMemoryAppend) {\n // Every caller holds the shared kernel mutation gate across validation and Ref publication.\n const current = yield* Ref.get(state);\n const thread = current.threads.get(request.threadId);\n\n const executionIntent = JSON.stringify({\n batch: batchJson,\n operational: (request.executions ?? []).flatMap((update) =>\n update.facts.map((fact) => Schema.encodeSync(RecordEnvelope)(fact)),\n ),\n });\n\n const latestIntent =\n thread === undefined\n ? undefined\n : [...thread.executionCommits.values()].find(\n (entry) => entry.batchId === request.batch.batchId,\n );\n\n if (thread !== undefined && latestIntent === undefined && request.batch.records.length === 0) {\n for (const update of request.executions ?? []) {\n const prior = thread.executions.get(update.checkpoint.progress.runId);\n\n if (\n prior !== undefined &&\n update.previousRevision < prior.progress.revision &&\n update.facts.every((fact) =>\n prior.operational.some((known) => known.recordId === fact.recordId),\n )\n )\n return yield* AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"stale-command\",\n });\n }\n }\n if (\n thread !== undefined &&\n thread.tailSequence === request.expectedTailSequence &&\n !thread.batches.has(request.batch.batchId) &&\n latestIntent === undefined\n ) {\n const executions = request.executions ?? [];\n\n if (\n new Set(executions.map((update) => update.checkpoint.progress.runId)).size !==\n executions.length\n )\n return yield* storeError(\"append\", \"Duplicate active execution identity\");\n for (const update of request.executions ?? []) {\n const prior = thread.executions.get(update.checkpoint.progress.runId);\n\n if ((prior?.progress.revision ?? 0) !== update.previousRevision)\n return yield* AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"tail\",\n actualTailSequence: thread.tailSequence,\n });\n if (\n update.checkpoint.throughSequence !==\n thread.tailSequence + request.batch.records.length ||\n update.checkpoint.batchId !== request.batch.batchId ||\n (prior !== undefined && update.checkpoint.originalSequence !== prior.originalSequence)\n )\n return yield* storeError(\n \"append\",\n \"Active checkpoint differs from its committed history boundary\",\n );\n if (\n update.retire &&\n ![\n ...request.batch.records,\n ...(thread.runRecords.get(update.checkpoint.progress.runId) ?? []).map(\n (entry) => entry.record,\n ),\n ].some(\n ({ payload }) =>\n payload._tag === \"SubmissionSettled\" &&\n payload.runId === update.checkpoint.progress.runId &&\n payload.submissionId === update.checkpoint.progress.submissionId,\n )\n )\n return yield* storeError(\n \"append\",\n \"Active state cannot retire without a canonical terminal outcome\",\n );\n }\n yield* validateProgressAppend(\n prepareProgressAppend(request.batch.records),\n request.executions,\n ).pipe(\n Effect.provideService(ProgressAppendReader, {\n previous: (runId) => Effect.succeed(thread.executions.get(runId)?.progress),\n initial: (next) =>\n Effect.succeed((thread.runRecords.get(next.runId) ?? []).map((entry) => entry.record)),\n }),\n );\n }\n\n const currentWork = (yield* Ref.get(workState)).get(request.threadId);\n\n const preparedWork =\n thread !== undefined &&\n thread.tailSequence === request.expectedTailSequence &&\n !thread.batches.has(request.batch.batchId) &&\n latestIntent === undefined &&\n currentWork?.version === WORK_INDEX_VERSION &&\n currentWork.state === \"ready\" &&\n currentWork.through === thread.tailSequence &&\n currentWork.entryCount === currentWork.entries.size\n ? yield* prepareWork(\n currentWork,\n batchEnvelopes(\n request.threadId,\n request.batch,\n decodeCanonicalSequence(thread.tailSequence + 1),\n ),\n retainedDelivery,\n ).pipe(Effect.provideService(Crypto.Crypto, crypto))\n : undefined;\n\n const decision = yield* Effect.uninterruptible(\n Ref.modify(state, (current): readonly [AppendDecision, MemoryState] => {\n const thread = current.threads.get(request.threadId);\n\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: request.threadId,\n }),\n },\n current,\n ];\n }\n const priorExecution = latestIntent;\n\n if (priorExecution !== undefined) {\n if (priorExecution.intent !== executionIntent)\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"batch-content\",\n }),\n },\n current,\n ];\n\n return [\n {\n _tag: \"success\",\n result: AppendResult.make({ ...priorExecution.result, replayed: true }),\n records: [],\n },\n current,\n ];\n }\n const previous = thread.batches.get(request.batch.batchId);\n\n if (previous !== undefined) {\n if (previous.batchJson !== batchJson) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"batch-content\",\n }),\n },\n current,\n ];\n }\n\n return [\n {\n _tag: \"success\",\n result: AppendResult.make({\n firstSequence: previous.result.firstSequence,\n lastSequence: previous.result.lastSequence,\n replayed: true,\n }),\n records: [],\n },\n current,\n ];\n }\n if (request.expectedTailSequence !== thread.tailSequence) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"tail\",\n actualTailSequence: thread.tailSequence,\n }),\n },\n current,\n ];\n }\n const batchRecordIds = new Set<RecordId>();\n\n for (const record of request.batch.records) {\n if (thread.byId.has(record.recordId) || batchRecordIds.has(record.recordId)) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"record-identity\",\n }),\n },\n current,\n ];\n }\n batchRecordIds.add(record.recordId);\n }\n\n const records = batchEnvelopes(\n request.threadId,\n request.batch,\n decodeCanonicalSequence(thread.tailSequence + 1),\n );\n\n const lastSequence = decodeCanonicalSequence(thread.tailSequence + records.length);\n\n const result = AppendResult.make({\n firstSequence: decodeCanonicalSequence(\n thread.tailSequence + (records.length > 0 ? 1 : 0),\n ),\n lastSequence,\n replayed: false,\n });\n\n const indexes = prepareIndexes(thread, records);\n\n const next: StoredThread = {\n ...thread,\n ...indexes.indexes,\n tailSequence: lastSequence,\n };\n\n // Every rejection and asynchronous validation precedes this synchronous publication.\n if (records.length > 0) {\n thread.batches.set(request.batch.batchId, { result, batchJson });\n thread.batchesByFirst.set(result.firstSequence, request.batch.batchId);\n retainRecords(thread, records);\n }\n for (const update of request.executions ?? []) {\n const runId = update.checkpoint.progress.runId;\n\n if (update.retire) {\n thread.executions.delete(runId);\n thread.executionCommits.delete(runId);\n } else {\n thread.executions.set(runId, update.checkpoint);\n thread.executionCommits.set(runId, {\n batchId: request.batch.batchId,\n intent: executionIntent,\n result,\n });\n }\n }\n indexes.commit();\n if (preparedWork !== undefined) publishWork(request.threadId, preparedWork());\n current.threads.set(request.threadId, next);\n\n const publication: readonly [AppendDecision, MemoryState] = [\n { _tag: \"success\", result, records },\n current,\n ];\n\n return publication;\n }).pipe(\n Effect.tap((decision) =>\n decision._tag === \"success\" && decision.records.length > 0\n ? PubSub.publish(updates, undefined)\n : Effect.void,\n ),\n ),\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.result;\n });\n\n const append: ThreadStore[\"Service\"][\"append\"] = Effect.fn(\"MemoryThreadStore.append\")(\n (request) =>\n prepareAppend(request).pipe(\n Effect.flatMap((prepared) =>\n owner.withProgress(prepared.request.threadId, withMutation(appendPrepared(prepared))),\n ),\n ),\n );\n\n const countPeerMessages: NonNullable<ThreadStore[\"Service\"][\"countPeerMessages\"]> =\n Effect.fnUntraced(function* (request) {\n yield* validate(ThreadPeerCountRequest, \"countPeerMessages\", request);\n const thread = yield* findThread(yield* Ref.get(state), request.threadId);\n\n const index = yield* readyIndex(request.threadId, thread.tailSequence).pipe(\n Effect.mapError((cause) => storeError(\"countPeerMessages\", cause.message)),\n );\n\n return Math.min(\n index.foreign.peer +\n (deliveryTransfer?.peerCount(request.threadId, request.nowMillis, request.limit) ?? 0),\n request.limit,\n );\n });\n\n const readSnapshot = (\n threadId: ThreadId,\n afterSequence: CanonicalSequence | undefined,\n limit: number,\n ) =>\n Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, threadId)),\n Effect.flatMap((thread) => {\n // Append assigns gap-free sequences starting at 1, so the exclusive cursor is an index.\n const start = afterSequence ?? ZERO_CANONICAL_SEQUENCE;\n\n return storedPage(thread, start, limit);\n }),\n );\n\n const selectedStream = (\n sources: ReadonlyArray<ReadonlyArray<CanonicalRecordEnvelope>>,\n after: number,\n through: number,\n maximum: number,\n ) =>\n Stream.paginate({ after, count: 0 }, (cursor) =>\n Effect.gen(function* () {\n const page: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n let last = cursor.after;\n\n while (page.length < Math.min(READ_PAGE_SIZE, maximum - cursor.count)) {\n let selected: CanonicalRecordEnvelope | undefined;\n\n for (const source of sources) {\n const next = source[upperSequence(source, last)];\n\n if (\n next !== undefined &&\n next.sequence <= through &&\n (selected === undefined || next.sequence < selected.sequence)\n )\n selected = next;\n }\n if (selected === undefined) break;\n const size = canonicalRecordBytes(selected.record);\n\n if (size > 32 * 1024 * 1024)\n return yield* storeError(\"read\", \"Canonical value exceeds the page byte bound\");\n if (bytes + size > 32 * 1024 * 1024) break;\n bytes += size;\n page.push(selected);\n last = selected.sequence;\n }\n const next = { after: last, count: cursor.count + page.length };\n\n return [\n page,\n page.length === 0 || next.count >= maximum\n ? Option.none<typeof next>()\n : Option.some(next),\n ] as const;\n }),\n );\n\n const readFromThread = (threadId: ThreadId, thread: StoredThread, request: ThreadReadRequest) =>\n Stream.unwrap(\n Effect.gen(function* () {\n if (request.threadId !== threadId)\n return yield* storeError(\"read snapshot\", \"Thread differs from the captured snapshot\");\n\n if (!(\"selection\" in request))\n return Stream.paginate(\n { after: request.afterSequence ?? ZERO_CANONICAL_SEQUENCE, count: 0 },\n (cursor) =>\n Effect.gen(function* () {\n const page = yield* storedPage(\n thread,\n cursor.after,\n Math.min(READ_PAGE_SIZE, request.limit - cursor.count),\n );\n\n const next = {\n after: page.at(-1)?.sequence ?? cursor.after,\n count: cursor.count + page.length,\n };\n\n return [\n page,\n page.length === 0 || next.count >= request.limit\n ? Option.none<typeof next>()\n : Option.some(next),\n ] as const;\n }),\n );\n const selection = request.selection;\n\n if (\n \"expectedTailSequence\" in selection &&\n selection.expectedTailSequence !== thread.tailSequence\n )\n return yield* storeError(\"selected read\", \"Canonical tail changed\");\n if (\"throughSequence\" in selection && selection.throughSequence > thread.tailSequence)\n return yield* storeError(\"selected read\", \"Captured sequence is ahead of canonical tail\");\n\n const through =\n \"throughSequence\" in selection ? selection.throughSequence : thread.tailSequence;\n\n const after = request.page.afterSequence ?? 0;\n let sources: ReadonlyArray<ReadonlyArray<CanonicalRecordEnvelope>> = [];\n\n const one = (entry: CanonicalRecordEnvelope | null | undefined) =>\n entry === undefined || entry === null ? [] : [entry];\n\n const latest = (entries: ReadonlyArray<CanonicalRecordEnvelope>) =>\n one(entries[upperSequence(entries, through) - 1]);\n\n switch (selection._tag) {\n case \"RecordId\":\n sources = [one(thread.byId.get(selection.recordId))];\n break;\n case \"RunInput\": {\n const entry = thread.runInputs.get(selection.runId);\n\n if (entry === null)\n return yield* storeError(\"selected read\", \"Ambiguous original Run input\");\n sources = [one(entry)];\n break;\n }\n case \"ToolDeclaration\": {\n const entry = thread.toolDeclarations.get(selection.settlementRecordId);\n\n if (entry === null)\n return yield* storeError(\"selected read\", \"Ambiguous original tool declaration\");\n if (entry !== undefined) {\n const payload = entry.record.payload;\n\n if (\n payload._tag !== \"ModelResponseRecorded\" ||\n !payload.toolOperations.some(\n (operation) =>\n toolCallSettledRecordId(payload.runId, payload.turn, operation.toolCallId) ===\n selection.settlementRecordId,\n )\n )\n return yield* storeError(\"selected read\", \"Invalid exact tool declaration pointer\");\n }\n sources = [one(entry)];\n break;\n }\n case \"RunEvidence\":\n sources = [\n thread.runRecords.get(selection.runId) ?? [],\n [\n submissionInputRecordId(selection.submissionId),\n submissionAbortRecordId(selection.submissionId),\n submissionSettlementRecordId(selection.submissionId),\n ]\n .flatMap((id) => one(thread.byId.get(id)))\n .sort((a, b) => a.sequence - b.sequence),\n ];\n break;\n case \"OperationEvidence\":\n sources = [\n thread.operationRecords.get(\n JSON.stringify([selection.runId, selection.toolCallId]),\n ) ?? [],\n ...selection.approvalToolCallIds.flatMap((toolCallId) =>\n toolCallId === selection.toolCallId\n ? []\n : [\n thread.operationRecords.get(\n JSON.stringify([selection.runId, toolCallId, \"approval\"]),\n ) ?? [],\n ],\n ),\n one(thread.byId.get(selection.originRecordId)),\n ];\n break;\n case \"LastAgentUpdate\":\n sources = [latest(thread.agentUpdates)];\n break;\n case \"DeliveryPredecessor\":\n sources = [latest(thread.deliveryPredecessors)];\n break;\n case \"LatestModelCompleted\":\n sources = [latest(thread.modelCompletions)];\n break;\n case \"LatestApplicationInput\":\n sources = [latest(thread.applicationInputs)];\n break;\n case \"DurableHistoryOwner\":\n sources = [one(thread.durableOwners[0])];\n break;\n case \"PromptEvidence\":\n sources = [thread.promptEvidence];\n break;\n case \"WorkHandoffs\":\n sources = [thread.handoffs];\n break;\n case \"ContextWindowBoundary\": {\n // Match native SQL's disjoint coverage-prefix seeks. Each bucket contains\n // canonical sequence order; captured-tail reads never assume monotone coverage.\n let start = 0;\n let selected: CanonicalRecordEnvelope | undefined;\n\n while (start < selection.atSequence) {\n const remaining = selection.atSequence - start;\n let height = Math.floor(Math.log2(remaining));\n\n while (2 ** height > remaining) height--;\n const width = 2 ** height;\n const entries = thread.windowBoundaries.get(`${height}:${start / width}`) ?? [];\n const candidate = entries[upperSequence(entries, through) - 1];\n\n if (\n candidate !== undefined &&\n (selected === undefined || candidate.sequence > selected.sequence)\n )\n selected = candidate;\n start += width;\n }\n sources = [one(selected)];\n break;\n }\n case \"WorkerStop\":\n sources = [latest(thread.workerRecords.get(`stop:${selection.workerThreadId}`) ?? [])];\n break;\n case \"WorkerExecution\":\n sources = [\n thread.workerRecords.get(\"execution:UserInputRecorded\") ?? [],\n thread.workerRecords.get(\"execution:SubmissionSettled\") ?? [],\n ];\n break;\n case \"WorkerState\":\n sources = [\n thread.workerRecords.get(\"worker\") ?? [],\n ...(selection.sourceSubmissionId === undefined\n ? []\n : [\n thread.workerRecords.get(`subtree:${selection.sourceSubmissionId}`) ?? [],\n thread.workerRecords.get(\n `joined:${runIdForSubmission(selection.sourceSubmissionId)}`,\n ) ?? [],\n thread.workerRecords.get(`funding:${selection.sourceSubmissionId}`) ?? [],\n ]),\n ];\n break;\n case \"LiveWorkerInputs\": {\n const index = yield* readyIndex(request.threadId, thread.tailSequence).pipe(\n Effect.mapError((e) => storeError(\"selected read\", e.message)),\n );\n\n if (selection.throughSequence !== thread.tailSequence)\n return yield* storeError(\n \"selected read\",\n \"Live work requires the current exact tail\",\n );\n\n const locators =\n selection.workerThreadId === undefined\n ? index.liveInputs\n : (index.inputsByWorker.get(selection.workerThreadId) ?? []);\n\n const start = liveInputPosition(locators, after + 1);\n const selected: Array<CanonicalRecordEnvelope> = [];\n\n for (let at = start; at < Math.min(locators.length, start + request.page.limit); at++) {\n const entry = index.entries.get(locators[at].id);\n\n const origin =\n entry === undefined ? undefined : thread.byId.get(entry.originRecordId);\n\n if (\n entry?.owner._tag !== \"WorkerInput\" ||\n origin?.record.payload._tag !== \"WorkerInputRequested\" ||\n origin.sequence !== locators[at].sequence ||\n origin.record.payload.admission.origin.worker.threadId !==\n entry.owner.workerThreadId ||\n (origin.record.payload.admission.reportKind === \"update\") !== entry.owner.update\n )\n return yield* storeError(\n \"selected read\",\n \"Invalid live worker input locator or origin\",\n );\n selected.push(origin);\n }\n sources = [selected];\n break;\n }\n }\n\n return selectedStream(sources, after, through, request.page.limit);\n }),\n );\n\n const read: ThreadStore[\"Service\"][\"read\"] = (input) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadReadRequest, \"read\", input);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n return readFromThread(request.threadId, thread, request);\n }),\n );\n\n const decodePromptRecord = Schema.decodeUnknownEffect(PromptRecord);\n\n const readPrompt: ThreadStore[\"Service\"][\"readPrompt\"] = (input) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadPromptRead, \"readPrompt\", input);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n if (request.throughSequence > thread.tailSequence)\n return yield* storeError(\"readPrompt\", \"Captured sequence is ahead of canonical tail\");\n const start = upperSequence(thread.promptEvidence, request.afterSequence ?? 0);\n const records: Array<PromptRecordEnvelope> = [];\n\n for (\n let at = start;\n at < Math.min(thread.promptEvidence.length, start + request.limit);\n at++\n ) {\n const entry = thread.promptEvidence[at];\n\n if (entry.sequence > request.throughSequence) break;\n\n const record = yield* decodePromptRecord(\n entry.record instanceof ExportedRecord ? entry.record.wire : entry.record,\n ).pipe(\n Effect.mapError((cause) => storeError(\"readPrompt\", \"Invalid prompt record\", cause)),\n );\n\n records.push({ threadId: request.threadId, sequence: entry.sequence, record });\n }\n\n return Stream.fromIterable(records);\n }),\n );\n\n const observe: ThreadStore[\"Service\"][\"observe\"] = (unvalidated) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadObservation, \"observe\", unvalidated);\n let after = yield* offsetSequence(request.threadId, request.afterOffset);\n const subscription = yield* PubSub.subscribe(updates);\n\n const drain = () =>\n Stream.paginate(after, (cursor) =>\n readSnapshot(request.threadId, cursor, READ_PAGE_SIZE).pipe(\n Effect.map((records) => {\n after = records.at(-1)?.sequence ?? cursor;\n\n return [\n records,\n records.length > 0 ? Option.some(after) : Option.none<CanonicalSequence>(),\n ] as const;\n }),\n ),\n );\n\n return drain().pipe(\n Stream.concat(\n Stream.fromEffectRepeat(PubSub.take(subscription)).pipe(Stream.flatMap(drain)),\n ),\n );\n }),\n );\n\n const emptyThread = (): StoredThread => ({\n ...emptyIndexes(),\n tailSequence: ZERO_CANONICAL_SEQUENCE,\n ranges: new Map(),\n rangeStarts: [],\n archiveContents: new Map(),\n chunks: new Map(),\n batches: new Map(),\n executions: new Map(),\n executionCommits: new Map(),\n batchesByFirst: new Map(),\n checkpoints: new Map(),\n });\n\n const makeExportReader = (idleOnly: boolean) =>\n ThreadExporterReader.of({\n snapshot: Effect.fnUntraced(function* (threadId: ThreadId, captured?: TransferManifest) {\n const thread = MutableRef.get(state.ref).threads.get(threadId);\n\n const facts =\n ledgerTransfer === undefined\n ? { idle: true, admissions: 0, aborts: 0, approvals: 0, resolutions: 0 }\n : yield* ledgerTransfer.snapshot(threadId);\n\n const delivered = deliveryTransfer?.snapshot(threadId) ?? { idle: true, deliveries: 0 };\n\n if (thread === undefined && facts.admissions === 0 && delivered.deliveries === 0)\n return yield* ThreadNotMaterialized.make({ threadId });\n if (idleOnly) {\n const index = yield* readyIndex(threadId, thread?.tailSequence ?? 0).pipe(\n Effect.mapError((e) => storeError(\"export\", e.message)),\n );\n\n if (\n owner.hasOwner(threadId) ||\n (thread?.executions.size ?? 0) > 0 ||\n index.entries.size > 0 ||\n !facts.idle ||\n !delivered.idle\n )\n return yield* ThreadExportRejected.make({ threadId, reason: \"non-idle\" });\n // Only the first page performs the full closed-receipt proof. The caller keeps\n // the source quiescent; subsequent pages still check current work and the tail.\n if (captured === undefined && thread !== undefined) {\n yield* Effect.gen(function* () {\n for (const runId of thread.runRecords.keys())\n yield* validateClosedRun(threadId, Schema.decodeSync(RunId)(runId));\n if (ledgerTransfer !== undefined) {\n const ledger = ledgerTransfer;\n\n yield* Stream.runForEach(ledger.submissions(threadId), (submission) =>\n Effect.gen(function* () {\n const admission = yield* ledger.admission(threadId, submission.submissionId);\n\n if (admission === undefined)\n return yield* storeError(\"export\", \"Missing immutable admission\");\n yield* rebuildClosedSubmission(admission);\n }),\n );\n }\n }).pipe(\n Effect.provide(ThreadImportReader.layer(importReader(threadId, thread))),\n Effect.mapError((cause) =>\n Schema.is(ThreadImportRejected)(cause)\n ? ThreadExportRejected.make({ threadId, reason: \"non-idle\" })\n : cause,\n ),\n );\n }\n }\n\n return {\n format: CURRENT_RECORD_FORMAT,\n threadId,\n tailSequence: thread?.tailSequence ?? ZERO_CANONICAL_SEQUENCE,\n snapshot: {\n admissions: facts.admissions,\n aborts: facts.aborts,\n approvals: facts.approvals,\n resolutions: facts.resolutions,\n deliveries: delivered.deliveries,\n },\n ...(facts.workerSeal === undefined ? {} : { workerSeal: facts.workerSeal }),\n };\n }),\n batch: Effect.fnUntraced(function* (threadId: ThreadId, fromSequence: number) {\n const thread = yield* findThread(MutableRef.get(state.ref), threadId);\n const batchId = thread.batchesByFirst.get(fromSequence);\n const stored = batchId === undefined ? undefined : thread.batches.get(batchId);\n\n if (\n stored === undefined ||\n new TextEncoder().encode(stored.batchJson).byteLength > 16 * 1024 * 1024\n )\n return yield* storeError(\"export\", \"Missing or oversized canonical batch wire\");\n const batch = yield* decodeStoredBatch(stored.batchJson, \"export\");\n const records: Array<ThreadExportRecord> = [];\n\n for (const [index, record] of batch.records.entries()) {\n const sequence = decodeCanonicalSequence(fromSequence + index);\n const exact = storedRecord(thread, sequence);\n\n if (\n exact === undefined ||\n exact.batchId !== batch.batchId ||\n exact.record.recordId !== record.recordId\n )\n return yield* storeError(\"export\", \"Canonical batch index differs from its wire\");\n records.push(\n ThreadExportRecord.make({\n threadId,\n batchId: batch.batchId,\n sequence,\n offset: observationOffset(threadId, sequence),\n record,\n }),\n );\n }\n\n return { batches: [{ batchId: batch.batchId, producerId: batch.producerId }], records };\n }),\n facts: (threadId, section, after) => {\n const empty = Effect.succeed({\n facts: {\n admissions: [],\n commands: { aborts: [], approvals: [], resolutions: [] },\n deliveries: [],\n },\n after: after ?? \"\",\n });\n\n return section === \"deliveries\"\n ? (deliveryTransfer?.facts(threadId, after) ?? empty)\n : (ledgerTransfer?.facts(threadId, section, after) ?? empty);\n },\n });\n\n const exportReader = makeExportReader(true);\n const verificationReader = makeExportReader(false);\n\n const exportThread: ThreadStore[\"Service\"][\"export\"] = (request) =>\n exportThreadPage(request).pipe(Effect.provideService(ThreadExporterReader, exportReader));\n\n const verificationPage: ThreadStore[\"Service\"][\"export\"] = (request) =>\n exportThreadPage(request).pipe(Effect.provideService(ThreadExporterReader, verificationReader));\n\n const exactRunRecords = Effect.fnUntraced(function* (thread: StoredThread, runId: RunId) {\n const records: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n const facts = thread.runRecords.get(runId) ?? [];\n\n if (\n facts.length >\n MAX_RUN_EVIDENCE_RECORDS + RUN_TERMINAL_RESERVE_RECORDS + MAX_RUN_RECOVERY_SUFFIX_RECORDS\n )\n return yield* storeError(\"Run evidence\", \"Run record bounds exceeded\");\n for (const entry of facts) {\n bytes += canonicalRecordBytes(entry.record);\n if (bytes > MAX_RUN_EVIDENCE_BYTES + MAX_RUN_TERMINAL_BYTES + MAX_RUN_RECOVERY_SUFFIX_BYTES)\n return yield* storeError(\"Run evidence\", \"Run byte bounds exceeded\");\n records.push(entry);\n }\n\n return records.sort((a, b) => a.sequence - b.sequence);\n });\n\n const exactRecordReader = (\n threadId: ThreadId,\n thread: StoredThread,\n ): Pick<\n ThreadImportReader[\"Service\"],\n \"read\" | \"record\" | \"runRecords\" | \"execution\" | \"hasAgent\"\n > => ({\n read: (input) =>\n Stream.unwrap(\n validate(ThreadReadRequest, \"read snapshot\", input).pipe(\n Effect.map((request) => readFromThread(threadId, thread, request)),\n ),\n ),\n record: (id) => Effect.succeed(thread.byId.get(id)),\n runRecords: (id) => exactRunRecords(thread, id),\n execution: (id) => Effect.succeed(thread.executions.get(id)),\n hasAgent: (id) =>\n Effect.succeed(\n (thread.workerRecords.get(\"worker\") ?? []).some(\n ({ record }) => record.payload._tag === \"ThreadCreated\" && record.payload.agentId === id,\n ),\n ),\n });\n\n const importReader = (id: ThreadId, thread: StoredThread): ThreadImportReader[\"Service\"] => ({\n ...exactRecordReader(id, thread),\n admission: (sid) => ledgerTransfer?.admission(id, sid) ?? Effect.succeed(undefined),\n runOwner: (runId) =>\n runId.startsWith(\"run:\")\n ? (ledgerTransfer?.admission(id, Schema.decodeSync(importSubmissionId)(runId.slice(4))) ??\n Effect.succeed(undefined))\n : Effect.succeed(undefined),\n commands: (sid) =>\n ledgerTransfer?.commands(sid) ??\n Effect.succeed({ aborts: [], approvals: [], resolutions: [] }),\n delivery: (messageId) => deliveryTransfer?.record(id, messageId) ?? Effect.succeed(undefined),\n });\n\n const importThread: ThreadImport[\"Service\"][\"import\"] = (pages) =>\n captureImportSource(pages, (captured) =>\n withMutation(\n Effect.gen(function* () {\n const progress = makeThreadImportProgress();\n let staged: StoredThread | undefined;\n let stagedWork = emptyWorkIndex();\n let stagedLedger: MemoryLedgerImport | undefined;\n let stagedDelivery: MemoryDeliveryImport | undefined;\n let existing: StoredThread | undefined;\n\n yield* Stream.runForEach(captured, (input) =>\n Effect.gen(function* () {\n const page = yield* prepareImportPage(progress, input).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const id = page.archive.threadId;\n\n if (staged === undefined) {\n const current = MutableRef.get(state.ref);\n\n existing = current.threads.get(id);\n const existingWork = MutableRef.get(workState.ref).get(id);\n\n if (\n (existing !== undefined &&\n (existing.tailSequence > 0 ||\n existing.batches.size > 0 ||\n existing.executions.size > 0 ||\n existing.executionCommits.size > 0 ||\n existing.checkpoints.size > 0 ||\n existing.ranges.size > 0 ||\n existing.archiveContents.size > 0)) ||\n (existingWork !== undefined &&\n (existingWork.entries.size > 0 ||\n existingWork.state !== \"ready\" ||\n existingWork.through !== 0))\n )\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"target-not-empty\",\n message: \"Destination canonical Thread is not empty\",\n });\n if (\n !MutableRef.get(workState.ref).has(id) &&\n MutableRef.get(workState.ref).size >= maxThreads\n )\n return yield* storeError(\"import\", \"Destination Thread capacity exceeded\");\n staged = emptyThread();\n stagedLedger =\n ledgerTransfer === undefined ? undefined : yield* ledgerTransfer.startImport(id);\n stagedDelivery =\n deliveryTransfer === undefined\n ? undefined\n : yield* deliveryTransfer.startImport(id);\n if (page.archive.workerSeal !== undefined && stagedLedger === undefined)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"A paired ledger is required to preserve the worker seal\",\n });\n }\n if (page.archive.admissions.length > 0 && stagedLedger === undefined)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"A paired ledger is required for admission restore\",\n });\n if (page.archive.deliveries.length > 0 && stagedDelivery === undefined)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"A paired delivery store is required for delivery restore\",\n });\n for (const batch of page.batches) {\n if (\n !canonicalBatchFitsTransfer(\n id,\n batch.batch,\n utf8ByteLength(batch.batchJson),\n 4 * Math.ceil(utf8ByteLength(id) / 3) + 36,\n )\n )\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-capacity\",\n message: \"Canonical batch exceeds its bounded transfer representation\",\n });\n\n if (staged.batches.has(batch.batch.batchId))\n return yield* invalidThreadArchive(\"Duplicate canonical batch identity\", id);\n\n const records = page.records\n .filter((entry) => entry.batchId === batch.batch.batchId)\n .map((entry) =>\n CanonicalRecordEnvelope.make({\n ...entry,\n offset: observationOffset(id, entry.sequence),\n }),\n );\n\n for (const entry of records)\n if (staged.byId.has(entry.record.recordId))\n return yield* invalidThreadArchive(\"Duplicate canonical record identity\", id);\n const native = prepareIndexes(staged, records);\n\n const commitWork = yield* prepareWork(\n stagedWork,\n records,\n (_, messageId) => stagedDelivery?.has(messageId) ?? false,\n ).pipe(Effect.provideService(Crypto.Crypto, crypto));\n\n retainRecords(staged, records);\n native.commit();\n staged = {\n ...staged,\n ...native.indexes,\n tailSequence: batch.lastSequence,\n };\n staged.batches.set(batch.batch.batchId, {\n batchJson: batch.batchJson,\n result: AppendResult.make({\n firstSequence: batch.firstSequence,\n lastSequence: batch.lastSequence,\n replayed: false,\n }),\n });\n staged.batchesByFirst.set(batch.firstSequence, batch.batch.batchId);\n stagedWork = commitWork();\n }\n if (stagedLedger !== undefined) yield* stagedLedger.stage(page);\n if (stagedDelivery !== undefined) yield* stagedDelivery.stage(page);\n for (const delivery of page.archive.deliveries) {\n for (const workId of stagedWork.messages.get(delivery.key.messageId) ?? []) {\n const entry = stagedWork.entries.get(workId);\n\n if (entry !== undefined) changeWorkCounts(stagedWork, entry, -1);\n stagedWork.entries.delete(workId);\n }\n stagedWork.messages.delete(delivery.key.messageId);\n stagedWork = { ...stagedWork, entryCount: stagedWork.entries.size };\n }\n }),\n );\n const result = yield* finishThreadImport(progress);\n\n if (staged === undefined) return yield* invalidThreadArchive(\"Missing transfer pages\");\n const restoredThread = staged;\n const id = result.threadId;\n\n const fallback = {\n admission: () => Effect.succeed(undefined),\n runOwner: () => Effect.succeed(undefined),\n commands: () => Effect.succeed({ aborts: [], approvals: [], resolutions: [] }),\n };\n\n const reader: ThreadImportReader[\"Service\"] = {\n ...exactRecordReader(id, restoredThread),\n ...(stagedLedger?.reader ?? fallback),\n delivery: stagedDelivery?.record ?? (() => Effect.succeed(undefined)),\n };\n\n return yield* Effect.gen(function* () {\n for (const runId of restoredThread.runRecords.keys()) {\n yield* verifyRunContinuations(\n yield* reader.runRecords(Schema.decodeSync(RunId)(runId)),\n { verifyContext: false },\n ).pipe(Effect.mapError((e) => invalidThreadArchive(e.message, id)));\n yield* validateClosedRun(id, Schema.decodeSync(RunId)(runId));\n }\n let lastInputQueue = -1;\n\n for (let sequence = 1; sequence <= restoredThread.tailSequence; sequence++) {\n const entry = storedRecord(restoredThread, sequence);\n\n if (entry === undefined)\n return yield* invalidThreadArchive(\"Incomplete canonical staging\", id);\n yield* verifyImportedReferences(entry);\n const payload = entry.record.payload;\n\n if (payload._tag === \"UserInputRecorded\" && payload.submissionId !== undefined) {\n const admission = yield* reader.admission(payload.submissionId);\n\n if (admission === undefined || admission.queueSequence <= lastInputQueue)\n return yield* invalidThreadArchive(\n \"Canonical inputs violate immutable admission order\",\n id,\n );\n lastInputQueue = admission.queueSequence;\n }\n\n if (\n payload._tag === \"UserInputRecorded\" &&\n payload.submissionId !== undefined &&\n entry.record.recordId !== submissionInputRecordId(payload.submissionId)\n )\n return yield* invalidThreadArchive(\"Canonical input identity is ambiguous\", id);\n if (\n payload._tag === \"SubmissionSettled\" &&\n entry.record.recordId !== submissionSettlementRecordId(payload.submissionId)\n )\n return yield* invalidThreadArchive(\n \"Canonical settlement identity is ambiguous\",\n id,\n );\n if (\n payload._tag !== \"WorkerInputCompleted\" &&\n \"submissionId\" in payload &&\n payload.submissionId !== undefined &&\n (yield* reader.admission(payload.submissionId)) === undefined\n )\n return yield* invalidThreadArchive(\"Canonical submission has no admission\", id);\n }\n if (stagedWork.entries.size > 0)\n return yield* ThreadImportRejected.make({\n threadId: id,\n reason: \"unsupported-obligations\",\n message: \"Transfer contains unresolved work\",\n });\n\n const commitLedger =\n stagedLedger === undefined\n ? undefined\n : yield* stagedLedger.prepareCommit(progress.manifest?.workerSeal);\n\n const commitDelivery =\n stagedDelivery === undefined ? undefined : yield* stagedDelivery.prepareCommit();\n\n const installed = restoredThread;\n\n yield* Effect.uninterruptible(\n Effect.sync(() => {\n commitLedger?.();\n commitDelivery?.();\n publishWork(id, stagedWork);\n MutableRef.get(state.ref).threads.set(id, installed);\n }).pipe(Effect.andThen(PubSub.publish(updates, undefined))),\n );\n\n return result;\n }).pipe(\n Effect.provide(ThreadImportReader.layer(reader)),\n Effect.provideService(ThreadDeliveryImportReader, {\n admission: (threadId, sid) =>\n threadId === id\n ? reader.admission(sid)\n : (ledgerTransfer?.admission(threadId, sid) ?? Effect.succeed(undefined)),\n record: (threadId, recordId) =>\n Effect.succeed(\n threadId === id\n ? restoredThread.byId.get(recordId)?.record\n : MutableRef.get(state.ref).threads.get(threadId)?.byId.get(recordId)?.record,\n ),\n }),\n );\n }).pipe(Effect.provideService(Crypto.Crypto, crypto)),\n ),\n );\n\n const inspectTail: ThreadStore[\"Service\"][\"inspectTail\"] = Effect.fnUntraced(\n function* (unvalidated) {\n const request = yield* validate(ThreadTailRequest, \"inspectTail\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n return ThreadTail.make({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n });\n },\n );\n\n const readIdentity: ThreadStore[\"Service\"][\"readIdentity\"] = Effect.fnUntraced(\n function* (unvalidated) {\n const request = yield* validate(ThreadIdentityRequest, \"readIdentity\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n const selected = [\n storedRecord(thread, 1),\n thread.byId.get(workerOriginRecordId(request.threadId)),\n thread.byId.get(subagentLineageRecordId(request.threadId)),\n ].filter((entry) => entry !== undefined);\n\n return yield* ThreadIdentity.makeEffect({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n hasAdmissions:\n ledgerTransfer !== undefined &&\n (yield* ledgerTransfer.snapshot(request.threadId)).admissions > 0,\n records: selected.filter(\n (entry, index) =>\n selected.findIndex((other) => other.record.recordId === entry.record.recordId) ===\n index,\n ),\n }).pipe(\n Effect.mapError((cause) => storeError(\"readIdentity\", \"Invalid canonical identity\", cause)),\n );\n },\n );\n\n const saveCheckpoint: ThreadCheckpoints[\"save\"] = Effect.fnUntraced(function* (unvalidated) {\n yield* validateCheckpointVersion(unvalidated);\n const request = yield* validate(SaveCheckpointRequest, \"saveCheckpoint\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [CheckpointDecision, MemoryState] => {\n const checkpoint = request.checkpoint;\n const thread = current.threads.get(checkpoint.threadId);\n\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: checkpoint.threadId,\n }),\n },\n current,\n ];\n }\n if (checkpoint.throughSequence > thread.tailSequence) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"ahead-of-tail\",\n }),\n },\n current,\n ];\n }\n if (!isBatchBoundary(thread, checkpoint.throughSequence)) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"not-batch-boundary\",\n }),\n },\n current,\n ];\n }\n const checkpoints = thread.checkpoints;\n\n checkpoints.set(checkpoint.throughSequence, checkpoint);\n // Checkpoints are disposable cache entries; history never fails when this cache fills.\n if (checkpoints.size > MAX_CHECKPOINTS_PER_THREAD) {\n let oldest = checkpoint.throughSequence;\n\n for (const sequence of checkpoints.keys()) if (sequence < oldest) oldest = sequence;\n checkpoints.delete(oldest);\n }\n\n return [{ _tag: \"success\" }, current];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n });\n\n const loadCheckpoint: ThreadCheckpoints[\"load\"] = Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(LoadCheckpointRequest, \"loadCheckpoint\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n const maximum = request.atOrBeforeSequence ?? thread.tailSequence;\n let selected: ThreadCheckpoint | undefined;\n\n for (const [sequence, checkpoint] of thread.checkpoints) {\n if (sequence <= maximum && (selected === undefined || sequence > selected.throughSequence)) {\n selected = checkpoint;\n }\n }\n if (selected !== undefined && !isBatchBoundary(thread, selected.throughSequence)) {\n return yield* CheckpointRejected.make({\n threadId: request.threadId,\n reason: \"not-batch-boundary\",\n });\n }\n\n return Option.fromNullishOr(selected);\n });\n\n // Range contents remain volatile RAM. Publishing an archive locator adds no durability.\n const verifyRange = Effect.fnUntraced(function* (\n thread: StoredThread,\n range: ThreadArchiveRange,\n source?: Map<BatchId, string>,\n ) {\n let sequence = range.firstSequence;\n let bytes = 0;\n let batches = 0;\n const captured = new Map<BatchId, string>();\n\n while (sequence <= range.lastSequence) {\n const id = thread.batchesByFirst.get(sequence);\n const batch = id === undefined ? undefined : thread.batches.get(id);\n\n const text =\n id === undefined ? undefined : source === undefined ? batch?.batchJson : source.get(id);\n\n if (\n id === undefined ||\n batch === undefined ||\n text === undefined ||\n batch.result.lastSequence > range.lastSequence\n )\n return yield* storeError(\"verify range\", \"Incomplete canonical batch range\");\n bytes += new TextEncoder().encode(text).byteLength;\n batches++;\n if (\n bytes > MAX_ARCHIVE_RANGE_BYTES ||\n batches > MAX_ARCHIVE_RANGE_RECORDS ||\n text !== batch.batchJson\n )\n return yield* storeError(\n \"verify range\",\n \"Range wire or bounds differ from canonical storage\",\n );\n\n const wire = yield* Schema.decodeEffect(Schema.fromJsonString(ExportBatch))(text).pipe(\n Effect.mapError((cause) => storeError(\"verify range\", \"Invalid range wire\", cause)),\n );\n\n if (\n wire.batchId !== id ||\n batch.result.firstSequence !== sequence ||\n batch.result.lastSequence !== sequence + wire.records.length - 1\n )\n return yield* storeError(\"verify range\", \"Canonical batch span or identity differs\");\n\n for (const [index, record] of wire.records.entries()) {\n const expected = storedRecord(thread, sequence + index);\n\n if (\n expected === undefined ||\n expected.threadId !== range.threadId ||\n expected.sequence !== sequence + index ||\n expected.batchId !== id ||\n expected.record.recordId !== record.recordId\n )\n return yield* storeError(\"verify range\", \"Canonical record identity or order differs\");\n\n const canonical = yield* Schema.encodeEffect(ReadRecord)(expected.record).pipe(\n Effect.mapError((cause) => storeError(\"verify range\", \"Invalid canonical record\", cause)),\n );\n\n const archived = yield* Schema.encodeEffect(ExportRecord)(record).pipe(\n Effect.mapError((cause) => storeError(\"verify range\", \"Invalid archive record\", cause)),\n );\n\n if (canonicalJson(canonical) !== canonicalJson(archived))\n return yield* storeError(\"verify range\", \"Archive and canonical record bytes differ\");\n }\n captured.set(id, text);\n sequence = decodeCanonicalSequence(batch.result.lastSequence + 1);\n }\n if (\n bytes !== range.byteCount ||\n batches !== range.batchCount ||\n range.recordCount !== range.lastSequence - range.firstSequence + 1\n )\n return yield* storeError(\"verify range\", \"Range spans or counts differ\");\n\n return captured;\n });\n\n const archiveTarget = Effect.fnUntraced(function* (\n request: import(\"@yielded/agent/thread-archive-range\").ThreadArchiveRangeSeal,\n ) {\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n return thread;\n });\n\n const archives: ThreadArchiveStorage = {\n page: Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(ThreadArchiveRangeRead, \"range page\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n let low = 0;\n let high = thread.rangeStarts.length;\n\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n const range = thread.ranges.get(thread.rangeStarts[middle]);\n\n if (range === undefined)\n return yield* storeError(\"page ranges\", \"Range locator has no exact range\");\n if (range.lastSequence <= (request.afterSequence ?? 0)) low = middle + 1;\n else high = middle;\n }\n const ranges: Array<ThreadArchiveRange> = [];\n const limit = request.limit ?? 32;\n\n for (let at = low; at < Math.min(thread.rangeStarts.length, low + limit); at++) {\n const range = thread.ranges.get(thread.rangeStarts[at]);\n\n if (range === undefined)\n return yield* storeError(\"page ranges\", \"Range locator has no exact range\");\n ranges.push(range);\n }\n\n const afterSequence =\n low + ranges.length < thread.rangeStarts.length ? ranges.at(-1)?.lastSequence : undefined;\n\n return { ranges, ...(afterSequence === undefined ? {} : { afterSequence }) };\n }),\n seal: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadArchiveRangeSeal, \"seal range\", unvalidated);\n const thread = yield* archiveTarget(request);\n const previousStart = thread.rangeStarts.at(-1);\n\n const previous =\n previousStart === undefined ? undefined : thread.ranges.get(previousStart);\n\n if (previousStart !== undefined && previous === undefined)\n return yield* storeError(\"seal range\", \"Range locator has no exact range\");\n const firstSequence = (previous?.lastSequence ?? 0) + 1;\n\n if (firstSequence > thread.tailSequence) return Option.none<ThreadArchiveRange>();\n let nextSequence = firstSequence;\n let byteCount = 0;\n let batchCount = 0;\n\n while (nextSequence <= thread.tailSequence) {\n const batchId = thread.batchesByFirst.get(nextSequence);\n const batch = batchId === undefined ? undefined : thread.batches.get(batchId);\n\n if (batch === undefined)\n return yield* storeError(\"seal range\", \"Missing exact canonical batch\");\n const bytes = utf8ByteLength(batch.batchJson);\n\n if (\n batchCount > 0 &&\n (batch.result.lastSequence - firstSequence + 1 > MAX_ARCHIVE_RANGE_RECORDS ||\n byteCount + bytes > MAX_ARCHIVE_RANGE_BYTES)\n )\n break;\n byteCount += bytes;\n batchCount++;\n nextSequence = batch.result.lastSequence + 1;\n }\n\n const range = ThreadArchiveRange.make({\n format: \"effect-agent/thread-range@2\",\n threadId: request.threadId,\n firstSequence: decodeCanonicalSequence(firstSequence),\n lastSequence: decodeCanonicalSequence(nextSequence - 1),\n recordCount: nextSequence - firstSequence,\n batchCount,\n byteCount,\n state: \"sealed\",\n });\n\n yield* verifyRange(thread, range);\n thread.ranges.set(firstSequence, range);\n thread.rangeStarts.push(firstSequence);\n\n return Option.some(range);\n }),\n ),\n verify: Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(ThreadArchiveRangeRequest, \"verify range\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n const range = thread.ranges.get(request.firstSequence);\n\n if (range === undefined) return yield* storeError(\"verify range\", \"Unknown sealed range\");\n yield* verifyRange(\n thread,\n range,\n range.state === \"archived\" ? thread.archiveContents.get(range.firstSequence) : undefined,\n );\n if (range.state === \"archived\" && !thread.archiveContents.has(range.firstSequence))\n return yield* storeError(\"verify range\", \"Published archive contents are missing\");\n\n return range;\n }),\n archive: (unvalidated) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadArchiveRangePublish, \"archive range\", unvalidated);\n const thread = yield* archiveTarget(request);\n const range = thread.ranges.get(request.firstSequence);\n\n if (range === undefined)\n return yield* storeError(\"archive range\", \"Unknown sealed range\");\n if (range.state === \"archived\") {\n const contents = thread.archiveContents.get(range.firstSequence);\n\n if (contents === undefined)\n return yield* storeError(\"archive range\", \"Published archive contents are missing\");\n yield* verifyRange(thread, range, contents);\n\n return range;\n }\n const contents = yield* verifyRange(thread, range);\n\n yield* verifyRange(thread, range, contents);\n\n const published = ThreadArchiveRange.make({\n ...range,\n state: \"archived\",\n locator: `memory:${encodeURIComponent(request.threadId)}:${range.firstSequence}`,\n });\n\n thread.archiveContents.set(range.firstSequence, contents);\n thread.ranges.set(range.firstSequence, published);\n\n return published;\n }),\n ),\n };\n\n const readWorkerCapacity: NonNullable<ThreadStore[\"Service\"][\"readWorkerCapacity\"]> =\n Effect.fnUntraced(function* (unvalidated) {\n const request = yield* validate(ThreadWorkerCapacityRequest, \"worker capacity\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n\n if (request.expectedTailSequence !== thread.tailSequence)\n return yield* storeError(\"worker capacity\", \"Canonical tail changed\");\n\n const index = yield* readyIndex(request.threadId, thread.tailSequence).pipe(\n Effect.mapError((e) => storeError(\"worker capacity\", e.message)),\n );\n\n const worker = index.workers.get(request.workerThreadId);\n\n return ThreadWorkerCapacity.make({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n activeWorkers: Math.min(index.workers.size, request.activeLimit + 1),\n workerActive: worker !== undefined,\n pendingInputs: Math.min(\n request.update ? (worker?.update ?? 0) : (worker?.ordinary ?? 0),\n request.pendingLimit + 1,\n ),\n });\n });\n\n const verification = {\n verify: (unvalidated: import(\"@yielded/agent/thread-store\").ThreadVerificationRequest) =>\n withMutation(\n Effect.gen(function* () {\n const request = yield* validate(ThreadVerificationRequest, \"verify Thread\", unvalidated);\n const thread = yield* findThread(MutableRef.get(state.ref), request.threadId);\n const id = request.threadId;\n\n const reader = importReader(id, thread);\n\n const submissions = () => ledgerTransfer?.submissions(id) ?? Stream.empty;\n\n const runs = Stream.fromIterable(thread.runRecords.keys()).pipe(\n Stream.map((runId) => Schema.decodeSync(RunId)(runId)),\n );\n\n const checkpoint = yield* loadCheckpoint(\n LoadCheckpointRequest.make({ threadId: id }),\n ).pipe(\n Effect.mapError((cause) =>\n Schema.is(CheckpointRejected)(cause)\n ? storeError(\"verify checkpoint\", \"Invalid checkpoint anchor\", cause)\n : cause,\n ),\n );\n\n return yield* verifyThreadInvariants({\n threadId: id,\n runs,\n executions: Stream.fromIterable(thread.executions.values()),\n submissions: submissions(),\n pages: streamExport({ threadId: id }).pipe(\n Stream.provideService(ThreadExportSource, { export: verificationPage }),\n Stream.mapError((cause) =>\n Schema.is(ThreadExportRejected)(cause)\n ? storeError(\"verify Thread\", \"Internal verification snapshot changed\")\n : cause,\n ),\n ),\n ...(Option.isNone(checkpoint) ? {} : { checkpoint: checkpoint.value }),\n checkpointsSupported: true,\n ...(request.requireAllSettled === undefined\n ? {}\n : { requireAllSettled: request.requireAllSettled }),\n }).pipe(\n Effect.provide(ThreadImportReader.layer(reader)),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n }),\n ),\n };\n\n const threadStore = ThreadStore.of({\n work,\n archives,\n verification,\n readWorkerCapacity,\n readIdentity,\n countPeerMessages,\n materialize: (request) => withMutation(materialize(request)),\n append,\n readExecution: (request) =>\n withMutation(\n Effect.gen(function* () {\n const thread = (yield* Ref.get(state)).threads.get(request.threadId);\n\n if (thread === undefined)\n return yield* ThreadNotMaterialized.make({ threadId: request.threadId });\n\n return Option.fromUndefinedOr(thread.executions.get(request.runId));\n }),\n ),\n read,\n readPrompt,\n observe,\n export: (request) =>\n checkExportSource(request.threadId).pipe(Effect.andThen(withMutation(exportThread(request)))),\n inspectTail,\n checkpoints: { save: (request) => withMutation(saveCheckpoint(request)), load: loadCheckpoint },\n });\n\n return Context.make(ThreadStore, threadStore).pipe(\n Context.add(StorageOwner, owner),\n Context.add(ThreadImport, { import: importThread }),\n Context.add(MemoryThreadStoreKernel, {\n owner,\n withMutation,\n retainDelivery,\n checkThreadCapacity: (threadId) =>\n Effect.suspend(() =>\n !MutableRef.get(workState.ref).has(threadId) &&\n MutableRef.get(workState.ref).size >= maxThreads\n ? Effect.fail(storeError(\"Thread capacity\", \"Retained Thread quota exceeded\"))\n : Effect.void,\n ),\n initializeWork: (threadId) => {\n if (\n !MutableRef.get(state.ref).threads.has(threadId) &&\n !MutableRef.get(workState.ref).has(threadId)\n )\n publishWork(threadId, emptyWorkIndex());\n },\n registerWorkOwner: (kind, owner) =>\n withMutation(\n Effect.gen(function* () {\n if (workOwners.has(kind))\n return yield* Effect.die(\n storeError(\"initialize\", `MemoryThreadStore already has a ${kind} work owner`),\n );\n workOwners.set(kind, owner);\n }),\n ),\n registerDeliveryLookup: (lookup) =>\n withMutation(\n Effect.gen(function* () {\n if (deliveryLookup !== undefined)\n return yield* Effect.die(\n storeError(\"initialize\", \"MemoryThreadStore already has a delivery lookup\"),\n );\n deliveryLookup = lookup;\n }),\n ),\n registerLedgerTransfer: (transfer) =>\n withMutation(\n Effect.gen(function* () {\n if (ledgerTransfer !== undefined)\n return yield* Effect.die(\n storeError(\"initialize\", \"MemoryThreadStore already has a paired SubmissionLedger\"),\n );\n ledgerTransfer = transfer;\n }),\n ),\n registerDeliveryTransfer: (transfer) =>\n withMutation(\n Effect.gen(function* () {\n if (deliveryTransfer !== undefined)\n return yield* Effect.die(\n storeError(\"initialize\", \"MemoryThreadStore already has a paired delivery store\"),\n );\n deliveryTransfer = transfer;\n }),\n ),\n prepareAppend,\n appendPrepared,\n record: (threadId, recordId) =>\n Ref.get(state).pipe(\n Effect.map((current) => current.threads.get(threadId)?.byId.get(recordId)?.record),\n ),\n toolCallResults: (threadId, runId, toolCallId) =>\n Ref.get(state).pipe(\n Effect.map((current) =>\n (\n current.threads\n .get(threadId)\n ?.operationRecords.get(JSON.stringify([runId, toolCallId, \"settled\"])) ?? []\n )\n .slice(0, 2)\n .map((entry) => entry.record),\n ),\n ),\n tail: (threadId) => inspectTail(ThreadTailRequest.make({ threadId })),\n }),\n );\n});\n\n/**\n * In-memory canonical Thread persistence. Durable accepted work is served by the separate\n * SubmissionLedger port; this Layer provides ThreadStore, ThreadReader, and ThreadImport.\n * Importing admissions requires a MemorySubmissionLedger paired with this store.\n */\nexport const MemoryThreadStoreLive = ThreadReader.layer().pipe(\n Layer.provideMerge(Layer.effectContext(makeThreadStore)),\n);\n\n/** Configure a finite retained Thread capacity. Invalid construction options throw immediately. */\nexport const memoryThreadStoreLayer = (options: { readonly maxThreads?: number } = {}) =>\n MemoryThreadStoreLive.pipe(\n Layer.provide(\n Layer.succeed(ThreadCapacity)(\n Schema.decodeSync(\n Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(65_536)),\n )(options.maxThreads ?? MAX_THREADS),\n ),\n ),\n );\n"],"mappings":"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"}
|