@yielded/agent 0.1.0-beta.171 → 0.1.0-beta.172

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.
Files changed (94) hide show
  1. package/dist/{Admin-BmALDmj8.d.mts → Admin-BX9ns28E.d.mts} +2 -2
  2. package/dist/{DurableAgentRuntime-CQGiSnCa.mjs → DurableAgentRuntime-BAmSkWYr.mjs} +10 -9
  3. package/dist/DurableAgentRuntime-BAmSkWYr.mjs.map +1 -0
  4. package/dist/{EventSource-CVXzC_8E.d.mts → EventSource-BwliwQz9.d.mts} +2 -2
  5. package/dist/{MessageDelivery-BGKWdjUu.d.mts → MessageDelivery-CeSDfHZa.d.mts} +4 -4
  6. package/dist/{PreparedInputAdmission-C1xt29pl.d.mts → PreparedInputAdmission-CxSJSiTl.d.mts} +3 -3
  7. package/dist/{RecordFormat-BphUsB6Q.d.mts → RecordFormat-BNiLpe43.d.mts} +9 -3
  8. package/dist/{RunContinuation-CNWMmymY.mjs → RunContinuation-DHYNAQFi.mjs} +2 -2
  9. package/dist/{RunContinuation-CNWMmymY.mjs.map → RunContinuation-DHYNAQFi.mjs.map} +1 -1
  10. package/dist/{RunContinuation-B7a2dK8k.d.mts → RunContinuation-FHM7XPjq.d.mts} +3 -3
  11. package/dist/{RunStorage-FFaYE4-2.mjs → RunStorage-uqPxps09.mjs} +2 -2
  12. package/dist/{RunStorage-FFaYE4-2.mjs.map → RunStorage-uqPxps09.mjs.map} +1 -1
  13. package/dist/{Subscription-CQqYNUqy.d.mts → Subscription-DONig54Q.d.mts} +2 -2
  14. package/dist/{SubscriptionInput-BibUlnWP.d.mts → SubscriptionInput-mJIRxWJM.d.mts} +2 -2
  15. package/dist/{ThreadImport-mLZiwu30.d.mts → ThreadImport-CoQTZywm.d.mts} +42 -42
  16. package/dist/{ThreadImport-BsOXD7qr.mjs → ThreadImport-DckUMEqJ.mjs} +4 -4
  17. package/dist/{ThreadImport-BsOXD7qr.mjs.map → ThreadImport-DckUMEqJ.mjs.map} +1 -1
  18. package/dist/{ThreadStore-B5sew3ir.mjs → ThreadStore-CEekRa80.mjs} +2 -2
  19. package/dist/ThreadStore-CEekRa80.mjs.map +1 -0
  20. package/dist/{ThreadTransfer-DeO03GBg.mjs → ThreadTransfer-B4gTQLIl.mjs} +3 -5
  21. package/dist/ThreadTransfer-B4gTQLIl.mjs.map +1 -0
  22. package/dist/{WorkerAdmission-C1TxLQPT.mjs → WorkerAdmission-DFVbbVh2.mjs} +2 -2
  23. package/dist/{WorkerAdmission-C1TxLQPT.mjs.map → WorkerAdmission-DFVbbVh2.mjs.map} +1 -1
  24. package/dist/durable/Admin.d.mts +1 -1
  25. package/dist/durable/AgentRegistration.d.mts +1 -1
  26. package/dist/durable/Certification.d.mts +1 -1
  27. package/dist/durable/CommittedActivity.d.mts +1 -1
  28. package/dist/durable/CommittedActivity.mjs +1 -1
  29. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  30. package/dist/durable/DurableAgentRuntime.mjs +2 -2
  31. package/dist/durable/EventSource.d.mts +1 -1
  32. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  33. package/dist/durable/LifecyclePublication.d.mts +1 -1
  34. package/dist/durable/LifecyclePublication.mjs +1 -1
  35. package/dist/durable/MessageDelivery.d.mts +1 -1
  36. package/dist/durable/MessageDeliveryStoreConformance.d.mts +2 -2
  37. package/dist/durable/PersistentHistory.d.mts +1 -1
  38. package/dist/durable/PersistentHistory.mjs +2 -2
  39. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  40. package/dist/durable/RecordFormat.d.mts +2 -2
  41. package/dist/durable/RecordFormat.mjs +14 -2
  42. package/dist/durable/RecordFormat.mjs.map +1 -1
  43. package/dist/durable/Recovery.d.mts +1 -1
  44. package/dist/durable/RunContinuation.d.mts +2 -2
  45. package/dist/durable/RunContinuation.mjs +2 -2
  46. package/dist/durable/RunJournal.d.mts +1 -1
  47. package/dist/durable/RunStorage.d.mts +1 -1
  48. package/dist/durable/RunStorage.mjs +1 -1
  49. package/dist/durable/Scheduling.d.mts +1 -1
  50. package/dist/durable/SettlementPublisher.d.mts +1 -1
  51. package/dist/durable/SettlementPublisher.mjs +1 -1
  52. package/dist/durable/SubmissionLedger.d.mts +1 -1
  53. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  54. package/dist/durable/SubmissionLedgerConformance.mjs +2 -2
  55. package/dist/durable/SubmissionStatus.d.mts +1 -1
  56. package/dist/durable/Subscription.d.mts +1 -1
  57. package/dist/durable/SubscriptionInput.d.mts +1 -1
  58. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  59. package/dist/durable/SubscriptionTools.d.mts +2 -2
  60. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  61. package/dist/durable/Subscriptions.d.mts +5 -5
  62. package/dist/durable/ThreadArchiveRange.d.mts +1 -1
  63. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  64. package/dist/durable/ThreadContextHistory.mjs +1 -1
  65. package/dist/durable/ThreadImport.d.mts +1 -1
  66. package/dist/durable/ThreadImport.mjs +1 -1
  67. package/dist/durable/ThreadInvariants.d.mts +3 -3
  68. package/dist/durable/ThreadInvariants.mjs +3 -3
  69. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  70. package/dist/durable/ThreadReader.d.mts +1 -1
  71. package/dist/durable/ThreadReader.mjs +1 -1
  72. package/dist/durable/ThreadStore.d.mts +1 -1
  73. package/dist/durable/ThreadStore.mjs +1 -1
  74. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  75. package/dist/durable/ThreadStoreConformance.mjs +2 -2
  76. package/dist/durable/ThreadTransfer.d.mts +1 -1
  77. package/dist/durable/ThreadTransfer.mjs +1 -1
  78. package/dist/durable/ThreadWork.d.mts +1 -1
  79. package/dist/durable/ThreadWork.mjs +2 -2
  80. package/dist/durable/WorkerAdmission.d.mts +1 -1
  81. package/dist/durable/WorkerAdmission.mjs +1 -1
  82. package/dist/durable/WorkerHost.d.mts +1 -1
  83. package/dist/index.d.mts +9 -9
  84. package/dist/index.mjs +6 -6
  85. package/dist/{run-context-reader-BrbZ8tb7.d.mts → run-context-reader-OcsZr4bk.d.mts} +2 -2
  86. package/package.json +1 -1
  87. package/src/durable/DurableAgentRuntime.ts +4 -1
  88. package/src/durable/RecordFormat.ts +18 -0
  89. package/src/durable/ThreadStore.ts +1 -1
  90. package/src/durable/ThreadTransfer.ts +1 -8
  91. package/src/durable/internal/agent-updates.ts +10 -2
  92. package/dist/DurableAgentRuntime-CQGiSnCa.mjs.map +0 -1
  93. package/dist/ThreadStore-B5sew3ir.mjs.map +0 -1
  94. package/dist/ThreadTransfer-DeO03GBg.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadImport-BsOXD7qr.mjs","names":[],"sources":["../src/durable/internal/thread-import-reader.ts","../src/durable/ThreadImport.ts"],"sourcesContent":["import { Context, type Effect, Layer, type Stream } from \"effect\";\n\nimport type { AgentId, RunId, SubmissionId, ThreadId } from \"../../core/Identifiers.ts\";\nimport type { IdempotencyKey } from \"../../core/Receipt.ts\";\nimport type { MessageDeliveryRecord } from \"../MessageDelivery.ts\";\nimport type { CanonicalRecordEnvelope, RecordEnvelope, RecordId } from \"../Records.ts\";\nimport type {\n ThreadAdmission,\n ThreadCommands,\n ThreadReadRequest,\n ThreadStoreError,\n ExecutionCheckpoint,\n} from \"../ThreadStore.ts\";\nimport { RunContextReader } from \"./run-context-reader.ts\";\n\n/** Exact indexes for one captured Thread transaction. Run records and commands enforce count and byte bounds. */\nexport class ThreadImportReader extends Context.Service<\n ThreadImportReader,\n {\n /** Full canonical history in this same snapshot, including archived facts. */\n readonly read: (\n request: ThreadReadRequest,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError>;\n readonly delivery: (\n messageId: IdempotencyKey,\n ) => Effect.Effect<MessageDeliveryRecord | undefined, ThreadStoreError>;\n readonly record: (\n id: RecordId,\n ) => Effect.Effect<CanonicalRecordEnvelope | undefined, ThreadStoreError>;\n readonly admission: (\n id: SubmissionId,\n ) => Effect.Effect<ThreadAdmission | undefined, ThreadStoreError>;\n readonly runOwner: (id: RunId) => Effect.Effect<ThreadAdmission | undefined, ThreadStoreError>;\n readonly runRecords: (\n id: RunId,\n ) => Effect.Effect<ReadonlyArray<CanonicalRecordEnvelope>, ThreadStoreError>;\n readonly execution: (\n id: RunId,\n ) => Effect.Effect<ExecutionCheckpoint | undefined, ThreadStoreError>;\n readonly commands: (\n id: SubmissionId,\n ) => Effect.Effect<typeof ThreadCommands.Type, ThreadStoreError>;\n readonly hasAgent: (id: AgentId) => Effect.Effect<boolean, ThreadStoreError>;\n }\n>()(\"@effect-agent/thread/ThreadImportReader\") {\n /** Bind context reconstruction to this same captured transaction. */\n static layer(reader: ThreadImportReader[\"Service\"]) {\n return Layer.succeedContext(\n Context.make(ThreadImportReader, reader).pipe(\n Context.add(RunContextReader, {\n record: reader.record,\n read: (request) =>\n reader.read({\n threadId: request.threadId,\n selection: { _tag: \"PromptEvidence\", throughSequence: request.throughSequence },\n page: {\n limit: request.limit,\n ...(request.afterSequence === undefined\n ? {}\n : { afterSequence: request.afterSequence }),\n },\n }),\n }),\n ),\n );\n }\n}\n\n/** Delivery evidence reads: the importing Thread uses staged facts; foreign Threads use retained facts. */\nexport class ThreadDeliveryImportReader extends Context.Service<\n ThreadDeliveryImportReader,\n {\n readonly admission: (\n threadId: ThreadId,\n submissionId: SubmissionId,\n ) => Effect.Effect<ThreadAdmission | undefined, ThreadStoreError>;\n readonly record: (\n threadId: ThreadId,\n recordId: RecordId,\n ) => Effect.Effect<RecordEnvelope | undefined, ThreadStoreError>;\n }\n>()(\"@effect-agent/thread/ThreadDeliveryImportReader\") {}\n","import { Context, Effect, Pull, Schema, Stream, type Scope } from \"effect\";\n\nimport { InputMessage } from \"../capabilities/Messaging.ts\";\nimport type { RunId } from \"../core/Identifiers.ts\";\nimport { SubmissionId, ThreadId, ToolCallId } from \"../core/Identifiers.ts\";\nimport { WorkerRef } from \"../core/Worker.ts\";\nimport { canonicalJson, digestJson, utf8ByteLength } from \"./Digest.ts\";\nimport { readRunContext, validateContextBoundary } from \"./internal/run-context.ts\";\nimport { ThreadImportReader } from \"./internal/thread-import-reader.ts\";\nimport { ImportSourcePhase } from \"./internal/thread-transfer-source.ts\";\nimport { toolOperationStates } from \"./internal/tool-operations.ts\";\nimport { MessageDeliveryRecord } from \"./MessageDelivery.ts\";\nimport { decodeExportRecord } from \"./RecordFormat.ts\";\nimport {\n CanonicalBatch,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n CURRENT_RECORD_FORMAT,\n RecordEnvelope,\n RecordJson,\n SubtreeBudgetReserved,\n} from \"./Records.ts\";\nimport {\n executionRunIds,\n isOperationalRecord,\n isPreContinuationFact,\n validateSuffix,\n} from \"./RunContinuation.ts\";\nimport { runIdForSubmission } from \"./RunJournal.ts\";\nimport { validateCanonicalSettlement, validateJoinedSettlement } from \"./SettlementPublisher.ts\";\nimport {\n AbortIntent,\n ApprovalDecisionIntent,\n ApprovalPendingSuspension,\n InputAppliedMarker,\n SubmissionState,\n SuspensionSnapshot,\n UnknownResolutionIntent,\n unknownResolutionKind,\n submissionInputRecordId,\n submissionSettlementRecordId,\n submissionAbortRecordId,\n} from \"./SubmissionLedger.ts\";\nimport {\n type ExecutionCheckpoint,\n MAX_THREAD_EXPORT_PAGE_BYTES,\n MAX_THREAD_EXPORT_PAGE_RECORDS,\n ThreadAdmission,\n ThreadExport,\n ThreadAbortFact,\n ThreadApprovalFact,\n ThreadResolutionFact,\n makeTransferFactCheck,\n transferPageFits,\n type ThreadStoreError,\n} from \"./ThreadStore.ts\";\nimport { transferDependencies, sameTransferManifest, transferSections } from \"./ThreadTransfer.ts\";\nimport { workIndexChanges } from \"./ThreadWork.ts\";\n\nexport { ThreadImportReader, ThreadDeliveryImportReader } from \"./internal/thread-import-reader.ts\";\n\nconst sameInputMessage = Schema.toEquivalence(InputMessage);\n\n/** One owned wire page. Canonical batches precede admissions; all admissions precede accepted commands.\n * Every fact section is required, including empty sections. This order permits indexed atomic staging. */\nexport const ThreadArchive = Schema.Struct({\n ...ThreadExport.fields,\n records: Schema.Array(\n Schema.Struct({ ...CanonicalRecordEnvelope.fields, record: RecordJson }),\n ).check(Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS)),\n});\n\nexport type ThreadArchive = typeof ThreadArchive.Type;\n\nconst admissionFitsTransfer = makeTransferFactCheck(ThreadAdmission);\nconst abortFitsTransfer = makeTransferFactCheck(ThreadAbortFact);\nconst approvalFitsTransfer = makeTransferFactCheck(ThreadApprovalFact);\nconst resolutionFitsTransfer = makeTransferFactCheck(ThreadResolutionFact);\nconst deliveryFitsTransfer = makeTransferFactCheck(MessageDeliveryRecord);\n\nexport class ThreadImportResult extends Schema.Class<ThreadImportResult>(\n \"@effect-agent/thread/ThreadImportResult\",\n)({\n threadId: ThreadId,\n format: Schema.String,\n tailSequence: CanonicalSequence,\n recordCount: Schema.Natural,\n submissionCount: Schema.Natural,\n}) {}\n\nexport class ThreadImportRejected extends Schema.TaggedError<ThreadImportRejected>()(\n \"ThreadImportRejected\",\n {\n threadId: Schema.optionalKey(ThreadId),\n reason: Schema.Literals([\n \"unsupported-format\",\n \"invalid-archive\",\n \"target-not-empty\",\n \"unsupported-obligations\",\n \"destination-conflict\",\n \"admission-policy-conflict\",\n \"admission-policy-unavailable\",\n \"unsupported-capacity\",\n ]),\n message: Schema.String,\n },\n) {}\n\n/** One owner transaction consumes the stream; E and R are preserved, including rollback on interruption. */\nexport class ThreadImport extends Context.Service<\n ThreadImport,\n {\n readonly import: <E, R>(\n pages: Stream.Stream<ThreadArchive, E, R>,\n ) => Effect.Effect<ThreadImportResult, E | ThreadImportRejected | ThreadStoreError, R>;\n }\n>()(\"@effect-agent/thread/ThreadImport\") {}\n\nexport class RebuiltSubmission extends Schema.Class<RebuiltSubmission>(\n \"@effect-agent/thread/RebuiltSubmission\",\n)({\n admission: ThreadAdmission,\n state: SubmissionState,\n inputApplied: Schema.optionalKey(InputAppliedMarker),\n joinedHostSubmissionId: Schema.optionalKey(SubmissionId),\n settlement: Schema.optionalKey(RecordEnvelope),\n suspension: Schema.optionalKey(SuspensionSnapshot),\n unknownToolCallIds: Schema.Array(ToolCallId),\n abort: Schema.optionalKey(AbortIntent),\n approvals: Schema.Array(ApprovalDecisionIntent),\n resolutions: Schema.Array(UnknownResolutionIntent),\n}) {}\n\nexport interface PreparedImportBatch {\n readonly batch: CanonicalBatch;\n readonly batchJson: string;\n readonly recordJson: ReadonlyArray<string>;\n readonly firstSequence: CanonicalSequence;\n readonly lastSequence: CanonicalSequence;\n}\n\nexport interface PreparedImportPage {\n readonly archive: ThreadArchive;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n readonly batches: ReadonlyArray<PreparedImportBatch>;\n}\n\n/** Resolve every declared immutable reference, even in a preparation without a continuation. */\nexport const verifyImportedReferences = Effect.fnUntraced(function* (\n entry: CanonicalRecordEnvelope,\n) {\n const reader = yield* ThreadImportReader;\n const resolve = reader.record;\n const payload = entry.record.payload;\n\n if (payload._tag === \"WorkHandoffCompleted\") {\n const preparation = yield* resolve(payload.preparationId);\n\n if (\n preparation === undefined ||\n preparation.threadId !== entry.threadId ||\n preparation.sequence >= entry.sequence ||\n entry.record.recordId !== `work-handoff-completed:${payload.preparationId}`\n )\n return yield* invalid(\"Missing or ambiguous handoff preparation\", entry.threadId);\n const changes = yield* workIndexChanges(preparation, \"none\");\n\n if (\n !changes.some(\n (change) =>\n change._tag === \"Put\" &&\n change.entry.owner._tag === \"Handoff\" &&\n change.entry.id === payload.ownerId,\n )\n )\n return yield* invalid(\n \"Handoff closure does not identify its preparation's exact owner\",\n entry.threadId,\n );\n }\n\n if (payload._tag === \"RunContextRecorded\") {\n const owner = yield* reader.runOwner(payload.runId);\n\n const original =\n owner === undefined ? undefined : yield* resolve(submissionInputRecordId(owner.submissionId));\n\n if (\n original === undefined ||\n original.threadId !== entry.threadId ||\n original.sequence >= entry.sequence\n )\n return yield* invalid(\"Saved context has no original admitted input\", entry.threadId);\n yield* validateContextBoundary(payload, original).pipe(\n Effect.mapError((error) => invalid(error.message, entry.threadId)),\n );\n }\n\n const references =\n payload._tag === \"WorkerInputRefused\"\n ? [payload.reservation, payload.stop]\n : payload._tag === \"RunContextRecorded\"\n ? payload.retained\n : payload._tag === \"RunContinuation\"\n ? [\n payload.originalInput,\n payload.savedContext,\n payload.latestResponse,\n payload.terminal,\n payload.lastFact,\n ].filter((ref) => ref !== undefined)\n : [];\n\n for (const ref of references) {\n const evidence = yield* resolve(ref.recordId);\n\n if (\n evidence === undefined ||\n evidence.threadId !== entry.threadId ||\n evidence.sequence >= entry.sequence ||\n (\"sequence\" in ref && evidence.sequence !== ref.sequence)\n )\n return yield* invalid(\"Missing, foreign or forward canonical dependency\", entry.threadId);\n }\n if (payload._tag === \"WorkerInputRefused\") {\n const request = (yield* resolve(payload.reservation.recordId))!.record.payload;\n const stop = (yield* resolve(payload.stop.recordId))!.record.payload;\n const retained = yield* reader.delivery(payload.messageId);\n\n if (\n retained === undefined ||\n retained.key.ownerThreadId !== entry.threadId ||\n retained.key.messageId !== payload.messageId ||\n retained.status !== \"refused\" ||\n retained.receipt !== null ||\n retained.settlement !== null ||\n retained.version !== payload.deliveryVersion ||\n retained.envelopeDigest !== payload.envelopeDigest ||\n retained.envelope.threadId !== payload.workerThreadId ||\n retained.envelope.deliveryPrincipal !== payload.receiver.principal ||\n retained.envelope.admissionKey !== payload.receiver.idempotencyKey ||\n retained.envelope.inputDigest !== payload.receiver.inputDigest ||\n retained.envelope.workerAdmission === undefined ||\n retained.envelope.workerAdmission.messageId !== payload.messageId ||\n retained.envelope.workerAdmission.origin.source.threadId !== entry.threadId ||\n stop._tag !== \"WorkerStopRequested\" ||\n !Schema.toEquivalence(WorkerRef)(\n stop.command.worker,\n retained.envelope.workerAdmission.origin.worker,\n )\n )\n return yield* invalid(\n \"Worker refusal has no exact refused delivery and source stop proof\",\n entry.threadId,\n );\n if (request._tag === \"WorkerInputRequested\") {\n if (\n request.inputDigest !== retained.envelope.inputDigest ||\n !Schema.toEquivalence(MessageDeliveryRecord.fields.envelope.fields.workerAdmission)(\n request.admission,\n retained.envelope.workerAdmission,\n )\n )\n return yield* invalid(\n \"Worker refusal reservation differs from its exact request\",\n entry.threadId,\n );\n } else if (\n request._tag !== \"SubtreeBudgetReserved\" ||\n request.childThreadId !== payload.workerThreadId ||\n request.reservationId !== payload.messageId ||\n request.lifetime !== \"background\" ||\n request.executionRunId !== retained.envelope.workerAdmission.executionRunId ||\n request.sourceSubmissionId !== retained.envelope.workerAdmission.sourceSubmissionId ||\n request.depth !== retained.envelope.workerAdmission.origin.depth ||\n !Schema.toEquivalence(SubtreeBudgetReserved.fields.policy)(\n request.policy,\n retained.envelope.workerAdmission.origin.policy,\n ) ||\n !Schema.toEquivalence(SubtreeBudgetReserved.fields.grant)(\n request.grant,\n retained.envelope.workerAdmission.origin.grant,\n ) ||\n !Schema.toEquivalence(SubtreeBudgetReserved.fields.budget)(\n request.budget,\n retained.envelope.workerAdmission.origin.budget,\n )\n )\n return yield* invalid(\"Worker refusal has no exact source reservation\", entry.threadId);\n }\n});\n\nconst sequence = Schema.decodeSync(CanonicalSequence);\n\nconst digest = (value: Schema.Json) =>\n digestJson(value).pipe(Effect.mapError(() => invalid(\"Unable to digest imported facts\")));\n\nexport const invalidThreadArchive = (message: string, threadId?: ThreadId) =>\n ThreadImportRejected.make({\n reason: \"invalid-archive\",\n message,\n ...(threadId === undefined ? {} : { threadId }),\n });\n\nconst invalid = invalidThreadArchive;\n\n/** Validate authoritative active state against the same staged/captured history and admissions. */\nexport const validateImportedExecution = Effect.fnUntraced(function* (\n threadId: ThreadId,\n checkpoint: ExecutionCheckpoint,\n tailSequence: CanonicalSequence,\n) {\n const reader = yield* ThreadImportReader;\n const progress = checkpoint.progress;\n const admission = yield* reader.admission(progress.submissionId);\n\n const own = (yield* reader.runRecords(progress.runId)).filter((entry) =>\n executionRunIds(entry.record).includes(progress.runId),\n );\n\n const local = new Map(checkpoint.operational.map((record) => [record.recordId, record]));\n\n if (\n admission === undefined ||\n admission.threadId !== threadId ||\n runIdForSubmission(admission.submissionId) !== progress.runId ||\n checkpoint.progressRecord.recordId !==\n JSON.stringify([\"continuation@1\", progress.runId, checkpoint.batchId]) ||\n checkpoint.throughSequence > tailSequence ||\n checkpoint.originalSequence > checkpoint.throughSequence ||\n local.size !== checkpoint.operational.length ||\n checkpoint.operational.some(\n (record) => !isOperationalRecord(record) || !executionRunIds(record).includes(progress.runId),\n ) ||\n own.filter((entry) => entry.sequence <= checkpoint.throughSequence).length !==\n checkpoint.canonicalRecords ||\n !validateSuffix(own, checkpoint.throughSequence)\n )\n return yield* invalid(\n \"Active execution identity, revision or history boundary is invalid\",\n threadId,\n );\n for (const id of local.keys())\n if ((yield* reader.record(id)) !== undefined)\n return yield* invalid(\"Operational identity collides with retained history\", threadId);\n\n const resolve = Effect.fnUntraced(function* (ref: typeof progress.originalInput) {\n const retained = yield* reader.record(ref.recordId);\n const record = local.get(ref.recordId) ?? retained?.record;\n\n if (\n record === undefined ||\n (retained !== undefined &&\n (retained.threadId !== threadId || retained.sequence > checkpoint.throughSequence)) ||\n !executionRunIds(record).includes(progress.runId)\n )\n return yield* invalid(\"Active execution reference is missing, foreign or corrupt\", threadId);\n\n return record;\n });\n\n const original = yield* reader.record(progress.originalInput.recordId);\n const input = (yield* resolve(progress.originalInput)).payload;\n\n if (\n original === undefined ||\n original.sequence !== checkpoint.originalSequence ||\n input._tag !== \"UserInputRecorded\" ||\n input.kind !== \"user\" ||\n input.runId !== progress.runId ||\n input.submissionId !== progress.submissionId\n )\n return yield* invalid(\"Active execution has no exact original admitted input\", threadId);\n yield* resolve(progress.lastFact);\n if (progress.savedContext !== undefined) {\n const context = yield* resolve(progress.savedContext);\n\n if (context.payload._tag !== \"RunContextRecorded\" || !local.has(context.recordId))\n return yield* invalid(\"Saved context is not owned active state\", threadId);\n yield* validateContextBoundary(context.payload, original).pipe(\n Effect.mapError((cause) => invalid(cause.message, threadId)),\n );\n yield* readRunContext(context.payload, original, progress.savedContext.recordId).pipe(\n Effect.mapError((cause) => invalid(cause.message, threadId)),\n );\n }\n if (progress.latestResponse !== undefined) {\n const response = (yield* resolve(progress.latestResponse)).payload;\n\n if (\n response._tag !== \"ModelResponseRecorded\" ||\n response.turn !== progress.accounting.committedTurns ||\n progress.savedContext === undefined\n )\n return yield* invalid(\"Active execution has invalid declared operation evidence\", threadId);\n } else if (progress.accounting.committedTurns !== 0)\n return yield* invalid(\"Active accounting has no corresponding response\", threadId);\n if (progress.terminal !== undefined) {\n const terminal = (yield* resolve(progress.terminal)).payload;\n\n if (\n terminal._tag !== \"RunCompleted\" &&\n terminal._tag !== \"RunFailed\" &&\n terminal._tag !== \"SubmissionSettled\"\n )\n return yield* invalid(\"Active execution has invalid terminal intent\", threadId);\n if (progress.position === \"settled\" && terminal._tag !== \"SubmissionSettled\")\n return yield* invalid(\"Settled active state has no canonical terminal outcome\", threadId);\n }\n});\n\n/** An executed unfinished Run cannot be imported without its authoritative operational owner. */\nexport const validateImportedRunExecution = Effect.fnUntraced(function* (\n threadId: ThreadId,\n runId: RunId,\n tailSequence: CanonicalSequence,\n) {\n const reader = yield* ThreadImportReader;\n const checkpoint = yield* reader.execution(runId);\n\n if (checkpoint !== undefined)\n return yield* validateImportedExecution(threadId, checkpoint, tailSequence);\n const records = yield* reader.runRecords(runId);\n\n if (\n records.some(\n ({ record }) =>\n record.payload._tag === \"UserInputRecorded\" &&\n record.payload.kind === \"user\" &&\n record.payload.submissionId !== undefined,\n ) &&\n !records.some(\n ({ record }) => record.payload._tag === \"SubmissionSettled\" && record.payload.runId === runId,\n ) &&\n records.some(({ record }) => !isPreContinuationFact(record))\n )\n return yield* invalid(\"Unfinished execution is missing its authoritative checkpoint\", threadId);\n});\n\n/** Own the first page before entering a destination gate; reuse the same scoped source pull. */\nexport const captureImportSource = <E, R, A, E2, R2>(\n pages: Stream.Stream<ThreadArchive, E, R>,\n use: (captured: Stream.Stream<ThreadArchive, E, R>) => Effect.Effect<A, E2, R2>,\n): Effect.Effect<A, E | E2 | ThreadImportRejected, Exclude<R | R2, Scope.Scope>> =>\n Effect.scoped(\n Effect.suspend(() => {\n const phase = { writing: false };\n\n return Effect.gen(function* () {\n const pull = yield* Stream.toPull(Stream.rechunk(pages, 1));\n\n const first = yield* Pull.catchDone(pull, () =>\n Effect.fail(invalid(\"Missing transfer pages\")),\n );\n\n const codec = Schema.fromJsonString(ThreadArchive);\n\n const wire = yield* Schema.encodeEffect(codec)(first[0]).pipe(\n Effect.mapError((cause) => invalid(`Malformed first transfer page: ${cause.message}`)),\n );\n\n if (utf8ByteLength(wire) > MAX_THREAD_EXPORT_PAGE_BYTES)\n return yield* invalid(\"Transfer page exceeds 32 MiB\");\n\n const owned = yield* Schema.decodeEffect(codec)(wire).pipe(\n Effect.mapError((cause) => invalid(`Malformed first transfer page: ${cause.message}`)),\n );\n\n phase.writing = true;\n\n return yield* use(\n Stream.succeed(owned).pipe(Stream.concat(Stream.fromPull(Effect.succeed(pull)))),\n );\n }).pipe(Effect.provideService(ImportSourcePhase, phase));\n }),\n );\n\n/** Constant-size fold state; identity uniqueness belongs to staged destination indexes. */\nexport interface ThreadImportProgress {\n manifest: ThreadArchive | undefined;\n sequence: number;\n ended: boolean;\n cursor: string | undefined;\n counts: {\n admissions: number;\n aborts: number;\n approvals: number;\n resolutions: number;\n deliveries: number;\n };\n}\n\nexport const makeThreadImportProgress = (): ThreadImportProgress => ({\n manifest: undefined,\n sequence: 0,\n ended: false,\n cursor: undefined,\n counts: { admissions: 0, aborts: 0, approvals: 0, resolutions: 0, deliveries: 0 },\n});\n\n/** Capture before awaiting any writes; the retained manifest never retains page payload arrays. */\nexport const prepareImportPage = Effect.fnUntraced(function* (\n state: ThreadImportProgress,\n input: ThreadArchive,\n options?: { readonly verification?: boolean },\n) {\n const codec = Schema.fromJsonString(ThreadArchive);\n\n const wire = yield* Schema.encodeEffect(codec)(input).pipe(\n Effect.mapError(() => invalid(\"Malformed transfer page\")),\n );\n\n if (utf8ByteLength(wire) > MAX_THREAD_EXPORT_PAGE_BYTES)\n return yield* invalid(\"Transfer page exceeds 32 MiB\");\n\n const archive = yield* Schema.decodeEffect(codec)(wire).pipe(\n Effect.mapError(() => invalid(\"Malformed transfer page\")),\n );\n\n const { threadId } = archive;\n\n // A final source page may omit its cursor. Restored facts must remain exportable after\n // later admissions, commands or a worker seal change the manifest and continuation.\n if (\n !transferPageFits(threadId) ||\n archive.admissions.some((fact) => !admissionFitsTransfer(threadId, fact)) ||\n archive.commands.aborts.some((fact) => !abortFitsTransfer(threadId, fact)) ||\n archive.commands.approvals.some((fact) => !approvalFitsTransfer(threadId, fact)) ||\n archive.commands.resolutions.some((fact) => !resolutionFitsTransfer(threadId, fact)) ||\n archive.deliveries.some((fact) => !deliveryFitsTransfer(threadId, fact))\n )\n return yield* ThreadImportRejected.make({\n threadId,\n reason: \"unsupported-capacity\",\n message: \"Imported fact exceeds its bounded transfer representation\",\n });\n\n if (state.ended) return yield* invalid(\"Page after the final transfer page\", threadId);\n if (archive.format !== CURRENT_RECORD_FORMAT)\n return yield* ThreadImportRejected.make({\n threadId,\n reason: \"unsupported-format\",\n message: `Only ${CURRENT_RECORD_FORMAT} can be imported`,\n });\n if (state.manifest !== undefined && !sameTransferManifest(state.manifest, archive))\n return yield* invalid(\"Transfer snapshot changed\", threadId);\n if (\n archive.fromSequence !== state.sequence + 1 ||\n (archive.cursor !== undefined && archive.cursor === state.cursor)\n )\n return yield* invalid(\"Transfer page position is invalid\", threadId);\n if (archive.records.length > 0 && transferSections.some((section) => state.counts[section] > 0))\n return yield* invalid(\"Canonical records follow immutable fact sections\", threadId);\n if (\n archive.admissions.length > 0 &&\n state.counts.aborts +\n state.counts.approvals +\n state.counts.resolutions +\n state.counts.deliveries >\n 0\n )\n return yield* invalid(\"Admissions follow accepted command sections\", threadId);\n const records: Array<CanonicalRecordEnvelope> = [];\n const prepared: Array<PreparedImportBatch> = [];\n let index = 0;\n\n for (const batch of archive.batches) {\n const current: Array<RecordEnvelope> = [];\n const encoded: Array<RecordJson> = [];\n const firstSequence = sequence(state.sequence + 1);\n\n while (archive.records[index]?.batchId === batch.batchId) {\n const entry = archive.records[index]!;\n\n if (entry.threadId !== threadId || entry.sequence !== state.sequence + 1)\n return yield* invalid(\"Canonical identity or sequence mismatch\", threadId);\n\n const record = yield* decodeExportRecord(archive.format, entry.record).pipe(\n Effect.mapError((e) => invalid(e.message, threadId)),\n );\n\n if (record.payload._tag === \"RunContinuation\")\n return yield* invalid(\"Mutable interpreter progress is not canonical history\", threadId);\n\n records.push(CanonicalRecordEnvelope.make({ ...entry, record }));\n current.push(record);\n encoded.push(entry.record);\n index++;\n state.sequence++;\n }\n\n const canonical = yield* Schema.decodeUnknownEffect(\n Schema.toType(Schema.Struct(CanonicalBatch.fields)),\n )({ ...batch, records: current }).pipe(\n Effect.mapError(() => invalid(\"Empty or oversized canonical batch\", threadId)),\n Effect.map((value) => CanonicalBatch.make(value)),\n );\n\n const batchJson = canonicalJson({ ...batch, records: encoded });\n\n if (utf8ByteLength(batchJson) > 16 * 1024 * 1024)\n return yield* invalid(\"Canonical batch exceeds 16 MiB\", threadId);\n prepared.push({\n batch: canonical,\n batchJson,\n recordJson: encoded.map(canonicalJson),\n firstSequence,\n lastSequence: sequence(state.sequence),\n });\n }\n if (index !== archive.records.length || state.sequence > archive.tailSequence)\n return yield* invalid(\n \"Unbound canonical records or records beyond the captured tail\",\n threadId,\n );\n if (\n archive.admissions.length +\n archive.commands.aborts.length +\n archive.commands.approvals.length +\n archive.commands.resolutions.length +\n archive.deliveries.length >\n 0 &&\n state.sequence !== archive.tailSequence\n )\n return yield* invalid(\"Immutable sections precede the complete canonical prefix\", threadId);\n if (\n archive.commands.aborts.length +\n archive.commands.approvals.length +\n archive.commands.resolutions.length >\n 0 &&\n state.counts.admissions + archive.admissions.length !== archive.snapshot.admissions\n )\n return yield* invalid(\"Accepted commands precede the complete admission directory\", threadId);\n\n const sectionLength = (section: (typeof transferSections)[number]) =>\n section === \"admissions\"\n ? archive.admissions.length\n : section === \"deliveries\"\n ? archive.deliveries.length\n : archive.commands[section].length;\n\n for (let index = 0; index < transferSections.length; index++) {\n const section = transferSections[index]!;\n\n if (sectionLength(section) === 0) continue;\n if (\n transferSections\n .slice(0, index)\n .some((prior) => state.counts[prior] + sectionLength(prior) !== archive.snapshot[prior]) ||\n transferSections.slice(index + 1).some((later) => state.counts[later] !== 0)\n )\n return yield* invalid(\"Transfer fact sections are out of order\", threadId);\n }\n const required = transferDependencies(records);\n\n if (canonicalJson(required) !== canonicalJson([...archive.dependencies].sort()))\n return yield* invalid(\"Cross-range dependency directory is incomplete or ambiguous\", threadId);\n for (const section of transferSections) {\n state.counts[section] += sectionLength(section);\n if (state.counts[section] > archive.snapshot[section])\n return yield* invalid(`Too many ${section} facts`, threadId);\n }\n for (const admission of archive.admissions) {\n if (!options?.verification && admission.settledAt === undefined)\n return yield* invalid(\n \"Closed admission is missing its stable settlement timestamp\",\n threadId,\n );\n if (\n admission.threadId !== threadId ||\n (yield* digest(admission.inputPayload)) !== admission.inputDigest\n )\n return yield* invalid(\"Admission identity or input digest mismatch\", threadId);\n }\n for (const delivery of archive.deliveries) {\n const encoded = yield* Schema.encodeEffect(MessageDeliveryRecord)(delivery).pipe(\n Effect.mapError(() => invalid(\"Invalid delivery fact\", threadId)),\n );\n\n if (\n delivery.key.ownerThreadId !== threadId ||\n (!options?.verification &&\n (delivery.leaseUntilMillis !== null ||\n ![\"processed\", \"refused\"].includes(delivery.status))) ||\n (yield* digest(encoded.envelope)) !== delivery.envelopeDigest\n )\n return yield* invalid(\"Delivery ownership, lease or envelope digest mismatch\", threadId);\n }\n state.manifest = {\n ...archive,\n records: [],\n batches: [],\n admissions: [],\n commands: { aborts: [], approvals: [], resolutions: [] },\n deliveries: [],\n dependencies: [],\n };\n state.cursor = archive.cursor;\n state.ended = archive.cursor === undefined;\n\n return { archive, records, batches: prepared } satisfies PreparedImportPage;\n});\n\nexport const finishThreadImport = (state: ThreadImportProgress) =>\n Effect.gen(function* () {\n const page = state.manifest;\n\n if (\n page === undefined ||\n !state.ended ||\n state.sequence !== page.tailSequence ||\n transferSections.some((section) => state.counts[section] !== page.snapshot[section])\n )\n return yield* invalid(\n \"Transfer stream ended before its complete canonical sequence and fact sections\",\n );\n\n return ThreadImportResult.make({\n threadId: page.threadId,\n format: page.format,\n tailSequence: page.tailSequence,\n recordCount: state.sequence,\n submissionCount: state.counts.admissions,\n });\n });\n\n/** An executed receipt must settle strictly after its own input. FIFO inputs are checked in one pass. */\nexport const verifyImportedInputOrder = Effect.fnUntraced(function* (\n admission: Pick<ThreadAdmission, \"threadId\" | \"submissionId\" | \"queueSequence\">,\n) {\n const reader = yield* ThreadImportReader;\n const settlement = yield* reader.record(submissionSettlementRecordId(admission.submissionId));\n\n if (settlement === undefined) return;\n const applied = yield* reader.record(submissionInputRecordId(admission.submissionId));\n const payload = settlement.record.payload;\n\n if (\n applied === undefined &&\n payload._tag === \"SubmissionSettled\" &&\n payload.outcome === \"aborted\"\n )\n return;\n if (applied === undefined || applied.sequence >= settlement.sequence)\n return yield* invalid(\n \"Executed settlement has no preceding canonical input\",\n admission.threadId,\n );\n});\n\n/** Rebuild ONE admitted submission from exact staged evidence; terminal state does not erase uncertainty. */\nexport const rebuildImportedSubmission = Effect.fnUntraced(function* (admission: ThreadAdmission) {\n const reader = yield* ThreadImportReader;\n const threadId = admission.threadId;\n const inputEntry = yield* reader.record(submissionInputRecordId(admission.submissionId));\n const payload = inputEntry?.record.payload;\n\n if (\n inputEntry !== undefined &&\n (payload?._tag !== \"UserInputRecorded\" ||\n payload.submissionId !== admission.submissionId ||\n (payload.kind !== \"user\" && payload.kind !== \"steering\") ||\n (payload.messageAdmission === undefined\n ? admission.messageAdmission !== undefined\n : admission.messageAdmission === undefined ||\n !sameInputMessage(payload.messageAdmission, admission.messageAdmission)) ||\n canonicalJson(payload.input) !== canonicalJson(admission.inputPayload))\n )\n return yield* invalid(\"Canonical input disagrees with its immutable admission\", threadId);\n const runId = payload?._tag === \"UserInputRecorded\" ? payload.runId : undefined;\n const host = runId === undefined ? undefined : yield* reader.runOwner(runId);\n\n if (inputEntry !== undefined && host === undefined)\n return yield* invalid(\"Canonical Run has no admitted owner\", threadId);\n\n const joined =\n host !== undefined && host.submissionId !== admission.submissionId\n ? host.submissionId\n : undefined;\n\n if (\n payload?._tag === \"UserInputRecorded\" &&\n payload.kind !== (joined === undefined ? \"user\" : \"steering\")\n )\n return yield* invalid(\"Canonical input kind disagrees with its admitted Run owner\", threadId);\n\n if (joined !== undefined && host !== undefined && host.queueSequence >= admission.queueSequence)\n return yield* invalid(\"Joined input precedes its host admission\", threadId);\n\n const settlement = (yield* reader.record(submissionSettlementRecordId(admission.submissionId)))\n ?.record;\n\n if (settlement !== undefined) {\n yield* validateCanonicalSettlement(settlement, admission).pipe(\n Effect.mapError(() => invalid(\"Canonical settlement disagrees with its receipt\", threadId)),\n );\n if (settlement.payload._tag !== \"SubmissionSettled\" || settlement.payload.runId !== runId)\n return yield* invalid(\"Settlement Run does not own its canonical input\", threadId);\n if (joined !== undefined) {\n const hostSettlement = (yield* reader.record(submissionSettlementRecordId(joined)))?.record\n .payload;\n\n if (hostSettlement?._tag !== \"SubmissionSettled\")\n return yield* invalid(\"Joined settlement has no host settlement\", threadId);\n yield* validateJoinedSettlement(settlement.payload, hostSettlement).pipe(\n Effect.mapError(() => invalid(\"Joined settlement conflicts with its host\", threadId)),\n );\n }\n }\n const ownRun = runIdForSubmission(admission.submissionId);\n\n const runRecords = yield* reader.runRecords(ownRun);\n\n if (inputEntry === undefined && runRecords.some(({ record }) => !isPreContinuationFact(record)))\n return yield* invalid(\"Admitted Run executed without its original canonical input\", threadId);\n const operations = toolOperationStates(runRecords, ownRun);\n const operationCounts = new Map<ToolCallId, number>();\n\n for (const state of operations)\n operationCounts.set(\n state.operation.toolCallId,\n (operationCounts.get(state.operation.toolCallId) ?? 0) + 1,\n );\n const toolRecords = new Map<ToolCallId, Array<CanonicalRecordEnvelope>>();\n\n for (const entry of runRecords) {\n const payload = entry.record.payload;\n\n if (!(\"toolCallId\" in payload)) continue;\n const entries = toolRecords.get(payload.toolCallId) ?? [];\n\n entries.push(entry);\n toolRecords.set(payload.toolCallId, entries);\n }\n const commands = yield* reader.commands(admission.submissionId);\n const approvals = commands.approvals.map((intent) => ApprovalDecisionIntent.make(intent));\n const resolutions = commands.resolutions.map((intent) => UnknownResolutionIntent.make(intent));\n const acceptedAbort = commands.aborts[0];\n\n if (commands.aborts.length > 1) return yield* invalid(\"Duplicate accepted abort\", threadId);\n const canonicalAbort = yield* reader.record(submissionAbortRecordId(admission.submissionId));\n\n if (canonicalAbort !== undefined && acceptedAbort === undefined)\n return yield* invalid(\"Canonical abort has no immutable accepted command\", threadId);\n\n const abort =\n canonicalAbort?.record.payload._tag === \"AbortRequested\"\n ? AbortIntent.make({\n ...canonicalAbort.record.payload,\n requestedAt: acceptedAbort?.requestedAt ?? canonicalAbort.record.createdAt,\n canonicalRecordId: canonicalAbort.record.recordId,\n })\n : acceptedAbort === undefined\n ? undefined\n : AbortIntent.make(acceptedAbort);\n\n if (\n acceptedAbort !== undefined &&\n abort !== undefined &&\n (acceptedAbort.author !== abort.author || acceptedAbort.reason !== abort.reason)\n )\n return yield* invalid(\"Accepted abort conflicts with the canonical command\", threadId);\n for (const command of [...approvals, ...resolutions]) {\n if (operationCounts.get(command.toolCallId) !== 1)\n return yield* invalid(\n \"Accepted tool command has no unambiguous canonical declaration\",\n threadId,\n );\n }\n for (const command of approvals) {\n const requested = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalRequested\" && payload.toolCallId === command.toolCallId,\n );\n\n const decided = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" && payload.toolCallId === command.toolCallId,\n );\n\n if (\n requested.length !== 1 ||\n decided.length > 1 ||\n decided.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" &&\n (payload.decision !== command.decision ||\n payload.resolver !== command.resolver ||\n payload.reason !== command.reason),\n )\n )\n return yield* invalid(\n \"Accepted approval conflicts with its canonical request or decision\",\n threadId,\n );\n }\n for (const command of resolutions) {\n if (command.resolution._tag === \"AbortSubmission\" && abort === undefined)\n return yield* invalid(\n \"AbortSubmission resolution has no accepted or canonical abort\",\n threadId,\n );\n\n const resolved = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallResolved\" &&\n payload.toolCallId === command.toolCallId &&\n (payload.resolution === \"safe-retry\" ? \"execution\" : \"factual\") ===\n unknownResolutionKind(command.resolution),\n );\n\n const expected =\n command.resolution._tag === \"CompletedWithResult\"\n ? command.resolution.isFailure\n ? \"failed-with-error\"\n : \"completed-with-result\"\n : command.resolution._tag === \"NeverHappened\"\n ? \"never-started\"\n : command.resolution._tag === \"SafeToRetry\"\n ? \"safe-retry\"\n : undefined;\n\n if (\n resolved.length > 1 ||\n resolved.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallResolved\" &&\n (payload.resolution !== expected ||\n payload.author !== command.author ||\n payload.reason !== command.reason),\n )\n )\n return yield* invalid(\"Accepted resolution conflicts with its canonical audit\", threadId);\n if (command.resolution._tag === \"CompletedWithResult\") {\n const result = command.resolution;\n\n const outcomes = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallSettled\" && payload.toolCallId === command.toolCallId,\n );\n\n if (\n outcomes.length > 1 ||\n outcomes.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallSettled\" &&\n (payload.isFailure !== result.isFailure ||\n canonicalJson(payload.result) !== canonicalJson(result.result)),\n )\n )\n return yield* invalid(\n \"Accepted resolution conflicts with the canonical tool result\",\n threadId,\n );\n }\n }\n\n const unknown = operations\n .filter(\n (state) =>\n !state.settled &&\n !state.resolved &&\n (state.unknown ||\n (!state.dispatchBlocked &&\n state.operation.executionKind === \"ordinary\" &&\n state.operation.executionClass !== \"readonly\")),\n )\n .map((state) => state.operation.toolCallId);\n\n const acceptedApprovals = new Set(approvals.map((intent) => intent.toolCallId));\n\n const pendingApprovals = runRecords\n .filter(({ record: { payload } }) => payload._tag === \"ToolApprovalRequested\")\n .flatMap(({ record }) => {\n if (record.payload._tag !== \"ToolApprovalRequested\") return [];\n const id = record.payload.toolCallId;\n\n return acceptedApprovals.has(id) ||\n (toolRecords.get(id) ?? []).some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" && payload.toolCallId === id,\n )\n ? []\n : [id];\n });\n\n const suspension =\n pendingApprovals.length === 0\n ? undefined\n : SuspensionSnapshot.make({\n reason: ApprovalPendingSuspension.make({\n toolCallIds: [pendingApprovals[0], ...pendingApprovals.slice(1)],\n }),\n suspendedAt: runRecords.at(-1)?.record.createdAt ?? admission.createdAt,\n });\n\n // An admitted input need not have reached the log. Its immutable fact is the work;\n // recovery materializes an admitted Thread before it becomes ready.\n const state =\n settlement !== undefined\n ? \"settled\"\n : joined !== undefined\n ? \"joined\"\n : unknown.length > 0\n ? \"unknown\"\n : suspension !== undefined\n ? \"suspended\"\n : inputEntry !== undefined\n ? \"input-applied\"\n : (yield* reader.hasAgent(admission.agentId))\n ? \"ready\"\n : \"admitted\";\n\n return RebuiltSubmission.make({\n admission,\n state,\n ...(inputEntry === undefined\n ? {}\n : {\n inputApplied: InputAppliedMarker.make({\n recordId: inputEntry.record.recordId,\n sequence: inputEntry.sequence,\n }),\n }),\n ...(joined === undefined ? {} : { joinedHostSubmissionId: joined }),\n ...(settlement === undefined ? {} : { settlement }),\n ...(state !== \"suspended\" || suspension === undefined ? {} : { suspension }),\n unknownToolCallIds: unknown,\n ...(abort === undefined ? {} : { abort }),\n approvals,\n resolutions,\n });\n});\n\n/** Immediate persistent history has no ledger/checkpoint owner, but still needs a terminal Run fact. */\nexport const validateClosedRun = Effect.fnUntraced(function* (threadId: ThreadId, runId: RunId) {\n const reader = yield* ThreadImportReader;\n const records = yield* reader.runRecords(runId);\n\n const opened = records.some(\n ({ record: { payload } }) =>\n (payload._tag === \"UserInputRecorded\" ||\n payload._tag === \"RunStarted\" ||\n payload._tag === \"ModelResponseRecorded\") &&\n payload.runId === runId,\n );\n\n const closed = records.some(\n ({ record: { payload } }) =>\n (payload._tag === \"RunCompleted\" ||\n payload._tag === \"RunFailed\" ||\n payload._tag === \"SubmissionSettled\") &&\n payload.runId === runId,\n );\n\n if (opened && !closed) return yield* invalid(\"Transfer contains an unfinished Run\", threadId);\n});\n\n/** Idle transfer keeps closed receipts, never the authority to finish their former work. */\nexport const rebuildClosedSubmission = Effect.fnUntraced(function* (admission: ThreadAdmission) {\n if (admission.settledAt === undefined)\n return yield* invalid(\n \"Closed admission is missing its stable settlement timestamp\",\n admission.threadId,\n );\n const rebuilt = yield* rebuildImportedSubmission(admission);\n const reader = yield* ThreadImportReader;\n\n if (\n rebuilt.state !== \"settled\" ||\n rebuilt.unknownToolCallIds.length > 0 ||\n rebuilt.suspension !== undefined\n )\n return yield* invalid(\"Transfer contains unfinished accepted work\", admission.threadId);\n if (rebuilt.abort !== undefined && rebuilt.abort.canonicalRecordId === undefined)\n return yield* invalid(\"Transfer contains an unapplied abort\", admission.threadId);\n const records = yield* reader.runRecords(runIdForSubmission(admission.submissionId));\n\n const decidedApprovals = new Set(\n records.flatMap(({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" ? [payload.toolCallId] : [],\n ),\n );\n\n if (\n records.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalRequested\" && !decidedApprovals.has(payload.toolCallId),\n )\n )\n return yield* invalid(\"Transfer contains an unresolved approval\", admission.threadId);\n for (const approval of rebuilt.approvals)\n if (\n !records.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" && payload.toolCallId === approval.toolCallId,\n )\n )\n return yield* invalid(\"Transfer contains an unapplied approval\", admission.threadId);\n for (const resolution of rebuilt.resolutions)\n if (\n resolution.resolution._tag !== \"AbortSubmission\" &&\n !records.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallResolved\" &&\n payload.toolCallId === resolution.toolCallId &&\n (payload.resolution === \"safe-retry\" ? \"execution\" : \"factual\") ===\n unknownResolutionKind(resolution.resolution),\n )\n )\n return yield* invalid(\"Transfer contains an unapplied resolution\", admission.threadId);\n yield* verifyImportedInputOrder(admission);\n\n return rebuilt;\n});\n\n/** Encode one page at a time and retain upstream stream errors and requirements. */\nexport const reencodeThread = Effect.fnUntraced(function* <E, R>(\n source: Stream.Stream<ThreadExport, E, R>,\n) {\n const target = yield* ThreadImport;\n\n return yield* target.import(\n source.pipe(\n Stream.mapEffect((page) =>\n Schema.encodeEffect(ThreadExport)(page).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(ThreadArchive)),\n Effect.mapError(() => invalid(\"Unable to encode source page\", page.threadId)),\n ),\n ),\n ),\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThreadImport-DckUMEqJ.mjs","names":[],"sources":["../src/durable/internal/thread-import-reader.ts","../src/durable/ThreadImport.ts"],"sourcesContent":["import { Context, type Effect, Layer, type Stream } from \"effect\";\n\nimport type { AgentId, RunId, SubmissionId, ThreadId } from \"../../core/Identifiers.ts\";\nimport type { IdempotencyKey } from \"../../core/Receipt.ts\";\nimport type { MessageDeliveryRecord } from \"../MessageDelivery.ts\";\nimport type { CanonicalRecordEnvelope, RecordEnvelope, RecordId } from \"../Records.ts\";\nimport type {\n ThreadAdmission,\n ThreadCommands,\n ThreadReadRequest,\n ThreadStoreError,\n ExecutionCheckpoint,\n} from \"../ThreadStore.ts\";\nimport { RunContextReader } from \"./run-context-reader.ts\";\n\n/** Exact indexes for one captured Thread transaction. Run records and commands enforce count and byte bounds. */\nexport class ThreadImportReader extends Context.Service<\n ThreadImportReader,\n {\n /** Full canonical history in this same snapshot, including archived facts. */\n readonly read: (\n request: ThreadReadRequest,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError>;\n readonly delivery: (\n messageId: IdempotencyKey,\n ) => Effect.Effect<MessageDeliveryRecord | undefined, ThreadStoreError>;\n readonly record: (\n id: RecordId,\n ) => Effect.Effect<CanonicalRecordEnvelope | undefined, ThreadStoreError>;\n readonly admission: (\n id: SubmissionId,\n ) => Effect.Effect<ThreadAdmission | undefined, ThreadStoreError>;\n readonly runOwner: (id: RunId) => Effect.Effect<ThreadAdmission | undefined, ThreadStoreError>;\n readonly runRecords: (\n id: RunId,\n ) => Effect.Effect<ReadonlyArray<CanonicalRecordEnvelope>, ThreadStoreError>;\n readonly execution: (\n id: RunId,\n ) => Effect.Effect<ExecutionCheckpoint | undefined, ThreadStoreError>;\n readonly commands: (\n id: SubmissionId,\n ) => Effect.Effect<typeof ThreadCommands.Type, ThreadStoreError>;\n readonly hasAgent: (id: AgentId) => Effect.Effect<boolean, ThreadStoreError>;\n }\n>()(\"@effect-agent/thread/ThreadImportReader\") {\n /** Bind context reconstruction to this same captured transaction. */\n static layer(reader: ThreadImportReader[\"Service\"]) {\n return Layer.succeedContext(\n Context.make(ThreadImportReader, reader).pipe(\n Context.add(RunContextReader, {\n record: reader.record,\n read: (request) =>\n reader.read({\n threadId: request.threadId,\n selection: { _tag: \"PromptEvidence\", throughSequence: request.throughSequence },\n page: {\n limit: request.limit,\n ...(request.afterSequence === undefined\n ? {}\n : { afterSequence: request.afterSequence }),\n },\n }),\n }),\n ),\n );\n }\n}\n\n/** Delivery evidence reads: the importing Thread uses staged facts; foreign Threads use retained facts. */\nexport class ThreadDeliveryImportReader extends Context.Service<\n ThreadDeliveryImportReader,\n {\n readonly admission: (\n threadId: ThreadId,\n submissionId: SubmissionId,\n ) => Effect.Effect<ThreadAdmission | undefined, ThreadStoreError>;\n readonly record: (\n threadId: ThreadId,\n recordId: RecordId,\n ) => Effect.Effect<RecordEnvelope | undefined, ThreadStoreError>;\n }\n>()(\"@effect-agent/thread/ThreadDeliveryImportReader\") {}\n","import { Context, Effect, Pull, Schema, Stream, type Scope } from \"effect\";\n\nimport { InputMessage } from \"../capabilities/Messaging.ts\";\nimport type { RunId } from \"../core/Identifiers.ts\";\nimport { SubmissionId, ThreadId, ToolCallId } from \"../core/Identifiers.ts\";\nimport { WorkerRef } from \"../core/Worker.ts\";\nimport { canonicalJson, digestJson, utf8ByteLength } from \"./Digest.ts\";\nimport { readRunContext, validateContextBoundary } from \"./internal/run-context.ts\";\nimport { ThreadImportReader } from \"./internal/thread-import-reader.ts\";\nimport { ImportSourcePhase } from \"./internal/thread-transfer-source.ts\";\nimport { toolOperationStates } from \"./internal/tool-operations.ts\";\nimport { MessageDeliveryRecord } from \"./MessageDelivery.ts\";\nimport { decodeExportRecord } from \"./RecordFormat.ts\";\nimport {\n CanonicalBatch,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n CURRENT_RECORD_FORMAT,\n RecordEnvelope,\n RecordJson,\n SubtreeBudgetReserved,\n} from \"./Records.ts\";\nimport {\n executionRunIds,\n isOperationalRecord,\n isPreContinuationFact,\n validateSuffix,\n} from \"./RunContinuation.ts\";\nimport { runIdForSubmission } from \"./RunJournal.ts\";\nimport { validateCanonicalSettlement, validateJoinedSettlement } from \"./SettlementPublisher.ts\";\nimport {\n AbortIntent,\n ApprovalDecisionIntent,\n ApprovalPendingSuspension,\n InputAppliedMarker,\n SubmissionState,\n SuspensionSnapshot,\n UnknownResolutionIntent,\n unknownResolutionKind,\n submissionInputRecordId,\n submissionSettlementRecordId,\n submissionAbortRecordId,\n} from \"./SubmissionLedger.ts\";\nimport {\n type ExecutionCheckpoint,\n MAX_THREAD_EXPORT_PAGE_BYTES,\n MAX_THREAD_EXPORT_PAGE_RECORDS,\n ThreadAdmission,\n ThreadExport,\n ThreadAbortFact,\n ThreadApprovalFact,\n ThreadResolutionFact,\n makeTransferFactCheck,\n transferPageFits,\n type ThreadStoreError,\n} from \"./ThreadStore.ts\";\nimport { transferDependencies, sameTransferManifest, transferSections } from \"./ThreadTransfer.ts\";\nimport { workIndexChanges } from \"./ThreadWork.ts\";\n\nexport { ThreadImportReader, ThreadDeliveryImportReader } from \"./internal/thread-import-reader.ts\";\n\nconst sameInputMessage = Schema.toEquivalence(InputMessage);\n\n/** One owned wire page. Canonical batches precede admissions; all admissions precede accepted commands.\n * Every fact section is required, including empty sections. This order permits indexed atomic staging. */\nexport const ThreadArchive = Schema.Struct({\n ...ThreadExport.fields,\n records: Schema.Array(\n Schema.Struct({ ...CanonicalRecordEnvelope.fields, record: RecordJson }),\n ).check(Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS)),\n});\n\nexport type ThreadArchive = typeof ThreadArchive.Type;\n\nconst admissionFitsTransfer = makeTransferFactCheck(ThreadAdmission);\nconst abortFitsTransfer = makeTransferFactCheck(ThreadAbortFact);\nconst approvalFitsTransfer = makeTransferFactCheck(ThreadApprovalFact);\nconst resolutionFitsTransfer = makeTransferFactCheck(ThreadResolutionFact);\nconst deliveryFitsTransfer = makeTransferFactCheck(MessageDeliveryRecord);\n\nexport class ThreadImportResult extends Schema.Class<ThreadImportResult>(\n \"@effect-agent/thread/ThreadImportResult\",\n)({\n threadId: ThreadId,\n format: Schema.String,\n tailSequence: CanonicalSequence,\n recordCount: Schema.Natural,\n submissionCount: Schema.Natural,\n}) {}\n\nexport class ThreadImportRejected extends Schema.TaggedError<ThreadImportRejected>()(\n \"ThreadImportRejected\",\n {\n threadId: Schema.optionalKey(ThreadId),\n reason: Schema.Literals([\n \"unsupported-format\",\n \"invalid-archive\",\n \"target-not-empty\",\n \"unsupported-obligations\",\n \"destination-conflict\",\n \"admission-policy-conflict\",\n \"admission-policy-unavailable\",\n \"unsupported-capacity\",\n ]),\n message: Schema.String,\n },\n) {}\n\n/** One owner transaction consumes the stream; E and R are preserved, including rollback on interruption. */\nexport class ThreadImport extends Context.Service<\n ThreadImport,\n {\n readonly import: <E, R>(\n pages: Stream.Stream<ThreadArchive, E, R>,\n ) => Effect.Effect<ThreadImportResult, E | ThreadImportRejected | ThreadStoreError, R>;\n }\n>()(\"@effect-agent/thread/ThreadImport\") {}\n\nexport class RebuiltSubmission extends Schema.Class<RebuiltSubmission>(\n \"@effect-agent/thread/RebuiltSubmission\",\n)({\n admission: ThreadAdmission,\n state: SubmissionState,\n inputApplied: Schema.optionalKey(InputAppliedMarker),\n joinedHostSubmissionId: Schema.optionalKey(SubmissionId),\n settlement: Schema.optionalKey(RecordEnvelope),\n suspension: Schema.optionalKey(SuspensionSnapshot),\n unknownToolCallIds: Schema.Array(ToolCallId),\n abort: Schema.optionalKey(AbortIntent),\n approvals: Schema.Array(ApprovalDecisionIntent),\n resolutions: Schema.Array(UnknownResolutionIntent),\n}) {}\n\nexport interface PreparedImportBatch {\n readonly batch: CanonicalBatch;\n readonly batchJson: string;\n readonly recordJson: ReadonlyArray<string>;\n readonly firstSequence: CanonicalSequence;\n readonly lastSequence: CanonicalSequence;\n}\n\nexport interface PreparedImportPage {\n readonly archive: ThreadArchive;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n readonly batches: ReadonlyArray<PreparedImportBatch>;\n}\n\n/** Resolve every declared immutable reference, even in a preparation without a continuation. */\nexport const verifyImportedReferences = Effect.fnUntraced(function* (\n entry: CanonicalRecordEnvelope,\n) {\n const reader = yield* ThreadImportReader;\n const resolve = reader.record;\n const payload = entry.record.payload;\n\n if (payload._tag === \"WorkHandoffCompleted\") {\n const preparation = yield* resolve(payload.preparationId);\n\n if (\n preparation === undefined ||\n preparation.threadId !== entry.threadId ||\n preparation.sequence >= entry.sequence ||\n entry.record.recordId !== `work-handoff-completed:${payload.preparationId}`\n )\n return yield* invalid(\"Missing or ambiguous handoff preparation\", entry.threadId);\n const changes = yield* workIndexChanges(preparation, \"none\");\n\n if (\n !changes.some(\n (change) =>\n change._tag === \"Put\" &&\n change.entry.owner._tag === \"Handoff\" &&\n change.entry.id === payload.ownerId,\n )\n )\n return yield* invalid(\n \"Handoff closure does not identify its preparation's exact owner\",\n entry.threadId,\n );\n }\n\n if (payload._tag === \"RunContextRecorded\") {\n const owner = yield* reader.runOwner(payload.runId);\n\n const original =\n owner === undefined ? undefined : yield* resolve(submissionInputRecordId(owner.submissionId));\n\n if (\n original === undefined ||\n original.threadId !== entry.threadId ||\n original.sequence >= entry.sequence\n )\n return yield* invalid(\"Saved context has no original admitted input\", entry.threadId);\n yield* validateContextBoundary(payload, original).pipe(\n Effect.mapError((error) => invalid(error.message, entry.threadId)),\n );\n }\n\n const references =\n payload._tag === \"WorkerInputRefused\"\n ? [payload.reservation, payload.stop]\n : payload._tag === \"RunContextRecorded\"\n ? payload.retained\n : payload._tag === \"RunContinuation\"\n ? [\n payload.originalInput,\n payload.savedContext,\n payload.latestResponse,\n payload.terminal,\n payload.lastFact,\n ].filter((ref) => ref !== undefined)\n : [];\n\n for (const ref of references) {\n const evidence = yield* resolve(ref.recordId);\n\n if (\n evidence === undefined ||\n evidence.threadId !== entry.threadId ||\n evidence.sequence >= entry.sequence ||\n (\"sequence\" in ref && evidence.sequence !== ref.sequence)\n )\n return yield* invalid(\"Missing, foreign or forward canonical dependency\", entry.threadId);\n }\n if (payload._tag === \"WorkerInputRefused\") {\n const request = (yield* resolve(payload.reservation.recordId))!.record.payload;\n const stop = (yield* resolve(payload.stop.recordId))!.record.payload;\n const retained = yield* reader.delivery(payload.messageId);\n\n if (\n retained === undefined ||\n retained.key.ownerThreadId !== entry.threadId ||\n retained.key.messageId !== payload.messageId ||\n retained.status !== \"refused\" ||\n retained.receipt !== null ||\n retained.settlement !== null ||\n retained.version !== payload.deliveryVersion ||\n retained.envelopeDigest !== payload.envelopeDigest ||\n retained.envelope.threadId !== payload.workerThreadId ||\n retained.envelope.deliveryPrincipal !== payload.receiver.principal ||\n retained.envelope.admissionKey !== payload.receiver.idempotencyKey ||\n retained.envelope.inputDigest !== payload.receiver.inputDigest ||\n retained.envelope.workerAdmission === undefined ||\n retained.envelope.workerAdmission.messageId !== payload.messageId ||\n retained.envelope.workerAdmission.origin.source.threadId !== entry.threadId ||\n stop._tag !== \"WorkerStopRequested\" ||\n !Schema.toEquivalence(WorkerRef)(\n stop.command.worker,\n retained.envelope.workerAdmission.origin.worker,\n )\n )\n return yield* invalid(\n \"Worker refusal has no exact refused delivery and source stop proof\",\n entry.threadId,\n );\n if (request._tag === \"WorkerInputRequested\") {\n if (\n request.inputDigest !== retained.envelope.inputDigest ||\n !Schema.toEquivalence(MessageDeliveryRecord.fields.envelope.fields.workerAdmission)(\n request.admission,\n retained.envelope.workerAdmission,\n )\n )\n return yield* invalid(\n \"Worker refusal reservation differs from its exact request\",\n entry.threadId,\n );\n } else if (\n request._tag !== \"SubtreeBudgetReserved\" ||\n request.childThreadId !== payload.workerThreadId ||\n request.reservationId !== payload.messageId ||\n request.lifetime !== \"background\" ||\n request.executionRunId !== retained.envelope.workerAdmission.executionRunId ||\n request.sourceSubmissionId !== retained.envelope.workerAdmission.sourceSubmissionId ||\n request.depth !== retained.envelope.workerAdmission.origin.depth ||\n !Schema.toEquivalence(SubtreeBudgetReserved.fields.policy)(\n request.policy,\n retained.envelope.workerAdmission.origin.policy,\n ) ||\n !Schema.toEquivalence(SubtreeBudgetReserved.fields.grant)(\n request.grant,\n retained.envelope.workerAdmission.origin.grant,\n ) ||\n !Schema.toEquivalence(SubtreeBudgetReserved.fields.budget)(\n request.budget,\n retained.envelope.workerAdmission.origin.budget,\n )\n )\n return yield* invalid(\"Worker refusal has no exact source reservation\", entry.threadId);\n }\n});\n\nconst sequence = Schema.decodeSync(CanonicalSequence);\n\nconst digest = (value: Schema.Json) =>\n digestJson(value).pipe(Effect.mapError(() => invalid(\"Unable to digest imported facts\")));\n\nexport const invalidThreadArchive = (message: string, threadId?: ThreadId) =>\n ThreadImportRejected.make({\n reason: \"invalid-archive\",\n message,\n ...(threadId === undefined ? {} : { threadId }),\n });\n\nconst invalid = invalidThreadArchive;\n\n/** Validate authoritative active state against the same staged/captured history and admissions. */\nexport const validateImportedExecution = Effect.fnUntraced(function* (\n threadId: ThreadId,\n checkpoint: ExecutionCheckpoint,\n tailSequence: CanonicalSequence,\n) {\n const reader = yield* ThreadImportReader;\n const progress = checkpoint.progress;\n const admission = yield* reader.admission(progress.submissionId);\n\n const own = (yield* reader.runRecords(progress.runId)).filter((entry) =>\n executionRunIds(entry.record).includes(progress.runId),\n );\n\n const local = new Map(checkpoint.operational.map((record) => [record.recordId, record]));\n\n if (\n admission === undefined ||\n admission.threadId !== threadId ||\n runIdForSubmission(admission.submissionId) !== progress.runId ||\n checkpoint.progressRecord.recordId !==\n JSON.stringify([\"continuation@1\", progress.runId, checkpoint.batchId]) ||\n checkpoint.throughSequence > tailSequence ||\n checkpoint.originalSequence > checkpoint.throughSequence ||\n local.size !== checkpoint.operational.length ||\n checkpoint.operational.some(\n (record) => !isOperationalRecord(record) || !executionRunIds(record).includes(progress.runId),\n ) ||\n own.filter((entry) => entry.sequence <= checkpoint.throughSequence).length !==\n checkpoint.canonicalRecords ||\n !validateSuffix(own, checkpoint.throughSequence)\n )\n return yield* invalid(\n \"Active execution identity, revision or history boundary is invalid\",\n threadId,\n );\n for (const id of local.keys())\n if ((yield* reader.record(id)) !== undefined)\n return yield* invalid(\"Operational identity collides with retained history\", threadId);\n\n const resolve = Effect.fnUntraced(function* (ref: typeof progress.originalInput) {\n const retained = yield* reader.record(ref.recordId);\n const record = local.get(ref.recordId) ?? retained?.record;\n\n if (\n record === undefined ||\n (retained !== undefined &&\n (retained.threadId !== threadId || retained.sequence > checkpoint.throughSequence)) ||\n !executionRunIds(record).includes(progress.runId)\n )\n return yield* invalid(\"Active execution reference is missing, foreign or corrupt\", threadId);\n\n return record;\n });\n\n const original = yield* reader.record(progress.originalInput.recordId);\n const input = (yield* resolve(progress.originalInput)).payload;\n\n if (\n original === undefined ||\n original.sequence !== checkpoint.originalSequence ||\n input._tag !== \"UserInputRecorded\" ||\n input.kind !== \"user\" ||\n input.runId !== progress.runId ||\n input.submissionId !== progress.submissionId\n )\n return yield* invalid(\"Active execution has no exact original admitted input\", threadId);\n yield* resolve(progress.lastFact);\n if (progress.savedContext !== undefined) {\n const context = yield* resolve(progress.savedContext);\n\n if (context.payload._tag !== \"RunContextRecorded\" || !local.has(context.recordId))\n return yield* invalid(\"Saved context is not owned active state\", threadId);\n yield* validateContextBoundary(context.payload, original).pipe(\n Effect.mapError((cause) => invalid(cause.message, threadId)),\n );\n yield* readRunContext(context.payload, original, progress.savedContext.recordId).pipe(\n Effect.mapError((cause) => invalid(cause.message, threadId)),\n );\n }\n if (progress.latestResponse !== undefined) {\n const response = (yield* resolve(progress.latestResponse)).payload;\n\n if (\n response._tag !== \"ModelResponseRecorded\" ||\n response.turn !== progress.accounting.committedTurns ||\n progress.savedContext === undefined\n )\n return yield* invalid(\"Active execution has invalid declared operation evidence\", threadId);\n } else if (progress.accounting.committedTurns !== 0)\n return yield* invalid(\"Active accounting has no corresponding response\", threadId);\n if (progress.terminal !== undefined) {\n const terminal = (yield* resolve(progress.terminal)).payload;\n\n if (\n terminal._tag !== \"RunCompleted\" &&\n terminal._tag !== \"RunFailed\" &&\n terminal._tag !== \"SubmissionSettled\"\n )\n return yield* invalid(\"Active execution has invalid terminal intent\", threadId);\n if (progress.position === \"settled\" && terminal._tag !== \"SubmissionSettled\")\n return yield* invalid(\"Settled active state has no canonical terminal outcome\", threadId);\n }\n});\n\n/** An executed unfinished Run cannot be imported without its authoritative operational owner. */\nexport const validateImportedRunExecution = Effect.fnUntraced(function* (\n threadId: ThreadId,\n runId: RunId,\n tailSequence: CanonicalSequence,\n) {\n const reader = yield* ThreadImportReader;\n const checkpoint = yield* reader.execution(runId);\n\n if (checkpoint !== undefined)\n return yield* validateImportedExecution(threadId, checkpoint, tailSequence);\n const records = yield* reader.runRecords(runId);\n\n if (\n records.some(\n ({ record }) =>\n record.payload._tag === \"UserInputRecorded\" &&\n record.payload.kind === \"user\" &&\n record.payload.submissionId !== undefined,\n ) &&\n !records.some(\n ({ record }) => record.payload._tag === \"SubmissionSettled\" && record.payload.runId === runId,\n ) &&\n records.some(({ record }) => !isPreContinuationFact(record))\n )\n return yield* invalid(\"Unfinished execution is missing its authoritative checkpoint\", threadId);\n});\n\n/** Own the first page before entering a destination gate; reuse the same scoped source pull. */\nexport const captureImportSource = <E, R, A, E2, R2>(\n pages: Stream.Stream<ThreadArchive, E, R>,\n use: (captured: Stream.Stream<ThreadArchive, E, R>) => Effect.Effect<A, E2, R2>,\n): Effect.Effect<A, E | E2 | ThreadImportRejected, Exclude<R | R2, Scope.Scope>> =>\n Effect.scoped(\n Effect.suspend(() => {\n const phase = { writing: false };\n\n return Effect.gen(function* () {\n const pull = yield* Stream.toPull(Stream.rechunk(pages, 1));\n\n const first = yield* Pull.catchDone(pull, () =>\n Effect.fail(invalid(\"Missing transfer pages\")),\n );\n\n const codec = Schema.fromJsonString(ThreadArchive);\n\n const wire = yield* Schema.encodeEffect(codec)(first[0]).pipe(\n Effect.mapError((cause) => invalid(`Malformed first transfer page: ${cause.message}`)),\n );\n\n if (utf8ByteLength(wire) > MAX_THREAD_EXPORT_PAGE_BYTES)\n return yield* invalid(\"Transfer page exceeds 32 MiB\");\n\n const owned = yield* Schema.decodeEffect(codec)(wire).pipe(\n Effect.mapError((cause) => invalid(`Malformed first transfer page: ${cause.message}`)),\n );\n\n phase.writing = true;\n\n return yield* use(\n Stream.succeed(owned).pipe(Stream.concat(Stream.fromPull(Effect.succeed(pull)))),\n );\n }).pipe(Effect.provideService(ImportSourcePhase, phase));\n }),\n );\n\n/** Constant-size fold state; identity uniqueness belongs to staged destination indexes. */\nexport interface ThreadImportProgress {\n manifest: ThreadArchive | undefined;\n sequence: number;\n ended: boolean;\n cursor: string | undefined;\n counts: {\n admissions: number;\n aborts: number;\n approvals: number;\n resolutions: number;\n deliveries: number;\n };\n}\n\nexport const makeThreadImportProgress = (): ThreadImportProgress => ({\n manifest: undefined,\n sequence: 0,\n ended: false,\n cursor: undefined,\n counts: { admissions: 0, aborts: 0, approvals: 0, resolutions: 0, deliveries: 0 },\n});\n\n/** Capture before awaiting any writes; the retained manifest never retains page payload arrays. */\nexport const prepareImportPage = Effect.fnUntraced(function* (\n state: ThreadImportProgress,\n input: ThreadArchive,\n options?: { readonly verification?: boolean },\n) {\n const codec = Schema.fromJsonString(ThreadArchive);\n\n const wire = yield* Schema.encodeEffect(codec)(input).pipe(\n Effect.mapError(() => invalid(\"Malformed transfer page\")),\n );\n\n if (utf8ByteLength(wire) > MAX_THREAD_EXPORT_PAGE_BYTES)\n return yield* invalid(\"Transfer page exceeds 32 MiB\");\n\n const archive = yield* Schema.decodeEffect(codec)(wire).pipe(\n Effect.mapError(() => invalid(\"Malformed transfer page\")),\n );\n\n const { threadId } = archive;\n\n // A final source page may omit its cursor. Restored facts must remain exportable after\n // later admissions, commands or a worker seal change the manifest and continuation.\n if (\n !transferPageFits(threadId) ||\n archive.admissions.some((fact) => !admissionFitsTransfer(threadId, fact)) ||\n archive.commands.aborts.some((fact) => !abortFitsTransfer(threadId, fact)) ||\n archive.commands.approvals.some((fact) => !approvalFitsTransfer(threadId, fact)) ||\n archive.commands.resolutions.some((fact) => !resolutionFitsTransfer(threadId, fact)) ||\n archive.deliveries.some((fact) => !deliveryFitsTransfer(threadId, fact))\n )\n return yield* ThreadImportRejected.make({\n threadId,\n reason: \"unsupported-capacity\",\n message: \"Imported fact exceeds its bounded transfer representation\",\n });\n\n if (state.ended) return yield* invalid(\"Page after the final transfer page\", threadId);\n if (archive.format !== CURRENT_RECORD_FORMAT)\n return yield* ThreadImportRejected.make({\n threadId,\n reason: \"unsupported-format\",\n message: `Only ${CURRENT_RECORD_FORMAT} can be imported`,\n });\n if (state.manifest !== undefined && !sameTransferManifest(state.manifest, archive))\n return yield* invalid(\"Transfer snapshot changed\", threadId);\n if (\n archive.fromSequence !== state.sequence + 1 ||\n (archive.cursor !== undefined && archive.cursor === state.cursor)\n )\n return yield* invalid(\"Transfer page position is invalid\", threadId);\n if (archive.records.length > 0 && transferSections.some((section) => state.counts[section] > 0))\n return yield* invalid(\"Canonical records follow immutable fact sections\", threadId);\n if (\n archive.admissions.length > 0 &&\n state.counts.aborts +\n state.counts.approvals +\n state.counts.resolutions +\n state.counts.deliveries >\n 0\n )\n return yield* invalid(\"Admissions follow accepted command sections\", threadId);\n const records: Array<CanonicalRecordEnvelope> = [];\n const prepared: Array<PreparedImportBatch> = [];\n let index = 0;\n\n for (const batch of archive.batches) {\n const current: Array<RecordEnvelope> = [];\n const encoded: Array<RecordJson> = [];\n const firstSequence = sequence(state.sequence + 1);\n\n while (archive.records[index]?.batchId === batch.batchId) {\n const entry = archive.records[index]!;\n\n if (entry.threadId !== threadId || entry.sequence !== state.sequence + 1)\n return yield* invalid(\"Canonical identity or sequence mismatch\", threadId);\n\n const record = yield* decodeExportRecord(archive.format, entry.record).pipe(\n Effect.mapError((e) => invalid(e.message, threadId)),\n );\n\n if (record.payload._tag === \"RunContinuation\")\n return yield* invalid(\"Mutable interpreter progress is not canonical history\", threadId);\n\n records.push(CanonicalRecordEnvelope.make({ ...entry, record }));\n current.push(record);\n encoded.push(entry.record);\n index++;\n state.sequence++;\n }\n\n const canonical = yield* Schema.decodeUnknownEffect(\n Schema.toType(Schema.Struct(CanonicalBatch.fields)),\n )({ ...batch, records: current }).pipe(\n Effect.mapError(() => invalid(\"Empty or oversized canonical batch\", threadId)),\n Effect.map((value) => CanonicalBatch.make(value)),\n );\n\n const batchJson = canonicalJson({ ...batch, records: encoded });\n\n if (utf8ByteLength(batchJson) > 16 * 1024 * 1024)\n return yield* invalid(\"Canonical batch exceeds 16 MiB\", threadId);\n prepared.push({\n batch: canonical,\n batchJson,\n recordJson: encoded.map(canonicalJson),\n firstSequence,\n lastSequence: sequence(state.sequence),\n });\n }\n if (index !== archive.records.length || state.sequence > archive.tailSequence)\n return yield* invalid(\n \"Unbound canonical records or records beyond the captured tail\",\n threadId,\n );\n if (\n archive.admissions.length +\n archive.commands.aborts.length +\n archive.commands.approvals.length +\n archive.commands.resolutions.length +\n archive.deliveries.length >\n 0 &&\n state.sequence !== archive.tailSequence\n )\n return yield* invalid(\"Immutable sections precede the complete canonical prefix\", threadId);\n if (\n archive.commands.aborts.length +\n archive.commands.approvals.length +\n archive.commands.resolutions.length >\n 0 &&\n state.counts.admissions + archive.admissions.length !== archive.snapshot.admissions\n )\n return yield* invalid(\"Accepted commands precede the complete admission directory\", threadId);\n\n const sectionLength = (section: (typeof transferSections)[number]) =>\n section === \"admissions\"\n ? archive.admissions.length\n : section === \"deliveries\"\n ? archive.deliveries.length\n : archive.commands[section].length;\n\n for (let index = 0; index < transferSections.length; index++) {\n const section = transferSections[index]!;\n\n if (sectionLength(section) === 0) continue;\n if (\n transferSections\n .slice(0, index)\n .some((prior) => state.counts[prior] + sectionLength(prior) !== archive.snapshot[prior]) ||\n transferSections.slice(index + 1).some((later) => state.counts[later] !== 0)\n )\n return yield* invalid(\"Transfer fact sections are out of order\", threadId);\n }\n const required = transferDependencies(records);\n\n if (canonicalJson(required) !== canonicalJson([...archive.dependencies].sort()))\n return yield* invalid(\"Cross-range dependency directory is incomplete or ambiguous\", threadId);\n for (const section of transferSections) {\n state.counts[section] += sectionLength(section);\n if (state.counts[section] > archive.snapshot[section])\n return yield* invalid(`Too many ${section} facts`, threadId);\n }\n for (const admission of archive.admissions) {\n if (!options?.verification && admission.settledAt === undefined)\n return yield* invalid(\n \"Closed admission is missing its stable settlement timestamp\",\n threadId,\n );\n if (\n admission.threadId !== threadId ||\n (yield* digest(admission.inputPayload)) !== admission.inputDigest\n )\n return yield* invalid(\"Admission identity or input digest mismatch\", threadId);\n }\n for (const delivery of archive.deliveries) {\n const encoded = yield* Schema.encodeEffect(MessageDeliveryRecord)(delivery).pipe(\n Effect.mapError(() => invalid(\"Invalid delivery fact\", threadId)),\n );\n\n if (\n delivery.key.ownerThreadId !== threadId ||\n (!options?.verification &&\n (delivery.leaseUntilMillis !== null ||\n ![\"processed\", \"refused\"].includes(delivery.status))) ||\n (yield* digest(encoded.envelope)) !== delivery.envelopeDigest\n )\n return yield* invalid(\"Delivery ownership, lease or envelope digest mismatch\", threadId);\n }\n state.manifest = {\n ...archive,\n records: [],\n batches: [],\n admissions: [],\n commands: { aborts: [], approvals: [], resolutions: [] },\n deliveries: [],\n dependencies: [],\n };\n state.cursor = archive.cursor;\n state.ended = archive.cursor === undefined;\n\n return { archive, records, batches: prepared } satisfies PreparedImportPage;\n});\n\nexport const finishThreadImport = (state: ThreadImportProgress) =>\n Effect.gen(function* () {\n const page = state.manifest;\n\n if (\n page === undefined ||\n !state.ended ||\n state.sequence !== page.tailSequence ||\n transferSections.some((section) => state.counts[section] !== page.snapshot[section])\n )\n return yield* invalid(\n \"Transfer stream ended before its complete canonical sequence and fact sections\",\n );\n\n return ThreadImportResult.make({\n threadId: page.threadId,\n format: page.format,\n tailSequence: page.tailSequence,\n recordCount: state.sequence,\n submissionCount: state.counts.admissions,\n });\n });\n\n/** An executed receipt must settle strictly after its own input. FIFO inputs are checked in one pass. */\nexport const verifyImportedInputOrder = Effect.fnUntraced(function* (\n admission: Pick<ThreadAdmission, \"threadId\" | \"submissionId\" | \"queueSequence\">,\n) {\n const reader = yield* ThreadImportReader;\n const settlement = yield* reader.record(submissionSettlementRecordId(admission.submissionId));\n\n if (settlement === undefined) return;\n const applied = yield* reader.record(submissionInputRecordId(admission.submissionId));\n const payload = settlement.record.payload;\n\n if (\n applied === undefined &&\n payload._tag === \"SubmissionSettled\" &&\n payload.outcome === \"aborted\"\n )\n return;\n if (applied === undefined || applied.sequence >= settlement.sequence)\n return yield* invalid(\n \"Executed settlement has no preceding canonical input\",\n admission.threadId,\n );\n});\n\n/** Rebuild ONE admitted submission from exact staged evidence; terminal state does not erase uncertainty. */\nexport const rebuildImportedSubmission = Effect.fnUntraced(function* (admission: ThreadAdmission) {\n const reader = yield* ThreadImportReader;\n const threadId = admission.threadId;\n const inputEntry = yield* reader.record(submissionInputRecordId(admission.submissionId));\n const payload = inputEntry?.record.payload;\n\n if (\n inputEntry !== undefined &&\n (payload?._tag !== \"UserInputRecorded\" ||\n payload.submissionId !== admission.submissionId ||\n (payload.kind !== \"user\" && payload.kind !== \"steering\") ||\n (payload.messageAdmission === undefined\n ? admission.messageAdmission !== undefined\n : admission.messageAdmission === undefined ||\n !sameInputMessage(payload.messageAdmission, admission.messageAdmission)) ||\n canonicalJson(payload.input) !== canonicalJson(admission.inputPayload))\n )\n return yield* invalid(\"Canonical input disagrees with its immutable admission\", threadId);\n const runId = payload?._tag === \"UserInputRecorded\" ? payload.runId : undefined;\n const host = runId === undefined ? undefined : yield* reader.runOwner(runId);\n\n if (inputEntry !== undefined && host === undefined)\n return yield* invalid(\"Canonical Run has no admitted owner\", threadId);\n\n const joined =\n host !== undefined && host.submissionId !== admission.submissionId\n ? host.submissionId\n : undefined;\n\n if (\n payload?._tag === \"UserInputRecorded\" &&\n payload.kind !== (joined === undefined ? \"user\" : \"steering\")\n )\n return yield* invalid(\"Canonical input kind disagrees with its admitted Run owner\", threadId);\n\n if (joined !== undefined && host !== undefined && host.queueSequence >= admission.queueSequence)\n return yield* invalid(\"Joined input precedes its host admission\", threadId);\n\n const settlement = (yield* reader.record(submissionSettlementRecordId(admission.submissionId)))\n ?.record;\n\n if (settlement !== undefined) {\n yield* validateCanonicalSettlement(settlement, admission).pipe(\n Effect.mapError(() => invalid(\"Canonical settlement disagrees with its receipt\", threadId)),\n );\n if (settlement.payload._tag !== \"SubmissionSettled\" || settlement.payload.runId !== runId)\n return yield* invalid(\"Settlement Run does not own its canonical input\", threadId);\n if (joined !== undefined) {\n const hostSettlement = (yield* reader.record(submissionSettlementRecordId(joined)))?.record\n .payload;\n\n if (hostSettlement?._tag !== \"SubmissionSettled\")\n return yield* invalid(\"Joined settlement has no host settlement\", threadId);\n yield* validateJoinedSettlement(settlement.payload, hostSettlement).pipe(\n Effect.mapError(() => invalid(\"Joined settlement conflicts with its host\", threadId)),\n );\n }\n }\n const ownRun = runIdForSubmission(admission.submissionId);\n\n const runRecords = yield* reader.runRecords(ownRun);\n\n if (inputEntry === undefined && runRecords.some(({ record }) => !isPreContinuationFact(record)))\n return yield* invalid(\"Admitted Run executed without its original canonical input\", threadId);\n const operations = toolOperationStates(runRecords, ownRun);\n const operationCounts = new Map<ToolCallId, number>();\n\n for (const state of operations)\n operationCounts.set(\n state.operation.toolCallId,\n (operationCounts.get(state.operation.toolCallId) ?? 0) + 1,\n );\n const toolRecords = new Map<ToolCallId, Array<CanonicalRecordEnvelope>>();\n\n for (const entry of runRecords) {\n const payload = entry.record.payload;\n\n if (!(\"toolCallId\" in payload)) continue;\n const entries = toolRecords.get(payload.toolCallId) ?? [];\n\n entries.push(entry);\n toolRecords.set(payload.toolCallId, entries);\n }\n const commands = yield* reader.commands(admission.submissionId);\n const approvals = commands.approvals.map((intent) => ApprovalDecisionIntent.make(intent));\n const resolutions = commands.resolutions.map((intent) => UnknownResolutionIntent.make(intent));\n const acceptedAbort = commands.aborts[0];\n\n if (commands.aborts.length > 1) return yield* invalid(\"Duplicate accepted abort\", threadId);\n const canonicalAbort = yield* reader.record(submissionAbortRecordId(admission.submissionId));\n\n if (canonicalAbort !== undefined && acceptedAbort === undefined)\n return yield* invalid(\"Canonical abort has no immutable accepted command\", threadId);\n\n const abort =\n canonicalAbort?.record.payload._tag === \"AbortRequested\"\n ? AbortIntent.make({\n ...canonicalAbort.record.payload,\n requestedAt: acceptedAbort?.requestedAt ?? canonicalAbort.record.createdAt,\n canonicalRecordId: canonicalAbort.record.recordId,\n })\n : acceptedAbort === undefined\n ? undefined\n : AbortIntent.make(acceptedAbort);\n\n if (\n acceptedAbort !== undefined &&\n abort !== undefined &&\n (acceptedAbort.author !== abort.author || acceptedAbort.reason !== abort.reason)\n )\n return yield* invalid(\"Accepted abort conflicts with the canonical command\", threadId);\n for (const command of [...approvals, ...resolutions]) {\n if (operationCounts.get(command.toolCallId) !== 1)\n return yield* invalid(\n \"Accepted tool command has no unambiguous canonical declaration\",\n threadId,\n );\n }\n for (const command of approvals) {\n const requested = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalRequested\" && payload.toolCallId === command.toolCallId,\n );\n\n const decided = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" && payload.toolCallId === command.toolCallId,\n );\n\n if (\n requested.length !== 1 ||\n decided.length > 1 ||\n decided.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" &&\n (payload.decision !== command.decision ||\n payload.resolver !== command.resolver ||\n payload.reason !== command.reason),\n )\n )\n return yield* invalid(\n \"Accepted approval conflicts with its canonical request or decision\",\n threadId,\n );\n }\n for (const command of resolutions) {\n if (command.resolution._tag === \"AbortSubmission\" && abort === undefined)\n return yield* invalid(\n \"AbortSubmission resolution has no accepted or canonical abort\",\n threadId,\n );\n\n const resolved = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallResolved\" &&\n payload.toolCallId === command.toolCallId &&\n (payload.resolution === \"safe-retry\" ? \"execution\" : \"factual\") ===\n unknownResolutionKind(command.resolution),\n );\n\n const expected =\n command.resolution._tag === \"CompletedWithResult\"\n ? command.resolution.isFailure\n ? \"failed-with-error\"\n : \"completed-with-result\"\n : command.resolution._tag === \"NeverHappened\"\n ? \"never-started\"\n : command.resolution._tag === \"SafeToRetry\"\n ? \"safe-retry\"\n : undefined;\n\n if (\n resolved.length > 1 ||\n resolved.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallResolved\" &&\n (payload.resolution !== expected ||\n payload.author !== command.author ||\n payload.reason !== command.reason),\n )\n )\n return yield* invalid(\"Accepted resolution conflicts with its canonical audit\", threadId);\n if (command.resolution._tag === \"CompletedWithResult\") {\n const result = command.resolution;\n\n const outcomes = (toolRecords.get(command.toolCallId) ?? []).filter(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallSettled\" && payload.toolCallId === command.toolCallId,\n );\n\n if (\n outcomes.length > 1 ||\n outcomes.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallSettled\" &&\n (payload.isFailure !== result.isFailure ||\n canonicalJson(payload.result) !== canonicalJson(result.result)),\n )\n )\n return yield* invalid(\n \"Accepted resolution conflicts with the canonical tool result\",\n threadId,\n );\n }\n }\n\n const unknown = operations\n .filter(\n (state) =>\n !state.settled &&\n !state.resolved &&\n (state.unknown ||\n (!state.dispatchBlocked &&\n state.operation.executionKind === \"ordinary\" &&\n state.operation.executionClass !== \"readonly\")),\n )\n .map((state) => state.operation.toolCallId);\n\n const acceptedApprovals = new Set(approvals.map((intent) => intent.toolCallId));\n\n const pendingApprovals = runRecords\n .filter(({ record: { payload } }) => payload._tag === \"ToolApprovalRequested\")\n .flatMap(({ record }) => {\n if (record.payload._tag !== \"ToolApprovalRequested\") return [];\n const id = record.payload.toolCallId;\n\n return acceptedApprovals.has(id) ||\n (toolRecords.get(id) ?? []).some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" && payload.toolCallId === id,\n )\n ? []\n : [id];\n });\n\n const suspension =\n pendingApprovals.length === 0\n ? undefined\n : SuspensionSnapshot.make({\n reason: ApprovalPendingSuspension.make({\n toolCallIds: [pendingApprovals[0], ...pendingApprovals.slice(1)],\n }),\n suspendedAt: runRecords.at(-1)?.record.createdAt ?? admission.createdAt,\n });\n\n // An admitted input need not have reached the log. Its immutable fact is the work;\n // recovery materializes an admitted Thread before it becomes ready.\n const state =\n settlement !== undefined\n ? \"settled\"\n : joined !== undefined\n ? \"joined\"\n : unknown.length > 0\n ? \"unknown\"\n : suspension !== undefined\n ? \"suspended\"\n : inputEntry !== undefined\n ? \"input-applied\"\n : (yield* reader.hasAgent(admission.agentId))\n ? \"ready\"\n : \"admitted\";\n\n return RebuiltSubmission.make({\n admission,\n state,\n ...(inputEntry === undefined\n ? {}\n : {\n inputApplied: InputAppliedMarker.make({\n recordId: inputEntry.record.recordId,\n sequence: inputEntry.sequence,\n }),\n }),\n ...(joined === undefined ? {} : { joinedHostSubmissionId: joined }),\n ...(settlement === undefined ? {} : { settlement }),\n ...(state !== \"suspended\" || suspension === undefined ? {} : { suspension }),\n unknownToolCallIds: unknown,\n ...(abort === undefined ? {} : { abort }),\n approvals,\n resolutions,\n });\n});\n\n/** Immediate persistent history has no ledger/checkpoint owner, but still needs a terminal Run fact. */\nexport const validateClosedRun = Effect.fnUntraced(function* (threadId: ThreadId, runId: RunId) {\n const reader = yield* ThreadImportReader;\n const records = yield* reader.runRecords(runId);\n\n const opened = records.some(\n ({ record: { payload } }) =>\n (payload._tag === \"UserInputRecorded\" ||\n payload._tag === \"RunStarted\" ||\n payload._tag === \"ModelResponseRecorded\") &&\n payload.runId === runId,\n );\n\n const closed = records.some(\n ({ record: { payload } }) =>\n (payload._tag === \"RunCompleted\" ||\n payload._tag === \"RunFailed\" ||\n payload._tag === \"SubmissionSettled\") &&\n payload.runId === runId,\n );\n\n if (opened && !closed) return yield* invalid(\"Transfer contains an unfinished Run\", threadId);\n});\n\n/** Idle transfer keeps closed receipts, never the authority to finish their former work. */\nexport const rebuildClosedSubmission = Effect.fnUntraced(function* (admission: ThreadAdmission) {\n if (admission.settledAt === undefined)\n return yield* invalid(\n \"Closed admission is missing its stable settlement timestamp\",\n admission.threadId,\n );\n const rebuilt = yield* rebuildImportedSubmission(admission);\n const reader = yield* ThreadImportReader;\n\n if (\n rebuilt.state !== \"settled\" ||\n rebuilt.unknownToolCallIds.length > 0 ||\n rebuilt.suspension !== undefined\n )\n return yield* invalid(\"Transfer contains unfinished accepted work\", admission.threadId);\n if (rebuilt.abort !== undefined && rebuilt.abort.canonicalRecordId === undefined)\n return yield* invalid(\"Transfer contains an unapplied abort\", admission.threadId);\n const records = yield* reader.runRecords(runIdForSubmission(admission.submissionId));\n\n const decidedApprovals = new Set(\n records.flatMap(({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" ? [payload.toolCallId] : [],\n ),\n );\n\n if (\n records.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalRequested\" && !decidedApprovals.has(payload.toolCallId),\n )\n )\n return yield* invalid(\"Transfer contains an unresolved approval\", admission.threadId);\n for (const approval of rebuilt.approvals)\n if (\n !records.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolApprovalDecided\" && payload.toolCallId === approval.toolCallId,\n )\n )\n return yield* invalid(\"Transfer contains an unapplied approval\", admission.threadId);\n for (const resolution of rebuilt.resolutions)\n if (\n resolution.resolution._tag !== \"AbortSubmission\" &&\n !records.some(\n ({ record: { payload } }) =>\n payload._tag === \"ToolCallResolved\" &&\n payload.toolCallId === resolution.toolCallId &&\n (payload.resolution === \"safe-retry\" ? \"execution\" : \"factual\") ===\n unknownResolutionKind(resolution.resolution),\n )\n )\n return yield* invalid(\"Transfer contains an unapplied resolution\", admission.threadId);\n yield* verifyImportedInputOrder(admission);\n\n return rebuilt;\n});\n\n/** Encode one page at a time and retain upstream stream errors and requirements. */\nexport const reencodeThread = Effect.fnUntraced(function* <E, R>(\n source: Stream.Stream<ThreadExport, E, R>,\n) {\n const target = yield* ThreadImport;\n\n return yield* target.import(\n source.pipe(\n Stream.mapEffect((page) =>\n Schema.encodeEffect(ThreadExport)(page).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(ThreadArchive)),\n Effect.mapError(() => invalid(\"Unable to encode source page\", page.threadId)),\n ),\n ),\n ),\n );\n});\n"],"mappings":"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"}
