@yielded/agent 0.1.0-beta.177 → 0.1.0-beta.179

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 (103) hide show
  1. package/dist/{Admin-Bpg24yCK.d.mts → Admin-NvXFPDIM.d.mts} +26 -6
  2. package/dist/{DurableAgentRuntime-CGW93k81.mjs → DurableAgentRuntime-CWhu1exp.mjs} +49 -69
  3. package/dist/DurableAgentRuntime-CWhu1exp.mjs.map +1 -0
  4. package/dist/{EventSource-A6TB7t-f.d.mts → EventSource-DNyaWmyQ.d.mts} +2 -2
  5. package/dist/{MessageDelivery-BkWrcQUd.d.mts → MessageDelivery-CLzWJImC.d.mts} +42 -42
  6. package/dist/{PreparedInputAdmission-DKIfqRZT.d.mts → PreparedInputAdmission-BQ9UCLFS.d.mts} +3 -3
  7. package/dist/{RunContinuation-D42RFqjS.mjs → RunContinuation-BF95Ncv2.mjs} +9 -11
  8. package/dist/RunContinuation-BF95Ncv2.mjs.map +1 -0
  9. package/dist/{RunContinuation-Ce2pR8VD.d.mts → RunContinuation-CL0wBsQE.d.mts} +3 -6
  10. package/dist/{RunStorage-BRGP3Tcu.mjs → RunStorage-DlfvMfHM.mjs} +20 -6
  11. package/dist/RunStorage-DlfvMfHM.mjs.map +1 -0
  12. package/dist/{Subscription-D5sOrmlI.d.mts → Subscription-D2yn6Eo3.d.mts} +2 -2
  13. package/dist/{SubscriptionInput-CxSXZUiC.d.mts → SubscriptionInput-Cog4x7Rd.d.mts} +2 -2
  14. package/dist/{ThreadImport-DUcPj5jC.mjs → ThreadImport-BoTfjjrz.mjs} +4 -4
  15. package/dist/{ThreadImport-DUcPj5jC.mjs.map → ThreadImport-BoTfjjrz.mjs.map} +1 -1
  16. package/dist/{ThreadImport-C6IiPJMW.d.mts → ThreadImport-em89zmM-.d.mts} +4 -4
  17. package/dist/{ThreadStore-Cn6FDWX9.mjs → ThreadStore-D2rqtt7k.mjs} +13 -8
  18. package/dist/ThreadStore-D2rqtt7k.mjs.map +1 -0
  19. package/dist/{ThreadTransfer-BWnAHIge.mjs → ThreadTransfer-BFolkpEp.mjs} +2 -2
  20. package/dist/{ThreadTransfer-BWnAHIge.mjs.map → ThreadTransfer-BFolkpEp.mjs.map} +1 -1
  21. package/dist/{WorkerAdmission-cfiK9aRi.mjs → WorkerAdmission-CtX1HRkm.mjs} +2 -2
  22. package/dist/{WorkerAdmission-cfiK9aRi.mjs.map → WorkerAdmission-CtX1HRkm.mjs.map} +1 -1
  23. package/dist/capabilities/BrowserUse.d.mts +36 -18
  24. package/dist/capabilities/BrowserUse.mjs +43 -11
  25. package/dist/capabilities/BrowserUse.mjs.map +1 -1
  26. package/dist/capabilities/CodeMode.mjs +1 -0
  27. package/dist/capabilities/CodeMode.mjs.map +1 -1
  28. package/dist/durable/Admin.d.mts +1 -1
  29. package/dist/durable/AgentRegistration.d.mts +1 -1
  30. package/dist/durable/Certification.d.mts +1 -1
  31. package/dist/durable/CommittedActivity.d.mts +1 -1
  32. package/dist/durable/CommittedActivity.mjs +1 -1
  33. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  34. package/dist/durable/DurableAgentRuntime.mjs +2 -2
  35. package/dist/durable/EventSource.d.mts +1 -1
  36. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  37. package/dist/durable/LifecyclePublication.d.mts +1 -1
  38. package/dist/durable/LifecyclePublication.mjs +1 -1
  39. package/dist/durable/MessageDelivery.d.mts +1 -1
  40. package/dist/durable/MessageDeliveryStoreConformance.d.mts +2 -2
  41. package/dist/durable/PersistentHistory.d.mts +1 -1
  42. package/dist/durable/PersistentHistory.mjs +2 -2
  43. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  44. package/dist/durable/Recovery.d.mts +1 -1
  45. package/dist/durable/RunContinuation.d.mts +2 -2
  46. package/dist/durable/RunContinuation.mjs +2 -2
  47. package/dist/durable/RunJournal.d.mts +1 -1
  48. package/dist/durable/RunStorage.d.mts +1 -1
  49. package/dist/durable/RunStorage.mjs +1 -1
  50. package/dist/durable/Scheduling.d.mts +1 -1
  51. package/dist/durable/SettlementPublisher.d.mts +1 -1
  52. package/dist/durable/SettlementPublisher.mjs +1 -1
  53. package/dist/durable/SubmissionLedger.d.mts +1 -1
  54. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  55. package/dist/durable/SubmissionLedgerConformance.mjs +2 -2
  56. package/dist/durable/SubmissionStatus.d.mts +1 -1
  57. package/dist/durable/Subscription.d.mts +1 -1
  58. package/dist/durable/SubscriptionInput.d.mts +1 -1
  59. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  60. package/dist/durable/SubscriptionTools.d.mts +2 -2
  61. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  62. package/dist/durable/Subscriptions.d.mts +5 -5
  63. package/dist/durable/ThreadArchiveRange.d.mts +1 -1
  64. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  65. package/dist/durable/ThreadContextHistory.mjs +1 -1
  66. package/dist/durable/ThreadImport.d.mts +1 -1
  67. package/dist/durable/ThreadImport.mjs +1 -1
  68. package/dist/durable/ThreadInvariants.d.mts +3 -3
  69. package/dist/durable/ThreadInvariants.mjs +3 -3
  70. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  71. package/dist/durable/ThreadReader.d.mts +1 -1
  72. package/dist/durable/ThreadReader.mjs +1 -1
  73. package/dist/durable/ThreadStore.d.mts +2 -2
  74. package/dist/durable/ThreadStore.mjs +2 -2
  75. package/dist/durable/ThreadStoreConformance.d.mts +2 -1
  76. package/dist/durable/ThreadStoreConformance.mjs +2 -2
  77. package/dist/durable/ThreadTransfer.d.mts +1 -1
  78. package/dist/durable/ThreadTransfer.mjs +1 -1
  79. package/dist/durable/ThreadWork.d.mts +1 -1
  80. package/dist/durable/ThreadWork.mjs +2 -2
  81. package/dist/durable/WorkerAdmission.d.mts +1 -1
  82. package/dist/durable/WorkerAdmission.mjs +1 -1
  83. package/dist/durable/WorkerHost.d.mts +1 -1
  84. package/dist/index.d.mts +8 -8
  85. package/dist/index.mjs +6 -6
  86. package/dist/{run-context-reader-BtBPX_nC.d.mts → run-context-reader-kpO9xhP2.d.mts} +2 -2
  87. package/dist/sandbox/CodeExecutor.d.mts +3 -1
  88. package/dist/sandbox/CodeExecutor.mjs +3 -1
  89. package/dist/sandbox/CodeExecutor.mjs.map +1 -1
  90. package/package.json +1 -1
  91. package/src/capabilities/BrowserUse.ts +53 -15
  92. package/src/capabilities/CodeMode.ts +1 -0
  93. package/src/durable/DurableAgentRuntime.ts +78 -143
  94. package/src/durable/RunContinuation.ts +44 -32
  95. package/src/durable/RunStorage.ts +56 -15
  96. package/src/durable/ThreadStore.ts +11 -0
  97. package/src/durable/internal/prompt-history-cache.ts +19 -3
  98. package/src/durable/internal/record-encoding.ts +8 -7
  99. package/src/sandbox/CodeExecutor.ts +3 -1
  100. package/dist/DurableAgentRuntime-CGW93k81.mjs.map +0 -1
  101. package/dist/RunContinuation-D42RFqjS.mjs.map +0 -1
  102. package/dist/RunStorage-BRGP3Tcu.mjs.map +0 -1
  103. package/dist/ThreadStore-Cn6FDWX9.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunStorage-DlfvMfHM.mjs","names":[],"sources":["../src/durable/internal/StorageOwner.ts","../src/durable/RunStorage.ts"],"sourcesContent":["import { Context, Effect, Option, Semaphore, type Scope } from \"effect\";\n\nimport type { ThreadId } from \"../../core/Identifiers.ts\";\nimport { type Claim, LedgerError, OwnershipLost } from \"../SubmissionLedger.ts\";\n\nexport type MutationGate = <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;\n\n/** Local capability only. It is never encoded, persisted, or reconstructed from an Attempt ID. */\nexport interface OwnerGeneration {\n readonly claim: Claim;\n readonly identity: object;\n readonly checkActive: Effect.Effect<void, OwnershipLost>;\n readonly release: Effect.Effect<void>;\n readonly use: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | OwnershipLost, R>;\n}\n\nexport interface StorageOwnerService {\n readonly identity: object;\n readonly withMutation: MutationGate;\n readonly withProgress: <A, E, R>(\n threadId: ThreadId,\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E, R>;\n readonly isClosed: () => boolean;\n readonly hasOwner: (threadId: string, submissionId?: string) => boolean;\n /** Trusted administrative retirement, while holding the same mutation gate. */\n readonly closeSubmission: (threadId: string, submissionId: string) => void;\n readonly acquire: <E, R>(\n threadId: ThreadId,\n select: Effect.Effect<Option.Option<Claim>, E, R>,\n ) => Effect.Effect<Option.Option<OwnerGeneration>, E | LedgerError, R | Scope.Scope>;\n}\n\nexport class StorageOwner extends Context.Service<StorageOwner, StorageOwnerService>()(\n \"@effect-agent/durable/StorageOwner\",\n) {}\n\nconst ActiveOwner = Context.Reference<object | undefined>(\n \"@effect-agent/durable/internal/ActiveStorageOwner\",\n { defaultValue: () => undefined },\n);\n\nconst ActiveProgress = Context.Reference<\n { readonly owner: object; readonly threadId: ThreadId } | undefined\n>(\"@effect-agent/durable/internal/ActiveProgress\", { defaultValue: () => undefined });\n\n/** Reuse the physical owner's gate; reentrant calls remain in the same mutation. */\nexport const makeStorageOwner = Effect.fnUntraced(function* (gate: MutationGate) {\n const identity = {};\n let closed = false;\n const progress = new Map<ThreadId, { readonly gate: Semaphore.Semaphore; users: number }>();\n const active = new Map<string, { readonly claim: Claim; closed: boolean }>();\n\n const withMutation: MutationGate = (effect) =>\n Effect.withFiber((fiber) => {\n const current = fiber.getRef(ActiveOwner);\n\n return current === identity\n ? effect\n : gate(Effect.provideService(effect, ActiveOwner, identity));\n });\n\n yield* Effect.addFinalizer(() =>\n withMutation(\n Effect.sync(() => {\n closed = true;\n for (const entry of active.values()) entry.closed = true;\n active.clear();\n }),\n ),\n );\n\n return StorageOwner.of({\n identity,\n withMutation,\n withProgress: (threadId, effect) =>\n Effect.withFiber((fiber) => {\n const current = fiber.getRef(ActiveProgress);\n\n if (current?.owner === identity && current.threadId === threadId) return effect;\n\n return Effect.suspend(() => {\n let entry = progress.get(threadId);\n\n if (entry === undefined) {\n entry = { gate: Semaphore.makeUnsafe(1), users: 0 };\n progress.set(threadId, entry);\n }\n const retained = entry;\n\n retained.users++;\n\n return retained.gate\n .withPermits(1)(\n Effect.provideService(effect, ActiveProgress, { owner: identity, threadId }),\n )\n .pipe(\n Effect.ensuring(\n Effect.sync(() => {\n retained.users--;\n if (retained.users === 0 && progress.get(threadId) === retained)\n progress.delete(threadId);\n }),\n ),\n );\n });\n }),\n isClosed: () => closed,\n hasOwner: (threadId, submissionId) => {\n const entry = active.get(threadId);\n\n return (\n !closed &&\n entry !== undefined &&\n !entry.closed &&\n (submissionId === undefined || entry.claim.submissionId === submissionId)\n );\n },\n closeSubmission: (threadId, submissionId) => {\n const entry = active.get(threadId);\n\n if (entry?.claim.submissionId !== submissionId) return;\n entry.closed = true;\n active.delete(threadId);\n },\n acquire: (threadId, select) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const selected = yield* withMutation(\n Effect.gen(function* () {\n if (closed)\n return yield* LedgerError.make({\n operation: \"claim\",\n message: \"Storage owner is closed\",\n });\n if (active.has(threadId)) return Option.none<OwnerGeneration>();\n const selected = yield* select;\n\n if (Option.isNone(selected)) return Option.none<OwnerGeneration>();\n const entry = { claim: selected.value, closed: false };\n\n active.set(threadId, entry);\n\n const checkActive = Effect.suspend(() =>\n closed || entry.closed || active.get(threadId) !== entry\n ? Effect.fail(OwnershipLost.make({ submissionId: entry.claim.submissionId }))\n : Effect.void,\n );\n\n const release = withMutation(\n Effect.sync(() => {\n entry.closed = true;\n if (active.get(threadId) === entry) active.delete(threadId);\n }),\n );\n\n return Option.some<OwnerGeneration>({\n claim: entry.claim,\n identity: entry,\n checkActive,\n release,\n use: (effect) => withMutation(Effect.andThen(checkActive, effect)),\n });\n }),\n );\n\n if (Option.isNone(selected)) return selected;\n // A closed Scope runs this immediately. Never register while holding a nonlocal gate.\n yield* Effect.addFinalizer(() => selected.value.release);\n\n return yield* restore(Effect.succeed(selected));\n }),\n ),\n });\n});\n","import type { Scope } from \"effect\";\nimport { Cause, Context, Effect, Layer, Option, Schema } from \"effect\";\n\nimport type { SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport { StorageOwner } from \"./internal/StorageOwner.ts\";\nimport type { CanonicalBatch, CanonicalSequence } from \"./Records.ts\";\nimport {\n SettlementPublication,\n type SettlementPublicationFailure,\n type SettlementPublicationResult,\n SettlementPublisher,\n} from \"./SettlementPublisher.ts\";\nimport {\n AttachChildToReservationRequest,\n ChildBudgetReservationRequest,\n ClaimJoiningRequest,\n type Claim,\n type ClaimRequest,\n type InputAppliedMarker,\n type RecoverySnapshot,\n RecoverySnapshotRequest,\n LedgerError,\n MarkInputAppliedRequest,\n MarkJoinedRequest,\n OwnershipLost,\n RevertJoiningRequest,\n SettlementConflict,\n SubmissionLedger,\n SuspendRequest,\n type SuspensionReason,\n} from \"./SubmissionLedger.ts\";\nimport {\n type AppendResult,\n AppendConflict,\n AppendRequest,\n type CommitBatch,\n type ExecutionUpdate,\n PreparedAppend,\n FreshRunRead,\n type ThreadIdentity,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadStore,\n ThreadStoreError,\n type ThreadStoreFailure,\n ThreadTailRequest,\n} from \"./ThreadStore.ts\";\n\nexport {\n StorageOwner,\n makeStorageOwner,\n type MutationGate,\n type OwnerGeneration,\n type StorageOwnerService,\n} from \"./internal/StorageOwner.ts\";\n\nexport const RunChildBudgetReservation = Schema.Struct({\n reservationId: ChildBudgetReservationRequest.fields.reservationId,\n parentToolCallId: ChildBudgetReservationRequest.fields.parentToolCallId,\n allocation: ChildBudgetReservationRequest.fields.allocation,\n allocationDigest: ChildBudgetReservationRequest.fields.allocationDigest,\n});\n\nexport type RunChildBudgetReservation = typeof RunChildBudgetReservation.Type;\n\nexport const RunChildAttachment = Schema.Struct({\n reservationId: AttachChildToReservationRequest.fields.reservationId,\n childSubmissionId: AttachChildToReservationRequest.fields.childSubmissionId,\n});\n\nexport type RunChildAttachment = typeof RunChildAttachment.Type;\n\n/** Commands bound to one local scoped owner. No authority is transported in their values. */\nexport interface RunOwnership {\n readonly release: Effect.Effect<void>;\n readonly markInputApplied: (\n marker: InputAppliedMarker,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"markInputApplied\"]>;\n readonly claimJoining: (\n maxCount: number,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"claimJoining\"]>;\n readonly markJoined: (\n submissionId: SubmissionId,\n marker: InputAppliedMarker,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"markJoined\"]>;\n readonly revertJoining: (\n submissionId: SubmissionId,\n ) => Effect.Effect<void, LedgerError | OwnershipLost>;\n readonly suspend: (\n reason: SuspensionReason,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"suspend\"]>;\n readonly reserveChildBudget: (\n request: RunChildBudgetReservation,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"reserveChildBudget\"]>;\n readonly attachChildToReservation: (\n request: RunChildAttachment,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"attachChildToReservation\"]>;\n}\n\nexport interface RunWriter {\n readonly threadId: ThreadId;\n /** Opaque cache identity for this local writer lifetime; never portable authority. */\n readonly generation: object;\n readonly refresh: Effect.Effect<void, ThreadStoreFailure>;\n readonly withProgress: <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | ThreadStoreFailure, R>;\n readonly tail: Effect.Effect<{ readonly sequence: CanonicalSequence }>;\n /** Uncertain commit failures close this session before another command may enter. */\n readonly append: (\n batch: CommitBatch,\n executions?: ReadonlyArray<ExecutionUpdate>,\n ) => Effect.Effect<AppendResult, ThreadStoreFailure>;\n /** Recheck the captured local capability after preflight, immediately before effect dispatch. */\n readonly checkActive: Effect.Effect<void, ThreadStoreFailure>;\n}\n\nexport interface RunStorageSession extends RunWriter, RunOwnership {\n readonly claim: Claim;\n /** Atomic original input/context plus the ledger marker, when the adapter supports it. */\n readonly appendInput?: RunWriter[\"append\"];\n /** Read current controls, root identity and empty-Run evidence under this owner.\n * Its tail is adopted by the writer; append still checks the tail and revision. */\n readonly prepareStart?: Effect.Effect<\n { readonly snapshot: RecoverySnapshot; readonly identity: ThreadIdentity } | undefined,\n LedgerError | ThreadStoreFailure\n >;\n readonly refresh: Effect.Effect<void, ThreadStoreFailure>;\n readonly publishSettlement: (\n batch: CanonicalBatch,\n executions?: ReadonlyArray<ExecutionUpdate>,\n ) => Effect.Effect<SettlementPublicationResult, SettlementPublicationFailure>;\n}\n\nexport class RunStorage extends Context.Service<\n RunStorage,\n {\n readonly publishSettlement: SettlementPublisher[\"Service\"][\"publish\"];\n readonly claim: (\n request: ClaimRequest,\n ) => Effect.Effect<\n Option.Option<RunStorageSession>,\n LedgerError | ThreadStoreFailure,\n Scope.Scope\n >;\n }\n>()(\"@effect-agent/thread/RunStorage\") {}\n\n/** One writer's scoped capability, selected at claim or administrative construction. */\nclass WriterOwnership extends Context.Service<\n WriterOwnership,\n {\n readonly identity: object;\n readonly checkActive: Effect.Effect<void, ThreadStoreFailure>;\n readonly release: Effect.Effect<void>;\n }\n>()(\"@effect-agent/durable/internal/WriterOwnership\") {}\n\nconst isDefiniteWriteRefusal = Schema.is(\n Schema.Union([AppendConflict, OwnershipLost, SettlementConflict, ThreadNotMaterialized]),\n);\n\nconst isDefiniteWriteFailure = (cause: Cause.Cause<unknown>) =>\n cause.reasons.length > 0 &&\n cause.reasons.every(\n (reason) => Cause.isFailReason(reason) && isDefiniteWriteRefusal(reason.error),\n );\n\nconst makeWriter = Effect.fnUntraced(function* (threadId: ThreadId) {\n const store = yield* ThreadStore;\n const owner = yield* StorageOwner;\n const ownership = yield* WriterOwnership;\n const checkActive = ownership.checkActive;\n const initial = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));\n let tail = { sequence: initial.tailSequence };\n\n const refresh = owner.withMutation(\n Effect.gen(function* () {\n yield* checkActive;\n const current = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));\n\n tail = { sequence: current.tailSequence };\n }),\n );\n\n const makeAppend = Effect.gen(function* () {\n const publisher = yield* ThreadStore;\n\n const append: RunWriter[\"append\"] = Effect.fnUntraced(function* (batch, executions) {\n const captured = yield* PreparedAppend.capture({\n threadId,\n expectedTailSequence: tail.sequence,\n batch,\n ...(executions === undefined ? {} : { executions }),\n }).pipe(\n Effect.mapError((cause) =>\n ThreadStoreError.make({\n operation: \"capture append\",\n message: cause.message,\n cause,\n }),\n ),\n );\n\n return yield* owner.withProgress(\n threadId,\n owner.withMutation(\n Effect.gen(function* () {\n yield* checkActive;\n for (let retries = 0; ; retries++) {\n const result = yield* publisher\n .append(\n captured.expectedTailSequence === tail.sequence\n ? captured\n : AppendRequest.make({\n ...captured,\n expectedTailSequence: tail.sequence,\n }),\n )\n .pipe(\n Effect.catchTag(\"AppendConflict\", (conflict) => {\n if (\n conflict.reason !== \"tail\" ||\n conflict.actualTailSequence === undefined ||\n retries >= 8\n )\n return Effect.fail(conflict);\n tail = { sequence: conflict.actualTailSequence };\n if (captured.executions !== undefined) return Effect.fail(conflict);\n\n return Effect.succeed(undefined);\n }),\n );\n\n if (result === undefined) continue;\n // A historical replay returns its original coordinates, not today's canonical tail.\n if (result.replayed) yield* refresh;\n else tail = { sequence: result.lastSequence };\n\n return result;\n }\n }).pipe(\n // Revoke uncertain writes before releasing the writer's mutation gate.\n Effect.onError((cause) =>\n isDefiniteWriteFailure(cause) ? Effect.void : ownership.release,\n ),\n ),\n ),\n );\n });\n\n return append;\n });\n\n const writer = {\n threadId,\n generation: ownership.identity,\n withProgress: <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n owner.withProgress(threadId, Effect.andThen(checkActive, effect)),\n tail: Effect.sync(() => tail),\n append: yield* makeAppend,\n checkActive: owner.withMutation(checkActive),\n refresh,\n };\n\n return {\n writer,\n makeAppend,\n adoptTail: (sequence: CanonicalSequence) => {\n tail = { sequence };\n },\n };\n});\n\n/** Trusted administrative writer sharing the physical owner's gate and lifetime. */\nexport const makeRunWriter = Effect.fnUntraced(function* (threadId: ThreadId) {\n const owner = yield* StorageOwner;\n\n return (yield* makeWriter(threadId).pipe(\n Effect.provideService(WriterOwnership, {\n identity: owner.identity,\n checkActive: Effect.suspend(() =>\n owner.isClosed()\n ? Effect.fail(\n ThreadStoreError.make({\n operation: \"write Thread\",\n message: \"Storage owner is closed\",\n }),\n )\n : Effect.void,\n ),\n release: Effect.void,\n }),\n )).writer;\n});\n\n/** The same scoped single-owner protocol is used by every adapter. */\nexport const make = Effect.gen(function* () {\n const ledger = yield* SubmissionLedger;\n const store = yield* ThreadStore;\n const publisher = yield* SettlementPublisher;\n const owner = yield* StorageOwner;\n\n const claim: RunStorage[\"Service\"][\"claim\"] = (request) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const granted = yield* owner.acquire(request.threadId, ledger.selectHead(request));\n\n if (Option.isNone(granted)) return Option.none();\n const generation = granted.value;\n const claimed = generation.claim;\n\n return yield* restore(\n Effect.gen(function* () {\n if (\n request.handoff !== undefined &&\n request.handoff.submissionId !== claimed.submissionId\n )\n return yield* LedgerError.make({\n operation: \"claim handoff\",\n message: \"The submission adapter did not honor the requested handoff\",\n });\n yield* store.materialize(ThreadMaterialization.make({ threadId: request.threadId }));\n\n const { writer, makeAppend, adoptTail } = yield* makeWriter(request.threadId).pipe(\n Effect.provideService(WriterOwnership, generation),\n Effect.provideService(ThreadStore, store),\n Effect.provideService(StorageOwner, owner),\n );\n\n const owned = <A, E>(effect: Effect.Effect<A, E>) => generation.use(effect);\n\n const inputPublisher = ledger.appendInput;\n\n const appendInput =\n inputPublisher === undefined\n ? undefined\n : yield* makeAppend.pipe(\n Effect.provideService(ThreadStore, {\n ...store,\n append: (request) => inputPublisher(claimed.submissionId, request),\n }),\n );\n\n const session: RunStorageSession = {\n ...writer,\n claim: claimed,\n ...(appendInput === undefined ? {} : { appendInput }),\n ...(store.readFreshRun === undefined || appendInput === undefined\n ? {}\n : {\n prepareStart: owner.withProgress(\n request.threadId,\n generation.use(\n Effect.gen(function* () {\n const snapshot = yield* ledger.loadRecoverySnapshot(\n RecoverySnapshotRequest.make({ submissionId: claimed.submissionId }),\n );\n\n const submission = snapshot.submission;\n\n if (\n submission.threadId !== request.threadId ||\n submission.state !== \"ready\" ||\n submission.workerAdmission !== undefined ||\n submission.messageAdmission !== undefined ||\n submission.parentLinkage !== undefined ||\n snapshot.inputApplied !== undefined ||\n snapshot.abortIntent !== undefined ||\n snapshot.approvalDecisions.length !== 0\n )\n return undefined;\n\n const identity = yield* store.readFreshRun!(\n FreshRunRead.make({\n threadId: request.threadId,\n submissionId: claimed.submissionId,\n }),\n );\n\n if (Option.isNone(identity)) return undefined;\n adoptTail(identity.value.tailSequence);\n\n return { snapshot, identity: identity.value };\n }),\n ),\n ),\n }),\n release: generation.release,\n refresh: writer.refresh,\n markInputApplied: (marker) =>\n owned(\n ledger.markInputApplied(\n MarkInputAppliedRequest.make({\n ...marker,\n submissionId: claimed.submissionId,\n }),\n ),\n ),\n claimJoining: (maxCount) =>\n owned(\n ledger.claimJoining(\n ClaimJoiningRequest.make({\n threadId: request.threadId,\n hostSubmissionId: claimed.submissionId,\n maxCount,\n }),\n ),\n ),\n markJoined: (submissionId, marker) =>\n owned(\n ledger.markJoined(\n MarkJoinedRequest.make({\n ...marker,\n submissionId,\n }),\n ),\n ),\n revertJoining: (submissionId) =>\n owned(\n ledger.revertJoining(\n RevertJoiningRequest.make({\n submissionId,\n guard: { hostSubmissionId: claimed.submissionId },\n }),\n ),\n ),\n suspend: (reason) =>\n owned(\n ledger\n .suspend(\n SuspendRequest.make({\n submissionId: claimed.submissionId,\n reason,\n }),\n )\n .pipe(\n Effect.tap((outcome) =>\n outcome === \"suspended\" ? generation.release : Effect.void,\n ),\n ),\n ),\n publishSettlement: Effect.fnUntraced(function* (batch, executions) {\n const captured = yield* PreparedAppend.capture(\n AppendRequest.make({\n threadId: request.threadId,\n expectedTailSequence: (yield* writer.tail).sequence,\n batch,\n ...(executions === undefined ? {} : { executions }),\n }),\n ).pipe(\n Effect.mapError((cause) =>\n LedgerError.make({\n operation: \"capture settlement\",\n message: cause.message,\n cause,\n }),\n ),\n );\n\n return yield* owner.withProgress(\n request.threadId,\n owned(\n Effect.gen(function* () {\n for (let retries = 0; ; retries++) {\n const result = yield* publisher\n .publish(\n SettlementPublication.make({\n submissionId: claimed.submissionId,\n authority: { _tag: \"Owned\" },\n append: AppendRequest.make({\n ...captured,\n expectedTailSequence: (yield* writer.tail).sequence,\n }),\n }),\n )\n .pipe(\n Effect.catchTag(\"AppendConflict\", (conflict) => {\n if (\n conflict.reason !== \"tail\" ||\n conflict.actualTailSequence === undefined ||\n retries >= 8\n )\n return Effect.fail(conflict);\n\n return writer.refresh.pipe(\n Effect.andThen(\n captured.executions === undefined\n ? Effect.succeed(undefined)\n : Effect.fail(conflict),\n ),\n );\n }),\n );\n\n if (result === undefined) continue;\n adoptTail(result.tailSequence);\n\n return result;\n }\n }).pipe(\n Effect.onError((cause) =>\n isDefiniteWriteFailure(cause) ? Effect.void : generation.release,\n ),\n ),\n ),\n );\n }),\n reserveChildBudget: (value) =>\n owned(\n ledger.reserveChildBudget(\n ChildBudgetReservationRequest.make({\n ...value,\n parentSubmissionId: claimed.submissionId,\n }),\n ),\n ),\n attachChildToReservation: (value) =>\n owned(ledger.attachChildToReservation(AttachChildToReservationRequest.make(value))),\n };\n\n return Option.some(session);\n }).pipe(Effect.onError(() => generation.release)),\n );\n }),\n );\n\n return RunStorage.of({ claim, publishSettlement: publisher.publish });\n});\n\nexport const layer = () => Layer.effect(RunStorage, make);\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { a as Receipt, r as Principal } from "./Receipt-BkM21Qiu.mjs";
