@yielded/agent 0.1.0-beta.181 → 0.1.0-beta.183
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Admin-NvXFPDIM.d.mts → Admin-BgCHCGSl.d.mts} +8 -8
- package/dist/{AgentRuntime-Dx5u_FJD.d.mts → AgentRuntime-DhRchFzv.d.mts} +7 -4
- package/dist/{AgentRuntime-BAExRlgu.mjs → AgentRuntime-ILtyHuQG.mjs} +61 -45
- package/dist/AgentRuntime-ILtyHuQG.mjs.map +1 -0
- package/dist/{Digest-DjUgS5PG.d.mts → Digest-1iVcDLVm.d.mts} +2 -2
- package/dist/{Digest-ft4ku9pj.mjs → Digest-CzLJcsWv.mjs} +2 -2
- package/dist/{Digest-ft4ku9pj.mjs.map → Digest-CzLJcsWv.mjs.map} +1 -1
- package/dist/{DurableAgentRuntime-HH2muFrT.mjs → DurableAgentRuntime-Cj263rW9.mjs} +27 -57
- package/dist/DurableAgentRuntime-Cj263rW9.mjs.map +1 -0
- package/dist/{EventSource-DNyaWmyQ.d.mts → EventSource-CaA6RAtC.d.mts} +3 -3
- package/dist/InMemory.d.mts +1 -1
- package/dist/{MessageDelivery-CLzWJImC.d.mts → MessageDelivery-rlLpakO8.d.mts} +43 -43
- package/dist/{PreparedInputAdmission-BQ9UCLFS.d.mts → PreparedInputAdmission-DjbWz2lW.d.mts} +4 -4
- package/dist/{RecordFormat-BNiLpe43.d.mts → RecordFormat-CjMl0uu8.d.mts} +2 -2
- package/dist/{Records-BTnGRdcf.d.mts → Records-BP67Yz6n.d.mts} +20 -8
- package/dist/{Records-CZRedCE7.mjs → Records-bbGVHprv.mjs} +14 -10
- package/dist/Records-bbGVHprv.mjs.map +1 -0
- package/dist/{RunContinuation-CL0wBsQE.d.mts → RunContinuation-CIJRN_vC.d.mts} +5 -4
- package/dist/{RunContinuation-BF95Ncv2.mjs → RunContinuation-DJ6kkbQG.mjs} +22 -58
- package/dist/RunContinuation-DJ6kkbQG.mjs.map +1 -0
- package/dist/{RunEvent-C5jVQZ6K.d.mts → RunEvent-Bh1p4zAO.d.mts} +2 -2
- package/dist/{RunJournal-oJLo-pjS.mjs → RunJournal-DQr2dUgg.mjs} +4 -7
- package/dist/RunJournal-DQr2dUgg.mjs.map +1 -0
- package/dist/{RunOptions-BANtohGk.d.mts → RunOptions-aBHR-Eqm.d.mts} +6 -3
- package/dist/{RunStorage-DlfvMfHM.mjs → RunStorage-DblN-cmM.mjs} +2 -2
- package/dist/{RunStorage-DlfvMfHM.mjs.map → RunStorage-DblN-cmM.mjs.map} +1 -1
- package/dist/{Schedule-CDgTz0vj.d.mts → Schedule-CVLtl5rP.d.mts} +2 -2
- package/dist/{Scheduling-BebkRVc2.mjs → Scheduling-B6l0lWdr.mjs} +3 -3
- package/dist/{Scheduling-BebkRVc2.mjs.map → Scheduling-B6l0lWdr.mjs.map} +1 -1
- package/dist/{Subagent-D68fe7mr.mjs → Subagent-Bm842K7J.mjs} +43 -17
- package/dist/Subagent-Bm842K7J.mjs.map +1 -0
- package/dist/{Subagent-5ulnV6An.d.mts → Subagent-CWWmA1UQ.d.mts} +17 -5
- package/dist/{Subscription-D2yn6Eo3.d.mts → Subscription-BRsNy0TA.d.mts} +4 -4
- package/dist/{SubscriptionInput-Cog4x7Rd.d.mts → SubscriptionInput-ClCaW_kX.d.mts} +3 -3
- package/dist/{ThreadHistory-KPPBJLJb.d.mts → ThreadHistory-ajQhqZDY.d.mts} +2 -2
- package/dist/{ThreadImport-BoTfjjrz.mjs → ThreadImport-CkPAxXU5.mjs} +7 -7
- package/dist/{ThreadImport-BoTfjjrz.mjs.map → ThreadImport-CkPAxXU5.mjs.map} +1 -1
- package/dist/{ThreadImport-em89zmM-.d.mts → ThreadImport-DtRNoHIr.d.mts} +5 -5
- package/dist/{ThreadStore-D2rqtt7k.mjs → ThreadStore-C_ofHc7h.mjs} +4 -4
- package/dist/{ThreadStore-D2rqtt7k.mjs.map → ThreadStore-C_ofHc7h.mjs.map} +1 -1
- package/dist/{ThreadTransfer-BFolkpEp.mjs → ThreadTransfer-C_TRuo_9.mjs} +4 -4
- package/dist/{ThreadTransfer-BFolkpEp.mjs.map → ThreadTransfer-C_TRuo_9.mjs.map} +1 -1
- package/dist/{WorkerAdmission-DrxDrLII.mjs → WorkerAdmission-9Ka3edXj.mjs} +5 -5
- package/dist/{WorkerAdmission-DrxDrLII.mjs.map → WorkerAdmission-9Ka3edXj.mjs.map} +1 -1
- package/dist/{agent-registration-BovXT8jc.mjs → agent-registration-7kp1dHT0.mjs} +4 -4
- package/dist/{agent-registration-BovXT8jc.mjs.map → agent-registration-7kp1dHT0.mjs.map} +1 -1
- package/dist/capabilities/Commands.d.mts +1 -1
- package/dist/capabilities/Redaction.d.mts +1 -1
- package/dist/capabilities/RunHooks.d.mts +1 -1
- package/dist/capabilities/Subagent.d.mts +1 -1
- package/dist/capabilities/Subagent.mjs +1 -1
- package/dist/capabilities/SubagentReservations.d.mts +4 -1
- package/dist/capabilities/SubagentReservations.mjs +4 -1
- package/dist/capabilities/SubagentReservations.mjs.map +1 -1
- package/dist/core/RunEvent.d.mts +1 -1
- package/dist/core/RunEvent.mjs +1 -1
- package/dist/core/RunEvent.mjs.map +1 -1
- package/dist/durable/ActivityStore.d.mts +1 -1
- package/dist/durable/ActivityStore.mjs +1 -1
- package/dist/durable/Admin.d.mts +1 -1
- package/dist/durable/Admin.mjs +1 -1
- package/dist/durable/AgentRegistration.d.mts +1 -1
- package/dist/durable/AgentRegistration.mjs +1 -1
- package/dist/durable/Certification.d.mts +1 -1
- package/dist/durable/CommittedActivity.d.mts +3 -3
- package/dist/durable/CommittedActivity.mjs +3 -3
- package/dist/durable/Digest.d.mts +1 -1
- package/dist/durable/Digest.mjs +1 -1
- package/dist/durable/DurableAgentRuntime.d.mts +1 -1
- package/dist/durable/DurableAgentRuntime.mjs +2 -2
- package/dist/durable/EventSource.d.mts +1 -1
- package/dist/durable/EventSource.mjs +1 -1
- package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
- package/dist/durable/LifecyclePublication.d.mts +1 -1
- package/dist/durable/LifecyclePublication.mjs +2 -2
- package/dist/durable/MessageDelivery.d.mts +1 -1
- package/dist/durable/MessageDelivery.mjs +2 -2
- package/dist/durable/MessageDeliveryStoreConformance.d.mts +42 -42
- package/dist/durable/MessageDeliveryStoreConformance.mjs +2 -2
- package/dist/durable/PersistentHistory.d.mts +2 -2
- package/dist/durable/PersistentHistory.mjs +4 -4
- package/dist/durable/PreparedInputAdmission.d.mts +1 -1
- package/dist/durable/RecordFormat.d.mts +1 -1
- package/dist/durable/RecordFormat.mjs +1 -1
- package/dist/durable/Records.d.mts +1 -1
- package/dist/durable/Records.mjs +1 -1
- package/dist/durable/Recovery.d.mts +1 -1
- package/dist/durable/Recovery.mjs +1 -1
- package/dist/durable/RunContinuation.d.mts +3 -3
- package/dist/durable/RunContinuation.mjs +3 -3
- package/dist/durable/RunJournal.d.mts +1 -1
- package/dist/durable/RunJournal.mjs +1 -1
- package/dist/durable/RunStorage.d.mts +1 -1
- package/dist/durable/RunStorage.mjs +1 -1
- package/dist/durable/Schedule.d.mts +1 -1
- package/dist/durable/Schedule.mjs +1 -1
- package/dist/durable/ScheduleStoreConformance.d.mts +1 -1
- package/dist/durable/ScheduleStoreConformance.mjs +1 -1
- package/dist/durable/ScheduleTransition.d.mts +1 -1
- package/dist/durable/ScheduleTransition.mjs +1 -1
- package/dist/durable/Scheduling.d.mts +3 -3
- package/dist/durable/Scheduling.mjs +1 -1
- package/dist/durable/SettlementPublisher.d.mts +1 -1
- package/dist/durable/SettlementPublisher.mjs +3 -3
- package/dist/durable/SubmissionLedger.d.mts +1 -1
- package/dist/durable/SubmissionLedger.mjs +2 -2
- package/dist/durable/SubmissionLedgerConformance.d.mts +2 -2
- package/dist/durable/SubmissionLedgerConformance.mjs +5 -5
- package/dist/durable/SubmissionStatus.d.mts +1 -1
- package/dist/durable/Subscription.d.mts +1 -1
- package/dist/durable/Subscription.mjs +1 -1
- package/dist/durable/SubscriptionInput.d.mts +1 -1
- package/dist/durable/SubscriptionInput.mjs +2 -2
- package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
- package/dist/durable/SubscriptionStoreConformance.mjs +1 -1
- package/dist/durable/SubscriptionTools.d.mts +4 -4
- package/dist/durable/SubscriptionTransition.d.mts +1 -1
- package/dist/durable/SubscriptionTransition.mjs +1 -1
- package/dist/durable/Subscriptions.d.mts +6 -6
- package/dist/durable/Subscriptions.mjs +2 -2
- package/dist/durable/ThreadArchiveRange.d.mts +1 -1
- package/dist/durable/ThreadArchiveRange.mjs +1 -1
- package/dist/durable/ThreadContextHistory.d.mts +1 -1
- package/dist/durable/ThreadContextHistory.mjs +2 -2
- package/dist/durable/ThreadContextHistoryProjection.d.mts +1 -1
- package/dist/durable/ThreadContextHistoryProjection.mjs +1 -1
- package/dist/durable/ThreadImport.d.mts +1 -1
- package/dist/durable/ThreadImport.mjs +1 -1
- package/dist/durable/ThreadInvariants.d.mts +3 -3
- package/dist/durable/ThreadInvariants.mjs +4 -4
- package/dist/durable/ThreadProjection.d.mts +1 -1
- package/dist/durable/ThreadProjection.mjs +1 -1
- package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
- package/dist/durable/ThreadReader.d.mts +1 -1
- package/dist/durable/ThreadReader.mjs +1 -1
- package/dist/durable/ThreadStore.d.mts +2 -2
- package/dist/durable/ThreadStore.mjs +2 -2
- package/dist/durable/ThreadStoreConformance.d.mts +2 -2
- package/dist/durable/ThreadStoreConformance.mjs +4 -4
- package/dist/durable/ThreadTransfer.d.mts +2 -2
- package/dist/durable/ThreadTransfer.mjs +1 -1
- package/dist/durable/ThreadWork.d.mts +1 -1
- package/dist/durable/ThreadWork.mjs +5 -5
- package/dist/durable/ToolReconciler.mjs +1 -1
- package/dist/durable/WorkerAdmission.d.mts +2 -2
- package/dist/durable/WorkerAdmission.mjs +1 -1
- package/dist/durable/WorkerHost.d.mts +2 -2
- package/dist/engine/AgentRuntime.d.mts +1 -1
- package/dist/engine/AgentRuntime.mjs +1 -1
- package/dist/engine/RunOptions.d.mts +1 -1
- package/dist/engine/RunOptions.mjs.map +1 -1
- package/dist/engine/ThreadHistory.d.mts +1 -1
- package/dist/index.d.mts +17 -17
- package/dist/index.mjs +12 -12
- package/dist/{run-context-reader-kpO9xhP2.d.mts → run-context-reader-DEU4REfD.d.mts} +3 -3
- package/package.json +1 -1
- package/src/capabilities/Subagent.ts +83 -28
- package/src/capabilities/SubagentReservations.ts +4 -1
- package/src/capabilities/internal/subagent-contract.ts +23 -3
- package/src/core/RunEvent.ts +1 -1
- package/src/durable/DurableAgentRuntime.ts +64 -14
- package/src/durable/Records.ts +21 -15
- package/src/durable/RunContinuation.ts +64 -125
- package/src/durable/RunJournal.ts +4 -12
- package/src/durable/internal/history-prompt.ts +10 -4
- package/src/durable/internal/initial-context.ts +1 -1
- package/src/durable/internal/prompt-history-cache.ts +8 -63
- package/src/engine/RunOptions.ts +4 -1
- package/src/engine/internal/agent-runtime.ts +422 -387
- package/dist/AgentRuntime-BAExRlgu.mjs.map +0 -1
- package/dist/DurableAgentRuntime-HH2muFrT.mjs.map +0 -1
- package/dist/Records-CZRedCE7.mjs.map +0 -1
- package/dist/RunContinuation-BF95Ncv2.mjs.map +0 -1
- package/dist/RunJournal-oJLo-pjS.mjs.map +0 -1
- package/dist/Subagent-D68fe7mr.mjs.map +0 -1
- package/dist/json-BlJVQZxN.mjs +0 -15
- package/dist/json-BlJVQZxN.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerAdmission-DrxDrLII.mjs","names":[],"sources":["../src/durable/internal/thread-initialization.ts","../src/durable/WorkerAdmission.ts"],"sourcesContent":["import { DateTime, Effect, Schema } from \"effect\";\n\nimport type { AgentId, ThreadId } from \"../../core/Identifiers.ts\";\nimport { WorkerError } from \"../../core/Worker.ts\";\nimport { DurableRuntimeFailpoint } from \"../DurableFailpoint.ts\";\nimport {\n BatchId,\n CanonicalBatch,\n RecordEnvelope,\n RecordId,\n ThreadCreated,\n WorkerOrigin,\n WorkerOriginRecorded,\n type DefinitionDigests,\n type DeploymentId,\n type ProducerId,\n} from \"../Records.ts\";\nimport { workerOriginRecordId } from \"../RunJournal.ts\";\nimport type { OwnershipLost } from \"../SubmissionLedger.ts\";\nimport type { AppendConflict, ThreadNotMaterialized, ThreadStoreError } from \"../ThreadStore.ts\";\nimport {\n AppendRequest,\n ThreadIdentityRequest,\n ThreadTailRequest,\n ThreadStore,\n} from \"../ThreadStore.ts\";\nimport { WakeScheduler } from \"../WakeScheduler.ts\";\nimport { definitionDigestsEqual } from \"./agent-registration.ts\";\n\ninterface InitializationConfig {\n readonly producerId: ProducerId;\n readonly deploymentId: DeploymentId;\n}\n\n/** Stable identities retained across admission retries and recovery. */\nexport const threadCreatedBatchId = (threadId: ThreadId): BatchId =>\n Schema.decodeSync(BatchId)(`thread-created:${threadId}`);\n\nexport const threadCreatedRecordId = (threadId: ThreadId): RecordId =>\n Schema.decodeSync(RecordId)(`thread-created:${threadId}`);\n\n/**\n * Coordinator invariant: every Thread's first canonical record is `ThreadCreated`,\n * so `tailSequence >= 1` is the deterministic already-created check. Concurrent admissions\n * re-read this invariant after a tail conflict before considering initialization complete.\n */\nexport const ensureThreadCreated = Effect.fnUntraced(\n function* (\n config: InitializationConfig,\n threadId: ThreadId,\n agentId: AgentId,\n definitions: DefinitionDigests,\n ): Effect.fn.Return<\n void,\n ThreadStoreError | ThreadNotMaterialized | AppendConflict | OwnershipLost,\n ThreadStore | WakeScheduler\n > {\n const store = yield* ThreadStore;\n const wake = yield* WakeScheduler;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));\n\n if (tail.tailSequence > 0) return;\n\n const record = yield* Effect.map(DateTime.now, (createdAt) =>\n RecordEnvelope.make({\n recordId: threadCreatedRecordId(threadId),\n family: \"thread\",\n schemaVersion: 1,\n createdAt,\n deploymentId: config.deploymentId,\n payload: ThreadCreated.make({ agentId, definitions }),\n }),\n );\n\n yield* store\n .append(\n AppendRequest.make({\n threadId,\n batch: CanonicalBatch.make({\n batchId: threadCreatedBatchId(threadId),\n producerId: config.producerId,\n records: [record],\n }),\n expectedTailSequence: tail.tailSequence,\n }),\n )\n .pipe(\n Effect.catchTag(\"AppendConflict\", (error) =>\n store\n .inspectTail(ThreadTailRequest.make({ threadId }))\n .pipe(\n Effect.flatMap((current) =>\n current.tailSequence > 0 ? Effect.void : Effect.fail(error),\n ),\n ),\n ),\n Effect.andThen(wake.notify(threadId)),\n Effect.asVoid,\n );\n },\n (effect) =>\n effect.pipe(\n Effect.retry({\n times: 7,\n while: (error) => error._tag === \"AppendConflict\",\n }),\n ),\n);\n\nconst sameOrigin = Schema.toEquivalence(WorkerOrigin);\n\nexport const ensureWorkerOrigin = Effect.fnUntraced(\n function* (config: InitializationConfig, origin: WorkerOrigin) {\n const store = yield* ThreadStore;\n const failpoint = yield* DurableRuntimeFailpoint;\n\n for (let attempt = 0; attempt < 16; attempt++) {\n const current = yield* store.readIdentity(\n ThreadIdentityRequest.make({ threadId: origin.worker.threadId }),\n );\n\n const existing = current.records.find(\n ({ record }) => record.payload._tag === \"WorkerOriginRecorded\",\n )?.record.payload;\n\n if (existing?._tag === \"WorkerOriginRecorded\") {\n if (!sameOrigin(existing.origin, origin))\n return yield* WorkerError.make({ operation: \"start\", reason: \"worker-mismatch\" });\n\n return;\n }\n const first = current.records[0]?.record.payload;\n\n if (\n first?._tag !== \"ThreadCreated\" ||\n first.agentId !== origin.worker.targetAgentId ||\n !definitionDigestsEqual(first.definitions, origin.targetDigests) ||\n current.records.some(({ record }) => record.payload._tag === \"SubagentLineageRecorded\")\n )\n return yield* WorkerError.make({ operation: \"start\", reason: \"worker-mismatch\" });\n const id = workerOriginRecordId(origin.worker.threadId);\n\n yield* failpoint.hit(\"worker:before-origin-append\");\n\n const appended = yield* store\n .append(\n AppendRequest.make({\n threadId: origin.worker.threadId,\n expectedTailSequence: current.tailSequence,\n\n batch: CanonicalBatch.make({\n batchId: Schema.decodeSync(BatchId)(id),\n producerId: config.producerId,\n records: [\n RecordEnvelope.make({\n recordId: id,\n family: \"thread\",\n schemaVersion: 1,\n createdAt: DateTime.makeUnsafe(origin.createdAtMillis),\n deploymentId: config.deploymentId,\n payload: WorkerOriginRecorded.make({ origin }),\n }),\n ],\n }),\n }),\n )\n .pipe(\n Effect.as(true),\n Effect.catchTag(\"AppendConflict\", () => Effect.succeed(false)),\n );\n\n if (appended) {\n yield* failpoint.hit(\"worker:after-origin-append\");\n\n return;\n }\n }\n\n return yield* WorkerError.make({ operation: \"start\", reason: \"storage\" });\n },\n Effect.mapError((cause) =>\n cause._tag === \"WorkerError\"\n ? cause\n : WorkerError.make({ operation: \"start\", reason: \"storage\", cause }),\n ),\n);\n","import { Context, Effect, Schema } from \"effect\";\n\nimport { DurableRuntimeFailpoint, DurableRuntimeFailpointError } from \"./DurableFailpoint.ts\";\nimport { ensureThreadCreated, ensureWorkerOrigin } from \"./internal/thread-initialization.ts\";\nimport { ProducerId, WorkerAdmission } from \"./Records.ts\";\nimport {\n AdmissionConflict,\n AdmissionPolicyError,\n AdmissionRequest,\n LedgerError,\n MarkReadyRequest,\n SubmissionLedger,\n} from \"./SubmissionLedger.ts\";\nimport {\n AppendConflict,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadStore,\n ThreadStoreError,\n} from \"./ThreadStore.ts\";\nimport { WakeScheduler } from \"./WakeScheduler.ts\";\n\n/**\n * Storage admission after source authorization, input validation and capacity reservation.\n * This is an internal host port, not an authorization entrypoint. Hosts route the whole\n * operation to the destination owner and enroll recovery before executing it.\n */\nexport class WorkerAdmissionRequest extends Schema.Class<WorkerAdmissionRequest>(\n \"@effect-agent/thread/WorkerAdmissionRequest\",\n)({\n ...AdmissionRequest.fields,\n workerAdmission: WorkerAdmission,\n producerId: ProducerId,\n}) {}\n\nexport const WorkerAdmissionFailure = Schema.Union([\n AdmissionConflict,\n AdmissionPolicyError,\n LedgerError,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n DurableRuntimeFailpointError,\n]);\n\n/** Local implementation shared by every host; retries finish the same admitted row. */\nexport const admitWorker = Effect.fnUntraced(function* (request: WorkerAdmissionRequest) {\n const origin = request.workerAdmission.origin;\n\n if (\n origin.worker.threadId !== request.threadId ||\n origin.worker.targetAgentId !== request.agentId ||\n request.parentLinkage !== undefined\n )\n return yield* LedgerError.make({\n operation: \"admit worker\",\n message: \"Worker admission does not belong to the destination Thread\",\n });\n\n const ledger = yield* SubmissionLedger;\n const store = yield* ThreadStore;\n const wake = yield* WakeScheduler;\n const failpoint = yield* DurableRuntimeFailpoint;\n const admitted = yield* ledger.admit(AdmissionRequest.make(request));\n\n yield* failpoint.hit(\"submit:after-admit\");\n if (admitted.replayed && admitted.state !== \"admitted\") return admitted;\n\n yield* store.materialize(\n ThreadMaterialization.make({\n threadId: request.threadId,\n }),\n );\n\n const config = {\n producerId: request.producerId,\n deploymentId: request.deploymentId,\n };\n\n yield* ensureThreadCreated(config, request.threadId, request.agentId, request.agentDigests);\n yield* ensureWorkerOrigin(config, origin).pipe(\n Effect.mapError((cause) =>\n LedgerError.make({ operation: \"worker-origin\", message: cause.reason, cause }),\n ),\n );\n yield* failpoint.hit(\"submit:after-materialize\");\n yield* ledger.markReady(MarkReadyRequest.make({ submissionId: admitted.submissionId }));\n yield* wake.notify(request.threadId);\n\n return admitted;\n});\n\n/** Placement adapter for the composite operation; local hosts use the same implementation. */\nexport const WorkerAdmissionPort = Context.Reference<{ readonly admit: typeof admitWorker }>(\n \"@effect-agent/thread/WorkerAdmissionPort\",\n { defaultValue: () => ({ admit: admitWorker }) },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkerAdmission-9Ka3edXj.mjs","names":[],"sources":["../src/durable/internal/thread-initialization.ts","../src/durable/WorkerAdmission.ts"],"sourcesContent":["import { DateTime, Effect, Schema } from \"effect\";\n\nimport type { AgentId, ThreadId } from \"../../core/Identifiers.ts\";\nimport { WorkerError } from \"../../core/Worker.ts\";\nimport { DurableRuntimeFailpoint } from \"../DurableFailpoint.ts\";\nimport {\n BatchId,\n CanonicalBatch,\n RecordEnvelope,\n RecordId,\n ThreadCreated,\n WorkerOrigin,\n WorkerOriginRecorded,\n type DefinitionDigests,\n type DeploymentId,\n type ProducerId,\n} from \"../Records.ts\";\nimport { workerOriginRecordId } from \"../RunJournal.ts\";\nimport type { OwnershipLost } from \"../SubmissionLedger.ts\";\nimport type { AppendConflict, ThreadNotMaterialized, ThreadStoreError } from \"../ThreadStore.ts\";\nimport {\n AppendRequest,\n ThreadIdentityRequest,\n ThreadTailRequest,\n ThreadStore,\n} from \"../ThreadStore.ts\";\nimport { WakeScheduler } from \"../WakeScheduler.ts\";\nimport { definitionDigestsEqual } from \"./agent-registration.ts\";\n\ninterface InitializationConfig {\n readonly producerId: ProducerId;\n readonly deploymentId: DeploymentId;\n}\n\n/** Stable identities retained across admission retries and recovery. */\nexport const threadCreatedBatchId = (threadId: ThreadId): BatchId =>\n Schema.decodeSync(BatchId)(`thread-created:${threadId}`);\n\nexport const threadCreatedRecordId = (threadId: ThreadId): RecordId =>\n Schema.decodeSync(RecordId)(`thread-created:${threadId}`);\n\n/**\n * Coordinator invariant: every Thread's first canonical record is `ThreadCreated`,\n * so `tailSequence >= 1` is the deterministic already-created check. Concurrent admissions\n * re-read this invariant after a tail conflict before considering initialization complete.\n */\nexport const ensureThreadCreated = Effect.fnUntraced(\n function* (\n config: InitializationConfig,\n threadId: ThreadId,\n agentId: AgentId,\n definitions: DefinitionDigests,\n ): Effect.fn.Return<\n void,\n ThreadStoreError | ThreadNotMaterialized | AppendConflict | OwnershipLost,\n ThreadStore | WakeScheduler\n > {\n const store = yield* ThreadStore;\n const wake = yield* WakeScheduler;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));\n\n if (tail.tailSequence > 0) return;\n\n const record = yield* Effect.map(DateTime.now, (createdAt) =>\n RecordEnvelope.make({\n recordId: threadCreatedRecordId(threadId),\n family: \"thread\",\n schemaVersion: 1,\n createdAt,\n deploymentId: config.deploymentId,\n payload: ThreadCreated.make({ agentId, definitions }),\n }),\n );\n\n yield* store\n .append(\n AppendRequest.make({\n threadId,\n batch: CanonicalBatch.make({\n batchId: threadCreatedBatchId(threadId),\n producerId: config.producerId,\n records: [record],\n }),\n expectedTailSequence: tail.tailSequence,\n }),\n )\n .pipe(\n Effect.catchTag(\"AppendConflict\", (error) =>\n store\n .inspectTail(ThreadTailRequest.make({ threadId }))\n .pipe(\n Effect.flatMap((current) =>\n current.tailSequence > 0 ? Effect.void : Effect.fail(error),\n ),\n ),\n ),\n Effect.andThen(wake.notify(threadId)),\n Effect.asVoid,\n );\n },\n (effect) =>\n effect.pipe(\n Effect.retry({\n times: 7,\n while: (error) => error._tag === \"AppendConflict\",\n }),\n ),\n);\n\nconst sameOrigin = Schema.toEquivalence(WorkerOrigin);\n\nexport const ensureWorkerOrigin = Effect.fnUntraced(\n function* (config: InitializationConfig, origin: WorkerOrigin) {\n const store = yield* ThreadStore;\n const failpoint = yield* DurableRuntimeFailpoint;\n\n for (let attempt = 0; attempt < 16; attempt++) {\n const current = yield* store.readIdentity(\n ThreadIdentityRequest.make({ threadId: origin.worker.threadId }),\n );\n\n const existing = current.records.find(\n ({ record }) => record.payload._tag === \"WorkerOriginRecorded\",\n )?.record.payload;\n\n if (existing?._tag === \"WorkerOriginRecorded\") {\n if (!sameOrigin(existing.origin, origin))\n return yield* WorkerError.make({ operation: \"start\", reason: \"worker-mismatch\" });\n\n return;\n }\n const first = current.records[0]?.record.payload;\n\n if (\n first?._tag !== \"ThreadCreated\" ||\n first.agentId !== origin.worker.targetAgentId ||\n !definitionDigestsEqual(first.definitions, origin.targetDigests) ||\n current.records.some(({ record }) => record.payload._tag === \"SubagentLineageRecorded\")\n )\n return yield* WorkerError.make({ operation: \"start\", reason: \"worker-mismatch\" });\n const id = workerOriginRecordId(origin.worker.threadId);\n\n yield* failpoint.hit(\"worker:before-origin-append\");\n\n const appended = yield* store\n .append(\n AppendRequest.make({\n threadId: origin.worker.threadId,\n expectedTailSequence: current.tailSequence,\n\n batch: CanonicalBatch.make({\n batchId: Schema.decodeSync(BatchId)(id),\n producerId: config.producerId,\n records: [\n RecordEnvelope.make({\n recordId: id,\n family: \"thread\",\n schemaVersion: 1,\n createdAt: DateTime.makeUnsafe(origin.createdAtMillis),\n deploymentId: config.deploymentId,\n payload: WorkerOriginRecorded.make({ origin }),\n }),\n ],\n }),\n }),\n )\n .pipe(\n Effect.as(true),\n Effect.catchTag(\"AppendConflict\", () => Effect.succeed(false)),\n );\n\n if (appended) {\n yield* failpoint.hit(\"worker:after-origin-append\");\n\n return;\n }\n }\n\n return yield* WorkerError.make({ operation: \"start\", reason: \"storage\" });\n },\n Effect.mapError((cause) =>\n cause._tag === \"WorkerError\"\n ? cause\n : WorkerError.make({ operation: \"start\", reason: \"storage\", cause }),\n ),\n);\n","import { Context, Effect, Schema } from \"effect\";\n\nimport { DurableRuntimeFailpoint, DurableRuntimeFailpointError } from \"./DurableFailpoint.ts\";\nimport { ensureThreadCreated, ensureWorkerOrigin } from \"./internal/thread-initialization.ts\";\nimport { ProducerId, WorkerAdmission } from \"./Records.ts\";\nimport {\n AdmissionConflict,\n AdmissionPolicyError,\n AdmissionRequest,\n LedgerError,\n MarkReadyRequest,\n SubmissionLedger,\n} from \"./SubmissionLedger.ts\";\nimport {\n AppendConflict,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadStore,\n ThreadStoreError,\n} from \"./ThreadStore.ts\";\nimport { WakeScheduler } from \"./WakeScheduler.ts\";\n\n/**\n * Storage admission after source authorization, input validation and capacity reservation.\n * This is an internal host port, not an authorization entrypoint. Hosts route the whole\n * operation to the destination owner and enroll recovery before executing it.\n */\nexport class WorkerAdmissionRequest extends Schema.Class<WorkerAdmissionRequest>(\n \"@effect-agent/thread/WorkerAdmissionRequest\",\n)({\n ...AdmissionRequest.fields,\n workerAdmission: WorkerAdmission,\n producerId: ProducerId,\n}) {}\n\nexport const WorkerAdmissionFailure = Schema.Union([\n AdmissionConflict,\n AdmissionPolicyError,\n LedgerError,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n DurableRuntimeFailpointError,\n]);\n\n/** Local implementation shared by every host; retries finish the same admitted row. */\nexport const admitWorker = Effect.fnUntraced(function* (request: WorkerAdmissionRequest) {\n const origin = request.workerAdmission.origin;\n\n if (\n origin.worker.threadId !== request.threadId ||\n origin.worker.targetAgentId !== request.agentId ||\n request.parentLinkage !== undefined\n )\n return yield* LedgerError.make({\n operation: \"admit worker\",\n message: \"Worker admission does not belong to the destination Thread\",\n });\n\n const ledger = yield* SubmissionLedger;\n const store = yield* ThreadStore;\n const wake = yield* WakeScheduler;\n const failpoint = yield* DurableRuntimeFailpoint;\n const admitted = yield* ledger.admit(AdmissionRequest.make(request));\n\n yield* failpoint.hit(\"submit:after-admit\");\n if (admitted.replayed && admitted.state !== \"admitted\") return admitted;\n\n yield* store.materialize(\n ThreadMaterialization.make({\n threadId: request.threadId,\n }),\n );\n\n const config = {\n producerId: request.producerId,\n deploymentId: request.deploymentId,\n };\n\n yield* ensureThreadCreated(config, request.threadId, request.agentId, request.agentDigests);\n yield* ensureWorkerOrigin(config, origin).pipe(\n Effect.mapError((cause) =>\n LedgerError.make({ operation: \"worker-origin\", message: cause.reason, cause }),\n ),\n );\n yield* failpoint.hit(\"submit:after-materialize\");\n yield* ledger.markReady(MarkReadyRequest.make({ submissionId: admitted.submissionId }));\n yield* wake.notify(request.threadId);\n\n return admitted;\n});\n\n/** Placement adapter for the composite operation; local hosts use the same implementation. */\nexport const WorkerAdmissionPort = Context.Reference<{ readonly admit: typeof admitWorker }>(\n \"@effect-agent/thread/WorkerAdmissionPort\",\n { defaultValue: () => ({ admit: admitWorker }) },\n);\n"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { AgentId } from "./core/Identifiers.mjs";
|
|
2
2
|
import { n as getToolExecutionClass } from "./tool-execution-Ba7tO7Pt.mjs";
|
|
3
|
+
import { S as withAttempt } from "./AgentRuntime-ILtyHuQG.mjs";
|
|
3
4
|
import { getToolExecutionKind } from "./core/SubagentContract.mjs";
|
|
4
5
|
import { a as PinnedTool, l as ToolNamespace, n as DiscoveryTool, r as IncludesCatalogDocumentation, t as AdditionalToolCatalog } from "./ToolExposure-hTJT2ekj.mjs";
|
|
5
6
|
import { BackgroundReporting, WorkerReportPreparationFailure } from "./engine/SubagentHost.mjs";
|
|
6
|
-
import { S as withAttempt } from "./AgentRuntime-BAExRlgu.mjs";
|
|
7
7
|
import { ContextRolloverTool } from "./engine/ContextWindow.mjs";
|
|
8
|
-
import { tt as ReplayContract, v as DefinitionDigests } from "./Records-
|
|
9
|
-
import { o as digestDefinitions, s as digestJson, t as DigestError } from "./Digest-
|
|
8
|
+
import { tt as ReplayContract, v as DefinitionDigests } from "./Records-bbGVHprv.mjs";
|
|
9
|
+
import { o as digestDefinitions, s as digestJson, t as DigestError } from "./Digest-CzLJcsWv.mjs";
|
|
10
10
|
import { Context, Crypto, Effect, Layer, Option, References, Schema, Scope, Tracer } from "effect";
|
|
11
11
|
import { Tool } from "effect/ai";
|
|
12
12
|
//#region src/durable/internal/agent-registration.ts
|
|
@@ -259,4 +259,4 @@ const compileRegistrations = (entries) => {
|
|
|
259
259
|
//#endregion
|
|
260
260
|
export { compileRegistrations as a, resolveDefinitionBinding as c, compileBindingContracts as i, resolveWorkerBinding as l, CurrentBindingSelection as n, definitionDigestsEqual as o, DurableWorkerBinding as r, makeLegacyWorkerBinding as s, BindingUnavailable as t, toolReplayContracts as u };
|
|
261
261
|
|
|
262
|
-
//# sourceMappingURL=agent-registration-
|
|
262
|
+
//# sourceMappingURL=agent-registration-7kp1dHT0.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registration-BovXT8jc.mjs","names":["withProvisionalTextAttempt","run"],"sources":["../src/durable/internal/agent-registration.ts"],"sourcesContent":["import { Crypto, Option, Scope, Context, Effect, Layer, References, Schema, Tracer } from \"effect\";\nimport { Tool } from \"effect/ai\";\n\nimport type * as Agent from \"../../core/Agent.ts\";\nimport {\n type InputPromptSource,\n type InstructionSource,\n type ModelServices,\n type RunDispositionDeclaration,\n} from \"../../core/Agent.ts\";\nimport { type ThreadId, AgentId } from \"../../core/Identifiers.ts\";\nimport { getToolExecutionKind } from \"../../core/SubagentContract.ts\";\nimport {\n AdditionalToolCatalog,\n DiscoveryTool,\n IncludesCatalogDocumentation,\n PinnedTool,\n ToolNamespace,\n} from \"../../core/ToolExposure.ts\";\nimport { type RuntimeBinding } from \"../../engine/AgentRuntime.ts\";\nimport { ContextRolloverTool } from \"../../engine/ContextWindow.ts\";\nimport { getToolExecutionClass } from \"../../engine/DurableStep.ts\";\nimport { withAttempt as withProvisionalTextAttempt } from \"../../engine/internal/provisional-text.ts\";\nimport {\n BackgroundReporting,\n WorkerReportPreparationFailure,\n type WorkerReporting,\n} from \"../../engine/SubagentHost.ts\";\nimport { digestDefinitions, digestJson, DigestError } from \"../Digest.ts\";\nimport type { DurableWorkerFailure, DurableWorkerRequirements } from \"../DurableAgentRuntime.ts\";\nimport type { DefinitionDigestInput, Digest, PersistedJson } from \"../Records.ts\";\nimport { DefinitionDigests, ReplayContract } from \"../Records.ts\";\nimport type { Claim, Settlement, SubmissionSnapshot } from \"../SubmissionLedger.ts\";\n\n/** No unique current Binding can execute the stable Agent identity or decode its accepted input. */\nexport class BindingUnavailable extends Schema.TaggedError<BindingUnavailable>()(\n \"BindingUnavailable\",\n { agentId: AgentId, message: Schema.String },\n) {}\n\nexport type DurableBindingFailure = BindingUnavailable;\n\n/**\n * Submission execution/recovery routing for stable identities shared by current Definitions.\n * Worker declarations and peer-messaging endpoints still require unique Agent identities.\n */\nexport interface BindingSelection {\n /** Change when routing changes, so hosts can retry parked work without rewriting admission. */\n readonly key: string;\n /**\n * Select an exact registered Definition using the canonical Submission and authoritative host\n * state. Undefined retains unique-identity resolution. Never grant authority or mutate here;\n * input decoding, replay contracts and current Tool authorization still apply after selection.\n */\n readonly select: (\n submission: SubmissionSnapshot,\n ) => Effect.Effect<Agent.AnyDefinition | undefined, DurableWorkerFailure | BindingUnavailable>;\n}\n\n/** Captured at runtime construction; callers cannot replace routing during an Attempt. */\nexport const CurrentBindingSelection = Context.Reference<BindingSelection | undefined>(\n \"@effect-agent/thread/CurrentBindingSelection\",\n { defaultValue: () => undefined },\n);\n\n/** Exact immutable admission, lineage and delivery evidence; never an executable-code gate. */\nexport const definitionDigestsEqual = (\n left: DefinitionDigests,\n right: DefinitionDigests,\n): boolean =>\n left.agent === right.agent &&\n left.model === right.model &&\n left.tools === right.tools &&\n Schema.toEquivalence(Schema.UndefinedOr(ReplayContract))(left.replay, right.replay);\n\n/**\n * Explicit versions must cover every current Tool. Change a version when handler meaning,\n * durable Step names/codecs, external idempotency keys, authorization, completion projection,\n * or child/report protocols change. JSON Schema cannot detect handler or codec-transform changes.\n */\nexport interface ReplayVersions {\n readonly tools: Readonly<Record<string, PersistedJson>>;\n}\n\n// These are immutable declaration projections, never model or admission contexts.\nconst replaySchemaProjections = new WeakMap<Schema.Top, Schema.Json>();\n\ntype CachedFallbackContracts = {\n readonly tools: ReadonlyArray<Tool.Any>;\n readonly completionTool: string | undefined;\n readonly completionFromTools: ReadonlyArray<string>;\n readonly version: PersistedJson;\n readonly contracts: Record<string, Digest>;\n};\n\nconst fallbackContracts = new WeakMap<Crypto.Crypto, WeakMap<object, CachedFallbackContracts>>();\n\n/** Hash current operation contracts; no historical definitions or schemas are retained. */\nexport const toolReplayContracts = Effect.fnUntraced(function* (\n definition: Agent.AnyDefinition,\n versions?: ReplayVersions,\n fallbackVersion: PersistedJson = null,\n) {\n // Optional lookup preserves validation before a missing-service defect. A\n // different host Crypto service must never inherit another host's digest map.\n const crypto = Option.getOrUndefined(yield* Effect.serviceOption(Crypto.Crypto));\n\n const invalidContracts = () =>\n DigestError.make({\n message: \"Operation contracts require serializable codecs and a version for every Tool\",\n });\n\n const prepared = yield* Effect.try({\n try: () => {\n const tools = Object.values(definition.toolkit.tools);\n const completionTool = definition.completion?.tool;\n const completionFromTools = definition.completionFromTools?.map(({ tool }) => tool) ?? [];\n // Object-valued versions may be mutable caller data. Only primitive fallback\n // versions can reuse a result, and only one result is retained per toolkit.\n\n const cacheable =\n versions === undefined && (fallbackVersion === null || typeof fallbackVersion !== \"object\");\n\n const cached =\n cacheable && crypto !== undefined\n ? fallbackContracts.get(crypto)?.get(definition.toolkit.tools)\n : undefined;\n\n if (\n cached !== undefined &&\n cached.version === fallbackVersion &&\n cached.completionTool === completionTool &&\n cached.completionFromTools.length === completionFromTools.length &&\n cached.completionFromTools.every((tool, index) => tool === completionFromTools[index]) &&\n cached.tools.length === tools.length &&\n cached.tools.every((tool, index) => tool === tools[index])\n )\n return { _tag: \"Cached\" as const, contracts: { ...cached.contracts } };\n\n const jsonSchema = (schema: Schema.Top) => {\n const cached = replaySchemaProjections.get(schema);\n\n if (cached !== undefined) return cached;\n\n const projection = Schema.decodeUnknownSync(Schema.Json)(\n Tool.getJsonSchemaFromSchema(schema),\n );\n\n replaySchemaProjections.set(schema, projection);\n\n return projection;\n };\n\n return {\n _tag: \"Compile\" as const,\n jsonSchema,\n cacheable,\n tools,\n completionTool,\n completionFromTools,\n };\n },\n catch: () =>\n DigestError.make({\n message: \"Operation contracts require serializable codecs and a version for every Tool\",\n }),\n });\n\n if (prepared._tag === \"Cached\") return prepared.contracts;\n\n const declarations = yield* Effect.forEach(\n prepared.tools,\n Effect.fnUntraced(function* (tool) {\n const { version, present } = yield* Effect.try({\n try: () => ({\n version: versions === undefined ? fallbackVersion : versions.tools[tool.name],\n present: versions === undefined || Object.hasOwn(versions.tools, tool.name),\n }),\n catch: invalidContracts,\n });\n\n if (version === undefined || !present) return yield* invalidContracts();\n\n return yield* Effect.try({\n try: () => ({\n name: tool.name,\n contract: {\n version,\n ...(Tool.isProviderDefined(tool)\n ? {\n provider: {\n id: tool.id,\n providerName: tool.providerName,\n args: Schema.decodeUnknownSync(Schema.Json)(tool.args ?? null),\n requiresHandler: tool.requiresHandler,\n },\n readonly: Context.get(tool.annotations, Tool.Readonly),\n }\n : {}),\n parameters: prepared.jsonSchema(tool.parametersSchema),\n success: prepared.jsonSchema(tool.successSchema),\n failure: prepared.jsonSchema(tool.failureSchema),\n failureMode: tool.failureMode,\n needsApproval:\n typeof tool.needsApproval === \"function\" ? \"dynamic\" : (tool.needsApproval ?? false),\n executionClass: getToolExecutionClass(tool),\n executionKind: getToolExecutionKind(tool.annotations),\n contextRollover: Context.get(tool.annotations, ContextRolloverTool),\n completion: definition.completion?.tool === tool.name,\n completionFromTool:\n definition.completionFromTools?.some(\n (declaration) => declaration.tool === tool.name,\n ) ?? false,\n },\n }),\n catch: invalidContracts,\n });\n }),\n );\n\n const contracts = Object.fromEntries(\n yield* Effect.forEach(declarations, ({ name, contract }) =>\n digestJson(contract).pipe(Effect.map((digest) => [name, digest] as const)),\n ),\n );\n\n if (prepared.cacheable && crypto !== undefined) {\n const cache = fallbackContracts.get(crypto) ?? new WeakMap<object, CachedFallbackContracts>();\n\n cache.set(definition.toolkit.tools, {\n tools: prepared.tools,\n completionTool: prepared.completionTool,\n completionFromTools: prepared.completionFromTools,\n version: fallbackVersion,\n contracts: { ...contracts },\n });\n fallbackContracts.set(crypto, cache);\n }\n\n return contracts;\n});\n\n/** Compile current metadata without acquiring executable services. */\nexport const compileBindingContracts = Effect.fnUntraced(function* (\n definition: Agent.AnyDefinition,\n definitions: DefinitionDigestInput,\n versions?: ReplayVersions,\n): Effect.fn.Return<Pick<ResolvedBinding, \"digests\">, DigestError, Crypto.Crypto> {\n const digests = yield* digestDefinitions(definitions);\n const tools = yield* toolReplayContracts(definition, versions, definitions.tools);\n\n return {\n digests: DefinitionDigests.make({\n ...digests,\n replay: ReplayContract.make({ agent: digests.agent, tools }),\n }),\n };\n});\n\ntype ExecutableDefinition = Agent.AnyDefinition & {\n readonly instructions: InstructionSource<never, unknown, unknown>;\n readonly inputPrompt?: InputPromptSource<never, unknown, unknown> | undefined;\n};\n\n/** Executable model Binding accepted by durable registration descriptors. */\nexport type ExecutableAgentBinding = {\n readonly definition: ExecutableDefinition;\n readonly model: Layer.Layer<ModelServices, never, unknown>;\n};\n\n/**\n * Internal coordinator entry point for one fenced Attempt over an already-granted claim.\n * The generic signature matches `runAttempt` and is specialized for each captured Agent.\n */\ntype ResolvedAttemptDriver = <\n InputSchema extends Schema.Top,\n OutputSchema extends Schema.Top,\n Instructions,\n Tools extends Record<string, Tool.Any>,\n Provider,\n ModelProvides,\n ModelRequires,\n InstructionError,\n InstructionRequirements,\n RunDispositionValue extends\n | RunDispositionDeclaration<OutputSchema[\"Type\"], Schema.Top>\n | undefined,\n InputPromptValue extends InputPromptSource<InputSchema[\"Type\"], unknown, unknown> | undefined,\n UpdatesSchema extends Schema.Top | undefined,\n>(\n agent: RuntimeBinding<\n InputSchema,\n OutputSchema,\n Instructions,\n Tools,\n Provider,\n ModelProvides,\n ModelRequires,\n InstructionError,\n InstructionRequirements,\n RunDispositionValue,\n InputPromptValue,\n UpdatesSchema\n >,\n threadId: ThreadId,\n claim: Claim,\n) => Effect.Effect<\n Option.Option<Settlement>,\n DurableWorkerFailure | DurableBindingFailure,\n DurableWorkerRequirements<\n RuntimeBinding<\n InputSchema,\n OutputSchema,\n Instructions,\n Tools,\n Provider,\n ModelProvides,\n ModelRequires,\n InstructionError,\n InstructionRequirements,\n RunDispositionValue,\n InputPromptValue,\n UpdatesSchema\n >,\n InstructionRequirements\n >\n>;\n\ntype CapturedAttempt<A extends ExecutableAgentBinding> = (\n agent: A,\n threadId: ThreadId,\n claim: Claim,\n) => Effect.Effect<\n Option.Option<Settlement>,\n DurableWorkerFailure | DurableBindingFailure,\n DurableWorkerRequirements<A>\n>;\n\n/**\n * An Agent with its worker services captured, ready to drive a fenced Attempt.\n * Concrete Schema and model types stay inside this closure when registrations are collected.\n */\ninterface CapturedBinding {\n readonly agentId: AgentId;\n /** Exact immutable definition whose codecs and behavior the worker captured. */\n readonly definition: Agent.AnyDefinition;\n /** Captured independently from per-Attempt services: report preparation has no fenced Claim. */\n readonly reporting?: ReadonlyArray<WorkerReporting<WorkerReportPreparationFailure>>;\n readonly attempt: (\n driver: ResolvedAttemptDriver,\n threadId: ThreadId,\n claim: Claim,\n ) => Effect.Effect<Option.Option<Settlement>, DurableWorkerFailure | DurableBindingFailure>;\n}\n\n// Registrations outlive their construction span. Dependencies remain captured,\n// while every attempt/report inherits the invoking fiber's tracing state.\nconst omitTraceContext = Context.omit(\n Scope.Scope,\n Tracer.ParentSpan,\n Tracer.Tracer,\n Tracer.MinimumTraceLevel,\n Tracer.CurrentTraceLevel,\n References.TracerEnabled,\n References.TracerTimingEnabled,\n References.TracerSpanAnnotations,\n References.TracerSpanLinks,\n References.CurrentLoggers,\n References.CurrentLogLevel,\n References.MinimumLogLevel,\n References.CurrentStackFrame,\n References.CurrentLogAnnotations,\n References.CurrentLogSpans,\n);\n\n// R describes captured application services; ParentSpan is supplied by the\n// live invocation rather than stored as a registration dependency.\nconst withoutTraceContext = <R>(context: Context.Context<R>): Context.Context<R> =>\n omitTraceContext(context) as Context.Context<R>;\n\nconst captureReporting = <E, R>(reports: ReadonlyArray<WorkerReporting<E, R>>) =>\n Effect.map(\n Effect.context<Exclude<R, Scope.Scope>>().pipe(Effect.map(withoutTraceContext)),\n (context) =>\n reports.map((report): WorkerReporting<WorkerReportPreparationFailure> => ({\n ...report,\n prepare: (value) =>\n Effect.scoped(Effect.suspend(() => report.prepare(value))).pipe(\n Effect.provide(context),\n Effect.mapError((error) =>\n Schema.is(WorkerReportPreparationFailure)(error)\n ? error\n : WorkerReportPreparationFailure.make({ stage: \"preparation\" }),\n ),\n ),\n })),\n );\n\nconst backgroundReports = (definition: Agent.AnyDefinition) => [\n ...new Set(\n Object.values(definition.toolkit.tools).flatMap((tool) => {\n const report = Context.get(tool.annotations, BackgroundReporting);\n\n return report === undefined ? [] : [report];\n }),\n ),\n];\n\n/** One exact executable registration used by durable claim-time resolution. */\nexport interface ResolvedBinding extends CapturedBinding {\n readonly digests: DefinitionDigests;\n}\n\n/** Trusted claim identity for resolving per-Attempt application services. Not model input. */\nexport interface AgentAttemptContext {\n readonly threadId: ThreadId;\n readonly submissionId: Claim[\"submissionId\"];\n readonly attemptId: Claim[\"attemptId\"];\n}\n\nconst capture = <A extends ExecutableAgentBinding, Requires>(\n agent: A,\n prepare: (\n execute: ReturnType<CapturedAttempt<A>>,\n context: AgentAttemptContext,\n ) => Effect.Effect<\n Option.Option<Settlement>,\n DurableWorkerFailure | DurableBindingFailure,\n Requires\n >,\n): Effect.Effect<CapturedBinding, never, Requires> =>\n Effect.map(\n Effect.context<Requires>().pipe(Effect.map(withoutTraceContext)),\n (context): CapturedBinding => ({\n agentId: agent.definition.id,\n definition: agent.definition,\n attempt: (driver, threadId, claim) => {\n // Registration closes one concrete Binding before heterogeneous registrations are\n // collected. TypeScript cannot instantiate the higher-rank RuntimeBinding parameters\n // from the intentionally erased public shape, so specialize the driver back to A here.\n const run = driver as unknown as CapturedAttempt<A>;\n\n const execute = withProvisionalTextAttempt(\n run(agent, threadId, claim),\n threadId,\n claim.submissionId,\n claim.attemptId,\n );\n\n return prepare(execute, {\n threadId,\n submissionId: claim.submissionId,\n attemptId: claim.attemptId,\n }).pipe(Effect.provide(context));\n },\n }),\n );\n\nconst captureWithAttemptLayer = <A extends ExecutableAgentBinding, Provides, Requires>(\n agent: A,\n attemptLayer: (context: AgentAttemptContext) => Layer.Layer<Provides, never, Requires>,\n) =>\n capture(agent, (execute, context) =>\n execute.pipe(Effect.provide(Layer.fresh(attemptLayer(context)))),\n );\n\n/**\n * Build one exact worker registration from an executable Agent Binding and\n * its already-computed definition digests.\n *\n * `make(agent, digests)` captures the binding plus its worker-requirement\n * Context at Layer/effect construction time. Hosts that start from application\n * version declarations should use `compileRegistrations`; low-level fixtures\n * may supply a previously computed digest triple directly.\n */\nexport const DurableWorkerBinding = {\n make: <A extends ExecutableAgentBinding>(\n agent: A,\n digests: DefinitionDigests,\n ): Effect.Effect<ResolvedBinding, never, DurableWorkerRequirements<A>> =>\n Effect.gen(function* () {\n const binding = yield* capture(agent, (execute) => execute);\n const reporting = yield* captureReporting(backgroundReports(agent.definition));\n\n return { ...binding, digests, reporting };\n }),\n} as const;\n\n/** INTERNAL identity-only capture retained for the legacy direct worker path. */\nexport const makeLegacyWorkerBinding = <A extends ExecutableAgentBinding>(agent: A) =>\n capture(agent, (execute) => execute);\n\nexport const resolveWorkerBinding = Effect.fnUntraced(function* (\n bindings: ReadonlyArray<ResolvedBinding>,\n submission: SubmissionSnapshot,\n) {\n const selection = yield* CurrentBindingSelection;\n const definition = selection === undefined ? undefined : yield* selection.select(submission);\n\n const registered = bindings.filter(\n (binding) =>\n binding.agentId === submission.agentId &&\n (definition === undefined || Object.is(binding.definition, definition)),\n );\n\n const binding = registered[0];\n\n if (registered.length !== 1 || binding === undefined)\n return yield* BindingUnavailable.make({\n agentId: submission.agentId,\n message: \"Exactly one current Agent Binding must match the accepted Submission\",\n });\n\n return binding;\n});\n\n/** Resolve authoring-time admission through exact host registration, never by identity alone. */\nexport const resolveDefinitionBinding = (\n bindings: ReadonlyArray<ResolvedBinding>,\n definition: Pick<Agent.AnyDefinition, \"id\">,\n): Effect.Effect<ResolvedBinding, BindingUnavailable> => {\n const candidates = bindings.filter(\n (binding) => binding.agentId === definition.id && Object.is(binding.definition, definition),\n );\n\n const binding = candidates[0];\n\n return candidates.length === 1 && binding !== undefined\n ? Effect.succeed(binding)\n : Effect.fail(\n BindingUnavailable.make({\n agentId: definition.id,\n message:\n \"Registered admission requires exactly one registration of the exact Agent Definition\",\n }),\n );\n};\n\n/** Application versions and a model Layer, supplied directly or through an existing Binding. */\nexport type AgentRegistration<A extends ExecutableAgentBinding = ExecutableAgentBinding> = (\n | { readonly agent: A; readonly model?: never; readonly definitions: DefinitionDigestInput }\n | {\n readonly agent: A[\"definition\"];\n readonly model: A[\"model\"];\n readonly definitions: DefinitionDigestInput;\n }\n) & {\n /** Explicit operation versions let unchanged unfinished handlers survive toolbox changes. */\n readonly continuity?: {\n readonly versions: ReplayVersions;\n };\n /**\n * Build fresh services for exactly one fenced Attempt, across all its Tool/model turns.\n * Finalizes on completion, suspension, failure and interruption. Never reused after eviction.\n * Resolve invocation authority from the trusted claim identity, not captured caller state.\n * Keep fallible resource acquisition lazy in typed Tool operations; this Layer cannot fail.\n * Provide DurableApprovalSuspension here when resources need retention before approval waits.\n */\n readonly attemptLayer?: (context: AgentAttemptContext) => Layer.Layer<never, never, unknown>;\n};\n\ntype EntryWorkerRequirements<Entry> = Entry extends {\n readonly agent: infer A extends ExecutableAgentBinding;\n}\n ? DurableWorkerRequirements<A>\n : Entry extends {\n readonly agent: infer D extends ExecutableDefinition;\n readonly model: infer M extends ExecutableAgentBinding[\"model\"];\n }\n ? DurableWorkerRequirements<{ readonly definition: D; readonly model: M }>\n : never;\n\ntype AttemptLayerRequirements<Requirements, AttemptLayer> = AttemptLayer extends (\n context: AgentAttemptContext,\n) => Layer.Layer<infer Provides, never, infer Requires>\n ? Exclude<Requirements, Provides> | Requires\n : Requirements;\n\n// Conditional options retain every service they may consume. An absent attempt Layer\n// still needs the original worker services; only a definite Layer can remove them.\ntype EntryRequirements<Entry> = Entry extends unknown\n ? AttemptLayerRequirements<\n EntryWorkerRequirements<Entry>,\n \"attemptLayer\" extends keyof Entry ? Entry[\"attemptLayer\"] : undefined\n >\n : never;\n\ntype RegistrationRequirements<Entries extends ReadonlyArray<AgentRegistration>> = EntryRequirements<\n Entries[number]\n>;\n\nconst registrationDefinitions = (entry: AgentRegistration): DefinitionDigestInput => {\n const definition = entry.model === undefined ? entry.agent.definition : entry.agent;\n const automatic = backgroundReports(definition);\n\n const declaredDefinitions =\n definition.updates === undefined\n ? entry.definitions\n : {\n ...entry.definitions,\n agent: {\n declaration: entry.definitions.agent,\n updates: Schema.decodeUnknownSync(Schema.Json)(\n Tool.getJsonSchemaFromSchema(definition.updates),\n ),\n updateProtocol: { schemaVersion: 1, tool: \"emit_update\" },\n },\n };\n\n const definitions =\n automatic.length === 0\n ? declaredDefinitions\n : {\n ...declaredDefinitions,\n agent: {\n declaration: declaredDefinitions.agent,\n backgroundReporting: automatic.map((report) => ({\n delegationId: report.delegationId,\n targetAgentId: report.target.id,\n mode: \"standard\",\n // Preserve the fingerprint of existing standard registrations.\n destinationDelegationId: null,\n })),\n },\n };\n\n const exposure = definition.toolExposure;\n\n if (\n exposure === undefined &&\n !Object.values(definition.toolkit.tools).some(\n (tool) =>\n Context.get(tool.annotations, DiscoveryTool) || Context.get(tool.annotations, PinnedTool),\n )\n )\n return definitions;\n\n return {\n ...definitions,\n agent: {\n declaration: definitions.agent,\n toolExposure: {\n initialToolNames: exposure === undefined ? null : [...(exposure.initialToolNames ?? [])],\n maxTools: exposure?.maxTools ?? 64,\n maxSchemaBytes: exposure?.maxSchemaBytes ?? 262_144,\n requiredCompletion:\n definition.completion?.required === true ? definition.completion.tool : null,\n tools: Object.values(definition.toolkit.tools).map((tool) => ({\n name: tool.name,\n pinned: Context.get(tool.annotations, PinnedTool),\n discovery: Context.get(tool.annotations, DiscoveryTool),\n namespace: Context.get(tool.annotations, ToolNamespace) ?? null,\n includesCatalogDocumentation: Context.get(tool.annotations, IncludesCatalogDocumentation),\n additional: Context.get(tool.annotations, AdditionalToolCatalog).map((entry) => ({\n name: entry.tool.name,\n namespace: entry.namespace,\n method: entry.method,\n })),\n })),\n },\n },\n };\n};\n\n// The public signature distributes over descriptors, including optional attempt Layers.\n// The implementation consumes their erased union and captures the selected Layer's context.\nfunction compileRegistration<Entry extends AgentRegistration>(\n entry: Entry,\n): Effect.Effect<ResolvedBinding, DigestError, Crypto.Crypto | EntryRequirements<Entry>>;\nfunction compileRegistration(entry: AgentRegistration) {\n return Effect.flatMap(\n Effect.try({\n try: () => registrationDefinitions(entry),\n catch: () =>\n DigestError.make({ message: \"Agent update schema has no serializable wire contract\" }),\n }),\n (definitions) =>\n Effect.gen(function* () {\n const agent =\n // The heterogeneous descriptor erases model services; the overload retains EntryRequirements.\n // @effect-diagnostics-next-line anyUnknownInErrorContext:off\n entry.model === undefined ? entry.agent : { definition: entry.agent, model: entry.model };\n\n // Omitted attempt services need no Layer construction or provisioning scope.\n const binding = yield* entry.attemptLayer === undefined\n ? // Capture closes the erased requirements over the registration's actual Context.\n // @effect-diagnostics-next-line anyUnknownInErrorContext:off\n capture(agent, (execute) => execute)\n : // The selected Layer discharges its services before the remaining Context is captured.\n // @effect-diagnostics-next-line anyUnknownInErrorContext:off\n captureWithAttemptLayer(agent, entry.attemptLayer);\n\n const reporting = yield* captureReporting(backgroundReports(binding.definition));\n\n return {\n ...binding,\n ...(yield* compileBindingContracts(\n binding.definition,\n definitions,\n entry.continuity?.versions,\n )),\n reporting,\n };\n }),\n );\n}\n\n/** Compile heterogeneous Agent descriptors into exact, dependency-closed worker registrations. */\nexport const compileRegistrations = <const Entries extends ReadonlyArray<AgentRegistration>>(\n entries: Entries,\n): Effect.Effect<\n ReadonlyArray<ResolvedBinding>,\n DigestError,\n Crypto.Crypto | RegistrationRequirements<Entries>\n> => {\n return Effect.forEach(entries, compileRegistration<Entries[number]>);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-registration-7kp1dHT0.mjs","names":["withProvisionalTextAttempt","run"],"sources":["../src/durable/internal/agent-registration.ts"],"sourcesContent":["import { Crypto, Option, Scope, Context, Effect, Layer, References, Schema, Tracer } from \"effect\";\nimport { Tool } from \"effect/ai\";\n\nimport type * as Agent from \"../../core/Agent.ts\";\nimport {\n type InputPromptSource,\n type InstructionSource,\n type ModelServices,\n type RunDispositionDeclaration,\n} from \"../../core/Agent.ts\";\nimport { type ThreadId, AgentId } from \"../../core/Identifiers.ts\";\nimport { getToolExecutionKind } from \"../../core/SubagentContract.ts\";\nimport {\n AdditionalToolCatalog,\n DiscoveryTool,\n IncludesCatalogDocumentation,\n PinnedTool,\n ToolNamespace,\n} from \"../../core/ToolExposure.ts\";\nimport { type RuntimeBinding } from \"../../engine/AgentRuntime.ts\";\nimport { ContextRolloverTool } from \"../../engine/ContextWindow.ts\";\nimport { getToolExecutionClass } from \"../../engine/DurableStep.ts\";\nimport { withAttempt as withProvisionalTextAttempt } from \"../../engine/internal/provisional-text.ts\";\nimport {\n BackgroundReporting,\n WorkerReportPreparationFailure,\n type WorkerReporting,\n} from \"../../engine/SubagentHost.ts\";\nimport { digestDefinitions, digestJson, DigestError } from \"../Digest.ts\";\nimport type { DurableWorkerFailure, DurableWorkerRequirements } from \"../DurableAgentRuntime.ts\";\nimport type { DefinitionDigestInput, Digest, PersistedJson } from \"../Records.ts\";\nimport { DefinitionDigests, ReplayContract } from \"../Records.ts\";\nimport type { Claim, Settlement, SubmissionSnapshot } from \"../SubmissionLedger.ts\";\n\n/** No unique current Binding can execute the stable Agent identity or decode its accepted input. */\nexport class BindingUnavailable extends Schema.TaggedError<BindingUnavailable>()(\n \"BindingUnavailable\",\n { agentId: AgentId, message: Schema.String },\n) {}\n\nexport type DurableBindingFailure = BindingUnavailable;\n\n/**\n * Submission execution/recovery routing for stable identities shared by current Definitions.\n * Worker declarations and peer-messaging endpoints still require unique Agent identities.\n */\nexport interface BindingSelection {\n /** Change when routing changes, so hosts can retry parked work without rewriting admission. */\n readonly key: string;\n /**\n * Select an exact registered Definition using the canonical Submission and authoritative host\n * state. Undefined retains unique-identity resolution. Never grant authority or mutate here;\n * input decoding, replay contracts and current Tool authorization still apply after selection.\n */\n readonly select: (\n submission: SubmissionSnapshot,\n ) => Effect.Effect<Agent.AnyDefinition | undefined, DurableWorkerFailure | BindingUnavailable>;\n}\n\n/** Captured at runtime construction; callers cannot replace routing during an Attempt. */\nexport const CurrentBindingSelection = Context.Reference<BindingSelection | undefined>(\n \"@effect-agent/thread/CurrentBindingSelection\",\n { defaultValue: () => undefined },\n);\n\n/** Exact immutable admission, lineage and delivery evidence; never an executable-code gate. */\nexport const definitionDigestsEqual = (\n left: DefinitionDigests,\n right: DefinitionDigests,\n): boolean =>\n left.agent === right.agent &&\n left.model === right.model &&\n left.tools === right.tools &&\n Schema.toEquivalence(Schema.UndefinedOr(ReplayContract))(left.replay, right.replay);\n\n/**\n * Explicit versions must cover every current Tool. Change a version when handler meaning,\n * durable Step names/codecs, external idempotency keys, authorization, completion projection,\n * or child/report protocols change. JSON Schema cannot detect handler or codec-transform changes.\n */\nexport interface ReplayVersions {\n readonly tools: Readonly<Record<string, PersistedJson>>;\n}\n\n// These are immutable declaration projections, never model or admission contexts.\nconst replaySchemaProjections = new WeakMap<Schema.Top, Schema.Json>();\n\ntype CachedFallbackContracts = {\n readonly tools: ReadonlyArray<Tool.Any>;\n readonly completionTool: string | undefined;\n readonly completionFromTools: ReadonlyArray<string>;\n readonly version: PersistedJson;\n readonly contracts: Record<string, Digest>;\n};\n\nconst fallbackContracts = new WeakMap<Crypto.Crypto, WeakMap<object, CachedFallbackContracts>>();\n\n/** Hash current operation contracts; no historical definitions or schemas are retained. */\nexport const toolReplayContracts = Effect.fnUntraced(function* (\n definition: Agent.AnyDefinition,\n versions?: ReplayVersions,\n fallbackVersion: PersistedJson = null,\n) {\n // Optional lookup preserves validation before a missing-service defect. A\n // different host Crypto service must never inherit another host's digest map.\n const crypto = Option.getOrUndefined(yield* Effect.serviceOption(Crypto.Crypto));\n\n const invalidContracts = () =>\n DigestError.make({\n message: \"Operation contracts require serializable codecs and a version for every Tool\",\n });\n\n const prepared = yield* Effect.try({\n try: () => {\n const tools = Object.values(definition.toolkit.tools);\n const completionTool = definition.completion?.tool;\n const completionFromTools = definition.completionFromTools?.map(({ tool }) => tool) ?? [];\n // Object-valued versions may be mutable caller data. Only primitive fallback\n // versions can reuse a result, and only one result is retained per toolkit.\n\n const cacheable =\n versions === undefined && (fallbackVersion === null || typeof fallbackVersion !== \"object\");\n\n const cached =\n cacheable && crypto !== undefined\n ? fallbackContracts.get(crypto)?.get(definition.toolkit.tools)\n : undefined;\n\n if (\n cached !== undefined &&\n cached.version === fallbackVersion &&\n cached.completionTool === completionTool &&\n cached.completionFromTools.length === completionFromTools.length &&\n cached.completionFromTools.every((tool, index) => tool === completionFromTools[index]) &&\n cached.tools.length === tools.length &&\n cached.tools.every((tool, index) => tool === tools[index])\n )\n return { _tag: \"Cached\" as const, contracts: { ...cached.contracts } };\n\n const jsonSchema = (schema: Schema.Top) => {\n const cached = replaySchemaProjections.get(schema);\n\n if (cached !== undefined) return cached;\n\n const projection = Schema.decodeUnknownSync(Schema.Json)(\n Tool.getJsonSchemaFromSchema(schema),\n );\n\n replaySchemaProjections.set(schema, projection);\n\n return projection;\n };\n\n return {\n _tag: \"Compile\" as const,\n jsonSchema,\n cacheable,\n tools,\n completionTool,\n completionFromTools,\n };\n },\n catch: () =>\n DigestError.make({\n message: \"Operation contracts require serializable codecs and a version for every Tool\",\n }),\n });\n\n if (prepared._tag === \"Cached\") return prepared.contracts;\n\n const declarations = yield* Effect.forEach(\n prepared.tools,\n Effect.fnUntraced(function* (tool) {\n const { version, present } = yield* Effect.try({\n try: () => ({\n version: versions === undefined ? fallbackVersion : versions.tools[tool.name],\n present: versions === undefined || Object.hasOwn(versions.tools, tool.name),\n }),\n catch: invalidContracts,\n });\n\n if (version === undefined || !present) return yield* invalidContracts();\n\n return yield* Effect.try({\n try: () => ({\n name: tool.name,\n contract: {\n version,\n ...(Tool.isProviderDefined(tool)\n ? {\n provider: {\n id: tool.id,\n providerName: tool.providerName,\n args: Schema.decodeUnknownSync(Schema.Json)(tool.args ?? null),\n requiresHandler: tool.requiresHandler,\n },\n readonly: Context.get(tool.annotations, Tool.Readonly),\n }\n : {}),\n parameters: prepared.jsonSchema(tool.parametersSchema),\n success: prepared.jsonSchema(tool.successSchema),\n failure: prepared.jsonSchema(tool.failureSchema),\n failureMode: tool.failureMode,\n needsApproval:\n typeof tool.needsApproval === \"function\" ? \"dynamic\" : (tool.needsApproval ?? false),\n executionClass: getToolExecutionClass(tool),\n executionKind: getToolExecutionKind(tool.annotations),\n contextRollover: Context.get(tool.annotations, ContextRolloverTool),\n completion: definition.completion?.tool === tool.name,\n completionFromTool:\n definition.completionFromTools?.some(\n (declaration) => declaration.tool === tool.name,\n ) ?? false,\n },\n }),\n catch: invalidContracts,\n });\n }),\n );\n\n const contracts = Object.fromEntries(\n yield* Effect.forEach(declarations, ({ name, contract }) =>\n digestJson(contract).pipe(Effect.map((digest) => [name, digest] as const)),\n ),\n );\n\n if (prepared.cacheable && crypto !== undefined) {\n const cache = fallbackContracts.get(crypto) ?? new WeakMap<object, CachedFallbackContracts>();\n\n cache.set(definition.toolkit.tools, {\n tools: prepared.tools,\n completionTool: prepared.completionTool,\n completionFromTools: prepared.completionFromTools,\n version: fallbackVersion,\n contracts: { ...contracts },\n });\n fallbackContracts.set(crypto, cache);\n }\n\n return contracts;\n});\n\n/** Compile current metadata without acquiring executable services. */\nexport const compileBindingContracts = Effect.fnUntraced(function* (\n definition: Agent.AnyDefinition,\n definitions: DefinitionDigestInput,\n versions?: ReplayVersions,\n): Effect.fn.Return<Pick<ResolvedBinding, \"digests\">, DigestError, Crypto.Crypto> {\n const digests = yield* digestDefinitions(definitions);\n const tools = yield* toolReplayContracts(definition, versions, definitions.tools);\n\n return {\n digests: DefinitionDigests.make({\n ...digests,\n replay: ReplayContract.make({ agent: digests.agent, tools }),\n }),\n };\n});\n\ntype ExecutableDefinition = Agent.AnyDefinition & {\n readonly instructions: InstructionSource<never, unknown, unknown>;\n readonly inputPrompt?: InputPromptSource<never, unknown, unknown> | undefined;\n};\n\n/** Executable model Binding accepted by durable registration descriptors. */\nexport type ExecutableAgentBinding = {\n readonly definition: ExecutableDefinition;\n readonly model: Layer.Layer<ModelServices, never, unknown>;\n};\n\n/**\n * Internal coordinator entry point for one fenced Attempt over an already-granted claim.\n * The generic signature matches `runAttempt` and is specialized for each captured Agent.\n */\ntype ResolvedAttemptDriver = <\n InputSchema extends Schema.Top,\n OutputSchema extends Schema.Top,\n Instructions,\n Tools extends Record<string, Tool.Any>,\n Provider,\n ModelProvides,\n ModelRequires,\n InstructionError,\n InstructionRequirements,\n RunDispositionValue extends\n | RunDispositionDeclaration<OutputSchema[\"Type\"], Schema.Top>\n | undefined,\n InputPromptValue extends InputPromptSource<InputSchema[\"Type\"], unknown, unknown> | undefined,\n UpdatesSchema extends Schema.Top | undefined,\n>(\n agent: RuntimeBinding<\n InputSchema,\n OutputSchema,\n Instructions,\n Tools,\n Provider,\n ModelProvides,\n ModelRequires,\n InstructionError,\n InstructionRequirements,\n RunDispositionValue,\n InputPromptValue,\n UpdatesSchema\n >,\n threadId: ThreadId,\n claim: Claim,\n) => Effect.Effect<\n Option.Option<Settlement>,\n DurableWorkerFailure | DurableBindingFailure,\n DurableWorkerRequirements<\n RuntimeBinding<\n InputSchema,\n OutputSchema,\n Instructions,\n Tools,\n Provider,\n ModelProvides,\n ModelRequires,\n InstructionError,\n InstructionRequirements,\n RunDispositionValue,\n InputPromptValue,\n UpdatesSchema\n >,\n InstructionRequirements\n >\n>;\n\ntype CapturedAttempt<A extends ExecutableAgentBinding> = (\n agent: A,\n threadId: ThreadId,\n claim: Claim,\n) => Effect.Effect<\n Option.Option<Settlement>,\n DurableWorkerFailure | DurableBindingFailure,\n DurableWorkerRequirements<A>\n>;\n\n/**\n * An Agent with its worker services captured, ready to drive a fenced Attempt.\n * Concrete Schema and model types stay inside this closure when registrations are collected.\n */\ninterface CapturedBinding {\n readonly agentId: AgentId;\n /** Exact immutable definition whose codecs and behavior the worker captured. */\n readonly definition: Agent.AnyDefinition;\n /** Captured independently from per-Attempt services: report preparation has no fenced Claim. */\n readonly reporting?: ReadonlyArray<WorkerReporting<WorkerReportPreparationFailure>>;\n readonly attempt: (\n driver: ResolvedAttemptDriver,\n threadId: ThreadId,\n claim: Claim,\n ) => Effect.Effect<Option.Option<Settlement>, DurableWorkerFailure | DurableBindingFailure>;\n}\n\n// Registrations outlive their construction span. Dependencies remain captured,\n// while every attempt/report inherits the invoking fiber's tracing state.\nconst omitTraceContext = Context.omit(\n Scope.Scope,\n Tracer.ParentSpan,\n Tracer.Tracer,\n Tracer.MinimumTraceLevel,\n Tracer.CurrentTraceLevel,\n References.TracerEnabled,\n References.TracerTimingEnabled,\n References.TracerSpanAnnotations,\n References.TracerSpanLinks,\n References.CurrentLoggers,\n References.CurrentLogLevel,\n References.MinimumLogLevel,\n References.CurrentStackFrame,\n References.CurrentLogAnnotations,\n References.CurrentLogSpans,\n);\n\n// R describes captured application services; ParentSpan is supplied by the\n// live invocation rather than stored as a registration dependency.\nconst withoutTraceContext = <R>(context: Context.Context<R>): Context.Context<R> =>\n omitTraceContext(context) as Context.Context<R>;\n\nconst captureReporting = <E, R>(reports: ReadonlyArray<WorkerReporting<E, R>>) =>\n Effect.map(\n Effect.context<Exclude<R, Scope.Scope>>().pipe(Effect.map(withoutTraceContext)),\n (context) =>\n reports.map((report): WorkerReporting<WorkerReportPreparationFailure> => ({\n ...report,\n prepare: (value) =>\n Effect.scoped(Effect.suspend(() => report.prepare(value))).pipe(\n Effect.provide(context),\n Effect.mapError((error) =>\n Schema.is(WorkerReportPreparationFailure)(error)\n ? error\n : WorkerReportPreparationFailure.make({ stage: \"preparation\" }),\n ),\n ),\n })),\n );\n\nconst backgroundReports = (definition: Agent.AnyDefinition) => [\n ...new Set(\n Object.values(definition.toolkit.tools).flatMap((tool) => {\n const report = Context.get(tool.annotations, BackgroundReporting);\n\n return report === undefined ? [] : [report];\n }),\n ),\n];\n\n/** One exact executable registration used by durable claim-time resolution. */\nexport interface ResolvedBinding extends CapturedBinding {\n readonly digests: DefinitionDigests;\n}\n\n/** Trusted claim identity for resolving per-Attempt application services. Not model input. */\nexport interface AgentAttemptContext {\n readonly threadId: ThreadId;\n readonly submissionId: Claim[\"submissionId\"];\n readonly attemptId: Claim[\"attemptId\"];\n}\n\nconst capture = <A extends ExecutableAgentBinding, Requires>(\n agent: A,\n prepare: (\n execute: ReturnType<CapturedAttempt<A>>,\n context: AgentAttemptContext,\n ) => Effect.Effect<\n Option.Option<Settlement>,\n DurableWorkerFailure | DurableBindingFailure,\n Requires\n >,\n): Effect.Effect<CapturedBinding, never, Requires> =>\n Effect.map(\n Effect.context<Requires>().pipe(Effect.map(withoutTraceContext)),\n (context): CapturedBinding => ({\n agentId: agent.definition.id,\n definition: agent.definition,\n attempt: (driver, threadId, claim) => {\n // Registration closes one concrete Binding before heterogeneous registrations are\n // collected. TypeScript cannot instantiate the higher-rank RuntimeBinding parameters\n // from the intentionally erased public shape, so specialize the driver back to A here.\n const run = driver as unknown as CapturedAttempt<A>;\n\n const execute = withProvisionalTextAttempt(\n run(agent, threadId, claim),\n threadId,\n claim.submissionId,\n claim.attemptId,\n );\n\n return prepare(execute, {\n threadId,\n submissionId: claim.submissionId,\n attemptId: claim.attemptId,\n }).pipe(Effect.provide(context));\n },\n }),\n );\n\nconst captureWithAttemptLayer = <A extends ExecutableAgentBinding, Provides, Requires>(\n agent: A,\n attemptLayer: (context: AgentAttemptContext) => Layer.Layer<Provides, never, Requires>,\n) =>\n capture(agent, (execute, context) =>\n execute.pipe(Effect.provide(Layer.fresh(attemptLayer(context)))),\n );\n\n/**\n * Build one exact worker registration from an executable Agent Binding and\n * its already-computed definition digests.\n *\n * `make(agent, digests)` captures the binding plus its worker-requirement\n * Context at Layer/effect construction time. Hosts that start from application\n * version declarations should use `compileRegistrations`; low-level fixtures\n * may supply a previously computed digest triple directly.\n */\nexport const DurableWorkerBinding = {\n make: <A extends ExecutableAgentBinding>(\n agent: A,\n digests: DefinitionDigests,\n ): Effect.Effect<ResolvedBinding, never, DurableWorkerRequirements<A>> =>\n Effect.gen(function* () {\n const binding = yield* capture(agent, (execute) => execute);\n const reporting = yield* captureReporting(backgroundReports(agent.definition));\n\n return { ...binding, digests, reporting };\n }),\n} as const;\n\n/** INTERNAL identity-only capture retained for the legacy direct worker path. */\nexport const makeLegacyWorkerBinding = <A extends ExecutableAgentBinding>(agent: A) =>\n capture(agent, (execute) => execute);\n\nexport const resolveWorkerBinding = Effect.fnUntraced(function* (\n bindings: ReadonlyArray<ResolvedBinding>,\n submission: SubmissionSnapshot,\n) {\n const selection = yield* CurrentBindingSelection;\n const definition = selection === undefined ? undefined : yield* selection.select(submission);\n\n const registered = bindings.filter(\n (binding) =>\n binding.agentId === submission.agentId &&\n (definition === undefined || Object.is(binding.definition, definition)),\n );\n\n const binding = registered[0];\n\n if (registered.length !== 1 || binding === undefined)\n return yield* BindingUnavailable.make({\n agentId: submission.agentId,\n message: \"Exactly one current Agent Binding must match the accepted Submission\",\n });\n\n return binding;\n});\n\n/** Resolve authoring-time admission through exact host registration, never by identity alone. */\nexport const resolveDefinitionBinding = (\n bindings: ReadonlyArray<ResolvedBinding>,\n definition: Pick<Agent.AnyDefinition, \"id\">,\n): Effect.Effect<ResolvedBinding, BindingUnavailable> => {\n const candidates = bindings.filter(\n (binding) => binding.agentId === definition.id && Object.is(binding.definition, definition),\n );\n\n const binding = candidates[0];\n\n return candidates.length === 1 && binding !== undefined\n ? Effect.succeed(binding)\n : Effect.fail(\n BindingUnavailable.make({\n agentId: definition.id,\n message:\n \"Registered admission requires exactly one registration of the exact Agent Definition\",\n }),\n );\n};\n\n/** Application versions and a model Layer, supplied directly or through an existing Binding. */\nexport type AgentRegistration<A extends ExecutableAgentBinding = ExecutableAgentBinding> = (\n | { readonly agent: A; readonly model?: never; readonly definitions: DefinitionDigestInput }\n | {\n readonly agent: A[\"definition\"];\n readonly model: A[\"model\"];\n readonly definitions: DefinitionDigestInput;\n }\n) & {\n /** Explicit operation versions let unchanged unfinished handlers survive toolbox changes. */\n readonly continuity?: {\n readonly versions: ReplayVersions;\n };\n /**\n * Build fresh services for exactly one fenced Attempt, across all its Tool/model turns.\n * Finalizes on completion, suspension, failure and interruption. Never reused after eviction.\n * Resolve invocation authority from the trusted claim identity, not captured caller state.\n * Keep fallible resource acquisition lazy in typed Tool operations; this Layer cannot fail.\n * Provide DurableApprovalSuspension here when resources need retention before approval waits.\n */\n readonly attemptLayer?: (context: AgentAttemptContext) => Layer.Layer<never, never, unknown>;\n};\n\ntype EntryWorkerRequirements<Entry> = Entry extends {\n readonly agent: infer A extends ExecutableAgentBinding;\n}\n ? DurableWorkerRequirements<A>\n : Entry extends {\n readonly agent: infer D extends ExecutableDefinition;\n readonly model: infer M extends ExecutableAgentBinding[\"model\"];\n }\n ? DurableWorkerRequirements<{ readonly definition: D; readonly model: M }>\n : never;\n\ntype AttemptLayerRequirements<Requirements, AttemptLayer> = AttemptLayer extends (\n context: AgentAttemptContext,\n) => Layer.Layer<infer Provides, never, infer Requires>\n ? Exclude<Requirements, Provides> | Requires\n : Requirements;\n\n// Conditional options retain every service they may consume. An absent attempt Layer\n// still needs the original worker services; only a definite Layer can remove them.\ntype EntryRequirements<Entry> = Entry extends unknown\n ? AttemptLayerRequirements<\n EntryWorkerRequirements<Entry>,\n \"attemptLayer\" extends keyof Entry ? Entry[\"attemptLayer\"] : undefined\n >\n : never;\n\ntype RegistrationRequirements<Entries extends ReadonlyArray<AgentRegistration>> = EntryRequirements<\n Entries[number]\n>;\n\nconst registrationDefinitions = (entry: AgentRegistration): DefinitionDigestInput => {\n const definition = entry.model === undefined ? entry.agent.definition : entry.agent;\n const automatic = backgroundReports(definition);\n\n const declaredDefinitions =\n definition.updates === undefined\n ? entry.definitions\n : {\n ...entry.definitions,\n agent: {\n declaration: entry.definitions.agent,\n updates: Schema.decodeUnknownSync(Schema.Json)(\n Tool.getJsonSchemaFromSchema(definition.updates),\n ),\n updateProtocol: { schemaVersion: 1, tool: \"emit_update\" },\n },\n };\n\n const definitions =\n automatic.length === 0\n ? declaredDefinitions\n : {\n ...declaredDefinitions,\n agent: {\n declaration: declaredDefinitions.agent,\n backgroundReporting: automatic.map((report) => ({\n delegationId: report.delegationId,\n targetAgentId: report.target.id,\n mode: \"standard\",\n // Preserve the fingerprint of existing standard registrations.\n destinationDelegationId: null,\n })),\n },\n };\n\n const exposure = definition.toolExposure;\n\n if (\n exposure === undefined &&\n !Object.values(definition.toolkit.tools).some(\n (tool) =>\n Context.get(tool.annotations, DiscoveryTool) || Context.get(tool.annotations, PinnedTool),\n )\n )\n return definitions;\n\n return {\n ...definitions,\n agent: {\n declaration: definitions.agent,\n toolExposure: {\n initialToolNames: exposure === undefined ? null : [...(exposure.initialToolNames ?? [])],\n maxTools: exposure?.maxTools ?? 64,\n maxSchemaBytes: exposure?.maxSchemaBytes ?? 262_144,\n requiredCompletion:\n definition.completion?.required === true ? definition.completion.tool : null,\n tools: Object.values(definition.toolkit.tools).map((tool) => ({\n name: tool.name,\n pinned: Context.get(tool.annotations, PinnedTool),\n discovery: Context.get(tool.annotations, DiscoveryTool),\n namespace: Context.get(tool.annotations, ToolNamespace) ?? null,\n includesCatalogDocumentation: Context.get(tool.annotations, IncludesCatalogDocumentation),\n additional: Context.get(tool.annotations, AdditionalToolCatalog).map((entry) => ({\n name: entry.tool.name,\n namespace: entry.namespace,\n method: entry.method,\n })),\n })),\n },\n },\n };\n};\n\n// The public signature distributes over descriptors, including optional attempt Layers.\n// The implementation consumes their erased union and captures the selected Layer's context.\nfunction compileRegistration<Entry extends AgentRegistration>(\n entry: Entry,\n): Effect.Effect<ResolvedBinding, DigestError, Crypto.Crypto | EntryRequirements<Entry>>;\nfunction compileRegistration(entry: AgentRegistration) {\n return Effect.flatMap(\n Effect.try({\n try: () => registrationDefinitions(entry),\n catch: () =>\n DigestError.make({ message: \"Agent update schema has no serializable wire contract\" }),\n }),\n (definitions) =>\n Effect.gen(function* () {\n const agent =\n // The heterogeneous descriptor erases model services; the overload retains EntryRequirements.\n // @effect-diagnostics-next-line anyUnknownInErrorContext:off\n entry.model === undefined ? entry.agent : { definition: entry.agent, model: entry.model };\n\n // Omitted attempt services need no Layer construction or provisioning scope.\n const binding = yield* entry.attemptLayer === undefined\n ? // Capture closes the erased requirements over the registration's actual Context.\n // @effect-diagnostics-next-line anyUnknownInErrorContext:off\n capture(agent, (execute) => execute)\n : // The selected Layer discharges its services before the remaining Context is captured.\n // @effect-diagnostics-next-line anyUnknownInErrorContext:off\n captureWithAttemptLayer(agent, entry.attemptLayer);\n\n const reporting = yield* captureReporting(backgroundReports(binding.definition));\n\n return {\n ...binding,\n ...(yield* compileBindingContracts(\n binding.definition,\n definitions,\n entry.continuity?.versions,\n )),\n reporting,\n };\n }),\n );\n}\n\n/** Compile heterogeneous Agent descriptors into exact, dependency-closed worker registrations. */\nexport const compileRegistrations = <const Entries extends ReadonlyArray<AgentRegistration>>(\n entries: Entries,\n): Effect.Effect<\n ReadonlyArray<ResolvedBinding>,\n DigestError,\n Crypto.Crypto | RegistrationRequirements<Entries>\n> => {\n return Effect.forEach(entries, compileRegistration<Entries[number]>);\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as CommandDrainPolicy } from "../RunOptions-
|
|
1
|
+
import { o as CommandDrainPolicy } from "../RunOptions-aBHR-Eqm.mjs";
|
|
2
2
|
import { Effect, Schema } from "effect";
|
|
3
3
|
declare namespace Commands_d_exports {
|
|
4
4
|
export { FollowUpCommand, RunCommand, RunCommandQueue, RunCommandQueueClosed, RunCommandQueueConfig, SteeringCommand, makeRunCommandQueue };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { u as RunEvent } from "../RunEvent-
|
|
1
|
+
import { u as RunEvent } from "../RunEvent-Bh1p4zAO.mjs";
|
|
2
2
|
import { Context, Effect, Layer, Schema } from "effect";
|
|
3
3
|
declare namespace Redaction_d_exports {
|
|
4
4
|
export { RedactedPreview, RedactionError, Redactor, StructuralRedactorLive, redactedTranscript };
|
|
@@ -2,7 +2,7 @@ import { c as ThreadLimitExceeded, d as ThreadOwnershipError, i as ThreadEncodin
|
|
|
2
2
|
import { RedactionError, Redactor } from "./Redaction.mjs";
|
|
3
3
|
import { ApprovalAudit, ApprovalAuditLimitExceeded, ApprovalDecisionMismatch, ApprovalRequestDraft, ApprovalResolver, ApprovalResolverError } from "./Approval.mjs";
|
|
4
4
|
import { BudgetExceeded, UsageBudgetNode } from "./Budget.mjs";
|
|
5
|
-
import { M as RunOptions, R as RunSchedulingHook, _ as RunBudgetHook, b as RunContextHook, g as RunApprovalRequest, h as RunApprovalHook, j as RunInputHook, w as RunContextRequest } from "../RunOptions-
|
|
5
|
+
import { M as RunOptions, R as RunSchedulingHook, _ as RunBudgetHook, b as RunContextHook, g as RunApprovalRequest, h as RunApprovalHook, j as RunInputHook, w as RunContextRequest } from "../RunOptions-aBHR-Eqm.mjs";
|
|
6
6
|
import { RunCommandQueue } from "./Commands.mjs";
|
|
7
7
|
import { Effect, Schema } from "effect";
|
|
8
8
|
import { Prompt } from "effect/ai";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { c as SubagentExecutionFailureClassification, l as SubagentGrant, s as SubagentExecutionFailure } from "../SubagentContract-DdPzxYQj.mjs";
|
|
2
2
|
import { o as WorkerCompletion, p as WorkerReport } from "../Worker-CLYgfqhF.mjs";
|
|
3
|
-
import { A as list, C as BackgroundTools, D as cancel, E as awaitWorker, F as SubagentPolicyInput, I as SubagentPrestartDenied, L as SubagentProjectionFailure, M as start, N as stop, O as followUp, P as SubagentPolicy, R as delegationAllocationFromPolicy, S as BackgroundOptions, T as WorkerObservation, _ as SubagentTools, a as SubagentDelegation, b as layer, c as SubagentFailureMode, d as SubagentResult, f as SubagentResultContext, g as SubagentToolFailure, h as SubagentTool, i as SubagentDefineOptions, j as observe, k as inspect, l as SubagentLayerRequirements, m as SubagentRuntimeOptions, n as SubagentContainedFailure, o as SubagentDurableAccounting, p as SubagentReturnModeFailure, r as SubagentDeclarationOptions, s as SubagentDurableOptions, t as SubagentChildRunFailure, u as SubagentPrepareContext, w as Worker, x as make, y as background, z as delegationCapsFromPolicy } from "../Subagent-
|
|
3
|
+
import { A as list, C as BackgroundTools, D as cancel, E as awaitWorker, F as SubagentPolicyInput, I as SubagentPrestartDenied, L as SubagentProjectionFailure, M as start, N as stop, O as followUp, P as SubagentPolicy, R as delegationAllocationFromPolicy, S as BackgroundOptions, T as WorkerObservation, _ as SubagentTools, a as SubagentDelegation, b as layer, c as SubagentFailureMode, d as SubagentResult, f as SubagentResultContext, g as SubagentToolFailure, h as SubagentTool, i as SubagentDefineOptions, j as observe, k as inspect, l as SubagentLayerRequirements, m as SubagentRuntimeOptions, n as SubagentContainedFailure, o as SubagentDurableAccounting, p as SubagentReturnModeFailure, r as SubagentDeclarationOptions, s as SubagentDurableOptions, t as SubagentChildRunFailure, u as SubagentPrepareContext, w as Worker, x as make, y as background, z as delegationCapsFromPolicy } from "../Subagent-CWWmA1UQ.mjs";
|
|
4
4
|
export { type BackgroundOptions, type BackgroundTools, SubagentChildRunFailure, SubagentContainedFailure, SubagentDeclarationOptions, SubagentDefineOptions, SubagentDelegation, SubagentDurableAccounting, SubagentDurableOptions, SubagentExecutionFailure, SubagentExecutionFailureClassification, SubagentFailureMode, SubagentGrant, SubagentLayerRequirements, SubagentPolicy, type SubagentPolicyInput, SubagentPrepareContext, SubagentPrestartDenied, SubagentProjectionFailure, SubagentResult, SubagentResultContext, SubagentReturnModeFailure, SubagentRuntimeOptions, SubagentTool, SubagentToolFailure, SubagentTools, Worker, WorkerCompletion, WorkerObservation, WorkerReport, awaitWorker as await, background, cancel, delegationAllocationFromPolicy, delegationCapsFromPolicy, followUp, inspect, layer, list, make, observe, start, stop };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SubagentExecutionFailure, SubagentExecutionFailureClassification, SubagentGrant } from "../core/SubagentContract.mjs";
|
|
2
2
|
import { o as WorkerCompletion, p as WorkerReport } from "../Worker-CtuUwYOK.mjs";
|
|
3
3
|
import "./SubagentReservations.mjs";
|
|
4
|
-
import { _ as SubagentPolicy, a as layer, b as delegationAllocationFromPolicy, c as WorkerObservation, d as followUp, f as inspect, g as stop, h as start, i as background, l as awaitWorker, m as observe, n as SubagentResult, o as make, p as list, s as Worker, t as SubagentDurableAccounting, u as cancel, v as SubagentPrestartDenied, x as delegationCapsFromPolicy, y as SubagentProjectionFailure } from "../Subagent-
|
|
4
|
+
import { _ as SubagentPolicy, a as layer, b as delegationAllocationFromPolicy, c as WorkerObservation, d as followUp, f as inspect, g as stop, h as start, i as background, l as awaitWorker, m as observe, n as SubagentResult, o as make, p as list, s as Worker, t as SubagentDurableAccounting, u as cancel, v as SubagentPrestartDenied, x as delegationCapsFromPolicy, y as SubagentProjectionFailure } from "../Subagent-Bm842K7J.mjs";
|
|
5
5
|
export { SubagentDurableAccounting, SubagentExecutionFailure, SubagentExecutionFailureClassification, SubagentGrant, SubagentPolicy, SubagentPrestartDenied, SubagentProjectionFailure, SubagentResult, Worker, WorkerCompletion, WorkerObservation, WorkerReport, awaitWorker as await, background, cancel, delegationAllocationFromPolicy, delegationCapsFromPolicy, followUp, inspect, layer, list, make, observe, start, stop };
|
|
@@ -86,7 +86,10 @@ declare const SubagentBudgetExhausted_base: Schema$1.Class<SubagentBudgetExhaust
|
|
|
86
86
|
readonly limitValue: Schema$1.Natural;
|
|
87
87
|
readonly observedValue: Schema$1.Natural;
|
|
88
88
|
}>, import("effect/Cause").YieldableError>;
|
|
89
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* Delegation admission or execution exhausted a bound. A child refused at the
|
|
91
|
+
* in-process parent's reserved finish window reports zero duration limit and usage.
|
|
92
|
+
*/
|
|
90
93
|
export declare class SubagentBudgetExhausted extends SubagentBudgetExhausted_base {}
|
|
91
94
|
declare const SubagentReservationConflict_base: Schema$1.Class<SubagentReservationConflict, Schema$1.TaggedStruct<"SubagentReservationConflict", {
|
|
92
95
|
readonly reservationId: Schema$1.brand<Schema$1.NonEmptyString, "@effect-agent/capabilities/BudgetReservationId">;
|
|
@@ -101,7 +101,10 @@ var SubagentParentBudgetView = class extends Schema.Class("@effect-agent/capabil
|
|
|
101
101
|
cumulativeOverrun: SubagentReservationAmounts,
|
|
102
102
|
reservations: Schema.Array(SubagentReservationView)
|
|
103
103
|
}) {};
|
|
104
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* Delegation admission or execution exhausted a bound. A child refused at the
|
|
106
|
+
* in-process parent's reserved finish window reports zero duration limit and usage.
|
|
107
|
+
*/
|
|
105
108
|
var SubagentBudgetExhausted = class extends Schema.TaggedError()("SubagentBudgetExhausted", {
|
|
106
109
|
parentRunId: RunId,
|
|
107
110
|
dimension: SubagentBudgetDimension,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubagentReservations.mjs","names":[],"sources":["../../src/capabilities/SubagentReservations.ts"],"sourcesContent":["import type { Scope } from \"effect\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Ref from \"effect/Ref\";\nimport * as Schema from \"effect/Schema\";\nimport * as Semaphore from \"effect/Semaphore\";\n\nimport { RunId, ToolCallId } from \"../core/Identifiers.ts\";\nimport { SubagentDelegationCaps, SubagentReservationAmounts } from \"../core/SubagentContract.ts\";\n\nconst Natural = Schema.Natural;\n\n/**\n * Stable identity of one parent-owned Subagent budget reservation.\n *\n * Derivation rule (see {@link makeBudgetReservationId}):\n * `encodeURIComponent(parentRunId) + \":\" + encodeURIComponent(parentToolCallId)`.\n * Component encoding escapes `:`; the mapping is injective for every\n * `(parentRunId, parentToolCallId)` pair.\n */\nexport const BudgetReservationId = Schema.NonEmptyString.pipe(\n Schema.brand(\"@effect-agent/capabilities/BudgetReservationId\"),\n);\n\nexport type BudgetReservationId = typeof BudgetReservationId.Type;\n\nconst decodeBudgetReservationId = Schema.decodeSync(BudgetReservationId);\n\n/** Derive the stable reservation identity of one Subagent Invocation. */\nexport const makeBudgetReservationId = (\n parentRunId: RunId,\n parentToolCallId: ToolCallId,\n): BudgetReservationId =>\n decodeBudgetReservationId(\n `${encodeURIComponent(parentRunId)}:${encodeURIComponent(parentToolCallId)}`,\n );\n\n/** One enforced hierarchical delegation budget dimension. */\nexport const SubagentBudgetDimension = Schema.Literals([\n \"total-child-invocations\",\n \"concurrent-children\",\n \"turns\",\n \"tool-calls\",\n \"duration\",\n \"input-tokens\",\n \"output-tokens\",\n \"cost\",\n \"result-bytes\",\n]);\n\nexport type SubagentBudgetDimension = typeof SubagentBudgetDimension.Type;\n\nconst AmountFields = SubagentReservationAmounts.fields;\n\nconst OptionalAmountFields = {\n turns: Schema.optionalKey(Natural),\n toolCalls: Schema.optionalKey(Natural),\n durationMillis: Schema.optionalKey(Natural),\n inputTokens: Schema.optionalKey(Natural),\n outputTokens: Schema.optionalKey(Natural),\n costMicrousd: Schema.optionalKey(Natural),\n resultBytes: Schema.optionalKey(Natural),\n} as const;\n\n/** Observed child usage. An absent dimension was never reported and settles conservatively. */\nexport class SubagentObservedUsage extends Schema.Class<SubagentObservedUsage>(\n \"@effect-agent/capabilities/SubagentObservedUsage\",\n)(OptionalAmountFields) {}\n\n/** Remaining delegable allocation per configured dimension. Absent means not configured. */\nexport class SubagentAvailableAmounts extends Schema.Class<SubagentAvailableAmounts>(\n \"@effect-agent/capabilities/SubagentAvailableAmounts\",\n)(OptionalAmountFields) {}\n\n/** Reservation lifecycle: absent → reserved → releasePending → released. */\nexport const SubagentReservationStatus = Schema.Literals([\n \"reserved\",\n \"releasePending\",\n \"released\",\n]);\n\nexport type SubagentReservationStatus = typeof SubagentReservationStatus.Type;\n\n/** All-or-nothing allocation request for one Subagent Invocation. */\nexport class SubagentReservationRequest extends Schema.Class<SubagentReservationRequest>(\n \"@effect-agent/capabilities/SubagentReservationRequest\",\n)({\n parentRunId: RunId,\n parentToolCallId: ToolCallId,\n allocation: SubagentReservationAmounts,\n /** Additional invocation slots held for this child's entire subtree. */\n descendantInvocations: Schema.optionalKey(Natural),\n}) {}\n\n/** Accounting snapshot of one reservation: allocated, observed, covered, released, and overrun. */\nexport class SubagentReservationView extends Schema.Class<SubagentReservationView>(\n \"@effect-agent/capabilities/SubagentReservationView\",\n)({\n reservationId: BudgetReservationId,\n parentRunId: RunId,\n parentToolCallId: ToolCallId,\n status: SubagentReservationStatus,\n allocated: SubagentReservationAmounts,\n observedConsumed: SubagentObservedUsage,\n coveredConsumed: SubagentReservationAmounts,\n released: SubagentReservationAmounts,\n overrun: SubagentReservationAmounts,\n}) {}\n\n/** Aggregate parent delegation budget snapshot including every reservation it owns. */\nexport class SubagentParentBudgetView extends Schema.Class<SubagentParentBudgetView>(\n \"@effect-agent/capabilities/SubagentParentBudgetView\",\n)({\n parentRunId: RunId,\n caps: SubagentDelegationCaps,\n totalChildInvocations: Natural,\n available: SubagentAvailableAmounts,\n cumulativeOverrun: SubagentReservationAmounts,\n reservations: Schema.Array(SubagentReservationView),\n}) {}\n\n/** All-or-nothing admission failed: one dimension cannot cover the requested allocation. */\nexport class SubagentBudgetExhausted extends Schema.TaggedError<SubagentBudgetExhausted>()(\n \"SubagentBudgetExhausted\",\n {\n parentRunId: RunId,\n dimension: SubagentBudgetDimension,\n limitValue: Natural,\n observedValue: Natural,\n },\n) {}\n\n/** The stable key is already reserved with a different allocation; neither request may win silently. */\nexport class SubagentReservationConflict extends Schema.TaggedError<SubagentReservationConflict>()(\n \"SubagentReservationConflict\",\n {\n reservationId: BudgetReservationId,\n existingAllocation: SubagentReservationAmounts,\n requestedAllocation: SubagentReservationAmounts,\n },\n) {}\n\n/** No reservation exists for this identity. */\nexport class SubagentReservationUnknown extends Schema.TaggedError<SubagentReservationUnknown>()(\n \"SubagentReservationUnknown\",\n {\n reservationId: BudgetReservationId,\n },\n) {}\n\n/** No delegation budget was registered for this parent Run. */\nexport class SubagentParentBudgetUnknown extends Schema.TaggedError<SubagentParentBudgetUnknown>()(\n \"SubagentParentBudgetUnknown\",\n {\n parentRunId: RunId,\n },\n) {}\n\n/** The parent Run is already registered with different caps; neither set may win silently. */\nexport class SubagentParentBudgetConflict extends Schema.TaggedError<SubagentParentBudgetConflict>()(\n \"SubagentParentBudgetConflict\",\n {\n parentRunId: RunId,\n },\n) {}\n\n/** A parent budget cannot retire while one of its child reservations is unsettled. */\nexport class SubagentParentBudgetActive extends Schema.TaggedError<SubagentParentBudgetActive>()(\n \"SubagentParentBudgetActive\",\n {\n parentRunId: RunId,\n openReservations: Natural,\n },\n) {}\n\n/**\n * Parent-owned hierarchical Subagent budget reservation authority.\n *\n * Every transition is a single atomic `Ref` update, so parallel children can\n * never observe and spend the same remainder. The post-response usage hook in\n * `budget.ts` is deliberately not reused here: it accounts after the fact and\n * is not a reservation service.\n */\nexport class SubagentReservations extends Context.Service<\n SubagentReservations,\n {\n /**\n * Register the finite delegable budget of one parent Run. Re-registering\n * identical caps returns the existing registration; different caps fail\n * rather than silently winning.\n */\n readonly registerParent: (\n parentRunId: RunId,\n caps: SubagentDelegationCaps,\n ) => Effect.Effect<SubagentParentBudgetView, SubagentParentBudgetConflict>;\n /**\n * Atomically reserve an all-or-nothing child allocation from the parent's\n * remaining delegable budget, checking every dimension before committing\n * any. The same key with the same allocation is idempotent and never\n * double-reserves; a distinct key charges the monotonic total-invocation\n * counter by one plus its reserved descendant slots, which release never refunds.\n */\n readonly reserve: (\n request: SubagentReservationRequest,\n ) => Effect.Effect<\n SubagentReservationView,\n SubagentBudgetExhausted | SubagentReservationConflict | SubagentParentBudgetUnknown\n >;\n /**\n * Record observed child usage against a reservation. Usage above the\n * reserved amount is recorded as overrun and charged to the parent\n * aggregate, never clipped. Usage observed after settlement begins is\n * pure overrun and cannot create budget.\n */\n readonly observe: (\n reservationId: BudgetReservationId,\n usage: SubagentObservedUsage,\n ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;\n /**\n * `reserved → releasePending`: freeze the settlement decision. A dimension\n * with no observed usage conservatively consumes its reserved amount.\n * Idempotent once settlement has begun.\n */\n readonly beginRelease: (\n reservationId: BudgetReservationId,\n ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;\n /**\n * `releasePending → released`: return the unused allocation to the parent\n * exactly once. Called on a still-reserved reservation it settles through\n * `releasePending` in the same atomic update. Idempotent once released.\n */\n readonly release: (\n reservationId: BudgetReservationId,\n ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;\n /**\n * Acquire bounded child execution slots as a Scope-owned resource, so\n * an interrupted child always frees its slot. The Semaphore bounds only\n * concurrent children; a subtree holds one plus its possible descendants up front.\n * Total invocations are enforced separately by\n * `reserve`'s monotonic counter. A configured cap of zero fails closed\n * instead of queueing forever; an unconfigured cap leaves execution\n * ungated by this service.\n */\n readonly acquireChildSlot: (\n parentRunId: RunId,\n slots?: number,\n ) => Effect.Effect<void, SubagentParentBudgetUnknown | SubagentBudgetExhausted, Scope.Scope>;\n /**\n * Reclaim one terminal parent registration and all of its released child\n * reservations. Retirement is idempotent; an unknown parent is already\n * retired. Open reservations fail typed and leave the ledger unchanged.\n * The Run owner must call this after its final accounting snapshot no\n * longer needs to be observable.\n */\n readonly retireParent: (parentRunId: RunId) => Effect.Effect<void, SubagentParentBudgetActive>;\n /** Read the aggregate parent view for auditing and conservation checks. */\n readonly parentSnapshot: (\n parentRunId: RunId,\n ) => Effect.Effect<SubagentParentBudgetView, SubagentParentBudgetUnknown>;\n }\n>()(\"@effect-agent/capabilities/SubagentReservations\") {}\n\ntype ReservableDimensionKey = keyof typeof AmountFields;\n\ntype Amounts = Readonly<Record<ReservableDimensionKey, number>>;\ntype PartialAmounts = Readonly<Partial<Record<ReservableDimensionKey, number>>>;\n\ninterface DimensionSpec {\n readonly key: ReservableDimensionKey;\n readonly dimension: SubagentBudgetDimension;\n readonly cap: (caps: SubagentDelegationCaps) => number | undefined;\n}\n\nconst dimensionSpecs: ReadonlyArray<DimensionSpec> = [\n { key: \"turns\", dimension: \"turns\", cap: (caps) => caps.maxTurns },\n { key: \"toolCalls\", dimension: \"tool-calls\", cap: (caps) => caps.maxToolCalls },\n { key: \"durationMillis\", dimension: \"duration\", cap: (caps) => caps.maxDurationMillis },\n { key: \"inputTokens\", dimension: \"input-tokens\", cap: (caps) => caps.maxInputTokens },\n { key: \"outputTokens\", dimension: \"output-tokens\", cap: (caps) => caps.maxOutputTokens },\n { key: \"costMicrousd\", dimension: \"cost\", cap: (caps) => caps.maxCostMicrousd },\n { key: \"resultBytes\", dimension: \"result-bytes\", cap: (caps) => caps.maxResultBytes },\n];\n\nconst zeroAmounts: Amounts = {\n turns: 0,\n toolCalls: 0,\n durationMillis: 0,\n inputTokens: 0,\n outputTokens: 0,\n costMicrousd: 0,\n resultBytes: 0,\n};\n\ninterface ReservationState {\n readonly parentRunId: RunId;\n readonly parentToolCallId: ToolCallId;\n readonly descendantInvocations: number;\n readonly status: SubagentReservationStatus;\n readonly allocated: Amounts;\n readonly observed: PartialAmounts;\n readonly covered: Amounts;\n readonly overrun: Amounts;\n}\n\ninterface ParentBudgetState {\n readonly parentRunId: RunId;\n readonly caps: SubagentDelegationCaps;\n readonly gate: Semaphore.Semaphore | undefined;\n /** Monotonic count of distinct reservations; never refunded by release. */\n readonly totalChildInvocations: number;\n /** Remaining delegable allocation for configured dimensions only. */\n readonly available: PartialAmounts;\n readonly cumulativeOverrun: Amounts;\n}\n\ninterface ReservationLedger {\n readonly parents: ReadonlyMap<RunId, ParentBudgetState>;\n readonly reservations: ReadonlyMap<BudgetReservationId, ReservationState>;\n}\n\ntype TransitionResult<A, E> =\n | { readonly _tag: \"ok\"; readonly value: A }\n | { readonly _tag: \"error\"; readonly error: E }\n | { readonly _tag: \"corrupt\"; readonly message: string };\n\nconst ok = <A>(value: A): TransitionResult<A, never> => ({ _tag: \"ok\", value });\nconst fail = <E>(error: E): TransitionResult<never, E> => ({ _tag: \"error\", error });\n\n/** Corrupt internal accounting is a defect, never an expected reservation failure. */\nclass ReservationLedgerCorrupt extends Schema.TaggedError<ReservationLedgerCorrupt>()(\n \"ReservationLedgerCorrupt\",\n {\n message: Schema.String,\n },\n) {}\n\nconst resolve = <A, E>(result: TransitionResult<A, E>): Effect.Effect<A, E> => {\n switch (result._tag) {\n case \"ok\":\n return Effect.succeed(result.value);\n case \"error\":\n return Effect.fail(result.error);\n case \"corrupt\":\n return Effect.die(ReservationLedgerCorrupt.make({ message: result.message }));\n }\n};\n\nconst sameCaps = (a: SubagentDelegationCaps, b: SubagentDelegationCaps): boolean =>\n a.maxTotalChildInvocations === b.maxTotalChildInvocations &&\n a.maxConcurrentChildren === b.maxConcurrentChildren &&\n a.maxTurns === b.maxTurns &&\n a.maxToolCalls === b.maxToolCalls &&\n a.maxDurationMillis === b.maxDurationMillis &&\n a.maxInputTokens === b.maxInputTokens &&\n a.maxOutputTokens === b.maxOutputTokens &&\n a.maxCostMicrousd === b.maxCostMicrousd &&\n a.maxResultBytes === b.maxResultBytes;\n\nconst sameAmounts = (a: Amounts, b: Amounts): boolean =>\n dimensionSpecs.every((spec) => a[spec.key] === b[spec.key]);\n\nconst optionalAmounts = (partial: PartialAmounts): { [K in ReservableDimensionKey]?: number } => {\n const out: { [K in ReservableDimensionKey]?: number } = {};\n\n for (const spec of dimensionSpecs) {\n const value = partial[spec.key];\n\n if (value !== undefined) {\n out[spec.key] = value;\n }\n }\n\n return out;\n};\n\n/** Covered usage freezes at settlement, so the unused allocation remains stable afterward. */\nconst unusedAllocation = (reservation: ReservationState): Amounts => {\n const unused = { ...zeroAmounts };\n\n for (const spec of dimensionSpecs) {\n unused[spec.key] = reservation.allocated[spec.key] - reservation.covered[spec.key];\n }\n\n return unused;\n};\n\nconst reservationView = (\n reservationId: BudgetReservationId,\n state: ReservationState,\n): SubagentReservationView =>\n SubagentReservationView.make({\n reservationId,\n parentRunId: state.parentRunId,\n parentToolCallId: state.parentToolCallId,\n status: state.status,\n allocated: SubagentReservationAmounts.make(state.allocated),\n observedConsumed: SubagentObservedUsage.make(optionalAmounts(state.observed)),\n coveredConsumed: SubagentReservationAmounts.make(state.covered),\n released: SubagentReservationAmounts.make(\n state.status === \"released\" ? unusedAllocation(state) : zeroAmounts,\n ),\n overrun: SubagentReservationAmounts.make(state.overrun),\n });\n\nconst parentView = (\n ledger: ReservationLedger,\n parent: ParentBudgetState,\n): SubagentParentBudgetView => {\n const reservations: Array<SubagentReservationView> = [];\n\n for (const [reservationId, reservation] of ledger.reservations) {\n if (reservation.parentRunId === parent.parentRunId) {\n reservations.push(reservationView(reservationId, reservation));\n }\n }\n\n return SubagentParentBudgetView.make({\n parentRunId: parent.parentRunId,\n caps: parent.caps,\n totalChildInvocations: parent.totalChildInvocations,\n available: SubagentAvailableAmounts.make(optionalAmounts(parent.available)),\n cumulativeOverrun: SubagentReservationAmounts.make(parent.cumulativeOverrun),\n reservations,\n });\n};\n\nconst corruptParent = (parentRunId: RunId): TransitionResult<never, never> => ({\n _tag: \"corrupt\",\n message: `SubagentReservations ledger invariant violated: reservation references unregistered parent Run ${parentRunId}`,\n});\n\nconst registerTransition = (\n ledger: ReservationLedger,\n parentRunId: RunId,\n caps: SubagentDelegationCaps,\n gate: Semaphore.Semaphore | undefined,\n): readonly [\n TransitionResult<SubagentParentBudgetView, SubagentParentBudgetConflict>,\n ReservationLedger,\n] => {\n const existing = ledger.parents.get(parentRunId);\n\n if (existing !== undefined) {\n return sameCaps(existing.caps, caps)\n ? [ok(parentView(ledger, existing)), ledger]\n : [fail(SubagentParentBudgetConflict.make({ parentRunId })), ledger];\n }\n const available: { [K in ReservableDimensionKey]?: number } = {};\n\n for (const spec of dimensionSpecs) {\n const cap = spec.cap(caps);\n\n if (cap !== undefined) {\n available[spec.key] = cap;\n }\n }\n\n const parent: ParentBudgetState = {\n parentRunId,\n caps,\n gate,\n totalChildInvocations: 0,\n available,\n cumulativeOverrun: zeroAmounts,\n };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(parentRunId, parent),\n reservations: ledger.reservations,\n };\n\n return [ok(parentView(next, parent)), next];\n};\n\nconst reserveTransition = (\n ledger: ReservationLedger,\n request: SubagentReservationRequest,\n): readonly [\n TransitionResult<\n SubagentReservationView,\n SubagentBudgetExhausted | SubagentReservationConflict | SubagentParentBudgetUnknown\n >,\n ReservationLedger,\n] => {\n const parent = ledger.parents.get(request.parentRunId);\n\n if (parent === undefined) {\n return [fail(SubagentParentBudgetUnknown.make({ parentRunId: request.parentRunId })), ledger];\n }\n const reservationId = makeBudgetReservationId(request.parentRunId, request.parentToolCallId);\n const existing = ledger.reservations.get(reservationId);\n\n if (existing !== undefined) {\n return sameAmounts(existing.allocated, request.allocation) &&\n existing.descendantInvocations === (request.descendantInvocations ?? 0)\n ? [ok(reservationView(reservationId, existing)), ledger]\n : [\n fail(\n SubagentReservationConflict.make({\n reservationId,\n existingAllocation: SubagentReservationAmounts.make(existing.allocated),\n requestedAllocation: request.allocation,\n }),\n ),\n ledger,\n ];\n }\n const maxInvocations = parent.caps.maxTotalChildInvocations;\n const slots = 1 + (request.descendantInvocations ?? 0);\n\n if (maxInvocations !== undefined && parent.totalChildInvocations + slots > maxInvocations) {\n return [\n fail(\n SubagentBudgetExhausted.make({\n parentRunId: request.parentRunId,\n dimension: \"total-child-invocations\",\n limitValue: maxInvocations,\n observedValue: parent.totalChildInvocations + slots,\n }),\n ),\n ledger,\n ];\n }\n for (const spec of dimensionSpecs) {\n const cap = spec.cap(parent.caps);\n\n if (cap === undefined) {\n continue;\n }\n // Overrun already charged to the parent aggregate reduces delegable\n // headroom without mutating `available`.\n const headroom = (parent.available[spec.key] ?? 0) - parent.cumulativeOverrun[spec.key];\n const requested = request.allocation[spec.key];\n\n if (requested > headroom) {\n return [\n fail(\n SubagentBudgetExhausted.make({\n parentRunId: request.parentRunId,\n dimension: spec.dimension,\n limitValue: cap,\n observedValue: cap - headroom + requested,\n }),\n ),\n ledger,\n ];\n }\n }\n\n const nextAvailable: { [K in ReservableDimensionKey]?: number } = {\n ...parent.available,\n };\n\n for (const spec of dimensionSpecs) {\n const available = parent.available[spec.key];\n\n if (available !== undefined) {\n nextAvailable[spec.key] = available - request.allocation[spec.key];\n }\n }\n\n const reservation: ReservationState = {\n parentRunId: request.parentRunId,\n parentToolCallId: request.parentToolCallId,\n descendantInvocations: request.descendantInvocations ?? 0,\n status: \"reserved\",\n allocated: request.allocation,\n observed: {},\n covered: zeroAmounts,\n overrun: zeroAmounts,\n };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(request.parentRunId, {\n ...parent,\n totalChildInvocations: parent.totalChildInvocations + slots,\n available: nextAvailable,\n }),\n reservations: new Map(ledger.reservations).set(reservationId, reservation),\n };\n\n return [ok(reservationView(reservationId, reservation)), next];\n};\n\nconst observeTransition = (\n ledger: ReservationLedger,\n reservationId: BudgetReservationId,\n usage: SubagentObservedUsage,\n): readonly [\n TransitionResult<SubagentReservationView, SubagentReservationUnknown>,\n ReservationLedger,\n] => {\n const reservation = ledger.reservations.get(reservationId);\n\n if (reservation === undefined) {\n return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];\n }\n const parent = ledger.parents.get(reservation.parentRunId);\n\n if (parent === undefined) {\n return [corruptParent(reservation.parentRunId), ledger];\n }\n const observed: { [K in ReservableDimensionKey]?: number } = { ...reservation.observed };\n const covered: Record<ReservableDimensionKey, number> = { ...reservation.covered };\n const overrun: Record<ReservableDimensionKey, number> = { ...reservation.overrun };\n\n const cumulativeOverrun: Record<ReservableDimensionKey, number> = {\n ...parent.cumulativeOverrun,\n };\n\n for (const spec of dimensionSpecs) {\n const delta = usage[spec.key];\n\n if (delta === undefined) {\n continue;\n }\n observed[spec.key] = (observed[spec.key] ?? 0) + delta;\n\n // Once settlement began the accounting decision is frozen, so late or\n // corrected usage is pure overrun and cannot silently create budget.\n const coverable =\n reservation.status === \"reserved\"\n ? Math.min(delta, reservation.allocated[spec.key] - covered[spec.key])\n : 0;\n\n covered[spec.key] += coverable;\n const overrunDelta = delta - coverable;\n\n overrun[spec.key] += overrunDelta;\n cumulativeOverrun[spec.key] += overrunDelta;\n }\n const nextReservation: ReservationState = { ...reservation, observed, covered, overrun };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(parent.parentRunId, { ...parent, cumulativeOverrun }),\n reservations: new Map(ledger.reservations).set(reservationId, nextReservation),\n };\n\n return [ok(reservationView(reservationId, nextReservation)), next];\n};\n\n/**\n * Freeze the settlement decision. A dimension that was never observed\n * conservatively consumes its full reserved amount.\n */\nconst freezeSettlement = (reservation: ReservationState): ReservationState => {\n const observed: { [K in ReservableDimensionKey]?: number } = { ...reservation.observed };\n const covered: Record<ReservableDimensionKey, number> = { ...reservation.covered };\n\n for (const spec of dimensionSpecs) {\n if (observed[spec.key] === undefined) {\n observed[spec.key] = reservation.allocated[spec.key];\n covered[spec.key] = reservation.allocated[spec.key];\n }\n }\n\n return { ...reservation, status: \"releasePending\", observed, covered };\n};\n\nconst beginReleaseTransition = (\n ledger: ReservationLedger,\n reservationId: BudgetReservationId,\n): readonly [\n TransitionResult<SubagentReservationView, SubagentReservationUnknown>,\n ReservationLedger,\n] => {\n const reservation = ledger.reservations.get(reservationId);\n\n if (reservation === undefined) {\n return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];\n }\n if (reservation.status !== \"reserved\") {\n return [ok(reservationView(reservationId, reservation)), ledger];\n }\n const frozen = freezeSettlement(reservation);\n\n const next: ReservationLedger = {\n parents: ledger.parents,\n reservations: new Map(ledger.reservations).set(reservationId, frozen),\n };\n\n return [ok(reservationView(reservationId, frozen)), next];\n};\n\nconst releaseTransition = (\n ledger: ReservationLedger,\n reservationId: BudgetReservationId,\n): readonly [\n TransitionResult<SubagentReservationView, SubagentReservationUnknown>,\n ReservationLedger,\n] => {\n const reservation = ledger.reservations.get(reservationId);\n\n if (reservation === undefined) {\n return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];\n }\n if (reservation.status === \"released\") {\n return [ok(reservationView(reservationId, reservation)), ledger];\n }\n const parent = ledger.parents.get(reservation.parentRunId);\n\n if (parent === undefined) {\n return [corruptParent(reservation.parentRunId), ledger];\n }\n const frozen = reservation.status === \"reserved\" ? freezeSettlement(reservation) : reservation;\n const unused = unusedAllocation(frozen);\n const nextAvailable: { [K in ReservableDimensionKey]?: number } = { ...parent.available };\n\n for (const spec of dimensionSpecs) {\n const available = parent.available[spec.key];\n\n if (available !== undefined) {\n nextAvailable[spec.key] = available + unused[spec.key];\n }\n }\n const settled: ReservationState = { ...frozen, status: \"released\" };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(parent.parentRunId, {\n ...parent,\n available: nextAvailable,\n }),\n reservations: new Map(ledger.reservations).set(reservationId, settled),\n };\n\n return [ok(reservationView(reservationId, settled)), next];\n};\n\nconst retireParentTransition = (\n ledger: ReservationLedger,\n parentRunId: RunId,\n): readonly [TransitionResult<void, SubagentParentBudgetActive>, ReservationLedger] => {\n if (!ledger.parents.has(parentRunId)) {\n return [ok(undefined), ledger];\n }\n let openReservations = 0;\n\n for (const reservation of ledger.reservations.values()) {\n if (reservation.parentRunId === parentRunId && reservation.status !== \"released\") {\n openReservations += 1;\n }\n }\n if (openReservations > 0) {\n return [fail(SubagentParentBudgetActive.make({ parentRunId, openReservations })), ledger];\n }\n const parents = new Map(ledger.parents);\n\n parents.delete(parentRunId);\n const reservations = new Map(ledger.reservations);\n\n for (const [reservationId, reservation] of reservations) {\n if (reservation.parentRunId === parentRunId) {\n reservations.delete(reservationId);\n }\n }\n\n return [ok(undefined), { parents, reservations }];\n};\n\n/**\n * In-memory reservation ledger. All state lives in one `Ref` owned by the\n * Layer's Scope; every transition is a single atomic `Ref.modify`.\n */\nexport const SubagentReservationsMemoryLive: Layer.Layer<SubagentReservations> = Layer.effect(\n SubagentReservations,\n Effect.gen(function* () {\n const state = yield* Ref.make<ReservationLedger>({\n parents: new Map(),\n reservations: new Map(),\n });\n\n return SubagentReservations.of({\n registerParent: Effect.fnUntraced(function* (parentRunId, caps) {\n const gate =\n caps.maxConcurrentChildren !== undefined && caps.maxConcurrentChildren > 0\n ? yield* Semaphore.make(caps.maxConcurrentChildren)\n : undefined;\n\n const result = yield* Ref.modify(state, (ledger) =>\n registerTransition(ledger, parentRunId, caps, gate),\n );\n\n return yield* resolve(result);\n }),\n reserve: Effect.fnUntraced(function* (request) {\n const result = yield* Ref.modify(state, (ledger) => reserveTransition(ledger, request));\n\n return yield* resolve(result);\n }),\n observe: Effect.fnUntraced(function* (reservationId, usage) {\n const result = yield* Ref.modify(state, (ledger) =>\n observeTransition(ledger, reservationId, usage),\n );\n\n return yield* resolve(result);\n }),\n beginRelease: Effect.fnUntraced(function* (reservationId) {\n const result = yield* Ref.modify(state, (ledger) =>\n beginReleaseTransition(ledger, reservationId),\n );\n\n return yield* resolve(result);\n }),\n release: Effect.fnUntraced(function* (reservationId) {\n const result = yield* Ref.modify(state, (ledger) =>\n releaseTransition(ledger, reservationId),\n );\n\n return yield* resolve(result);\n }),\n acquireChildSlot: Effect.fnUntraced(function* (parentRunId, slots = 1) {\n const ledger = yield* Ref.get(state);\n const parent = ledger.parents.get(parentRunId);\n\n if (parent === undefined) {\n return yield* SubagentParentBudgetUnknown.make({ parentRunId });\n }\n const cap = parent.caps.maxConcurrentChildren;\n\n if (cap === undefined) {\n return;\n }\n if (!Number.isSafeInteger(slots) || slots < 1 || slots > cap || parent.gate === undefined) {\n return yield* SubagentBudgetExhausted.make({\n parentRunId,\n dimension: \"concurrent-children\",\n limitValue: cap,\n observedValue: Number.isSafeInteger(slots) && slots > 0 ? slots : 0,\n });\n }\n const gate = parent.gate;\n\n yield* Effect.acquireRelease(\n gate.take(slots),\n (permits) => gate.release(permits).pipe(Effect.asVoid),\n { interruptible: true },\n );\n }),\n retireParent: Effect.fnUntraced(function* (parentRunId) {\n const result = yield* Ref.modify(state, (ledger) =>\n retireParentTransition(ledger, parentRunId),\n );\n\n return yield* resolve(result);\n }),\n parentSnapshot: Effect.fnUntraced(function* (parentRunId) {\n const ledger = yield* Ref.get(state);\n const parent = ledger.parents.get(parentRunId);\n\n if (parent === undefined) {\n return yield* SubagentParentBudgetUnknown.make({ parentRunId });\n }\n\n return parentView(ledger, parent);\n }),\n });\n }),\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,MAAM,UAAU,OAAO;;;;;;;;;AAUvB,MAAa,sBAAsB,OAAO,eAAe,KACvD,OAAO,MAAM,gDAAgD,CAC/D;AAIA,MAAM,4BAA4B,OAAO,WAAW,mBAAmB;;AAGvE,MAAa,2BACX,aACA,qBAEA,0BACE,GAAG,mBAAmB,WAAW,EAAE,GAAG,mBAAmB,gBAAgB,GAC3E;;AAGF,MAAa,0BAA0B,OAAO,SAAS;CACrD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAIoB,2BAA2B;AAEhD,MAAM,uBAAuB;CAC3B,OAAO,OAAO,YAAY,OAAO;CACjC,WAAW,OAAO,YAAY,OAAO;CACrC,gBAAgB,OAAO,YAAY,OAAO;CAC1C,aAAa,OAAO,YAAY,OAAO;CACvC,cAAc,OAAO,YAAY,OAAO;CACxC,cAAc,OAAO,YAAY,OAAO;CACxC,aAAa,OAAO,YAAY,OAAO;AACzC;;AAGA,IAAa,wBAAb,cAA2C,OAAO,MAChD,kDACF,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;;AAGzB,IAAa,2BAAb,cAA8C,OAAO,MACnD,qDACF,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC;;AAGzB,MAAa,4BAA4B,OAAO,SAAS;CACvD;CACA;CACA;AACF,CAAC;;AAKD,IAAa,6BAAb,cAAgD,OAAO,MACrD,uDACF,CAAC,CAAC;CACA,aAAa;CACb,kBAAkB;CAClB,YAAY;;CAEZ,uBAAuB,OAAO,YAAY,OAAO;AACnD,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,0BAAb,cAA6C,OAAO,MAClD,oDACF,CAAC,CAAC;CACA,eAAe;CACf,aAAa;CACb,kBAAkB;CAClB,QAAQ;CACR,WAAW;CACX,kBAAkB;CAClB,iBAAiB;CACjB,UAAU;CACV,SAAS;AACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,2BAAb,cAA8C,OAAO,MACnD,qDACF,CAAC,CAAC;CACA,aAAa;CACb,MAAM;CACN,uBAAuB;CACvB,WAAW;CACX,mBAAmB;CACnB,cAAc,OAAO,MAAM,uBAAuB;AACpD,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,0BAAb,cAA6C,OAAO,YAAqC,CAAC,CACxF,2BACA;CACE,aAAa;CACb,WAAW;CACX,YAAY;CACZ,eAAe;AACjB,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,8BAAb,cAAiD,OAAO,YAAyC,CAAC,CAChG,+BACA;CACE,eAAe;CACf,oBAAoB;CACpB,qBAAqB;AACvB,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,6BAAb,cAAgD,OAAO,YAAwC,CAAC,CAC9F,8BACA,EACE,eAAe,oBACjB,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,8BAAb,cAAiD,OAAO,YAAyC,CAAC,CAChG,+BACA,EACE,aAAa,MACf,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,+BAAb,cAAkD,OAAO,YAA0C,CAAC,CAClG,gCACA,EACE,aAAa,MACf,CACF,CAAC,CAAC,CAAC;;AAGH,IAAa,6BAAb,cAAgD,OAAO,YAAwC,CAAC,CAC9F,8BACA;CACE,aAAa;CACb,kBAAkB;AACpB,CACF,CAAC,CAAC,CAAC;;;;;;;;;AAUH,IAAa,uBAAb,cAA0C,QAAQ,QA6EhD,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC;AAaxD,MAAM,iBAA+C;CACnD;EAAE,KAAK;EAAS,WAAW;EAAS,MAAM,SAAS,KAAK;CAAS;CACjE;EAAE,KAAK;EAAa,WAAW;EAAc,MAAM,SAAS,KAAK;CAAa;CAC9E;EAAE,KAAK;EAAkB,WAAW;EAAY,MAAM,SAAS,KAAK;CAAkB;CACtF;EAAE,KAAK;EAAe,WAAW;EAAgB,MAAM,SAAS,KAAK;CAAe;CACpF;EAAE,KAAK;EAAgB,WAAW;EAAiB,MAAM,SAAS,KAAK;CAAgB;CACvF;EAAE,KAAK;EAAgB,WAAW;EAAQ,MAAM,SAAS,KAAK;CAAgB;CAC9E;EAAE,KAAK;EAAe,WAAW;EAAgB,MAAM,SAAS,KAAK;CAAe;AACtF;AAEA,MAAM,cAAuB;CAC3B,OAAO;CACP,WAAW;CACX,gBAAgB;CAChB,aAAa;CACb,cAAc;CACd,cAAc;CACd,aAAa;AACf;AAkCA,MAAM,MAAS,WAA0C;CAAE,MAAM;CAAM;AAAM;AAC7E,MAAM,QAAW,WAA0C;CAAE,MAAM;CAAS;AAAM;;AAGlF,IAAM,2BAAN,cAAuC,OAAO,YAAsC,CAAC,CACnF,4BACA,EACE,SAAS,OAAO,OAClB,CACF,CAAC,CAAC,CAAC;AAEH,MAAM,WAAiB,WAAwD;CAC7E,QAAQ,OAAO,MAAf;EACE,KAAK,MACH,OAAO,OAAO,QAAQ,OAAO,KAAK;EACpC,KAAK,SACH,OAAO,OAAO,KAAK,OAAO,KAAK;EACjC,KAAK,WACH,OAAO,OAAO,IAAI,yBAAyB,KAAK,EAAE,SAAS,OAAO,QAAQ,CAAC,CAAC;CAChF;AACF;AAEA,MAAM,YAAY,GAA2B,MAC3C,EAAE,6BAA6B,EAAE,4BACjC,EAAE,0BAA0B,EAAE,yBAC9B,EAAE,aAAa,EAAE,YACjB,EAAE,iBAAiB,EAAE,gBACrB,EAAE,sBAAsB,EAAE,qBAC1B,EAAE,mBAAmB,EAAE,kBACvB,EAAE,oBAAoB,EAAE,mBACxB,EAAE,oBAAoB,EAAE,mBACxB,EAAE,mBAAmB,EAAE;AAEzB,MAAM,eAAe,GAAY,MAC/B,eAAe,OAAO,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI;AAE5D,MAAM,mBAAmB,YAAwE;CAC/F,MAAM,MAAkD,CAAC;CAEzD,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,QAAQ,QAAQ,KAAK;EAE3B,IAAI,UAAU,KAAA,GACZ,IAAI,KAAK,OAAO;CAEpB;CAEA,OAAO;AACT;;AAGA,MAAM,oBAAoB,gBAA2C;CACnE,MAAM,SAAS,EAAE,GAAG,YAAY;CAEhC,KAAK,MAAM,QAAQ,gBACjB,OAAO,KAAK,OAAO,YAAY,UAAU,KAAK,OAAO,YAAY,QAAQ,KAAK;CAGhF,OAAO;AACT;AAEA,MAAM,mBACJ,eACA,UAEA,wBAAwB,KAAK;CAC3B;CACA,aAAa,MAAM;CACnB,kBAAkB,MAAM;CACxB,QAAQ,MAAM;CACd,WAAW,2BAA2B,KAAK,MAAM,SAAS;CAC1D,kBAAkB,sBAAsB,KAAK,gBAAgB,MAAM,QAAQ,CAAC;CAC5E,iBAAiB,2BAA2B,KAAK,MAAM,OAAO;CAC9D,UAAU,2BAA2B,KACnC,MAAM,WAAW,aAAa,iBAAiB,KAAK,IAAI,WAC1D;CACA,SAAS,2BAA2B,KAAK,MAAM,OAAO;AACxD,CAAC;AAEH,MAAM,cACJ,QACA,WAC6B;CAC7B,MAAM,eAA+C,CAAC;CAEtD,KAAK,MAAM,CAAC,eAAe,gBAAgB,OAAO,cAChD,IAAI,YAAY,gBAAgB,OAAO,aACrC,aAAa,KAAK,gBAAgB,eAAe,WAAW,CAAC;CAIjE,OAAO,yBAAyB,KAAK;EACnC,aAAa,OAAO;EACpB,MAAM,OAAO;EACb,uBAAuB,OAAO;EAC9B,WAAW,yBAAyB,KAAK,gBAAgB,OAAO,SAAS,CAAC;EAC1E,mBAAmB,2BAA2B,KAAK,OAAO,iBAAiB;EAC3E;CACF,CAAC;AACH;AAEA,MAAM,iBAAiB,iBAAwD;CAC7E,MAAM;CACN,SAAS,kGAAkG;AAC7G;AAEA,MAAM,sBACJ,QACA,aACA,MACA,SAIG;CACH,MAAM,WAAW,OAAO,QAAQ,IAAI,WAAW;CAE/C,IAAI,aAAa,KAAA,GACf,OAAO,SAAS,SAAS,MAAM,IAAI,IAC/B,CAAC,GAAG,WAAW,QAAQ,QAAQ,CAAC,GAAG,MAAM,IACzC,CAAC,KAAK,6BAA6B,KAAK,EAAE,YAAY,CAAC,CAAC,GAAG,MAAM;CAEvE,MAAM,YAAwD,CAAC;CAE/D,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,MAAM,KAAK,IAAI,IAAI;EAEzB,IAAI,QAAQ,KAAA,GACV,UAAU,KAAK,OAAO;CAE1B;CAEA,MAAM,SAA4B;EAChC;EACA;EACA;EACA,uBAAuB;EACvB;EACA,mBAAmB;CACrB;CAEA,MAAM,OAA0B;EAC9B,SAAS,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,aAAa,MAAM;EACxD,cAAc,OAAO;CACvB;CAEA,OAAO,CAAC,GAAG,WAAW,MAAM,MAAM,CAAC,GAAG,IAAI;AAC5C;AAEA,MAAM,qBACJ,QACA,YAOG;CACH,MAAM,SAAS,OAAO,QAAQ,IAAI,QAAQ,WAAW;CAErD,IAAI,WAAW,KAAA,GACb,OAAO,CAAC,KAAK,4BAA4B,KAAK,EAAE,aAAa,QAAQ,YAAY,CAAC,CAAC,GAAG,MAAM;CAE9F,MAAM,gBAAgB,wBAAwB,QAAQ,aAAa,QAAQ,gBAAgB;CAC3F,MAAM,WAAW,OAAO,aAAa,IAAI,aAAa;CAEtD,IAAI,aAAa,KAAA,GACf,OAAO,YAAY,SAAS,WAAW,QAAQ,UAAU,KACvD,SAAS,2BAA2B,QAAQ,yBAAyB,KACnE,CAAC,GAAG,gBAAgB,eAAe,QAAQ,CAAC,GAAG,MAAM,IACrD,CACE,KACE,4BAA4B,KAAK;EAC/B;EACA,oBAAoB,2BAA2B,KAAK,SAAS,SAAS;EACtE,qBAAqB,QAAQ;CAC/B,CAAC,CACH,GACA,MACF;CAEN,MAAM,iBAAiB,OAAO,KAAK;CACnC,MAAM,QAAQ,KAAK,QAAQ,yBAAyB;CAEpD,IAAI,mBAAmB,KAAA,KAAa,OAAO,wBAAwB,QAAQ,gBACzE,OAAO,CACL,KACE,wBAAwB,KAAK;EAC3B,aAAa,QAAQ;EACrB,WAAW;EACX,YAAY;EACZ,eAAe,OAAO,wBAAwB;CAChD,CAAC,CACH,GACA,MACF;CAEF,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,MAAM,KAAK,IAAI,OAAO,IAAI;EAEhC,IAAI,QAAQ,KAAA,GACV;EAIF,MAAM,YAAY,OAAO,UAAU,KAAK,QAAQ,KAAK,OAAO,kBAAkB,KAAK;EACnF,MAAM,YAAY,QAAQ,WAAW,KAAK;EAE1C,IAAI,YAAY,UACd,OAAO,CACL,KACE,wBAAwB,KAAK;GAC3B,aAAa,QAAQ;GACrB,WAAW,KAAK;GAChB,YAAY;GACZ,eAAe,MAAM,WAAW;EAClC,CAAC,CACH,GACA,MACF;CAEJ;CAEA,MAAM,gBAA4D,EAChE,GAAG,OAAO,UACZ;CAEA,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,YAAY,OAAO,UAAU,KAAK;EAExC,IAAI,cAAc,KAAA,GAChB,cAAc,KAAK,OAAO,YAAY,QAAQ,WAAW,KAAK;CAElE;CAEA,MAAM,cAAgC;EACpC,aAAa,QAAQ;EACrB,kBAAkB,QAAQ;EAC1B,uBAAuB,QAAQ,yBAAyB;EACxD,QAAQ;EACR,WAAW,QAAQ;EACnB,UAAU,CAAC;EACX,SAAS;EACT,SAAS;CACX;CAEA,MAAM,OAA0B;EAC9B,SAAS,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,QAAQ,aAAa;GACxD,GAAG;GACH,uBAAuB,OAAO,wBAAwB;GACtD,WAAW;EACb,CAAC;EACD,cAAc,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC,IAAI,eAAe,WAAW;CAC3E;CAEA,OAAO,CAAC,GAAG,gBAAgB,eAAe,WAAW,CAAC,GAAG,IAAI;AAC/D;AAEA,MAAM,qBACJ,QACA,eACA,UAIG;CACH,MAAM,cAAc,OAAO,aAAa,IAAI,aAAa;CAEzD,IAAI,gBAAgB,KAAA,GAClB,OAAO,CAAC,KAAK,2BAA2B,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,MAAM;CAE1E,MAAM,SAAS,OAAO,QAAQ,IAAI,YAAY,WAAW;CAEzD,IAAI,WAAW,KAAA,GACb,OAAO,CAAC,cAAc,YAAY,WAAW,GAAG,MAAM;CAExD,MAAM,WAAuD,EAAE,GAAG,YAAY,SAAS;CACvF,MAAM,UAAkD,EAAE,GAAG,YAAY,QAAQ;CACjF,MAAM,UAAkD,EAAE,GAAG,YAAY,QAAQ;CAEjF,MAAM,oBAA4D,EAChE,GAAG,OAAO,kBACZ;CAEA,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,QAAQ,MAAM,KAAK;EAEzB,IAAI,UAAU,KAAA,GACZ;EAEF,SAAS,KAAK,QAAQ,SAAS,KAAK,QAAQ,KAAK;EAIjD,MAAM,YACJ,YAAY,WAAW,aACnB,KAAK,IAAI,OAAO,YAAY,UAAU,KAAK,OAAO,QAAQ,KAAK,IAAI,IACnE;EAEN,QAAQ,KAAK,QAAQ;EACrB,MAAM,eAAe,QAAQ;EAE7B,QAAQ,KAAK,QAAQ;EACrB,kBAAkB,KAAK,QAAQ;CACjC;CACA,MAAM,kBAAoC;EAAE,GAAG;EAAa;EAAU;EAAS;CAAQ;CAEvF,MAAM,OAA0B;EAC9B,SAAS,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,OAAO,aAAa;GAAE,GAAG;GAAQ;EAAkB,CAAC;EACzF,cAAc,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC,IAAI,eAAe,eAAe;CAC/E;CAEA,OAAO,CAAC,GAAG,gBAAgB,eAAe,eAAe,CAAC,GAAG,IAAI;AACnE;;;;;AAMA,MAAM,oBAAoB,gBAAoD;CAC5E,MAAM,WAAuD,EAAE,GAAG,YAAY,SAAS;CACvF,MAAM,UAAkD,EAAE,GAAG,YAAY,QAAQ;CAEjF,KAAK,MAAM,QAAQ,gBACjB,IAAI,SAAS,KAAK,SAAS,KAAA,GAAW;EACpC,SAAS,KAAK,OAAO,YAAY,UAAU,KAAK;EAChD,QAAQ,KAAK,OAAO,YAAY,UAAU,KAAK;CACjD;CAGF,OAAO;EAAE,GAAG;EAAa,QAAQ;EAAkB;EAAU;CAAQ;AACvE;AAEA,MAAM,0BACJ,QACA,kBAIG;CACH,MAAM,cAAc,OAAO,aAAa,IAAI,aAAa;CAEzD,IAAI,gBAAgB,KAAA,GAClB,OAAO,CAAC,KAAK,2BAA2B,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,MAAM;CAE1E,IAAI,YAAY,WAAW,YACzB,OAAO,CAAC,GAAG,gBAAgB,eAAe,WAAW,CAAC,GAAG,MAAM;CAEjE,MAAM,SAAS,iBAAiB,WAAW;CAE3C,MAAM,OAA0B;EAC9B,SAAS,OAAO;EAChB,cAAc,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC,IAAI,eAAe,MAAM;CACtE;CAEA,OAAO,CAAC,GAAG,gBAAgB,eAAe,MAAM,CAAC,GAAG,IAAI;AAC1D;AAEA,MAAM,qBACJ,QACA,kBAIG;CACH,MAAM,cAAc,OAAO,aAAa,IAAI,aAAa;CAEzD,IAAI,gBAAgB,KAAA,GAClB,OAAO,CAAC,KAAK,2BAA2B,KAAK,EAAE,cAAc,CAAC,CAAC,GAAG,MAAM;CAE1E,IAAI,YAAY,WAAW,YACzB,OAAO,CAAC,GAAG,gBAAgB,eAAe,WAAW,CAAC,GAAG,MAAM;CAEjE,MAAM,SAAS,OAAO,QAAQ,IAAI,YAAY,WAAW;CAEzD,IAAI,WAAW,KAAA,GACb,OAAO,CAAC,cAAc,YAAY,WAAW,GAAG,MAAM;CAExD,MAAM,SAAS,YAAY,WAAW,aAAa,iBAAiB,WAAW,IAAI;CACnF,MAAM,SAAS,iBAAiB,MAAM;CACtC,MAAM,gBAA4D,EAAE,GAAG,OAAO,UAAU;CAExF,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,YAAY,OAAO,UAAU,KAAK;EAExC,IAAI,cAAc,KAAA,GAChB,cAAc,KAAK,OAAO,YAAY,OAAO,KAAK;CAEtD;CACA,MAAM,UAA4B;EAAE,GAAG;EAAQ,QAAQ;CAAW;CAElE,MAAM,OAA0B;EAC9B,SAAS,IAAI,IAAI,OAAO,OAAO,CAAC,CAAC,IAAI,OAAO,aAAa;GACvD,GAAG;GACH,WAAW;EACb,CAAC;EACD,cAAc,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC,IAAI,eAAe,OAAO;CACvE;CAEA,OAAO,CAAC,GAAG,gBAAgB,eAAe,OAAO,CAAC,GAAG,IAAI;AAC3D;AAEA,MAAM,0BACJ,QACA,gBACqF;CACrF,IAAI,CAAC,OAAO,QAAQ,IAAI,WAAW,GACjC,OAAO,CAAC,GAAG,KAAA,CAAS,GAAG,MAAM;CAE/B,IAAI,mBAAmB;CAEvB,KAAK,MAAM,eAAe,OAAO,aAAa,OAAO,GACnD,IAAI,YAAY,gBAAgB,eAAe,YAAY,WAAW,YACpE,oBAAoB;CAGxB,IAAI,mBAAmB,GACrB,OAAO,CAAC,KAAK,2BAA2B,KAAK;EAAE;EAAa;CAAiB,CAAC,CAAC,GAAG,MAAM;CAE1F,MAAM,UAAU,IAAI,IAAI,OAAO,OAAO;CAEtC,QAAQ,OAAO,WAAW;CAC1B,MAAM,eAAe,IAAI,IAAI,OAAO,YAAY;CAEhD,KAAK,MAAM,CAAC,eAAe,gBAAgB,cACzC,IAAI,YAAY,gBAAgB,aAC9B,aAAa,OAAO,aAAa;CAIrC,OAAO,CAAC,GAAG,KAAA,CAAS,GAAG;EAAE;EAAS;CAAa,CAAC;AAClD;;;;;AAMA,MAAa,iCAAoE,MAAM,OACrF,sBACA,OAAO,IAAI,aAAa;CACtB,MAAM,QAAQ,OAAO,IAAI,KAAwB;EAC/C,yBAAS,IAAI,IAAI;EACjB,8BAAc,IAAI,IAAI;CACxB,CAAC;CAED,OAAO,qBAAqB,GAAG;EAC7B,gBAAgB,OAAO,WAAW,WAAW,aAAa,MAAM;GAC9D,MAAM,OACJ,KAAK,0BAA0B,KAAA,KAAa,KAAK,wBAAwB,IACrE,OAAO,UAAU,KAAK,KAAK,qBAAqB,IAChD,KAAA;GAEN,MAAM,SAAS,OAAO,IAAI,OAAO,QAAQ,WACvC,mBAAmB,QAAQ,aAAa,MAAM,IAAI,CACpD;GAEA,OAAO,OAAO,QAAQ,MAAM;EAC9B,CAAC;EACD,SAAS,OAAO,WAAW,WAAW,SAAS;GAC7C,MAAM,SAAS,OAAO,IAAI,OAAO,QAAQ,WAAW,kBAAkB,QAAQ,OAAO,CAAC;GAEtF,OAAO,OAAO,QAAQ,MAAM;EAC9B,CAAC;EACD,SAAS,OAAO,WAAW,WAAW,eAAe,OAAO;GAC1D,MAAM,SAAS,OAAO,IAAI,OAAO,QAAQ,WACvC,kBAAkB,QAAQ,eAAe,KAAK,CAChD;GAEA,OAAO,OAAO,QAAQ,MAAM;EAC9B,CAAC;EACD,cAAc,OAAO,WAAW,WAAW,eAAe;GACxD,MAAM,SAAS,OAAO,IAAI,OAAO,QAAQ,WACvC,uBAAuB,QAAQ,aAAa,CAC9C;GAEA,OAAO,OAAO,QAAQ,MAAM;EAC9B,CAAC;EACD,SAAS,OAAO,WAAW,WAAW,eAAe;GACnD,MAAM,SAAS,OAAO,IAAI,OAAO,QAAQ,WACvC,kBAAkB,QAAQ,aAAa,CACzC;GAEA,OAAO,OAAO,QAAQ,MAAM;EAC9B,CAAC;EACD,kBAAkB,OAAO,WAAW,WAAW,aAAa,QAAQ,GAAG;GAErE,MAAM,UAAS,OADO,IAAI,IAAI,KAAK,EAAA,CACb,QAAQ,IAAI,WAAW;GAE7C,IAAI,WAAW,KAAA,GACb,OAAO,OAAO,4BAA4B,KAAK,EAAE,YAAY,CAAC;GAEhE,MAAM,MAAM,OAAO,KAAK;GAExB,IAAI,QAAQ,KAAA,GACV;GAEF,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,OAAO,SAAS,KAAA,GAC9E,OAAO,OAAO,wBAAwB,KAAK;IACzC;IACA,WAAW;IACX,YAAY;IACZ,eAAe,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,QAAQ;GACpE,CAAC;GAEH,MAAM,OAAO,OAAO;GAEpB,OAAO,OAAO,eACZ,KAAK,KAAK,KAAK,IACd,YAAY,KAAK,QAAQ,OAAO,CAAC,CAAC,KAAK,OAAO,MAAM,GACrD,EAAE,eAAe,KAAK,CACxB;EACF,CAAC;EACD,cAAc,OAAO,WAAW,WAAW,aAAa;GACtD,MAAM,SAAS,OAAO,IAAI,OAAO,QAAQ,WACvC,uBAAuB,QAAQ,WAAW,CAC5C;GAEA,OAAO,OAAO,QAAQ,MAAM;EAC9B,CAAC;EACD,gBAAgB,OAAO,WAAW,WAAW,aAAa;GACxD,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK;GACnC,MAAM,SAAS,OAAO,QAAQ,IAAI,WAAW;GAE7C,IAAI,WAAW,KAAA,GACb,OAAO,OAAO,4BAA4B,KAAK,EAAE,YAAY,CAAC;GAGhE,OAAO,WAAW,QAAQ,MAAM;EAClC,CAAC;CACH,CAAC;AACH,CAAC,CACH"}
|
|
1
|
+
{"version":3,"file":"SubagentReservations.mjs","names":[],"sources":["../../src/capabilities/SubagentReservations.ts"],"sourcesContent":["import type { Scope } from \"effect\";\nimport * as Context from \"effect/Context\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Ref from \"effect/Ref\";\nimport * as Schema from \"effect/Schema\";\nimport * as Semaphore from \"effect/Semaphore\";\n\nimport { RunId, ToolCallId } from \"../core/Identifiers.ts\";\nimport { SubagentDelegationCaps, SubagentReservationAmounts } from \"../core/SubagentContract.ts\";\n\nconst Natural = Schema.Natural;\n\n/**\n * Stable identity of one parent-owned Subagent budget reservation.\n *\n * Derivation rule (see {@link makeBudgetReservationId}):\n * `encodeURIComponent(parentRunId) + \":\" + encodeURIComponent(parentToolCallId)`.\n * Component encoding escapes `:`; the mapping is injective for every\n * `(parentRunId, parentToolCallId)` pair.\n */\nexport const BudgetReservationId = Schema.NonEmptyString.pipe(\n Schema.brand(\"@effect-agent/capabilities/BudgetReservationId\"),\n);\n\nexport type BudgetReservationId = typeof BudgetReservationId.Type;\n\nconst decodeBudgetReservationId = Schema.decodeSync(BudgetReservationId);\n\n/** Derive the stable reservation identity of one Subagent Invocation. */\nexport const makeBudgetReservationId = (\n parentRunId: RunId,\n parentToolCallId: ToolCallId,\n): BudgetReservationId =>\n decodeBudgetReservationId(\n `${encodeURIComponent(parentRunId)}:${encodeURIComponent(parentToolCallId)}`,\n );\n\n/** One enforced hierarchical delegation budget dimension. */\nexport const SubagentBudgetDimension = Schema.Literals([\n \"total-child-invocations\",\n \"concurrent-children\",\n \"turns\",\n \"tool-calls\",\n \"duration\",\n \"input-tokens\",\n \"output-tokens\",\n \"cost\",\n \"result-bytes\",\n]);\n\nexport type SubagentBudgetDimension = typeof SubagentBudgetDimension.Type;\n\nconst AmountFields = SubagentReservationAmounts.fields;\n\nconst OptionalAmountFields = {\n turns: Schema.optionalKey(Natural),\n toolCalls: Schema.optionalKey(Natural),\n durationMillis: Schema.optionalKey(Natural),\n inputTokens: Schema.optionalKey(Natural),\n outputTokens: Schema.optionalKey(Natural),\n costMicrousd: Schema.optionalKey(Natural),\n resultBytes: Schema.optionalKey(Natural),\n} as const;\n\n/** Observed child usage. An absent dimension was never reported and settles conservatively. */\nexport class SubagentObservedUsage extends Schema.Class<SubagentObservedUsage>(\n \"@effect-agent/capabilities/SubagentObservedUsage\",\n)(OptionalAmountFields) {}\n\n/** Remaining delegable allocation per configured dimension. Absent means not configured. */\nexport class SubagentAvailableAmounts extends Schema.Class<SubagentAvailableAmounts>(\n \"@effect-agent/capabilities/SubagentAvailableAmounts\",\n)(OptionalAmountFields) {}\n\n/** Reservation lifecycle: absent → reserved → releasePending → released. */\nexport const SubagentReservationStatus = Schema.Literals([\n \"reserved\",\n \"releasePending\",\n \"released\",\n]);\n\nexport type SubagentReservationStatus = typeof SubagentReservationStatus.Type;\n\n/** All-or-nothing allocation request for one Subagent Invocation. */\nexport class SubagentReservationRequest extends Schema.Class<SubagentReservationRequest>(\n \"@effect-agent/capabilities/SubagentReservationRequest\",\n)({\n parentRunId: RunId,\n parentToolCallId: ToolCallId,\n allocation: SubagentReservationAmounts,\n /** Additional invocation slots held for this child's entire subtree. */\n descendantInvocations: Schema.optionalKey(Natural),\n}) {}\n\n/** Accounting snapshot of one reservation: allocated, observed, covered, released, and overrun. */\nexport class SubagentReservationView extends Schema.Class<SubagentReservationView>(\n \"@effect-agent/capabilities/SubagentReservationView\",\n)({\n reservationId: BudgetReservationId,\n parentRunId: RunId,\n parentToolCallId: ToolCallId,\n status: SubagentReservationStatus,\n allocated: SubagentReservationAmounts,\n observedConsumed: SubagentObservedUsage,\n coveredConsumed: SubagentReservationAmounts,\n released: SubagentReservationAmounts,\n overrun: SubagentReservationAmounts,\n}) {}\n\n/** Aggregate parent delegation budget snapshot including every reservation it owns. */\nexport class SubagentParentBudgetView extends Schema.Class<SubagentParentBudgetView>(\n \"@effect-agent/capabilities/SubagentParentBudgetView\",\n)({\n parentRunId: RunId,\n caps: SubagentDelegationCaps,\n totalChildInvocations: Natural,\n available: SubagentAvailableAmounts,\n cumulativeOverrun: SubagentReservationAmounts,\n reservations: Schema.Array(SubagentReservationView),\n}) {}\n\n/**\n * Delegation admission or execution exhausted a bound. A child refused at the\n * in-process parent's reserved finish window reports zero duration limit and usage.\n */\nexport class SubagentBudgetExhausted extends Schema.TaggedError<SubagentBudgetExhausted>()(\n \"SubagentBudgetExhausted\",\n {\n parentRunId: RunId,\n dimension: SubagentBudgetDimension,\n limitValue: Natural,\n observedValue: Natural,\n },\n) {}\n\n/** The stable key is already reserved with a different allocation; neither request may win silently. */\nexport class SubagentReservationConflict extends Schema.TaggedError<SubagentReservationConflict>()(\n \"SubagentReservationConflict\",\n {\n reservationId: BudgetReservationId,\n existingAllocation: SubagentReservationAmounts,\n requestedAllocation: SubagentReservationAmounts,\n },\n) {}\n\n/** No reservation exists for this identity. */\nexport class SubagentReservationUnknown extends Schema.TaggedError<SubagentReservationUnknown>()(\n \"SubagentReservationUnknown\",\n {\n reservationId: BudgetReservationId,\n },\n) {}\n\n/** No delegation budget was registered for this parent Run. */\nexport class SubagentParentBudgetUnknown extends Schema.TaggedError<SubagentParentBudgetUnknown>()(\n \"SubagentParentBudgetUnknown\",\n {\n parentRunId: RunId,\n },\n) {}\n\n/** The parent Run is already registered with different caps; neither set may win silently. */\nexport class SubagentParentBudgetConflict extends Schema.TaggedError<SubagentParentBudgetConflict>()(\n \"SubagentParentBudgetConflict\",\n {\n parentRunId: RunId,\n },\n) {}\n\n/** A parent budget cannot retire while one of its child reservations is unsettled. */\nexport class SubagentParentBudgetActive extends Schema.TaggedError<SubagentParentBudgetActive>()(\n \"SubagentParentBudgetActive\",\n {\n parentRunId: RunId,\n openReservations: Natural,\n },\n) {}\n\n/**\n * Parent-owned hierarchical Subagent budget reservation authority.\n *\n * Every transition is a single atomic `Ref` update, so parallel children can\n * never observe and spend the same remainder. The post-response usage hook in\n * `budget.ts` is deliberately not reused here: it accounts after the fact and\n * is not a reservation service.\n */\nexport class SubagentReservations extends Context.Service<\n SubagentReservations,\n {\n /**\n * Register the finite delegable budget of one parent Run. Re-registering\n * identical caps returns the existing registration; different caps fail\n * rather than silently winning.\n */\n readonly registerParent: (\n parentRunId: RunId,\n caps: SubagentDelegationCaps,\n ) => Effect.Effect<SubagentParentBudgetView, SubagentParentBudgetConflict>;\n /**\n * Atomically reserve an all-or-nothing child allocation from the parent's\n * remaining delegable budget, checking every dimension before committing\n * any. The same key with the same allocation is idempotent and never\n * double-reserves; a distinct key charges the monotonic total-invocation\n * counter by one plus its reserved descendant slots, which release never refunds.\n */\n readonly reserve: (\n request: SubagentReservationRequest,\n ) => Effect.Effect<\n SubagentReservationView,\n SubagentBudgetExhausted | SubagentReservationConflict | SubagentParentBudgetUnknown\n >;\n /**\n * Record observed child usage against a reservation. Usage above the\n * reserved amount is recorded as overrun and charged to the parent\n * aggregate, never clipped. Usage observed after settlement begins is\n * pure overrun and cannot create budget.\n */\n readonly observe: (\n reservationId: BudgetReservationId,\n usage: SubagentObservedUsage,\n ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;\n /**\n * `reserved → releasePending`: freeze the settlement decision. A dimension\n * with no observed usage conservatively consumes its reserved amount.\n * Idempotent once settlement has begun.\n */\n readonly beginRelease: (\n reservationId: BudgetReservationId,\n ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;\n /**\n * `releasePending → released`: return the unused allocation to the parent\n * exactly once. Called on a still-reserved reservation it settles through\n * `releasePending` in the same atomic update. Idempotent once released.\n */\n readonly release: (\n reservationId: BudgetReservationId,\n ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;\n /**\n * Acquire bounded child execution slots as a Scope-owned resource, so\n * an interrupted child always frees its slot. The Semaphore bounds only\n * concurrent children; a subtree holds one plus its possible descendants up front.\n * Total invocations are enforced separately by\n * `reserve`'s monotonic counter. A configured cap of zero fails closed\n * instead of queueing forever; an unconfigured cap leaves execution\n * ungated by this service.\n */\n readonly acquireChildSlot: (\n parentRunId: RunId,\n slots?: number,\n ) => Effect.Effect<void, SubagentParentBudgetUnknown | SubagentBudgetExhausted, Scope.Scope>;\n /**\n * Reclaim one terminal parent registration and all of its released child\n * reservations. Retirement is idempotent; an unknown parent is already\n * retired. Open reservations fail typed and leave the ledger unchanged.\n * The Run owner must call this after its final accounting snapshot no\n * longer needs to be observable.\n */\n readonly retireParent: (parentRunId: RunId) => Effect.Effect<void, SubagentParentBudgetActive>;\n /** Read the aggregate parent view for auditing and conservation checks. */\n readonly parentSnapshot: (\n parentRunId: RunId,\n ) => Effect.Effect<SubagentParentBudgetView, SubagentParentBudgetUnknown>;\n }\n>()(\"@effect-agent/capabilities/SubagentReservations\") {}\n\ntype ReservableDimensionKey = keyof typeof AmountFields;\n\ntype Amounts = Readonly<Record<ReservableDimensionKey, number>>;\ntype PartialAmounts = Readonly<Partial<Record<ReservableDimensionKey, number>>>;\n\ninterface DimensionSpec {\n readonly key: ReservableDimensionKey;\n readonly dimension: SubagentBudgetDimension;\n readonly cap: (caps: SubagentDelegationCaps) => number | undefined;\n}\n\nconst dimensionSpecs: ReadonlyArray<DimensionSpec> = [\n { key: \"turns\", dimension: \"turns\", cap: (caps) => caps.maxTurns },\n { key: \"toolCalls\", dimension: \"tool-calls\", cap: (caps) => caps.maxToolCalls },\n { key: \"durationMillis\", dimension: \"duration\", cap: (caps) => caps.maxDurationMillis },\n { key: \"inputTokens\", dimension: \"input-tokens\", cap: (caps) => caps.maxInputTokens },\n { key: \"outputTokens\", dimension: \"output-tokens\", cap: (caps) => caps.maxOutputTokens },\n { key: \"costMicrousd\", dimension: \"cost\", cap: (caps) => caps.maxCostMicrousd },\n { key: \"resultBytes\", dimension: \"result-bytes\", cap: (caps) => caps.maxResultBytes },\n];\n\nconst zeroAmounts: Amounts = {\n turns: 0,\n toolCalls: 0,\n durationMillis: 0,\n inputTokens: 0,\n outputTokens: 0,\n costMicrousd: 0,\n resultBytes: 0,\n};\n\ninterface ReservationState {\n readonly parentRunId: RunId;\n readonly parentToolCallId: ToolCallId;\n readonly descendantInvocations: number;\n readonly status: SubagentReservationStatus;\n readonly allocated: Amounts;\n readonly observed: PartialAmounts;\n readonly covered: Amounts;\n readonly overrun: Amounts;\n}\n\ninterface ParentBudgetState {\n readonly parentRunId: RunId;\n readonly caps: SubagentDelegationCaps;\n readonly gate: Semaphore.Semaphore | undefined;\n /** Monotonic count of distinct reservations; never refunded by release. */\n readonly totalChildInvocations: number;\n /** Remaining delegable allocation for configured dimensions only. */\n readonly available: PartialAmounts;\n readonly cumulativeOverrun: Amounts;\n}\n\ninterface ReservationLedger {\n readonly parents: ReadonlyMap<RunId, ParentBudgetState>;\n readonly reservations: ReadonlyMap<BudgetReservationId, ReservationState>;\n}\n\ntype TransitionResult<A, E> =\n | { readonly _tag: \"ok\"; readonly value: A }\n | { readonly _tag: \"error\"; readonly error: E }\n | { readonly _tag: \"corrupt\"; readonly message: string };\n\nconst ok = <A>(value: A): TransitionResult<A, never> => ({ _tag: \"ok\", value });\nconst fail = <E>(error: E): TransitionResult<never, E> => ({ _tag: \"error\", error });\n\n/** Corrupt internal accounting is a defect, never an expected reservation failure. */\nclass ReservationLedgerCorrupt extends Schema.TaggedError<ReservationLedgerCorrupt>()(\n \"ReservationLedgerCorrupt\",\n {\n message: Schema.String,\n },\n) {}\n\nconst resolve = <A, E>(result: TransitionResult<A, E>): Effect.Effect<A, E> => {\n switch (result._tag) {\n case \"ok\":\n return Effect.succeed(result.value);\n case \"error\":\n return Effect.fail(result.error);\n case \"corrupt\":\n return Effect.die(ReservationLedgerCorrupt.make({ message: result.message }));\n }\n};\n\nconst sameCaps = (a: SubagentDelegationCaps, b: SubagentDelegationCaps): boolean =>\n a.maxTotalChildInvocations === b.maxTotalChildInvocations &&\n a.maxConcurrentChildren === b.maxConcurrentChildren &&\n a.maxTurns === b.maxTurns &&\n a.maxToolCalls === b.maxToolCalls &&\n a.maxDurationMillis === b.maxDurationMillis &&\n a.maxInputTokens === b.maxInputTokens &&\n a.maxOutputTokens === b.maxOutputTokens &&\n a.maxCostMicrousd === b.maxCostMicrousd &&\n a.maxResultBytes === b.maxResultBytes;\n\nconst sameAmounts = (a: Amounts, b: Amounts): boolean =>\n dimensionSpecs.every((spec) => a[spec.key] === b[spec.key]);\n\nconst optionalAmounts = (partial: PartialAmounts): { [K in ReservableDimensionKey]?: number } => {\n const out: { [K in ReservableDimensionKey]?: number } = {};\n\n for (const spec of dimensionSpecs) {\n const value = partial[spec.key];\n\n if (value !== undefined) {\n out[spec.key] = value;\n }\n }\n\n return out;\n};\n\n/** Covered usage freezes at settlement, so the unused allocation remains stable afterward. */\nconst unusedAllocation = (reservation: ReservationState): Amounts => {\n const unused = { ...zeroAmounts };\n\n for (const spec of dimensionSpecs) {\n unused[spec.key] = reservation.allocated[spec.key] - reservation.covered[spec.key];\n }\n\n return unused;\n};\n\nconst reservationView = (\n reservationId: BudgetReservationId,\n state: ReservationState,\n): SubagentReservationView =>\n SubagentReservationView.make({\n reservationId,\n parentRunId: state.parentRunId,\n parentToolCallId: state.parentToolCallId,\n status: state.status,\n allocated: SubagentReservationAmounts.make(state.allocated),\n observedConsumed: SubagentObservedUsage.make(optionalAmounts(state.observed)),\n coveredConsumed: SubagentReservationAmounts.make(state.covered),\n released: SubagentReservationAmounts.make(\n state.status === \"released\" ? unusedAllocation(state) : zeroAmounts,\n ),\n overrun: SubagentReservationAmounts.make(state.overrun),\n });\n\nconst parentView = (\n ledger: ReservationLedger,\n parent: ParentBudgetState,\n): SubagentParentBudgetView => {\n const reservations: Array<SubagentReservationView> = [];\n\n for (const [reservationId, reservation] of ledger.reservations) {\n if (reservation.parentRunId === parent.parentRunId) {\n reservations.push(reservationView(reservationId, reservation));\n }\n }\n\n return SubagentParentBudgetView.make({\n parentRunId: parent.parentRunId,\n caps: parent.caps,\n totalChildInvocations: parent.totalChildInvocations,\n available: SubagentAvailableAmounts.make(optionalAmounts(parent.available)),\n cumulativeOverrun: SubagentReservationAmounts.make(parent.cumulativeOverrun),\n reservations,\n });\n};\n\nconst corruptParent = (parentRunId: RunId): TransitionResult<never, never> => ({\n _tag: \"corrupt\",\n message: `SubagentReservations ledger invariant violated: reservation references unregistered parent Run ${parentRunId}`,\n});\n\nconst registerTransition = (\n ledger: ReservationLedger,\n parentRunId: RunId,\n caps: SubagentDelegationCaps,\n gate: Semaphore.Semaphore | undefined,\n): readonly [\n TransitionResult<SubagentParentBudgetView, SubagentParentBudgetConflict>,\n ReservationLedger,\n] => {\n const existing = ledger.parents.get(parentRunId);\n\n if (existing !== undefined) {\n return sameCaps(existing.caps, caps)\n ? [ok(parentView(ledger, existing)), ledger]\n : [fail(SubagentParentBudgetConflict.make({ parentRunId })), ledger];\n }\n const available: { [K in ReservableDimensionKey]?: number } = {};\n\n for (const spec of dimensionSpecs) {\n const cap = spec.cap(caps);\n\n if (cap !== undefined) {\n available[spec.key] = cap;\n }\n }\n\n const parent: ParentBudgetState = {\n parentRunId,\n caps,\n gate,\n totalChildInvocations: 0,\n available,\n cumulativeOverrun: zeroAmounts,\n };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(parentRunId, parent),\n reservations: ledger.reservations,\n };\n\n return [ok(parentView(next, parent)), next];\n};\n\nconst reserveTransition = (\n ledger: ReservationLedger,\n request: SubagentReservationRequest,\n): readonly [\n TransitionResult<\n SubagentReservationView,\n SubagentBudgetExhausted | SubagentReservationConflict | SubagentParentBudgetUnknown\n >,\n ReservationLedger,\n] => {\n const parent = ledger.parents.get(request.parentRunId);\n\n if (parent === undefined) {\n return [fail(SubagentParentBudgetUnknown.make({ parentRunId: request.parentRunId })), ledger];\n }\n const reservationId = makeBudgetReservationId(request.parentRunId, request.parentToolCallId);\n const existing = ledger.reservations.get(reservationId);\n\n if (existing !== undefined) {\n return sameAmounts(existing.allocated, request.allocation) &&\n existing.descendantInvocations === (request.descendantInvocations ?? 0)\n ? [ok(reservationView(reservationId, existing)), ledger]\n : [\n fail(\n SubagentReservationConflict.make({\n reservationId,\n existingAllocation: SubagentReservationAmounts.make(existing.allocated),\n requestedAllocation: request.allocation,\n }),\n ),\n ledger,\n ];\n }\n const maxInvocations = parent.caps.maxTotalChildInvocations;\n const slots = 1 + (request.descendantInvocations ?? 0);\n\n if (maxInvocations !== undefined && parent.totalChildInvocations + slots > maxInvocations) {\n return [\n fail(\n SubagentBudgetExhausted.make({\n parentRunId: request.parentRunId,\n dimension: \"total-child-invocations\",\n limitValue: maxInvocations,\n observedValue: parent.totalChildInvocations + slots,\n }),\n ),\n ledger,\n ];\n }\n for (const spec of dimensionSpecs) {\n const cap = spec.cap(parent.caps);\n\n if (cap === undefined) {\n continue;\n }\n // Overrun already charged to the parent aggregate reduces delegable\n // headroom without mutating `available`.\n const headroom = (parent.available[spec.key] ?? 0) - parent.cumulativeOverrun[spec.key];\n const requested = request.allocation[spec.key];\n\n if (requested > headroom) {\n return [\n fail(\n SubagentBudgetExhausted.make({\n parentRunId: request.parentRunId,\n dimension: spec.dimension,\n limitValue: cap,\n observedValue: cap - headroom + requested,\n }),\n ),\n ledger,\n ];\n }\n }\n\n const nextAvailable: { [K in ReservableDimensionKey]?: number } = {\n ...parent.available,\n };\n\n for (const spec of dimensionSpecs) {\n const available = parent.available[spec.key];\n\n if (available !== undefined) {\n nextAvailable[spec.key] = available - request.allocation[spec.key];\n }\n }\n\n const reservation: ReservationState = {\n parentRunId: request.parentRunId,\n parentToolCallId: request.parentToolCallId,\n descendantInvocations: request.descendantInvocations ?? 0,\n status: \"reserved\",\n allocated: request.allocation,\n observed: {},\n covered: zeroAmounts,\n overrun: zeroAmounts,\n };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(request.parentRunId, {\n ...parent,\n totalChildInvocations: parent.totalChildInvocations + slots,\n available: nextAvailable,\n }),\n reservations: new Map(ledger.reservations).set(reservationId, reservation),\n };\n\n return [ok(reservationView(reservationId, reservation)), next];\n};\n\nconst observeTransition = (\n ledger: ReservationLedger,\n reservationId: BudgetReservationId,\n usage: SubagentObservedUsage,\n): readonly [\n TransitionResult<SubagentReservationView, SubagentReservationUnknown>,\n ReservationLedger,\n] => {\n const reservation = ledger.reservations.get(reservationId);\n\n if (reservation === undefined) {\n return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];\n }\n const parent = ledger.parents.get(reservation.parentRunId);\n\n if (parent === undefined) {\n return [corruptParent(reservation.parentRunId), ledger];\n }\n const observed: { [K in ReservableDimensionKey]?: number } = { ...reservation.observed };\n const covered: Record<ReservableDimensionKey, number> = { ...reservation.covered };\n const overrun: Record<ReservableDimensionKey, number> = { ...reservation.overrun };\n\n const cumulativeOverrun: Record<ReservableDimensionKey, number> = {\n ...parent.cumulativeOverrun,\n };\n\n for (const spec of dimensionSpecs) {\n const delta = usage[spec.key];\n\n if (delta === undefined) {\n continue;\n }\n observed[spec.key] = (observed[spec.key] ?? 0) + delta;\n\n // Once settlement began the accounting decision is frozen, so late or\n // corrected usage is pure overrun and cannot silently create budget.\n const coverable =\n reservation.status === \"reserved\"\n ? Math.min(delta, reservation.allocated[spec.key] - covered[spec.key])\n : 0;\n\n covered[spec.key] += coverable;\n const overrunDelta = delta - coverable;\n\n overrun[spec.key] += overrunDelta;\n cumulativeOverrun[spec.key] += overrunDelta;\n }\n const nextReservation: ReservationState = { ...reservation, observed, covered, overrun };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(parent.parentRunId, { ...parent, cumulativeOverrun }),\n reservations: new Map(ledger.reservations).set(reservationId, nextReservation),\n };\n\n return [ok(reservationView(reservationId, nextReservation)), next];\n};\n\n/**\n * Freeze the settlement decision. A dimension that was never observed\n * conservatively consumes its full reserved amount.\n */\nconst freezeSettlement = (reservation: ReservationState): ReservationState => {\n const observed: { [K in ReservableDimensionKey]?: number } = { ...reservation.observed };\n const covered: Record<ReservableDimensionKey, number> = { ...reservation.covered };\n\n for (const spec of dimensionSpecs) {\n if (observed[spec.key] === undefined) {\n observed[spec.key] = reservation.allocated[spec.key];\n covered[spec.key] = reservation.allocated[spec.key];\n }\n }\n\n return { ...reservation, status: \"releasePending\", observed, covered };\n};\n\nconst beginReleaseTransition = (\n ledger: ReservationLedger,\n reservationId: BudgetReservationId,\n): readonly [\n TransitionResult<SubagentReservationView, SubagentReservationUnknown>,\n ReservationLedger,\n] => {\n const reservation = ledger.reservations.get(reservationId);\n\n if (reservation === undefined) {\n return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];\n }\n if (reservation.status !== \"reserved\") {\n return [ok(reservationView(reservationId, reservation)), ledger];\n }\n const frozen = freezeSettlement(reservation);\n\n const next: ReservationLedger = {\n parents: ledger.parents,\n reservations: new Map(ledger.reservations).set(reservationId, frozen),\n };\n\n return [ok(reservationView(reservationId, frozen)), next];\n};\n\nconst releaseTransition = (\n ledger: ReservationLedger,\n reservationId: BudgetReservationId,\n): readonly [\n TransitionResult<SubagentReservationView, SubagentReservationUnknown>,\n ReservationLedger,\n] => {\n const reservation = ledger.reservations.get(reservationId);\n\n if (reservation === undefined) {\n return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];\n }\n if (reservation.status === \"released\") {\n return [ok(reservationView(reservationId, reservation)), ledger];\n }\n const parent = ledger.parents.get(reservation.parentRunId);\n\n if (parent === undefined) {\n return [corruptParent(reservation.parentRunId), ledger];\n }\n const frozen = reservation.status === \"reserved\" ? freezeSettlement(reservation) : reservation;\n const unused = unusedAllocation(frozen);\n const nextAvailable: { [K in ReservableDimensionKey]?: number } = { ...parent.available };\n\n for (const spec of dimensionSpecs) {\n const available = parent.available[spec.key];\n\n if (available !== undefined) {\n nextAvailable[spec.key] = available + unused[spec.key];\n }\n }\n const settled: ReservationState = { ...frozen, status: \"released\" };\n\n const next: ReservationLedger = {\n parents: new Map(ledger.parents).set(parent.parentRunId, {\n ...parent,\n available: nextAvailable,\n }),\n reservations: new Map(ledger.reservations).set(reservationId, settled),\n };\n\n return [ok(reservationView(reservationId, settled)), next];\n};\n\nconst retireParentTransition = (\n ledger: ReservationLedger,\n parentRunId: RunId,\n): readonly [TransitionResult<void, SubagentParentBudgetActive>, ReservationLedger] => {\n if (!ledger.parents.has(parentRunId)) {\n return [ok(undefined), ledger];\n }\n let openReservations = 0;\n\n for (const reservation of ledger.reservations.values()) {\n if (reservation.parentRunId === parentRunId && reservation.status !== \"released\") {\n openReservations += 1;\n }\n }\n if (openReservations > 0) {\n return [fail(SubagentParentBudgetActive.make({ parentRunId, openReservations })), ledger];\n }\n const parents = new Map(ledger.parents);\n\n parents.delete(parentRunId);\n const reservations = new Map(ledger.reservations);\n\n for (const [reservationId, reservation] of reservations) {\n if (reservation.parentRunId === parentRunId) {\n reservations.delete(reservationId);\n }\n }\n\n return [ok(undefined), { parents, reservations }];\n};\n\n/**\n * In-memory reservation ledger. All state lives in one `Ref` owned by the\n * Layer's Scope; every transition is a single atomic `Ref.modify`.\n */\nexport const SubagentReservationsMemoryLive: Layer.Layer<SubagentReservations> = Layer.effect(\n SubagentReservations,\n Effect.gen(function* () {\n const state = yield* Ref.make<ReservationLedger>({\n parents: new Map(),\n reservations: new Map(),\n });\n\n return SubagentReservations.of({\n registerParent: Effect.fnUntraced(function* (parentRunId, caps) {\n const gate =\n caps.maxConcurrentChildren !== undefined && caps.maxConcurrentChildren > 0\n ? yield* Semaphore.make(caps.maxConcurrentChildren)\n : undefined;\n\n const result = yield* Ref.modify(state, (ledger) =>\n registerTransition(ledger, parentRunId, caps, gate),\n );\n\n return yield* resolve(result);\n }),\n reserve: Effect.fnUntraced(function* (request) {\n const result = yield* Ref.modify(state, (ledger) => reserveTransition(ledger, request));\n\n return yield* resolve(result);\n }),\n observe: Effect.fnUntraced(function* (reservationId, usage) {\n const result = yield* Ref.modify(state, (ledger) =>\n observeTransition(ledger, reservationId, usage),\n );\n\n return yield* resolve(result);\n }),\n beginRelease: Effect.fnUntraced(function* (reservationId) {\n const result = yield* Ref.modify(state, (ledger) =>\n beginReleaseTransition(ledger, reservationId),\n );\n\n return yield* resolve(result);\n }),\n release: Effect.fnUntraced(function* (reservationId) {\n const result = yield* Ref.modify(state, (ledger) =>\n releaseTransition(ledger, reservationId),\n );\n\n return yield* resolve(result);\n }),\n acquireChildSlot: Effect.fnUntraced(function* (parentRunId, slots = 1) {\n const ledger = yield* Ref.get(state);\n const parent = ledger.parents.get(parentRunId);\n\n if (parent === undefined) {\n return yield* SubagentParentBudgetUnknown.make({ parentRunId });\n }\n const cap = parent.caps.maxConcurrentChildren;\n\n if (cap === undefined) {\n return;\n }\n if (!Number.isSafeInteger(slots) || slots < 1 || slots > cap || parent.gate === undefined) {\n return yield* SubagentBudgetExhausted.make({\n parentRunId,\n dimension: \"concurrent-children\",\n limitValue: cap,\n observedValue: Number.isSafeInteger(slots) && slots > 0 ? slots : 0,\n });\n }\n const gate = parent.gate;\n\n yield* Effect.acquireRelease(\n gate.take(slots),\n (permits) => gate.release(permits).pipe(Effect.asVoid),\n { interruptible: true },\n );\n }),\n retireParent: Effect.fnUntraced(function* (parentRunId) {\n const result = yield* Ref.modify(state, (ledger) =>\n retireParentTransition(ledger, parentRunId),\n );\n\n return yield* resolve(result);\n }),\n parentSnapshot: Effect.fnUntraced(function* (parentRunId) {\n const ledger = yield* Ref.get(state);\n const parent = ledger.parents.get(parentRunId);\n\n if (parent === undefined) {\n return yield* SubagentParentBudgetUnknown.make({ parentRunId });\n }\n\n return parentView(ledger, parent);\n }),\n });\n }),\n);\n"],"mappings":"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"}
|
package/dist/core/RunEvent.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as TurnCompleted, C as TextDelta, D as ToolCallSucceeded, E as ToolCallStarted, O as ToolFailureHandling, S as SubagentStarted, T as ToolCallFailed, _ as SubagentFailed, a as ExhaustedLimit, b as SubagentProgress, c as ReasoningDelta, f as RunFailed, g as SubagentCompleted, h as RunSuspended, i as CompactionPerformed, j as TurnStarted, k as ToolProgress, l as RunCompleted, m as RunStarted, n as ApprovalRequested, o as ModelRestarted, p as RunInterrupted, r as BudgetWarning, s as ModelStarted, t as AgentUpdateEmitted, u as RunEvent, v as SubagentInterrupted, w as ToolCallDeclared, x as SubagentRequested, y as SubagentJoined } from "../RunEvent-
|
|
1
|
+
import { A as TurnCompleted, C as TextDelta, D as ToolCallSucceeded, E as ToolCallStarted, O as ToolFailureHandling, S as SubagentStarted, T as ToolCallFailed, _ as SubagentFailed, a as ExhaustedLimit, b as SubagentProgress, c as ReasoningDelta, f as RunFailed, g as SubagentCompleted, h as RunSuspended, i as CompactionPerformed, j as TurnStarted, k as ToolProgress, l as RunCompleted, m as RunStarted, n as ApprovalRequested, o as ModelRestarted, p as RunInterrupted, r as BudgetWarning, s as ModelStarted, t as AgentUpdateEmitted, u as RunEvent, v as SubagentInterrupted, w as ToolCallDeclared, x as SubagentRequested, y as SubagentJoined } from "../RunEvent-Bh1p4zAO.mjs";
|
|
2
2
|
export { AgentUpdateEmitted, ApprovalRequested, BudgetWarning, CompactionPerformed, ExhaustedLimit, ModelRestarted, ModelStarted, ReasoningDelta, RunCompleted, RunEvent, RunFailed, RunInterrupted, RunStarted, RunSuspended, SubagentCompleted, SubagentFailed, SubagentInterrupted, SubagentJoined, SubagentProgress, SubagentRequested, SubagentStarted, TextDelta, ToolCallDeclared, ToolCallFailed, ToolCallStarted, ToolCallSucceeded, ToolFailureHandling, ToolProgress, TurnCompleted, TurnStarted };
|
package/dist/core/RunEvent.mjs
CHANGED
|
@@ -136,7 +136,7 @@ var ToolCallFailed = class extends Schema.TaggedClass()("ToolCallFailed", {
|
|
|
136
136
|
failureMode: Schema.optionalKey(Schema.Literals(["error", "return"])),
|
|
137
137
|
/** Actual route at this boundary. Absence on older events means unknown, never recoverable. */
|
|
138
138
|
failureHandling: Schema.optionalKey(ToolFailureHandling),
|
|
139
|
-
/** Synthetic policy rejection; no handler ran and the failure streak is unchanged. */
|
|
139
|
+
/** Synthetic policy or capacity rejection; no handler ran and the failure streak is unchanged. */
|
|
140
140
|
budgetRejected: Schema.optionalKey(Schema.Literal(true))
|
|
141
141
|
}) {};
|
|
142
142
|
/** Signals that a decoded Tool Call requires approval before execution. */
|