@@ -501,7 +501,7 @@ const PreparedAppend = { capture: (input) => Effect.suspend(() => {
501
501
  const encodings = Array.from(input.batch.records, captureRecord);
502
502
  const prefix = `{"batchId":${JSON.stringify(header.batchId)},"producerId":${JSON.stringify(header.producerId)},"records":[`;
503
503
  const batchJson = `${prefix}${encodings.map(({ json }) => json).join(",")}]}`;
504
- const batchBytes = encodings.reduce((total, record) => total + record.bytes, utf8ByteLength(prefix) + encodings.length + 1);
504
+ const batchBytes = encodings.reduce((total, record) => total + record.bytes, utf8ByteLength(prefix) + (encodings.length === 0 ? 2 : encodings.length + 1));
505
505
  if (batchBytes > 16777216) throw ThreadStoreError.make({
506
506
  operation: "prepare canonical append",
507
507
  message: `Canonical batch exceeds ${MAX_CANONICAL_BATCH_BYTES} bytes`
@@ -891,4 +891,4 @@ var ThreadReader = class ThreadReader extends Context.Service()("@effect-agent/t
891
891
  //#endregion
892
892
  export { ThreadTailRequest as $, ThreadExportRejected as A, ThreadPromptRead as B, ThreadApprovalFact as C, ThreadExportBatch as D, ThreadExport as E, ThreadIdentityRequest as F, ThreadResolutionFact as G, ThreadReadRequest as H, ThreadMaterialization as I, ThreadStore as J, ThreadRunInputRequest as K, ThreadNotMaterialized as L, ThreadExportSnapshot as M, ThreadExportSource as N, ThreadExportCursor as O, ThreadIdentity as P, ThreadTail as Q, ThreadObservation as R, ThreadAdmission as S, ThreadCommands as T, ThreadReader as U, ThreadRead as V, ThreadRecordRequest as W, ThreadStoreError as X, ThreadStoreDiagnostic as Y, ThreadStore_exports as Z, PromptCheckpointHead as _, isPreContinuationFact as _t, CommitBatch as a, canonicalBatchFitsTransfer as at, SelectedThreadRead as b, terminalUsageCharge as bt, ExecutionUpdate as c, makeTransferFactCheck as ct, MAX_PROMPT_CHECKPOINT_RUNS as d, transferPageFits as dt, ThreadVerificationRequest as et, MAX_THREAD_EXPORT_CURSOR_CHARS as f, transferRecordDependencies as ft, PromptCheckpoint as g, executionRunIds as gt, PreparedAppend as h, canonicalRunIds as ht, CheckpointRejected as i, ThreadWorkerStateRequest as it, ThreadExportRequest as j, ThreadExportRecord as k, LoadCheckpointRequest as l, readWorkerState as lt, MAX_THREAD_EXPORT_PAGE_RECORDS as m, recordEncoding as mt, AppendRequest as n, ThreadWorkerCapacityRequest as nt, ExecutionCheckpoint as o, getRecord as ot, MAX_THREAD_EXPORT_PAGE_BYTES as p, captureRecord as pt, ThreadSelection as q, AppendResult as r, ThreadWorkerSeal as rt, ExecutionRead as s, getRunInput as st, AppendConflict as t, ThreadWorkerCapacity as tt, MAX_PROMPT_CHECKPOINT_BYTES as u, streamExport as ut, PromptCheckpointRead as v, isTerminalBudgetFact as vt, ThreadCheckpoint as w, ThreadAbortFact as x, SaveCheckpointRequest as y, isWorkHandoff as yt, ThreadPeerCountRequest as z };
893
893
 
894
- //# sourceMappingURL=ThreadStore-B5sew3ir.mjs.map
894
+ //# sourceMappingURL=ThreadStore-CEekRa80.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreadStore-CEekRa80.mjs","names":[],"sources":["../src/durable/internal/record-ownership.ts","../src/durable/internal/record-encoding.ts","../src/durable/internal/transfer-dependencies.ts","../src/durable/ThreadStore.ts"],"sourcesContent":["import type { RunId } from \"../../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../../core/internal/utf8.ts\";\nimport type { ModelCallUsage } from \"../../core/Usage.ts\";\nimport type { RecordEnvelope } from \"../Records.ts\";\nimport { runIdForSubmission } from \"../RunJournal.ts\";\n\n/** Index membership comes from canonical owner fields, never parsing opaque identities. */\nexport const canonicalRunIds = ({ payload }: RecordEnvelope): ReadonlyArray<RunId> => {\n const ids = new Set<RunId>();\n\n if (\"runId\" in payload && payload.runId !== undefined) ids.add(payload.runId);\n if (payload._tag === \"AbortRequested\" || payload._tag === \"SubmissionSettled\")\n ids.add(runIdForSubmission(payload.submissionId));\n if (payload._tag === \"AgentUpdateEmitted\") ids.add(payload.update.runId);\n if (payload._tag === \"WorkerInputRequested\" && payload.admission.executionRunId !== null)\n ids.add(payload.admission.executionRunId);\n if (payload._tag === \"SubtreeBudgetReserved\" && payload.executionRunId !== null)\n ids.add(payload.executionRunId);\n if (payload._tag === \"PeerMessagePrepared\" && payload.source._tag === \"tool\")\n ids.add(payload.source.runId);\n\n return [...ids];\n};\n\n/** A joined Receipt's closure is discoverable from its host, but owns no host execution charge. */\nexport const executionRunIds = (record: RecordEnvelope): ReadonlyArray<RunId> =>\n record.payload._tag === \"SubmissionSettled\"\n ? [runIdForSubmission(record.payload.submissionId)]\n : canonicalRunIds(record);\n\n/**\n * These immutable preparations are durable handoff intents before a destination row exists.\n * Their canonical tag/identity index is published with the preparation and survives Run\n * settlement. WorkerInputCompleted closes capacity only with factual effectsResolved evidence;\n * ToolCallSettled/Resolved close operations, and destination delivery state owns transport closure.\n */\nexport const isWorkHandoff = ({ payload }: RecordEnvelope): boolean =>\n payload._tag === \"WorkerInputRequested\" ||\n payload._tag === \"WorkerReportPrepared\" ||\n payload._tag === \"PeerMessagePrepared\" ||\n payload._tag === \"WorkerStopRequested\" ||\n payload._tag === \"SubtreeBudgetReserved\" ||\n payload._tag === \"SubagentRequested\" ||\n (payload._tag === \"AgentUpdateEmitted\" && payload.delivery !== undefined);\n\n/** A host can prepare independent work before the source admission ever starts a Run. */\nexport const isPreContinuationFact = (record: RecordEnvelope): boolean =>\n (isWorkHandoff(record) &&\n record.payload._tag !== \"SubagentRequested\" &&\n record.payload._tag !== \"AgentUpdateEmitted\") ||\n (record.payload._tag === \"UserInputRecorded\" && record.payload.kind === \"user\") ||\n record.payload._tag === \"AbortRequested\" ||\n record.payload._tag === \"SubmissionSettled\";\n\n/** Grouped usage is no larger than its original identities/components plus bounded counters. */\nexport const terminalUsageCharge = (calls: ReadonlyArray<ModelCallUsage>): number =>\n calls.reduce((bytes, call) => bytes + utf8ByteLength(JSON.stringify(call)) + 512, 0);\n\n/** These facts end accepted work or durably request its termination. */\nexport const isTerminalBudgetFact = ({ payload }: RecordEnvelope): boolean =>\n payload._tag === \"AbortRequested\" ||\n payload._tag === \"RunFailed\" ||\n payload._tag === \"RunCompleted\" ||\n payload._tag === \"SubmissionSettled\";\n","import { DateTime, Predicate, Schema } from \"effect\";\n\nimport type { RunId } from \"../../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../../core/internal/utf8.ts\";\nimport { ExportedRecord } from \"../RecordFormat.ts\";\nimport {\n type CanonicalRecordPayload,\n MAX_CANONICAL_RECORD_BYTES,\n MAX_PERSISTED_JSON_COLLECTION_LENGTH,\n MAX_PERSISTED_JSON_DEPTH,\n MAX_PERSISTED_JSON_NODES,\n RecordEnvelope,\n type RecordJson,\n type RunContinuation,\n} from \"../Records.ts\";\nimport { canonicalJson } from \"./canonical-json.ts\";\nimport {\n executionRunIds,\n isPreContinuationFact,\n isTerminalBudgetFact,\n terminalUsageCharge,\n} from \"./record-ownership.ts\";\n\nconst encodeRecord = Schema.encodeSync(RecordEnvelope);\n\nconst recordLimits = {\n depth: MAX_PERSISTED_JSON_DEPTH + 4,\n nodes: MAX_PERSISTED_JSON_NODES * 4,\n collectionLength: MAX_PERSISTED_JSON_COLLECTION_LENGTH,\n // UTF-16 units give a lower bound while serializing; capture checks the exact UTF-8 width.\n textUnits: MAX_CANONICAL_RECORD_BYTES,\n};\n\nexport interface RecordEncoding {\n readonly canonical: RecordEnvelope;\n readonly wire: RecordJson;\n readonly json: string;\n readonly bytes: number;\n readonly progress: ProgressAppendRecord;\n}\n\n/** Private capture metadata, never caller-supplied wire data or execution authority. */\nexport interface ProgressAppendRecord {\n readonly recordId: RecordEnvelope[\"recordId\"];\n readonly runIds: ReadonlyArray<RunId>;\n readonly recordBytes: number;\n readonly terminalUsageBytes: number;\n readonly preContinuation: boolean;\n readonly terminal: boolean;\n readonly continuation?: RunContinuation;\n}\n\nconst progressRecord = (record: RecordEnvelope, bytes: number): ProgressAppendRecord => {\n const payload = record.payload;\n\n return Object.freeze({\n recordId: record.recordId,\n runIds: Object.freeze(executionRunIds(record)),\n recordBytes: bytes,\n preContinuation: isPreContinuationFact(record),\n terminal: isTerminalBudgetFact(record),\n terminalUsageBytes:\n payload._tag === \"ModelResponseRecorded\" || payload._tag === \"ModelCallAborted\"\n ? terminalUsageCharge(payload.modelUsage ?? [])\n : 0,\n ...(payload._tag === \"RunContinuation\" ? { continuation: payload } : {}),\n });\n};\n\nconst captured = new WeakMap<RecordEnvelope, RecordEncoding>();\n\n/** Own every fact before suspension; encoded JSON fields can share these private frozen values. */\nconst capturePayload = (payload: CanonicalRecordPayload) => {\n const copy = { ...payload };\n\n Object.setPrototypeOf(copy, Object.getPrototypeOf(payload));\n const copies = new WeakMap<object, object>([[payload, copy]]);\n\n const pending: Array<{ readonly source: object; readonly target: object }> = [\n { source: payload, target: copy },\n ];\n\n const owned: Array<object> = [copy];\n\n while (pending.length > 0) {\n const next = pending.pop()!;\n\n for (const [key, value] of Object.entries(next.source)) {\n if (!Predicate.isObject(value)) continue;\n let child = copies.get(value);\n\n if (child === undefined) {\n const created: object = Array.isArray(value)\n ? []\n : Object.create(Object.getPrototypeOf(value));\n\n Object.assign(created, value);\n copies.set(value, created);\n owned.push(created);\n pending.push({ source: value, target: created });\n child = created;\n }\n Reflect.set(next.target, key, child);\n }\n }\n for (const value of owned) Object.freeze(value);\n\n return { payload: Object.freeze(copy), copies };\n};\n\n/** Schema-created structures are private; detach JSON pass-throughs using the same owned copy. */\nconst ownWire = (wire: RecordJson, copies: WeakMap<object, object>): RecordJson => {\n const pending: Array<object> = Predicate.isObject(wire) ? [wire] : [];\n\n while (pending.length > 0) {\n const next = pending.pop()!;\n\n for (const [key, value] of Object.entries(next)) {\n if (!Predicate.isObject(value)) continue;\n const copy = copies.get(value);\n\n if (copy !== undefined) Reflect.set(next, key, copy);\n else pending.push(value);\n }\n Object.freeze(next);\n }\n\n return wire;\n};\n\n/** Capture at the Schema boundary; only the privately owned result can reuse its encoding. */\nexport const captureRecord = (input: RecordEnvelope): RecordEncoding => {\n const existing = captured.get(input);\n\n if (existing !== undefined) return existing;\n const encoded = encodeRecord(input);\n const owned = capturePayload(input.payload);\n const wire = ownWire(encoded, owned.copies);\n const json = canonicalJson(wire, recordLimits);\n const bytes = utf8ByteLength(json);\n\n if (bytes > MAX_CANONICAL_RECORD_BYTES)\n throw new RangeError(\"Canonical JSON exceeds its byte bound\");\n const createdAt = DateTime.makeUnsafe(DateTime.toEpochMillis(input.createdAt));\n\n // DateTime fills this cache lazily; populate it before freezing our private copy.\n Object.freeze(DateTime.toPartsUtc(createdAt));\n Object.freeze(createdAt);\n\n const canonical = Object.freeze(\n new RecordEnvelope(\n {\n ...input,\n createdAt,\n payload: owned.payload,\n },\n { disableChecks: true },\n ),\n );\n\n const encoding = Object.freeze({\n canonical,\n wire,\n json,\n bytes,\n progress: progressRecord(canonical, bytes),\n });\n\n captured.set(canonical, encoding);\n\n return encoding;\n};\n\n/** Read evidence retains its original wire; fresh writes use the captured Schema encoding. */\nexport const recordEncoding = (record: RecordEnvelope): RecordEncoding => {\n const existing = captured.get(record);\n\n if (existing !== undefined) return existing;\n if (record instanceof ExportedRecord) {\n const json = canonicalJson(record.wire);\n\n const bytes = utf8ByteLength(json);\n\n return {\n canonical: record,\n wire: record.wire,\n json,\n bytes,\n progress: progressRecord(record, bytes),\n };\n }\n\n return captureRecord(record);\n};\n","import type { RecordEnvelope, RecordId } from \"../Records.ts\";\n\n/** Exact references outside one complete canonical batch. */\nexport const transferRecordDependencies = (\n records: ReadonlyArray<RecordEnvelope>,\n): ReadonlyArray<RecordId> => {\n const local = new Set(records.map((record) => record.recordId));\n const dependencies = new Set<RecordId>();\n\n for (const { payload } of records) {\n if (payload._tag === \"WorkerInputRefused\")\n for (const ref of [payload.reservation, payload.stop])\n if (!local.has(ref.recordId)) dependencies.add(ref.recordId);\n if (payload._tag === \"WorkHandoffCompleted\" && !local.has(payload.preparationId))\n dependencies.add(payload.preparationId);\n if (payload._tag === \"RunContextRecorded\")\n for (const ref of payload.retained)\n if (!local.has(ref.recordId)) dependencies.add(ref.recordId);\n if (payload._tag === \"RunContinuation\")\n for (const ref of [\n payload.originalInput,\n payload.savedContext,\n payload.latestResponse,\n payload.terminal,\n payload.lastFact,\n ])\n if (ref !== undefined && !local.has(ref.recordId)) dependencies.add(ref.recordId);\n }\n\n return [...dependencies].sort();\n};\n","import { Context, Effect, Layer, Option, Predicate, Result, Schema, Stream, Struct } from \"effect\";\n\nimport { ReceiptId, RunId, SubmissionId, ThreadId, ToolCallId } from \"../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../core/internal/utf8.ts\";\nimport { QueueSequence } from \"../core/Receipt.ts\";\nimport { AssignmentTerminal } from \"../core/Worker.ts\";\nimport type { IntegrityReport } from \"./Admin.ts\";\nimport {\n captureRecord,\n recordEncoding,\n type ProgressAppendRecord,\n} from \"./internal/record-encoding.ts\";\nimport { transferRecordDependencies } from \"./internal/transfer-dependencies.ts\";\nimport type { LifecyclePublicationStorage } from \"./LifecyclePublication.ts\";\nimport { MessageDeliveryRecord } from \"./MessageDelivery.ts\";\nimport { ExportRecord } from \"./RecordFormat.ts\";\nimport {\n type CanonicalBatch,\n type RecordJson,\n BatchId,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n CURRENT_RECORD_FORMAT,\n Digest,\n MAX_RUN_TOOL_CALL_IDENTITIES,\n ObservationOffset,\n PersistedJson,\n type PromptRecordEnvelope,\n ProducerId,\n RecordId,\n RecordEnvelope,\n type RunContinuation,\n} from \"./Records.ts\";\nimport { subagentLineageRecordId, workerOriginRecordId } from \"./RunJournal.ts\";\nimport { ScheduleInstant } from \"./Schedule.ts\";\nimport type { OwnershipLost } from \"./SubmissionLedger.ts\";\nimport {\n AbortIntent,\n AdmissionRequest,\n ApprovalDecisionIntent,\n UnknownResolutionIntent,\n} from \"./SubmissionLedger.ts\";\nimport { MAX_CANONICAL_BATCH_BYTES, type ThreadArchiveStorage } from \"./ThreadArchiveRange.ts\";\nimport type { ThreadWorkStorage } from \"./ThreadWork.ts\";\n\nexport const MAX_THREAD_EXPORT_PAGE_RECORDS = 256;\nexport const MAX_THREAD_EXPORT_PAGE_BYTES = 32 * 1024 * 1024;\nexport const MAX_THREAD_EXPORT_CURSOR_CHARS = 16_384;\n/** Includes a maximally JSON-escaped cursor, snapshot, seal, digests and page structure. */\nconst THREAD_EXPORT_METADATA_BYTES = 128 * 1024;\n\n/** Reserve the manifest identity even when no canonical record or admission exists yet. */\nexport const transferPageFits = (threadId: ThreadId, factBytes = 0): boolean =>\n utf8ByteLength(JSON.stringify(threadId)) + factBytes + THREAD_EXPORT_METADATA_BYTES <=\n MAX_THREAD_EXPORT_PAGE_BYTES;\n\n/** Check a complete retained fact before fresh acceptance; existing replays keep their identity. */\nexport const makeTransferFactCheck = <A, I>(schema: Schema.Codec<A, I>) => {\n const encode = Schema.encodeResult(Schema.fromJsonString(schema));\n\n return (threadId: ThreadId, fact: A): boolean => {\n const encoded = encode(fact);\n\n return Result.isSuccess(encoded) && transferPageFits(threadId, utf8ByteLength(encoded.success));\n };\n};\n\nexport { PROMPT_EVIDENCE_TAGS } from \"./Records.ts\";\n\n/** Counts of closed owner facts, computed only when an idle export begins. */\nexport const ThreadExportSnapshot = Schema.Struct({\n admissions: Schema.Natural,\n aborts: Schema.Natural,\n approvals: Schema.Natural,\n resolutions: Schema.Natural,\n deliveries: Schema.Natural,\n});\n\nexport type ThreadExportSnapshot = typeof ThreadExportSnapshot.Type;\n\n/** Irreversible Thread-local admission restriction, independent of claims and worker completion. */\nexport const ThreadWorkerSeal = Schema.Struct({ terminal: Schema.optionalKey(AssignmentTerminal) });\nexport type ThreadWorkerSeal = typeof ThreadWorkerSeal.Type;\n\n/** Opaque, snapshot-bound transfer position. Only the exporting adapter constructs it. */\nexport const ThreadExportCursor = Schema.NonEmptyString.check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_CURSOR_CHARS),\n);\n\nexport type ThreadExportCursor = typeof ThreadExportCursor.Type;\n\n/** Exact canonical identity; absence is not proof that an admission was never accepted. */\nexport const ThreadRecordRequest = Schema.Struct({ threadId: ThreadId, recordId: RecordId });\nexport type ThreadRecordRequest = typeof ThreadRecordRequest.Type;\n\n/** The original user input for a Run, excluding later joined inputs. */\nexport const ThreadRunInputRequest = Schema.Struct({ threadId: ThreadId, runId: RunId });\nexport type ThreadRunInputRequest = typeof ThreadRunInputRequest.Type;\n\n/** Native accounting for one funding Run; settled Thread history is never included. */\nexport const ThreadWorkerStateRequest = Schema.Struct({\n threadId: ThreadId,\n sourceSubmissionId: Schema.optionalKey(SubmissionId),\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(16_384)),\n});\n\nexport type ThreadWorkerStateRequest = typeof ThreadWorkerStateRequest.Type;\n\n/** Saturating count of outstanding peer intents and terminal deliveries inside their retention window. */\nexport const ThreadPeerCountRequest = Schema.Struct({\n threadId: ThreadId,\n nowMillis: ScheduleInstant,\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1000)),\n});\n\nexport type ThreadPeerCountRequest = typeof ThreadPeerCountRequest.Type;\n\n/** Capacity is derived from unresolved canonical obligations at this exact tail. */\nexport const ThreadWorkerCapacityRequest = Schema.Struct({\n threadId: ThreadId,\n workerThreadId: ThreadId,\n expectedTailSequence: CanonicalSequence,\n update: Schema.Boolean,\n activeLimit: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(100)),\n pendingLimit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(100)),\n});\n\nexport type ThreadWorkerCapacityRequest = typeof ThreadWorkerCapacityRequest.Type;\n\nexport const ThreadWorkerCapacity = Schema.Struct({\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n /** min(actual distinct workers, activeLimit + 1); equality remains distinguishable. */\n activeWorkers: Schema.Natural.check(Schema.isLessThanOrEqualTo(101)),\n workerActive: Schema.Boolean,\n /** min(actual inputs in the requested partition, pendingLimit + 1). */\n pendingInputs: Schema.Natural.check(Schema.isLessThanOrEqualTo(101)),\n});\n\nexport type ThreadWorkerCapacity = typeof ThreadWorkerCapacity.Type;\n\n/** Explicit maintenance may traverse all pages while retaining only one bounded page or Run. */\nexport const ThreadVerificationRequest = Schema.Struct({\n threadId: ThreadId,\n requireAllSettled: Schema.optionalKey(Schema.Boolean),\n});\n\nexport type ThreadVerificationRequest = typeof ThreadVerificationRequest.Type;\n\nexport interface ThreadVerificationStorage {\n readonly verify: (\n request: ThreadVerificationRequest,\n ) => Effect.Effect<IntegrityReport, ThreadStoreError | ThreadNotMaterialized>;\n}\n\nconst incomplete = (operation: string) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n });\n\n/** Collect a complete bounded selection, using canonical sequence as a sparse cursor. */\nconst selectedRecords = Effect.fnUntraced(function* (\n threadId: ThreadId,\n selection: ThreadSelection,\n limit: number,\n) {\n const store = yield* ThreadReader;\n const records: Array<CanonicalRecordEnvelope> = [];\n let bytes = 0;\n let afterSequence: CanonicalSequence | undefined;\n\n while (true) {\n const pageLimit = Math.min(8, limit + 1 - records.length);\n\n const page = yield* Stream.runCollect(\n store.read({\n threadId,\n selection,\n page: { limit: pageLimit, ...(afterSequence === undefined ? {} : { afterSequence }) },\n }),\n );\n\n for (const entry of page) {\n if (\n entry.threadId !== threadId ||\n entry.sequence <= (afterSequence ?? 0) ||\n (\"expectedTailSequence\" in selection && entry.sequence > selection.expectedTailSequence)\n )\n return yield* incomplete(\"read selection identity\");\n afterSequence = entry.sequence;\n bytes += yield* Effect.try({\n try: () => recordEncoding(entry.record).bytes,\n catch: () => incomplete(\"read selection bytes\"),\n });\n if (bytes > MAX_THREAD_EXPORT_PAGE_BYTES)\n return yield* incomplete(\"read selection byte limit\");\n records.push(entry);\n }\n if (page.length > pageLimit || records.length > limit)\n return yield* incomplete(\"read selection limit\");\n if (page.length < pageLimit) return records;\n }\n});\n\n/** Host-owned read: authenticate the Thread and exact locator before calling. */\nexport const getRecord = Effect.fnUntraced(function* (request: ThreadRecordRequest) {\n yield* Schema.decodeEffect(ThreadRecordRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"getRecord request\")),\n );\n\n const records = yield* selectedRecords(\n request.threadId,\n { _tag: \"RecordId\", recordId: request.recordId },\n 1,\n );\n\n if (records.some((entry) => entry.record.recordId !== request.recordId))\n return yield* incomplete(\"getRecord identity\");\n\n return Option.fromUndefinedOr(records[0]);\n});\n\nexport const getRunInput = Effect.fnUntraced(function* (request: ThreadRunInputRequest) {\n yield* Schema.decodeEffect(ThreadRunInputRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"getRunInput request\")),\n );\n\n const records = yield* selectedRecords(\n request.threadId,\n { _tag: \"RunInput\", runId: request.runId },\n 1,\n );\n\n if (\n records.some(\n ({ record: { payload } }) =>\n payload._tag !== \"UserInputRecorded\" ||\n payload.kind !== \"user\" ||\n payload.runId !== request.runId,\n )\n )\n return yield* incomplete(\"getRunInput identity\");\n\n return Option.fromUndefinedOr(records[0]);\n});\n\n/** A bounded snapshot of source identity and the selected funding Run's accounting. */\nexport const readWorkerState = Effect.fnUntraced(function* (request: ThreadWorkerStateRequest) {\n yield* Schema.decodeEffect(ThreadWorkerStateRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"readWorkerState request\")),\n );\n const store = yield* ThreadReader;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId: request.threadId }));\n\n const records = yield* selectedRecords(\n request.threadId,\n {\n _tag: \"WorkerState\",\n expectedTailSequence: tail.tailSequence,\n ...(request.sourceSubmissionId === undefined\n ? {}\n : { sourceSubmissionId: request.sourceSubmissionId }),\n },\n request.limit,\n );\n\n return {\n threadId: request.threadId,\n tailSequence: tail.tailSequence,\n records,\n };\n});\n\nexport class ThreadMaterialization extends Schema.Class<ThreadMaterialization>(\n \"@effect-agent/thread/ThreadMaterialization\",\n)({\n threadId: ThreadId,\n}) {}\n\nconst isExecutionProgressRecord = (\n record: RecordEnvelope,\n): record is RecordEnvelope & { readonly payload: RunContinuation } =>\n record.payload._tag === \"RunContinuation\";\n\nconst ExecutionProgressRecord = RecordEnvelope.pipe(\n Schema.refine(isExecutionProgressRecord, { message: \"Expected a Run continuation record\" }),\n);\n\n/** Current interpreter state. Wire version 2 retains one copy of its continuation. */\nexport class ExecutionCheckpoint extends Schema.Class<ExecutionCheckpoint>(\n \"@effect-agent/thread/ExecutionCheckpoint\",\n)({\n version: Schema.Literal(2),\n /** Logical progress encoding is charged while active; previous revisions are discarded. */\n progressRecord: ExecutionProgressRecord,\n /** Original start, evaluated context and validated completion intent while the Run is active. */\n operational: Schema.Array(RecordEnvelope).check(Schema.isMaxLength(8)),\n canonicalRecords: Schema.Natural,\n /** Stable admitted-input position also supplies a bounded transfer cursor. */\n originalSequence: CanonicalSequence.check(Schema.isGreaterThan(0)),\n throughSequence: CanonicalSequence,\n batchId: BatchId,\n}) {\n /** View of the retained payload, not a second encoded field. */\n get progress(): RunContinuation {\n return this.progressRecord.payload;\n }\n}\n\n/** A revision-checked transition committed by the same owner as the retained history facts. */\nexport class ExecutionUpdate extends Schema.Class<ExecutionUpdate>(\n \"@effect-agent/thread/ExecutionUpdate\",\n)({\n previousRevision: Schema.Natural,\n checkpoint: ExecutionCheckpoint,\n /** Newly durable operational facts; capture and validate these before entering the writer. */\n facts: Schema.Array(RecordEnvelope).check(Schema.isMaxLength(8)),\n /** Delete current Run state in the same transaction as its authorized terminal publication. */\n retire: Schema.Boolean,\n}) {}\n\n/** A progress-only commit has no canonical records and does not advance the history tail. */\nexport class CommitBatch extends Schema.Class<CommitBatch>(\"@effect-agent/thread/CommitBatch\")({\n batchId: BatchId,\n producerId: ProducerId,\n records: Schema.Array(RecordEnvelope).check(Schema.isMaxLength(256)),\n}) {}\n\nexport class ExecutionRead extends Schema.Class<ExecutionRead>(\n \"@effect-agent/thread/ExecutionRead\",\n)({\n threadId: ThreadId,\n runId: RunId,\n}) {}\n\nexport class AppendRequest extends Schema.Class<AppendRequest>(\n \"@effect-agent/thread/AppendRequest\",\n)({\n threadId: ThreadId,\n batch: CommitBatch,\n executions: Schema.optionalKey(Schema.Array(ExecutionUpdate).check(Schema.isMaxLength(256))),\n expectedTailSequence: CanonicalSequence,\n}) {}\n\nconst AppendHeader = Schema.Struct({\n threadId: ThreadId,\n expectedTailSequence: CanonicalSequence,\n batchId: BatchId,\n producerId: ProducerId,\n});\n\nconst validateHeader = Schema.decodeUnknownSync(AppendHeader);\n\nconst validateRecordCount = Schema.decodeUnknownSync(\n Schema.Array(Schema.Unknown).check(Schema.isMaxLength(256)),\n);\n\nconst executionJson = Schema.fromJsonString(ExecutionUpdate);\nconst encodeExecution = Schema.encodeSync(executionJson);\nconst decodeExecution = Schema.decodeUnknownSync(ExecutionUpdate);\n\nconst capturedAppends = new WeakMap<AppendRequest, PreparedAppend>();\n\n/**\n * Admission reserves one complete batch's envelope, references, snapshot and continuation cursor.\n * Adapters supply their native offset byte bound. Dependency literals already occur in record\n * wire, so ordinary batches need only arithmetic; near the page limit, charge the exact references.\n */\nexport const canonicalBatchFitsTransfer = (\n threadId: ThreadId,\n batch: Pick<CommitBatch, \"batchId\" | \"records\">,\n batchBytes: number,\n maxOffsetBytes: number,\n): boolean => {\n const threadJson = JSON.stringify(threadId);\n const threadBytes = utf8ByteLength(threadJson);\n const batchIdBytes = utf8ByteLength(JSON.stringify(batch.batchId));\n\n // 128 bytes per envelope covers keys, sequence and punctuation. 128 KiB reserves the\n // maximum JSON-escaped cursor plus bounded snapshot, seal, digest and page metadata.\n const overhead =\n batch.records.length * (batchIdBytes + threadBytes + maxOffsetBytes + 128) +\n threadBytes +\n THREAD_EXPORT_METADATA_BYTES;\n\n if (2 * batchBytes + overhead + 2 <= MAX_THREAD_EXPORT_PAGE_BYTES) return true;\n\n const dependencyBytes = utf8ByteLength(JSON.stringify(transferRecordDependencies(batch.records)));\n\n return batchBytes + overhead + dependencyBytes <= MAX_THREAD_EXPORT_PAGE_BYTES;\n};\n\n/**\n * Adapter-owned append captured before writer acquisition can suspend. Record JSON\n * is shared by the batch and record rows. Privately owned facts and wire metadata\n * keep payloads, identities and validation stable across suspension; adapters persist the\n * captured strings rather than reconstructing bytes from caller-owned values.\n * Transport decoding intentionally returns an ordinary AppendRequest for fresh capture.\n */\nexport interface PreparedAppend extends AppendRequest {\n readonly batchJson: string;\n readonly batchBytes: number;\n readonly progress: ReadonlyArray<ProgressAppendRecord>;\n readonly executionWrites: ReadonlyArray<{\n readonly update: ExecutionUpdate;\n readonly json: string;\n /** Checkpoint wire from the same detached, validated execution capture. */\n readonly checkpointJson: string;\n readonly bytes: number;\n }>;\n readonly records: ReadonlyArray<{\n readonly recordId: RecordId;\n readonly recordJson: string;\n readonly recordBytes: number;\n readonly wire: RecordJson;\n readonly canonical: CanonicalBatch[\"records\"][number];\n }>;\n}\n\nexport const PreparedAppend = {\n capture: (input: AppendRequest): Effect.Effect<PreparedAppend, ThreadStoreError> =>\n Effect.suspend(() => {\n const existing = capturedAppends.get(input);\n\n if (existing !== undefined) return Effect.succeed(existing);\n\n return Effect.try({\n try: () => {\n const header = validateHeader({\n ...input,\n batchId: input.batch.batchId,\n producerId: input.batch.producerId,\n });\n\n validateRecordCount(input.batch.records);\n validateRecordCount(input.executions ?? []);\n\n const executionWrites = Object.freeze(\n (input.executions ?? []).map((update) => {\n const json = encodeExecution(update);\n const wire: unknown = JSON.parse(json);\n const decoded = decodeExecution(wire);\n\n if (!Predicate.hasProperty(wire, \"checkpoint\"))\n throw ThreadStoreError.make({\n operation: \"prepare durable commit\",\n message: \"Captured execution has no checkpoint wire\",\n });\n\n return Object.freeze({\n update: decoded,\n json,\n checkpointJson: JSON.stringify(wire.checkpoint),\n bytes: utf8ByteLength(json),\n });\n }),\n );\n\n if (input.batch.records.length === 0 && executionWrites.length === 0)\n throw ThreadStoreError.make({\n operation: \"prepare durable commit\",\n message: \"A commit must contain history facts or an active execution transition\",\n });\n if (executionWrites.some(({ bytes }) => !transferPageFits(header.threadId, bytes)))\n throw ThreadStoreError.make({\n operation: \"prepare durable commit\",\n message: \"Active state exceeds its bounded transfer representation\",\n });\n // Visit sparse slots too: capture owns each record's validation boundary.\n const encodings = Array.from(input.batch.records, captureRecord);\n const prefix = `{\"batchId\":${JSON.stringify(header.batchId)},\"producerId\":${JSON.stringify(header.producerId)},\"records\":[`;\n const batchJson = `${prefix}${encodings.map(({ json }) => json).join(\",\")}]}`;\n\n const batchBytes = encodings.reduce(\n (total, record) => total + record.bytes,\n utf8ByteLength(prefix) + (encodings.length === 0 ? 2 : encodings.length + 1),\n );\n\n if (batchBytes > MAX_CANONICAL_BATCH_BYTES)\n throw ThreadStoreError.make({\n operation: \"prepare canonical append\",\n message: `Canonical batch exceeds ${MAX_CANONICAL_BATCH_BYTES} bytes`,\n });\n\n const batch = Object.freeze(\n new CommitBatch(\n {\n batchId: header.batchId,\n producerId: header.producerId,\n records: Object.freeze(encodings.map(({ canonical }) => canonical)),\n },\n { disableChecks: true },\n ),\n );\n\n const request = new AppendRequest(\n {\n threadId: header.threadId,\n expectedTailSequence: header.expectedTailSequence,\n batch,\n ...(executionWrites.length === 0\n ? {}\n : { executions: Object.freeze(executionWrites.map(({ update }) => update)) }),\n },\n { disableChecks: true },\n );\n\n const records = Object.freeze(\n encodings.map(({ canonical, json, wire, bytes }) =>\n Object.freeze({\n recordId: canonical.recordId,\n recordJson: json,\n recordBytes: bytes,\n wire,\n canonical,\n }),\n ),\n );\n\n const progress = Object.freeze(encodings.map(({ progress }) => progress));\n\n const captured = Object.freeze(\n Object.assign(request, {\n batchJson,\n batchBytes,\n records,\n progress,\n executionWrites,\n }),\n );\n\n capturedAppends.set(captured, captured);\n\n return captured;\n },\n catch: (cause) =>\n Schema.is(ThreadStoreError)(cause)\n ? cause\n : ThreadStoreError.make({\n operation: \"prepare canonical append\",\n message: Schema.isSchemaError(cause)\n ? cause.message\n : \"Canonical append capture failed\",\n cause,\n }),\n });\n }),\n};\n\nexport class AppendResult extends Schema.Class<AppendResult>(\"@effect-agent/thread/AppendResult\")({\n firstSequence: CanonicalSequence,\n lastSequence: CanonicalSequence,\n replayed: Schema.Boolean,\n}) {}\n\nexport class ThreadRead extends Schema.Class<ThreadRead>(\"@effect-agent/thread/ThreadRead\")({\n threadId: ThreadId,\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: Schema.Natural.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1_024)),\n}) {}\n\n/** Sparse ordered history page at a fixed tail; no record-count limit on the whole range. */\nexport const ThreadPromptRead = Schema.Struct({\n ...ThreadRead.fields,\n throughSequence: CanonicalSequence,\n});\n\nexport type ThreadPromptRead = typeof ThreadPromptRead.Type;\n\n/** Closed native selections; mutable metadata is read at this exact canonical tail. */\nexport const ThreadSelection = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"RecordId\"), recordId: RecordId }),\n Schema.Struct({ _tag: Schema.Literal(\"RunInput\"), runId: RunId }),\n /** Exact original declaration indexed by its deterministic settlement identity. */\n Schema.Struct({\n _tag: Schema.Literal(\"ToolDeclaration\"),\n settlementRecordId: RecordId,\n throughSequence: CanonicalSequence,\n }),\n /** Only the selected Run's facts; unrelated Thread traffic cannot enlarge its suffix. */\n Schema.Struct({\n _tag: Schema.Literal(\"RunEvidence\"),\n runId: RunId,\n submissionId: SubmissionId,\n throughSequence: CanonicalSequence,\n }),\n /** Exact declaration, this call's facts, and shared approval proof from its original batch. */\n Schema.Struct({\n _tag: Schema.Literal(\"OperationEvidence\"),\n runId: RunId,\n toolCallId: ToolCallId,\n originRecordId: RecordId,\n approvalToolCallIds: Schema.Array(ToolCallId).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_RUN_TOOL_CALL_IDENTITIES),\n Schema.makeFilter((ids) => new Set(ids).size === ids.length),\n ),\n throughSequence: CanonicalSequence,\n }).check(\n Schema.makeFilter((selection) => selection.approvalToolCallIds.includes(selection.toolCallId)),\n ),\n Schema.Struct({\n _tag: Schema.Literal(\"LastAgentUpdate\"),\n throughSequence: CanonicalSequence,\n }),\n /** Sparse canonical pages; callers bound total evidence before building model metadata. */\n Schema.Struct({\n _tag: Schema.Literal(\"PromptEvidence\"),\n throughSequence: CanonicalSequence,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"LatestModelCompleted\"),\n throughSequence: CanonicalSequence,\n }),\n /** Latest application input; framework worker completion/update messages are excluded. */\n Schema.Struct({\n _tag: Schema.Literal(\"LatestApplicationInput\"),\n throughSequence: CanonicalSequence,\n }),\n /** Presence of durable ownership forbids an immediate-history writer on this Thread. */\n Schema.Struct({\n _tag: Schema.Literal(\"DurableHistoryOwner\"),\n throughSequence: CanonicalSequence,\n }),\n /** Latest rollover covering positions strictly before the addressed evidence. */\n Schema.Struct({\n _tag: Schema.Literal(\"ContextWindowBoundary\"),\n atSequence: CanonicalSequence,\n throughSequence: CanonicalSequence,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"DeliveryPredecessor\"),\n throughSequence: CanonicalSequence,\n }),\n /** Canonical creation/handoff intents retained independently of Run settlement. */\n Schema.Struct({\n _tag: Schema.Literal(\"WorkHandoffs\"),\n throughSequence: CanonicalSequence,\n }),\n /** Unresolved inputs only, selected through disposable work membership. */\n Schema.Struct({\n _tag: Schema.Literal(\"LiveWorkerInputs\"),\n throughSequence: CanonicalSequence,\n workerThreadId: Schema.optionalKey(ThreadId),\n }),\n /** A retained stop for the exact worker, independent of historical inputs. */\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerStop\"),\n workerThreadId: ThreadId,\n throughSequence: CanonicalSequence,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerExecution\"),\n expectedTailSequence: CanonicalSequence,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerState\"),\n expectedTailSequence: CanonicalSequence,\n sourceSubmissionId: Schema.optionalKey(SubmissionId),\n }),\n]);\n\nexport type ThreadSelection = typeof ThreadSelection.Type;\n\n/** Nested page makes an old ThreadRead decoder reject, never strip a selection into history. */\nexport const SelectedThreadRead = Schema.Struct({\n threadId: ThreadId,\n selection: ThreadSelection,\n page: Schema.Struct({\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: ThreadRead.fields.limit,\n }),\n});\n\nexport type SelectedThreadRead = typeof SelectedThreadRead.Type;\nexport const ThreadReadRequest = Schema.Union([SelectedThreadRead, ThreadRead]);\nexport type ThreadReadRequest = typeof ThreadReadRequest.Type;\n\nexport class ThreadObservation extends Schema.Class<ThreadObservation>(\n \"@effect-agent/thread/ThreadObservation\",\n)({\n threadId: ThreadId,\n afterOffset: Schema.optionalKey(ObservationOffset),\n}) {}\n\nexport class ThreadExportRequest extends Schema.Class<ThreadExportRequest>(\n \"@effect-agent/thread/ThreadExportRequest\",\n)({\n threadId: ThreadId,\n cursor: Schema.optionalKey(ThreadExportCursor),\n}) {}\n\nexport class ThreadTailRequest extends Schema.Class<ThreadTailRequest>(\n \"@effect-agent/thread/ThreadTailRequest\",\n)({\n threadId: ThreadId,\n}) {}\n\n/**\n * The committed tail of one Thread Log. A resuming producer composes its next\n * AppendRequest from this value instead of exporting the whole log.\n */\nexport class ThreadTail extends Schema.Class<ThreadTail>(\"@effect-agent/thread/ThreadTail\")({\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n}) {}\n\nexport class ThreadIdentityRequest extends Schema.Class<ThreadIdentityRequest>(\n \"@effect-agent/thread/ThreadIdentityRequest\",\n)({ threadId: ThreadId }) {}\n\n/**\n * One consistent snapshot: Thread ID, canonical tail, admission presence, first record,\n * exact worker origin, then exact subagent lineage. A row selected twice appears only\n * once. Missing identity records remain absent; the snapshot grants no execution authority.\n */\nexport class ThreadIdentity extends Schema.Class<ThreadIdentity>(\n \"@effect-agent/thread/ThreadIdentity\",\n)(\n Schema.Struct({\n ...ThreadTail.fields,\n /** Whether any admission is retained, including settled inputs and inputs not yet canonical. */\n hasAdmissions: Schema.Boolean,\n records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(3)),\n }).check(\n Schema.makeFilter((snapshot) => {\n if (snapshot.tailSequence === 0) return snapshot.records.length === 0;\n if (snapshot.records[0]?.sequence !== 1) return false;\n const origin = workerOriginRecordId(snapshot.threadId);\n const lineage = subagentLineageRecordId(snapshot.threadId);\n const ids = new Set<RecordId>();\n const sequences = new Set<CanonicalSequence>();\n let previous = -1;\n\n for (const entry of snapshot.records) {\n const rank =\n entry.sequence === 1\n ? 0\n : entry.record.recordId === origin\n ? 1\n : entry.record.recordId === lineage\n ? 2\n : -1;\n\n if (\n entry.threadId !== snapshot.threadId ||\n entry.sequence < 1 ||\n entry.sequence > snapshot.tailSequence ||\n rank <= previous ||\n ids.has(entry.record.recordId) ||\n sequences.has(entry.sequence)\n )\n return false;\n ids.add(entry.record.recordId);\n sequences.add(entry.sequence);\n previous = rank;\n }\n\n return true;\n }),\n ),\n) {}\n\n/** Immutable accepted input, distinct from all regenerable ledger execution state. */\nexport class ThreadAdmission extends Schema.Class<ThreadAdmission>(\n \"@effect-agent/thread/ThreadAdmission\",\n)({\n ...AdmissionRequest.fields,\n submissionId: SubmissionId,\n receiptId: ReceiptId,\n queueSequence: QueueSequence,\n createdAt: Schema.DateTimeUtcFromString,\n /** Stable closed Receipt timestamp; required for idle transfer, absent on active verification facts. */\n settledAt: Schema.optionalKey(Schema.DateTimeUtcFromString),\n}) {}\n\n/** Accepted operator commands are facts; their application markers are deliberately omitted. */\nexport const ThreadAbortFact = AbortIntent.mapFields(Struct.omit([\"canonicalRecordId\"]));\n\nexport const ThreadApprovalFact = ApprovalDecisionIntent.mapFields(\n Struct.omit([\"canonicalRecordId\"]),\n);\n\nexport const ThreadResolutionFact = UnknownResolutionIntent.mapFields(\n Struct.omit([\"canonicalRecordId\"]),\n);\n\nexport const ThreadCommands = Schema.Struct({\n aborts: Schema.Array(ThreadAbortFact).check(Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS)),\n approvals: Schema.Array(ThreadApprovalFact).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS),\n ),\n resolutions: Schema.Array(ThreadResolutionFact).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS),\n ),\n});\n\nexport const ThreadExportBatch = Schema.Struct({ batchId: BatchId, producerId: ProducerId });\n\n/** The wire is part of the export type: ordinary read envelopes are not lossless archives. */\nexport class ThreadExportRecord extends CanonicalRecordEnvelope.extend<ThreadExportRecord>(\n \"@effect-agent/thread/ThreadExportRecord\",\n)({\n record: ExportRecord,\n}) {}\n\n/** One bounded, batch-aligned page. An absent cursor alone marks a complete transfer. */\nexport class ThreadExport extends Schema.Class<ThreadExport>(\"@effect-agent/thread/ThreadExport\")({\n transferFormat: Schema.Literal(\"effect-agent/thread-transfer@4\"),\n format: Schema.NonEmptyString,\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n snapshot: ThreadExportSnapshot,\n /** Presence seals the restored inbox; a terminal reason also requires exact settled worker evidence. */\n workerSeal: Schema.optionalKey(ThreadWorkerSeal),\n /** Inclusive first canonical position, even on a page containing only other owner facts. */\n fromSequence: CanonicalSequence.check(Schema.isGreaterThan(0)),\n records: Schema.Array(ThreadExportRecord).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS),\n ),\n batches: Schema.Array(ThreadExportBatch).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS),\n ),\n admissions: Schema.Array(ThreadAdmission).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS),\n ),\n commands: ThreadCommands,\n /** Frozen delivery facts and outcomes; claims and leases are never transfer authority. */\n deliveries: Schema.Array(MessageDeliveryRecord).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_PAGE_RECORDS),\n ),\n cursor: Schema.optionalKey(ThreadExportCursor),\n /** Exact reference-bearing records identify cross-range recovery dependencies. */\n dependencies: Schema.Array(RecordId).check(Schema.isMaxLength(256 * 4_096)),\n}) {}\n\n/** Idle export authority. Applications quiesce external producers for the complete export. */\nexport class ThreadExportSource extends Context.Service<\n ThreadExportSource,\n Pick<ThreadStore[\"Service\"], \"export\">\n>()(\"@effect-agent/thread/ThreadExportSource\") {\n static layer() {\n return Layer.effect(\n ThreadExportSource,\n Effect.map(ThreadStore, (store) => ThreadExportSource.of({ export: store.export })),\n );\n }\n}\n\n/** Pull bounded idle pages. The caller keeps this Thread quiescent until the stream ends. */\nexport const streamExport = (request: ThreadExportRequest) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const source = yield* ThreadExportSource;\n let previous: ThreadExport | undefined;\n\n return Stream.paginate(request, (current) =>\n source.export(current).pipe(\n Effect.flatMap((page) => {\n if (\n page.threadId !== request.threadId ||\n (previous !== undefined &&\n (!Schema.toEquivalence(ThreadExportSnapshot)(page.snapshot, previous.snapshot) ||\n !Schema.toEquivalence(Schema.UndefinedOr(ThreadWorkerSeal))(\n page.workerSeal,\n previous.workerSeal,\n ) ||\n page.tailSequence !== previous.tailSequence ||\n page.fromSequence !==\n (previous.records.at(-1)?.sequence ?? previous.fromSequence - 1) + 1 ||\n (page.cursor !== undefined && page.cursor === current.cursor)))\n )\n return Effect.fail(\n ThreadStoreError.make({\n operation: \"stream Thread export\",\n message: \"Transfer snapshot or cursor is inconsistent\",\n }),\n );\n previous = page;\n\n return Effect.succeed([\n [page],\n page.cursor === undefined\n ? Option.none()\n : Option.some(\n ThreadExportRequest.make({ threadId: request.threadId, cursor: page.cursor }),\n ),\n ] as const);\n }),\n ),\n );\n }),\n );\n\n/**\n * A disposable projection snapshot. Adapters bind its sequence to a complete batch in the canonical\n * log; consumers decode `state` and decide projection compatibility before suffix replay.\n * Run recovery uses authoritative active checkpoints independently of these application snapshots.\n */\nexport class ThreadCheckpoint extends Schema.Class<ThreadCheckpoint>(\n \"@effect-agent/thread/ThreadCheckpoint\",\n)({\n schemaVersion: Schema.Literal(1),\n threadId: ThreadId,\n throughSequence: CanonicalSequence,\n state: PersistedJson,\n createdAt: Schema.DateTimeUtcFromString,\n}) {}\n\nexport class SaveCheckpointRequest extends Schema.Class<SaveCheckpointRequest>(\n \"@effect-agent/thread/SaveCheckpointRequest\",\n)({\n checkpoint: ThreadCheckpoint,\n}) {}\n\nexport class LoadCheckpointRequest extends Schema.Class<LoadCheckpointRequest>(\n \"@effect-agent/thread/LoadCheckpointRequest\",\n)({\n threadId: ThreadId,\n atOrBeforeSequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\n/** A bounded, disposable prior Prompt, checked against its captured historyDigest. */\nexport const MAX_PROMPT_CHECKPOINT_BYTES = 16 * 1024 * 1024;\n\n/** Maximum ordinary Runs between full prompt replacements and in a cold catch-up suffix. */\nexport const MAX_PROMPT_CHECKPOINT_RUNS = 16;\n\nexport const PromptCheckpointHead = Schema.Struct({\n version: Schema.Literal(2),\n recordFormat: Schema.Literal(CURRENT_RECORD_FORMAT),\n threadId: ThreadId,\n runId: RunId,\n throughSequence: CanonicalSequence,\n historyThrough: CanonicalSequence,\n priorHistoryLength: Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 16_384 })),\n historyDigest: Digest,\n});\n\nexport const PromptCheckpoint = Schema.Struct({\n ...PromptCheckpointHead.fields,\n /** Canonical JSON from Effect's Prompt codec; integrity is checked before decoding it. */\n promptJson: Schema.String.check(Schema.isMaxLength(MAX_PROMPT_CHECKPOINT_BYTES)),\n});\n\nexport type PromptCheckpoint = typeof PromptCheckpoint.Type;\n\nexport const PromptCheckpointRead = Schema.Struct({\n threadId: ThreadId,\n throughSequence: CanonicalSequence,\n});\n\nexport type PromptCheckpointRead = typeof PromptCheckpointRead.Type;\n\n/**\n * Optional cold-context acceleration, separate from application checkpoints. Save only after\n * canonical settlement. Replace the prior value atomically at the exact supplied sequence.\n * One process owns the Thread; import only targets empty Threads and atomically deletes these\n * derivatives. The runtime validates the content digest and a bounded suffix of completed Runs.\n * Any incompatible head, content digest or suffix is a cache miss.\n * Never export these bytes or use them as execution/compaction evidence.\n */\nexport interface PromptCheckpoints {\n readonly save: (checkpoint: PromptCheckpoint) => Effect.Effect<void, ThreadStoreError>;\n readonly load: (\n request: PromptCheckpointRead,\n ) => Effect.Effect<Option.Option<PromptCheckpoint>, ThreadStoreError>;\n}\n\n/**\n * Content-free storage provenance constructed by adapters from source-authored labels.\n * Raw foreign lookalikes are not trusted diagnostics. Never include rejected values, SQL,\n * or schema messages.\n */\nexport class ThreadStoreDiagnostic extends Schema.Class<ThreadStoreDiagnostic>(\n \"@effect-agent/thread/ThreadStoreDiagnostic\",\n)({\n causeTag: Schema.String.check(Schema.isMaxLength(128)),\n operation: Schema.String.check(Schema.isMaxLength(256)),\n decoder: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n issueTag: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n sequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\nexport class ThreadStoreError extends Schema.TaggedError<ThreadStoreError>()(\"ThreadStoreError\", {\n operation: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n diagnostic: Schema.optionalKey(ThreadStoreDiagnostic),\n}) {}\n\nexport class ThreadNotMaterialized extends Schema.TaggedError<ThreadNotMaterialized>()(\n \"ThreadNotMaterialized\",\n { threadId: ThreadId },\n) {}\n\n/** Export is Thread-local: external schedules, subscriptions and ingress are application-owned. */\nexport class ThreadExportRejected extends Schema.TaggedError<ThreadExportRejected>()(\n \"ThreadExportRejected\",\n {\n threadId: ThreadId,\n reason: Schema.Literals([\"non-idle\", \"source-changed\", \"live-import-source\"]),\n },\n) {\n override get message(): string {\n switch (this.reason) {\n case \"non-idle\":\n return `Thread ${this.threadId} is not idle; close its active owner and finish pending work before export.`;\n case \"source-changed\":\n return `Thread ${this.threadId} changed during export; keep the source quiescent and restart from the first page.`;\n case \"live-import-source\":\n return `Import requires a detached archive; finish exporting Thread ${this.threadId} before opening the destination transaction.`;\n }\n }\n}\n\n/**\n * A canonical append that cannot commit: `batch-content` replays a batch ID with different\n * content, `record-identity` reuses a canonical record ID, and `tail` declares a stale expected\n * tail. `stale-command` rejects a superseded operational request and must not be reprepared.\n * Tail conflicts carry the actual committed tail as a diagnostic resume hint.\n */\nexport class AppendConflict extends Schema.TaggedError<AppendConflict>()(\"AppendConflict\", {\n threadId: ThreadId,\n batchId: BatchId,\n reason: Schema.Literals([\"batch-content\", \"record-identity\", \"tail\", \"stale-command\"]),\n actualTailSequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\nexport class CheckpointRejected extends Schema.TaggedError<CheckpointRejected>()(\n \"CheckpointRejected\",\n {\n threadId: ThreadId,\n reason: Schema.Literals([\n \"ahead-of-tail\",\n \"not-batch-boundary\",\n \"unsupported-version\",\n \"corrupt\",\n ]),\n },\n) {}\n\nexport type ThreadStoreFailure =\n | ThreadStoreError\n | ThreadNotMaterialized\n | AppendConflict\n | OwnershipLost;\n\n/**\n * Optional, disposable projection storage. Neither history execution nor durable recovery\n * requires it. Adapters that offer it must bind every checkpoint to a canonical batch tail.\n * Application consumers own projection compatibility; this port does not interpret metadata.\n */\nexport interface ThreadCheckpoints {\n readonly save: (\n request: SaveCheckpointRequest,\n ) => Effect.Effect<void, ThreadStoreError | ThreadNotMaterialized | CheckpointRejected>;\n readonly load: (\n request: LoadCheckpointRequest,\n ) => Effect.Effect<\n Option.Option<ThreadCheckpoint>,\n ThreadStoreError | ThreadNotMaterialized | CheckpointRejected\n >;\n}\n\nexport class ThreadStore extends Context.Service<\n ThreadStore,\n {\n readonly lifecyclePublications?: LifecyclePublicationStorage;\n /** Native owner inventory and explicit canonical-index reconstruction. Absence fails closed. */\n readonly work?: ThreadWorkStorage;\n /** Bounded physical log ranges, independent of compaction and execution ownership. */\n readonly archives?: ThreadArchiveStorage;\n readonly verification?: ThreadVerificationStorage;\n readonly materialize: (request: ThreadMaterialization) => Effect.Effect<void, ThreadStoreError>;\n /**\n * Commit history and current execution atomically under the storage owner's mutation gate.\n * Only the latest active operational intent replays. Historical batches compare exact\n * canonical content; their prior operational intent is no longer retained.\n */\n readonly append: (\n request: AppendRequest,\n ) => Effect.Effect<\n AppendResult,\n ThreadStoreError | ThreadNotMaterialized | AppendConflict | OwnershipLost\n >;\n /** Authoritative current state only. Absence after settlement is normal; loss while active is corruption. */\n readonly readExecution: (\n request: ExecutionRead,\n ) => Effect.Effect<\n Option.Option<ExecutionCheckpoint>,\n ThreadStoreError | ThreadNotMaterialized\n >;\n /** Return immutable values decoded from privately owned canonical JSON. Unknown/Json\n * subgraphs must not retain caller/provider objects, accessors or oversized backing views.\n * Schema validation without canonical capture does not establish this ownership. */\n readonly read: (\n request: ThreadReadRequest,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n /** Decode only PromptRecord fields of PROMPT_EVIDENCE_TAGS, including archived ranges.\n * Bound raw hydration without shortening a page before its limit or captured range end.\n * Preserve read's canonical ownership contract, including nested Unknown/Json values.\n * The immutable source was validated on write; use read for integrity or execution evidence. */\n readonly readPrompt: (\n request: ThreadPromptRead,\n ) => Stream.Stream<PromptRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n readonly observe: (\n request: ThreadObservation,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n readonly export: (\n request: ThreadExportRequest,\n ) => Effect.Effect<\n ThreadExport,\n ThreadStoreError | ThreadNotMaterialized | ThreadExportRejected\n >;\n readonly inspectTail: (\n request: ThreadTailRequest,\n ) => Effect.Effect<ThreadTail, ThreadStoreError | ThreadNotMaterialized>;\n readonly readIdentity: (\n request: ThreadIdentityRequest,\n ) => Effect.Effect<ThreadIdentity, ThreadStoreError | ThreadNotMaterialized>;\n readonly readWorkerCapacity?: (\n request: ThreadWorkerCapacityRequest,\n ) => Effect.Effect<ThreadWorkerCapacity, ThreadStoreError | ThreadNotMaterialized>;\n /** Absent when this adapter does not support disposable checkpoints. */\n readonly checkpoints?: ThreadCheckpoints | undefined;\n readonly promptCheckpoints?: PromptCheckpoints | undefined;\n /** Indexed scalar count; unsupported adapters fail closed at the caller. */\n readonly countPeerMessages?:\n | ((\n request: ThreadPeerCountRequest,\n ) => Effect.Effect<number, ThreadStoreError | ThreadNotMaterialized>)\n | undefined;\n }\n>()(\"@effect-agent/thread/ThreadStore\") {}\n\n/** Canonical observation without append, materialization, or checkpoint mutation authority. */\nexport class ThreadReader extends Context.Service<\n ThreadReader,\n Pick<\n ThreadStore[\"Service\"],\n | \"read\"\n | \"readExecution\"\n | \"readPrompt\"\n | \"observe\"\n | \"export\"\n | \"inspectTail\"\n | \"readIdentity\"\n | \"countPeerMessages\"\n | \"readWorkerCapacity\"\n >\n>()(\"@effect-agent/thread/ThreadReader\") {\n static fromStore(store: ThreadStore[\"Service\"]): ThreadReader[\"Service\"] {\n return {\n read: store.read,\n readExecution: store.readExecution,\n readPrompt: store.readPrompt,\n observe: store.observe,\n export: store.export,\n inspectTail: store.inspectTail,\n readIdentity: store.readIdentity,\n ...(store.readWorkerCapacity === undefined\n ? {}\n : { readWorkerCapacity: store.readWorkerCapacity }),\n ...(store.countPeerMessages === undefined\n ? {}\n : { countPeerMessages: store.countPeerMessages }),\n };\n }\n\n /** Capture this assembly's store, independently of other local or routed stores. */\n static layer() {\n return Layer.effect(ThreadReader, Effect.map(ThreadStore, ThreadReader.fromStore));\n }\n}\n"],"mappings":"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"}
@@ -2,8 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { n as utf8ByteLength } from "./utf8-B5pAmhTo.mjs";
3
3
  import { f as CanonicalSequence } from "./Records-BiuJDWNe.mjs";
4
4
  import { r as canonicalJson } from "./Digest-DCuPlhNk.mjs";
5
- import { ExportRecord } from "./durable/RecordFormat.mjs";
6
- import { A as ThreadExportRejected, E as ThreadExport, M as ThreadExportSnapshot, X as ThreadStoreError, ft as transferRecordDependencies, j as ThreadExportRequest } from "./ThreadStore-B5sew3ir.mjs";
5
+ import { A as ThreadExportRejected, E as ThreadExport, M as ThreadExportSnapshot, X as ThreadStoreError, ft as transferRecordDependencies, j as ThreadExportRequest } from "./ThreadStore-CEekRa80.mjs";
7
6
  import { Context, Effect, Schema } from "effect";
8
7
  //#region src/durable/internal/thread-transfer-source.ts
9
8
  /** Installed before opening the source pull, so producer fibers observe the same phase. */
@@ -106,10 +105,9 @@ const exportThreadPage = Effect.fnUntraced(function* (input) {
106
105
  if (canonical.batches.length !== 1 || canonical.records.length === 0 || canonical.records.length > 256) return yield* failure("A transfer page must contain a complete bounded canonical batch");
107
106
  const batch = canonical.batches[0];
108
107
  for (const [index, entry] of canonical.records.entries()) if (entry.threadId !== request.threadId || entry.sequence !== fromSequence + index || entry.batchId !== batch.batchId) return yield* failure("Canonical batch identity or sequence mismatch");
109
- const records = yield* Effect.forEach(canonical.records, (entry) => Schema.encodeEffect(ExportRecord)(entry.record).pipe(Effect.mapError(() => failure("Canonical record lost its exact wire"))));
110
108
  position = {
111
109
  ...position,
112
- fromSequence: fromSequence + records.length
110
+ fromSequence: fromSequence + canonical.records.length
113
111
  };
114
112
  } else while (position.section < transferSections.length) {
115
113
  const section = transferSections[position.section];
@@ -153,4 +151,4 @@ const exportThreadPage = Effect.fnUntraced(function* (input) {
153
151
  //#endregion
154
152
  export { checkTransferPageBytes as a, transferDependencies as c, checkExportSource as i, transferSections as l, ThreadTransfer_exports as n, exportThreadPage as o, TransferManifest as r, sameTransferManifest as s, ThreadExporterReader as t, ImportSourcePhase as u };
155
153
 
156
- //# sourceMappingURL=ThreadTransfer-DeO03GBg.mjs.map
154
+ //# sourceMappingURL=ThreadTransfer-B4gTQLIl.mjs.map