3
3
  import { r as Update } from "./AgentUpdates-DksV4D0A.mjs";
4
4
  import { t as AgentPolicy } from "./AgentPolicy-B4lbCU2T.mjs";
5
5
  import { S as Digest, b as DefinitionDigests } from "./Records-BTnGRdcf.mjs";
6
- import "./Admin-Bpg24yCK.mjs";
6
+ import "./Admin-NvXFPDIM.mjs";
7
7
  import { t as ScheduleAuthorizationDecision } from "./Schedule-CDgTz0vj.mjs";
8
8
  import { Context, Effect, Schema } from "effect";
9
9
  declare namespace Subscription_d_exports {
@@ -988,4 +988,4 @@ declare const subscriptionKeyString: (key: SubscriptionKey) => string;
988
988
  declare const subscriptionDeliveryKeyString: (key: SubscriptionDeliveryKey) => string;
989
989
  //#endregion
990
990
  export { defaultSubscriptionLimits as A, SubscriptionScanCursors as C, SubscriptionStore as D, SubscriptionSourceError as E, subscriptionKeyString as M, SubscriptionStoreFailure as O, SubscriptionRetentionPolicy as S, SubscriptionSnapshot as T, SubscriptionKey as _, PreparedInput as a, SubscriptionRecord as b, SubscriptionAuthorizer as c, SubscriptionDelivery as d, SubscriptionDeliveryKey as f, SubscriptionFailpointError as g, SubscriptionFailpoint as h, EventSourceVersion as i, subscriptionDeliveryKeyString as j, Subscription_d_exports as k, SubscriptionChange as l, SubscriptionError as m, DeliveryChange as n, SourcePartition as o, SubscriptionDeliverySnapshot as p, EventAcknowledgement as r, SourceRecovery as s, AcceptedEvent as t, SubscriptionConfiguration as u, SubscriptionLimits as v, SubscriptionScope as w, SubscriptionRefusal as x, SubscriptionName as y };
991
- //# sourceMappingURL=Subscription-D5sOrmlI.d.mts.map
991
+ //# sourceMappingURL=Subscription-D2yn6Eo3.d.mts.map
@@ -1,6 +1,6 @@
1
1
  import { t as AgentId } from "./Identifiers-CN2s30fF.mjs";
2
2
  import { K as PersistedJson, b as DefinitionDigests } from "./Records-BTnGRdcf.mjs";
3
- import { E as SubscriptionSourceError, b as SubscriptionRecord, i as EventSourceVersion, m as SubscriptionError, t as AcceptedEvent, u as SubscriptionConfiguration } from "./Subscription-D5sOrmlI.mjs";
3
+ import { E as SubscriptionSourceError, b as SubscriptionRecord, i as EventSourceVersion, m as SubscriptionError, t as AcceptedEvent, u as SubscriptionConfiguration } from "./Subscription-D2yn6Eo3.mjs";
4
4
  import { Context, Effect, Schema, Scope } from "effect";
5
5
  declare namespace SubscriptionInput_d_exports {
6
6
  export { SubscriptionInputBinding, SubscriptionInputBindings, makeSubscriptionInputBinding, resolveSubscriptionInput };
@@ -38,4 +38,4 @@ declare const makeSubscriptionInputBinding: <Event extends Schema.Top, Parameter
38
38
  }) => Effect.Effect<SubscriptionInputBinding, never, Exclude<R, Scope.Scope> | Exclude<Continuation["DecodingServices"], Scope.Scope> | Exclude<Continuation["EncodingServices"], Scope.Scope> | Exclude<Event["DecodingServices"], Scope.Scope> | Exclude<Input["EncodingServices"], Scope.Scope> | Exclude<Parameters["DecodingServices"], Scope.Scope>>;
39
39
  //#endregion
40
40
  export { resolveSubscriptionInput as a, makeSubscriptionInputBinding as i, SubscriptionInputBindings as n, SubscriptionInput_d_exports as r, SubscriptionInputBinding as t };
41
- //# sourceMappingURL=SubscriptionInput-CxSXZUiC.d.mts.map
41
+ //# sourceMappingURL=SubscriptionInput-Cog4x7Rd.d.mts.map
@@ -8,13 +8,13 @@ import { r as canonicalJson, s as digestJson } from "./Digest-ft4ku9pj.mjs";
8
8
  import { AbortIntent, ApprovalDecisionIntent, ApprovalPendingSuspension, InputAppliedMarker, SubmissionState, SuspensionSnapshot, UnknownResolutionIntent, submissionAbortRecordId, submissionInputRecordId, submissionSettlementRecordId, unknownResolutionKind } from "./durable/SubmissionLedger.mjs";
9
9
  import { decodeExportRecord } from "./durable/RecordFormat.mjs";
10
10
  import { S as runIdForSubmission } from "./RunJournal-oJLo-pjS.mjs";
11
- import { C as ThreadApprovalFact, E as ThreadExport, G as ThreadResolutionFact, S as ThreadAdmission, _t as isPreContinuationFact, ct as makeTransferFactCheck, dt as transferPageFits, gt as executionRunIds, x as ThreadAbortFact } from "./ThreadStore-Cn6FDWX9.mjs";
11
+ import { C as ThreadAdmission, D as ThreadExport, K as ThreadResolutionFact, S as ThreadAbortFact, _t as executionRunIds, ft as transferPageFits, lt as makeTransferFactCheck, vt as isPreContinuationFact, w as ThreadApprovalFact } from "./ThreadStore-D2rqtt7k.mjs";
12
12
  import { MessageDeliveryRecord } from "./durable/MessageDelivery.mjs";
13
- import { _ as readRunContext, m as validateSuffix, o as isOperationalRecord, v as validateContextBoundary, y as RunContextReader } from "./RunContinuation-D42RFqjS.mjs";
13
+ import { _ as readRunContext, m as validateSuffix, o as isOperationalRecord, v as validateContextBoundary, y as RunContextReader } from "./RunContinuation-BF95Ncv2.mjs";
14
14
  import { workIndexChanges } from "./durable/ThreadWork.mjs";
15
15
  import { r as toolOperationStates } from "./tool-operations-BXBmagY1.mjs";
16
16
  import { validateCanonicalSettlement, validateJoinedSettlement } from "./durable/SettlementPublisher.mjs";
17
- import { c as transferDependencies, l as transferSections, s as sameTransferManifest, u as ImportSourcePhase } from "./ThreadTransfer-BWnAHIge.mjs";
17
+ import { c as transferDependencies, l as transferSections, s as sameTransferManifest, u as ImportSourcePhase } from "./ThreadTransfer-BFolkpEp.mjs";
18
18
  import { Context, Effect, Layer, Pull, Schema, Stream } from "effect";
19
19
  //#region src/durable/internal/thread-import-reader.ts
20
20
  /** Exact indexes for one captured Thread transaction. Run records and commands enforce count and byte bounds. */
@@ -481,4 +481,4 @@ const reencodeThread = Effect.fnUntraced(function* (source) {
481
481
  //#endregion
482
482
  export { validateImportedRunExecution as _, ThreadImportResult as a, ThreadDeliveryImportReader as b, finishThreadImport as c, prepareImportPage as d, rebuildClosedSubmission as f, validateImportedExecution as g, validateClosedRun as h, ThreadImportRejected as i, invalidThreadArchive as l, reencodeThread as m, ThreadArchive as n, ThreadImport_exports as o, rebuildImportedSubmission as p, ThreadImport as r, captureImportSource as s, RebuiltSubmission as t, makeThreadImportProgress as u, verifyImportedInputOrder as v, ThreadImportReader as x, verifyImportedReferences as y };
483
483
 
484
- //# sourceMappingURL=ThreadImport-DUcPj5jC.mjs.map
484
+ //# sourceMappingURL=ThreadImport-BoTfjjrz.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadImport-DUcPj5jC.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 = Effect.fnUntraced(function* (state: ThreadImportProgress) {\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-BoTfjjrz.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 = Effect.fnUntraced(function* (state: ThreadImportProgress) {\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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"}
@@ -5,9 +5,9 @@ import { r as Update } from "./AgentUpdates-DksV4D0A.mjs";
5
5
  import { r as Diagnostic } from "./FailureDiagnostic-DvHruCSJ.mjs";
6
6
  import { t as AgentPolicy } from "./AgentPolicy-B4lbCU2T.mjs";
7
7
  import { $ as RecordEnvelope, b as DefinitionDigests, d as CanonicalRecordEnvelope, et as RecordId, l as CanonicalBatch, p as CanonicalSequence } from "./Records-BTnGRdcf.mjs";
8
- import { $r as ExecutionCheckpoint, Ct as ApprovalDecisionIntent, Gi as ThreadStoreError, Li as ThreadReadRequest, On as UnknownResolutionIntent, Vt as InputAppliedMarker, an as ResolutionSafeToRetry, bi as ThreadCommands, gi as ThreadAdmission, in as ResolutionNeverHappened, lt as AbortIntent, nn as ResolutionAbortSubmission, rn as ResolutionCompletedWithResult, sn as Settlement, wn as SuspensionSnapshot, xi as ThreadExport } from "./Admin-Bpg24yCK.mjs";
9
- import { p as MessageDeliveryRecord } from "./MessageDelivery-BkWrcQUd.mjs";
10
- import { t as RunContextReader } from "./run-context-reader-BtBPX_nC.mjs";
8
+ import { $r as ExecutionCheckpoint, Ct as ApprovalDecisionIntent, Ki as ThreadStoreError, On as UnknownResolutionIntent, Ri as ThreadReadRequest, Si as ThreadExport, Vt as InputAppliedMarker, _i as ThreadAdmission, an as ResolutionSafeToRetry, in as ResolutionNeverHappened, lt as AbortIntent, nn as ResolutionAbortSubmission, rn as ResolutionCompletedWithResult, sn as Settlement, wn as SuspensionSnapshot, xi as ThreadCommands } from "./Admin-NvXFPDIM.mjs";
9
+ import { p as MessageDeliveryRecord } from "./MessageDelivery-CLzWJImC.mjs";
10
+ import { t as RunContextReader } from "./run-context-reader-kpO9xhP2.mjs";
11
11
  import { Context, Effect, Layer, Schema, Scope, Stream } from "effect";
12
12
  //#region src/durable/internal/thread-import-reader.d.ts
13
13
  declare const ThreadImportReader_base: Context.ServiceClass<ThreadImportReader, "@effect-agent/thread/ThreadImportReader", {
@@ -840,4 +840,4 @@ declare const rebuildClosedSubmission: (admission: ThreadAdmission) => Effect.Ef
840
840
  declare const reencodeThread: <E, R>(source: Stream.Stream<ThreadExport, E, R>) => Effect.Effect<ThreadImportResult, E | ThreadImportRejected | ThreadStoreError, R | ThreadImport>;
841
841
  //#endregion
842
842
  export { ThreadDeliveryImportReader as C, verifyImportedReferences as S, reencodeThread as _, ThreadImport as a, validateImportedRunExecution as b, ThreadImportResult as c, finishThreadImport as d, invalidThreadArchive as f, rebuildImportedSubmission as g, rebuildClosedSubmission as h, ThreadArchive as i, ThreadImport_d_exports as l, prepareImportPage as m, PreparedImportPage as n, ThreadImportProgress as o, makeThreadImportProgress as p, RebuiltSubmission as r, ThreadImportRejected as s, PreparedImportBatch as t, captureImportSource as u, validateClosedRun as v, ThreadImportReader as w, verifyImportedInputOrder as x, validateImportedExecution as y };
843
- //# sourceMappingURL=ThreadImport-C6IiPJMW.d.mts.map
843
+ //# sourceMappingURL=ThreadImport-em89zmM-.d.mts.map
@@ -90,18 +90,17 @@ const capturePayload = (payload) => {
90
90
  const copy = { ...payload };
91
91
  Object.setPrototypeOf(copy, Object.getPrototypeOf(payload));
92
92
  const copies = new WeakMap([[payload, copy]]);
93
- const pending = [copy];
94
93
  const owned = [copy];
95
- while (pending.length > 0) {
96
- const next = pending.pop();
97
- for (const [key, value] of Object.entries(next)) {
94
+ for (let index = 0; index < owned.length; index++) {
95
+ const next = owned[index];
96
+ for (const key of Object.keys(next)) {
97
+ const value = Reflect.get(next, key);
98
98
  if (!Predicate.isObjectOrArray(value)) continue;
99
99
  let child = copies.get(value);
100
100
  if (child === void 0) {
101
101
  const created = copyOwn(value);
102
102
  copies.set(value, created);
103
103
  owned.push(created);
104
- pending.push(created);
105
104
  child = created;
106
105
  }
107
106
  setOwn(next, key, child);
@@ -118,7 +117,8 @@ const ownWire = (wire, copies) => {
118
117
  const pending = Predicate.isObjectOrArray(wire) ? [wire] : [];
119
118
  while (pending.length > 0) {
120
119
  const next = pending.pop();
121
- for (const [key, value] of Object.entries(next)) {
120
+ for (const key of Object.keys(next)) {
121
+ const value = Reflect.get(next, key);
122
122
  if (!Predicate.isObjectOrArray(value)) continue;
123
123
  const copy = copies.get(value);
124
124
  if (copy !== void 0) setOwn(next, key, copy);
@@ -224,6 +224,7 @@ var ThreadStore_exports = /* @__PURE__ */ __exportAll({
224
224
  ExecutionCheckpoint: () => ExecutionCheckpoint,
225
225
  ExecutionRead: () => ExecutionRead,
226
226
  ExecutionUpdate: () => ExecutionUpdate,
227
+ FreshRunRead: () => FreshRunRead,
227
228
  LoadCheckpointRequest: () => LoadCheckpointRequest,
228
229
  MAX_PROMPT_CHECKPOINT_BYTES: () => MAX_PROMPT_CHECKPOINT_BYTES,
229
230
  MAX_PROMPT_CHECKPOINT_RUNS: () => 16,
@@ -765,6 +766,10 @@ var ThreadTail = class extends Schema.Class("@effect-agent/thread/ThreadTail")({
765
766
  tailSequence: CanonicalSequence
766
767
  }) {};
767
768
  var ThreadIdentityRequest = class extends Schema.Class("@effect-agent/thread/ThreadIdentityRequest")({ threadId: ThreadId }) {};
769
+ var FreshRunRead = class extends Schema.Class("@effect-agent/thread/FreshRunRead")({
770
+ threadId: ThreadId,
771
+ submissionId: SubmissionId
772
+ }) {};
768
773
  /**
769
774
  * One consistent snapshot: Thread ID, canonical tail, admission presence, first record,
770
775
  * exact worker origin, then exact subagent lineage. A row selected twice appears only
@@ -987,6 +992,6 @@ var ThreadReader = class ThreadReader extends Context.Service()("@effect-agent/t
987
992
  }
988
993
  };
989
994
  //#endregion
990
- 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 };
995
+ export { ThreadTail as $, ThreadExportRecord as A, ThreadPeerCountRequest as B, ThreadAdmission as C, ThreadExport as D, ThreadCommands as E, ThreadIdentity as F, ThreadRecordRequest as G, ThreadRead as H, ThreadIdentityRequest as I, ThreadSelection as J, ThreadResolutionFact as K, ThreadMaterialization as L, ThreadExportRequest as M, ThreadExportSnapshot as N, ThreadExportBatch as O, ThreadExportSource as P, ThreadStore_exports as Q, ThreadNotMaterialized as R, ThreadAbortFact as S, ThreadCheckpoint as T, ThreadReadRequest as U, ThreadPromptRead as V, ThreadReader as W, ThreadStoreDiagnostic as X, ThreadStore as Y, ThreadStoreError as Z, PromptCheckpoint as _, executionRunIds as _t, CommitBatch as a, ThreadWorkerStateRequest as at, SaveCheckpointRequest as b, isWorkHandoff as bt, ExecutionUpdate as c, getRunInput as ct, MAX_PROMPT_CHECKPOINT_BYTES as d, streamExport as dt, ThreadTailRequest as et, MAX_PROMPT_CHECKPOINT_RUNS as f, transferPageFits as ft, PreparedAppend as g, canonicalRunIds as gt, MAX_THREAD_EXPORT_PAGE_RECORDS as h, recordEncoding as ht, CheckpointRejected as i, ThreadWorkerSeal as it, ThreadExportRejected as j, ThreadExportCursor as k, FreshRunRead as l, makeTransferFactCheck as lt, MAX_THREAD_EXPORT_PAGE_BYTES as m, captureRecord as mt, AppendRequest as n, ThreadWorkerCapacity as nt, ExecutionCheckpoint as o, canonicalBatchFitsTransfer as ot, MAX_THREAD_EXPORT_CURSOR_CHARS as p, transferRecordDependencies as pt, ThreadRunInputRequest as q, AppendResult as r, ThreadWorkerCapacityRequest as rt, ExecutionRead as s, getRecord as st, AppendConflict as t, ThreadVerificationRequest as tt, LoadCheckpointRequest as u, readWorkerState as ut, PromptCheckpointHead as v, isPreContinuationFact as vt, ThreadApprovalFact as w, SelectedThreadRead as x, terminalUsageCharge as xt, PromptCheckpointRead as y, isTerminalBudgetFact as yt, ThreadObservation as z };
991
996
 
992
- //# sourceMappingURL=ThreadStore-Cn6FDWX9.mjs.map
997
+ //# sourceMappingURL=ThreadStore-D2rqtt7k.mjs.map