effect-agent 0.1.0-beta.160 → 0.1.0-beta.162

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/{Admin-Dirux8PR.d.mts → Admin-Vhz6NdaH.d.mts} +10 -2
  2. package/dist/{DurableAgentRuntime-pr7cCaZw.mjs → DurableAgentRuntime-BpB5rBcu.mjs} +41 -35
  3. package/dist/DurableAgentRuntime-BpB5rBcu.mjs.map +1 -0
  4. package/dist/{EventSource-DOXB0RJR.d.mts → EventSource-CtS0RBM7.d.mts} +2 -2
  5. package/dist/{PreparedInputAdmission-B7r401xJ.d.mts → PreparedInputAdmission-CS_zlCvD.d.mts} +3 -3
  6. package/dist/{Subscription-B3ScCBaN.d.mts → Subscription-nbSNY6Hs.d.mts} +2 -2
  7. package/dist/{SubscriptionInput-BP5WVsX_.d.mts → SubscriptionInput-DbXnOMS2.d.mts} +2 -2
  8. package/dist/durable/Admin.d.mts +1 -1
  9. package/dist/durable/AgentRegistration.d.mts +1 -1
  10. package/dist/durable/Certification.d.mts +1 -1
  11. package/dist/durable/CommittedActivity.d.mts +1 -1
  12. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  13. package/dist/durable/DurableAgentRuntime.mjs +1 -1
  14. package/dist/durable/EventSource.d.mts +1 -1
  15. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  16. package/dist/durable/LifecyclePublication.d.mts +1 -1
  17. package/dist/durable/LifecyclePublication.mjs +25 -16
  18. package/dist/durable/LifecyclePublication.mjs.map +1 -1
  19. package/dist/durable/MessageDelivery.d.mts +3 -3
  20. package/dist/durable/MessageDeliveryStoreConformance.d.mts +1 -1
  21. package/dist/durable/PersistentHistory.d.mts +1 -1
  22. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  23. package/dist/durable/Recovery.d.mts +1 -1
  24. package/dist/durable/RunJournal.d.mts +1 -1
  25. package/dist/durable/Scheduling.d.mts +1 -1
  26. package/dist/durable/SubmissionLedger.d.mts +1 -1
  27. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  28. package/dist/durable/SubmissionStatus.d.mts +1 -1
  29. package/dist/durable/Subscription.d.mts +1 -1
  30. package/dist/durable/SubscriptionInput.d.mts +1 -1
  31. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  32. package/dist/durable/SubscriptionTools.d.mts +2 -2
  33. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  34. package/dist/durable/Subscriptions.d.mts +5 -5
  35. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  36. package/dist/durable/ThreadInvariants.d.mts +1 -1
  37. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  38. package/dist/durable/ThreadStore.d.mts +1 -1
  39. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  40. package/dist/durable/WorkerAdmission.d.mts +1 -1
  41. package/dist/durable/WorkerHost.d.mts +1 -1
  42. package/dist/index.d.mts +5 -5
  43. package/dist/index.mjs +1 -1
  44. package/package.json +1 -1
  45. package/src/durable/DurableAgentRuntime.ts +63 -50
  46. package/src/durable/LifecyclePublication.ts +52 -29
  47. package/src/durable/internal/journal-checkpoint.ts +8 -7
  48. package/dist/DurableAgentRuntime-pr7cCaZw.mjs.map +0 -1
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"effect-agent","version":"0.1.0-beta.160","devDependencies":{"@effect/platform-node":"4.0.0-rc.117","@effect/vitest":"4.0.0-rc.117","effect":"4.0.0-rc.117","typescript":"7.0.2","vite-plus":"0.3.3"},"peerDependencies":{"effect":"^4.0.0-rc.117"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./activity-store":{"types":"./dist/durable/ActivityStore.d.mts","default":"./dist/durable/ActivityStore.mjs"},"./admin":{"types":"./dist/durable/Admin.d.mts","default":"./dist/durable/Admin.mjs"},"./agent":{"types":"./dist/core/Agent.d.mts","default":"./dist/core/Agent.mjs"},"./agent-error":{"types":"./dist/core/AgentError.d.mts","default":"./dist/core/AgentError.mjs"},"./agent-policy":{"types":"./dist/core/AgentPolicy.d.mts","default":"./dist/core/AgentPolicy.mjs"},"./agent-registration":{"types":"./dist/durable/AgentRegistration.d.mts","default":"./dist/durable/AgentRegistration.mjs"},"./agent-runtime":{"types":"./dist/engine/AgentRuntime.d.mts","default":"./dist/engine/AgentRuntime.mjs"},"./agent-updates":{"types":"./dist/core/AgentUpdates.d.mts","default":"./dist/core/AgentUpdates.mjs"},"./approval":{"types":"./dist/capabilities/Approval.d.mts","default":"./dist/capabilities/Approval.mjs"},"./browser-use":{"types":"./dist/capabilities/BrowserUse.d.mts","default":"./dist/capabilities/BrowserUse.mjs"},"./budget":{"types":"./dist/capabilities/Budget.d.mts","default":"./dist/capabilities/Budget.mjs"},"./code-executor":{"types":"./dist/sandbox/CodeExecutor.d.mts","default":"./dist/sandbox/CodeExecutor.mjs"},"./code-mode":{"types":"./dist/capabilities/CodeMode.d.mts","default":"./dist/capabilities/CodeMode.mjs"},"./commands":{"types":"./dist/capabilities/Commands.d.mts","default":"./dist/capabilities/Commands.mjs"},"./committed-activity":{"types":"./dist/durable/CommittedActivity.d.mts","default":"./dist/durable/CommittedActivity.mjs"},"./compaction":{"types":"./dist/engine/Compaction.d.mts","default":"./dist/engine/Compaction.mjs"},"./context-compactor":{"types":"./dist/engine/ContextCompactor.d.mts","default":"./dist/engine/ContextCompactor.mjs"},"./context-history":{"types":"./dist/engine/ContextHistory.d.mts","default":"./dist/engine/ContextHistory.mjs"},"./context-tools":{"types":"./dist/capabilities/ContextTools.d.mts","default":"./dist/capabilities/ContextTools.mjs"},"./context-window":{"types":"./dist/engine/ContextWindow.d.mts","default":"./dist/engine/ContextWindow.mjs"},"./digest":{"types":"./dist/durable/Digest.d.mts","default":"./dist/durable/Digest.mjs"},"./durable-agent-runtime":{"types":"./dist/durable/DurableAgentRuntime.d.mts","default":"./dist/durable/DurableAgentRuntime.mjs"},"./durable-failpoint":{"types":"./dist/durable/DurableFailpoint.d.mts","default":"./dist/durable/DurableFailpoint.mjs"},"./durable-step":{"types":"./dist/engine/DurableStep.d.mts","default":"./dist/engine/DurableStep.mjs"},"./event-source":{"types":"./dist/durable/EventSource.d.mts","default":"./dist/durable/EventSource.mjs"},"./failure-diagnostic":{"types":"./dist/core/FailureDiagnostic.d.mts","default":"./dist/core/FailureDiagnostic.mjs"},"./git-hub-workflow-source":{"types":"./dist/durable/GitHubWorkflowSource.d.mts","default":"./dist/durable/GitHubWorkflowSource.mjs"},"./id-generator":{"types":"./dist/core/IdGenerator.d.mts","default":"./dist/core/IdGenerator.mjs"},"./identifiers":{"types":"./dist/core/Identifiers.d.mts","default":"./dist/core/Identifiers.mjs"},"./in-memory":{"types":"./dist/InMemory.d.mts","default":"./dist/InMemory.mjs"},"./interactive-browser":{"types":"./dist/sandbox/InteractiveBrowser.d.mts","default":"./dist/sandbox/InteractiveBrowser.mjs"},"./mcp":{"types":"./dist/capabilities/Mcp.d.mts","default":"./dist/capabilities/Mcp.mjs"},"./mcp-client":{"types":"./dist/capabilities/McpClient.d.mts","default":"./dist/capabilities/McpClient.mjs"},"./memory":{"types":"./dist/core/Memory.d.mts","default":"./dist/core/Memory.mjs"},"./memory-namespace":{"types":"./dist/core/MemoryNamespace.d.mts","default":"./dist/core/MemoryNamespace.mjs"},"./memory-notes":{"types":"./dist/capabilities/MemoryNotes.d.mts","default":"./dist/capabilities/MemoryNotes.mjs"},"./memory-reference":{"types":"./dist/core/MemoryReference.d.mts","default":"./dist/core/MemoryReference.mjs"},"./memory-revalidation":{"types":"./dist/core/MemoryRevalidation.d.mts","default":"./dist/core/MemoryRevalidation.mjs"},"./memory-store":{"types":"./dist/core/MemoryStore.d.mts","default":"./dist/core/MemoryStore.mjs"},"./message-delivery":{"types":"./dist/durable/MessageDelivery.d.mts","default":"./dist/durable/MessageDelivery.mjs"},"./messaging":{"types":"./dist/capabilities/Messaging.d.mts","default":"./dist/capabilities/Messaging.mjs"},"./messaging-host":{"types":"./dist/engine/MessagingHost.d.mts","default":"./dist/engine/MessagingHost.mjs"},"./model-context":{"types":"./dist/capabilities/ModelContext.d.mts","default":"./dist/capabilities/ModelContext.mjs"},"./operation-authorizer":{"types":"./dist/durable/OperationAuthorizer.d.mts","default":"./dist/durable/OperationAuthorizer.mjs"},"./output":{"types":"./dist/engine/Output.d.mts","default":"./dist/engine/Output.mjs"},"./page-capture":{"types":"./dist/sandbox/PageCapture.d.mts","default":"./dist/sandbox/PageCapture.mjs"},"./page-crawl":{"types":"./dist/sandbox/PageCrawl.d.mts","default":"./dist/sandbox/PageCrawl.mjs"},"./page-screenshot":{"types":"./dist/sandbox/PageScreenshot.d.mts","default":"./dist/sandbox/PageScreenshot.mjs"},"./persistent-history":{"types":"./dist/durable/PersistentHistory.d.mts","default":"./dist/durable/PersistentHistory.mjs"},"./prepared-input-admission":{"types":"./dist/durable/PreparedInputAdmission.d.mts","default":"./dist/durable/PreparedInputAdmission.mjs"},"./receipt":{"types":"./dist/core/Receipt.d.mts","default":"./dist/core/Receipt.mjs"},"./records":{"types":"./dist/durable/Records.d.mts","default":"./dist/durable/Records.mjs"},"./recovery":{"types":"./dist/durable/Recovery.d.mts","default":"./dist/durable/Recovery.mjs"},"./redaction":{"types":"./dist/capabilities/Redaction.d.mts","default":"./dist/capabilities/Redaction.mjs"},"./remembering":{"types":"./dist/capabilities/Remembering.d.mts","default":"./dist/capabilities/Remembering.mjs"},"./remembering-store":{"types":"./dist/core/RememberingStore.d.mts","default":"./dist/core/RememberingStore.mjs"},"./run-event":{"types":"./dist/core/RunEvent.d.mts","default":"./dist/core/RunEvent.mjs"},"./run-event-sink":{"types":"./dist/engine/RunEventSink.d.mts","default":"./dist/engine/RunEventSink.mjs"},"./run-hooks":{"types":"./dist/capabilities/RunHooks.d.mts","default":"./dist/capabilities/RunHooks.mjs"},"./run-journal":{"types":"./dist/durable/RunJournal.d.mts","default":"./dist/durable/RunJournal.mjs"},"./run-options":{"types":"./dist/engine/RunOptions.d.mts","default":"./dist/engine/RunOptions.mjs"},"./run-policy-usage":{"types":"./dist/core/RunPolicyUsage.d.mts","default":"./dist/core/RunPolicyUsage.mjs"},"./sandbox":{"types":"./dist/sandbox/Sandbox.d.mts","default":"./dist/sandbox/Sandbox.mjs"},"./schedule":{"types":"./dist/durable/Schedule.d.mts","default":"./dist/durable/Schedule.mjs"},"./schedule-transition":{"types":"./dist/durable/ScheduleTransition.d.mts","default":"./dist/durable/ScheduleTransition.mjs"},"./scheduling":{"types":"./dist/durable/Scheduling.d.mts","default":"./dist/durable/Scheduling.mjs"},"./semantic-memory":{"types":"./dist/capabilities/SemanticMemory.d.mts","default":"./dist/capabilities/SemanticMemory.mjs"},"./semantic-memory-index":{"types":"./dist/core/SemanticMemoryIndex.d.mts","default":"./dist/core/SemanticMemoryIndex.mjs"},"./semantic-memory-revalidation":{"types":"./dist/core/SemanticMemoryRevalidation.d.mts","default":"./dist/core/SemanticMemoryRevalidation.mjs"},"./sql-memory-store":{"types":"./dist/durable/SqlMemoryStore.d.mts","default":"./dist/durable/SqlMemoryStore.mjs"},"./subagent":{"types":"./dist/capabilities/Subagent.d.mts","default":"./dist/capabilities/Subagent.mjs"},"./subagent-contract":{"types":"./dist/core/SubagentContract.d.mts","default":"./dist/core/SubagentContract.mjs"},"./subagent-host":{"types":"./dist/engine/SubagentHost.d.mts","default":"./dist/engine/SubagentHost.mjs"},"./subagent-reservations":{"types":"./dist/capabilities/SubagentReservations.d.mts","default":"./dist/capabilities/SubagentReservations.mjs"},"./submission-ledger":{"types":"./dist/durable/SubmissionLedger.d.mts","default":"./dist/durable/SubmissionLedger.mjs"},"./submission-status":{"types":"./dist/durable/SubmissionStatus.d.mts","default":"./dist/durable/SubmissionStatus.mjs"},"./subscription":{"types":"./dist/durable/Subscription.d.mts","default":"./dist/durable/Subscription.mjs"},"./subscription-input":{"types":"./dist/durable/SubscriptionInput.d.mts","default":"./dist/durable/SubscriptionInput.mjs"},"./subscription-tools":{"types":"./dist/durable/SubscriptionTools.d.mts","default":"./dist/durable/SubscriptionTools.mjs"},"./subscription-transition":{"types":"./dist/durable/SubscriptionTransition.d.mts","default":"./dist/durable/SubscriptionTransition.mjs"},"./subscriptions":{"types":"./dist/durable/Subscriptions.d.mts","default":"./dist/durable/Subscriptions.mjs"},"./testing/certification":{"types":"./dist/durable/Certification.d.mts","default":"./dist/durable/Certification.mjs"},"./testing/durable-failpoint-test-control":{"types":"./dist/durable/DurableFailpointTestControl.d.mts","default":"./dist/durable/DurableFailpointTestControl.mjs"},"./testing/message-delivery-store-conformance":{"types":"./dist/durable/MessageDeliveryStoreConformance.d.mts","default":"./dist/durable/MessageDeliveryStoreConformance.mjs"},"./testing/schedule-store-conformance":{"types":"./dist/durable/ScheduleStoreConformance.d.mts","default":"./dist/durable/ScheduleStoreConformance.mjs"},"./testing/submission-ledger-conformance":{"types":"./dist/durable/SubmissionLedgerConformance.d.mts","default":"./dist/durable/SubmissionLedgerConformance.mjs"},"./testing/subscription-store-conformance":{"types":"./dist/durable/SubscriptionStoreConformance.d.mts","default":"./dist/durable/SubscriptionStoreConformance.mjs"},"./testing/thread-store-conformance":{"types":"./dist/durable/ThreadStoreConformance.d.mts","default":"./dist/durable/ThreadStoreConformance.mjs"},"./thread":{"types":"./dist/core/Thread.d.mts","default":"./dist/core/Thread.mjs"},"./thread-context-history":{"types":"./dist/durable/ThreadContextHistory.d.mts","default":"./dist/durable/ThreadContextHistory.mjs"},"./thread-context-history-projection":{"types":"./dist/durable/ThreadContextHistoryProjection.d.mts","default":"./dist/durable/ThreadContextHistoryProjection.mjs"},"./thread-history":{"types":"./dist/engine/ThreadHistory.d.mts","default":"./dist/engine/ThreadHistory.mjs"},"./thread-invariants":{"types":"./dist/durable/ThreadInvariants.d.mts","default":"./dist/durable/ThreadInvariants.mjs"},"./thread-projection":{"types":"./dist/durable/ThreadProjection.d.mts","default":"./dist/durable/ThreadProjection.mjs"},"./thread-projection-maintenance":{"types":"./dist/durable/ThreadProjectionMaintenance.d.mts","default":"./dist/durable/ThreadProjectionMaintenance.mjs"},"./thread-store":{"types":"./dist/durable/ThreadStore.d.mts","default":"./dist/durable/ThreadStore.mjs"},"./tool-broker":{"types":"./dist/engine/ToolBroker.d.mts","default":"./dist/engine/ToolBroker.mjs"},"./tool-discovery":{"types":"./dist/capabilities/ToolDiscovery.d.mts","default":"./dist/capabilities/ToolDiscovery.mjs"},"./tool-exposure":{"types":"./dist/ToolExposure.d.mts","default":"./dist/ToolExposure.mjs"},"./tool-reconciler":{"types":"./dist/durable/ToolReconciler.d.mts","default":"./dist/durable/ToolReconciler.mjs"},"./tool-result":{"types":"./dist/core/ToolResult.d.mts","default":"./dist/core/ToolResult.mjs"},"./usage":{"types":"./dist/core/Usage.d.mts","default":"./dist/core/Usage.mjs"},"./wake-scheduler":{"types":"./dist/durable/WakeScheduler.d.mts","default":"./dist/durable/WakeScheduler.mjs"},"./web-capture":{"types":"./dist/capabilities/WebCapture.d.mts","default":"./dist/capabilities/WebCapture.mjs"},"./web-search":{"types":"./dist/capabilities/WebSearch.d.mts","default":"./dist/capabilities/WebSearch.mjs"},"./worker":{"types":"./dist/core/Worker.d.mts","default":"./dist/core/Worker.mjs"},"./worker-admission":{"types":"./dist/durable/WorkerAdmission.d.mts","default":"./dist/durable/WorkerAdmission.mjs"},"./worker-host":{"types":"./dist/durable/WorkerHost.d.mts","default":"./dist/durable/WorkerHost.mjs"},"./lifecycle-publication":{"types":"./dist/durable/LifecyclePublication.d.mts","default":"./dist/durable/LifecyclePublication.mjs"}},"description":"Effect-native agents, execution, subagents, and sandbox contracts in one tree-shakeable package.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/effect-agent"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests"}}
1
+ {"name":"effect-agent","version":"0.1.0-beta.162","devDependencies":{"@effect/platform-node":"4.0.0-rc.117","@effect/vitest":"4.0.0-rc.117","effect":"4.0.0-rc.117","typescript":"7.0.2","vite-plus":"0.3.3"},"peerDependencies":{"effect":"^4.0.0-rc.117"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./activity-store":{"types":"./dist/durable/ActivityStore.d.mts","default":"./dist/durable/ActivityStore.mjs"},"./admin":{"types":"./dist/durable/Admin.d.mts","default":"./dist/durable/Admin.mjs"},"./agent":{"types":"./dist/core/Agent.d.mts","default":"./dist/core/Agent.mjs"},"./agent-error":{"types":"./dist/core/AgentError.d.mts","default":"./dist/core/AgentError.mjs"},"./agent-policy":{"types":"./dist/core/AgentPolicy.d.mts","default":"./dist/core/AgentPolicy.mjs"},"./agent-registration":{"types":"./dist/durable/AgentRegistration.d.mts","default":"./dist/durable/AgentRegistration.mjs"},"./agent-runtime":{"types":"./dist/engine/AgentRuntime.d.mts","default":"./dist/engine/AgentRuntime.mjs"},"./agent-updates":{"types":"./dist/core/AgentUpdates.d.mts","default":"./dist/core/AgentUpdates.mjs"},"./approval":{"types":"./dist/capabilities/Approval.d.mts","default":"./dist/capabilities/Approval.mjs"},"./browser-use":{"types":"./dist/capabilities/BrowserUse.d.mts","default":"./dist/capabilities/BrowserUse.mjs"},"./budget":{"types":"./dist/capabilities/Budget.d.mts","default":"./dist/capabilities/Budget.mjs"},"./code-executor":{"types":"./dist/sandbox/CodeExecutor.d.mts","default":"./dist/sandbox/CodeExecutor.mjs"},"./code-mode":{"types":"./dist/capabilities/CodeMode.d.mts","default":"./dist/capabilities/CodeMode.mjs"},"./commands":{"types":"./dist/capabilities/Commands.d.mts","default":"./dist/capabilities/Commands.mjs"},"./committed-activity":{"types":"./dist/durable/CommittedActivity.d.mts","default":"./dist/durable/CommittedActivity.mjs"},"./compaction":{"types":"./dist/engine/Compaction.d.mts","default":"./dist/engine/Compaction.mjs"},"./context-compactor":{"types":"./dist/engine/ContextCompactor.d.mts","default":"./dist/engine/ContextCompactor.mjs"},"./context-history":{"types":"./dist/engine/ContextHistory.d.mts","default":"./dist/engine/ContextHistory.mjs"},"./context-tools":{"types":"./dist/capabilities/ContextTools.d.mts","default":"./dist/capabilities/ContextTools.mjs"},"./context-window":{"types":"./dist/engine/ContextWindow.d.mts","default":"./dist/engine/ContextWindow.mjs"},"./digest":{"types":"./dist/durable/Digest.d.mts","default":"./dist/durable/Digest.mjs"},"./durable-agent-runtime":{"types":"./dist/durable/DurableAgentRuntime.d.mts","default":"./dist/durable/DurableAgentRuntime.mjs"},"./durable-failpoint":{"types":"./dist/durable/DurableFailpoint.d.mts","default":"./dist/durable/DurableFailpoint.mjs"},"./durable-step":{"types":"./dist/engine/DurableStep.d.mts","default":"./dist/engine/DurableStep.mjs"},"./event-source":{"types":"./dist/durable/EventSource.d.mts","default":"./dist/durable/EventSource.mjs"},"./failure-diagnostic":{"types":"./dist/core/FailureDiagnostic.d.mts","default":"./dist/core/FailureDiagnostic.mjs"},"./git-hub-workflow-source":{"types":"./dist/durable/GitHubWorkflowSource.d.mts","default":"./dist/durable/GitHubWorkflowSource.mjs"},"./id-generator":{"types":"./dist/core/IdGenerator.d.mts","default":"./dist/core/IdGenerator.mjs"},"./identifiers":{"types":"./dist/core/Identifiers.d.mts","default":"./dist/core/Identifiers.mjs"},"./in-memory":{"types":"./dist/InMemory.d.mts","default":"./dist/InMemory.mjs"},"./interactive-browser":{"types":"./dist/sandbox/InteractiveBrowser.d.mts","default":"./dist/sandbox/InteractiveBrowser.mjs"},"./mcp":{"types":"./dist/capabilities/Mcp.d.mts","default":"./dist/capabilities/Mcp.mjs"},"./mcp-client":{"types":"./dist/capabilities/McpClient.d.mts","default":"./dist/capabilities/McpClient.mjs"},"./memory":{"types":"./dist/core/Memory.d.mts","default":"./dist/core/Memory.mjs"},"./memory-namespace":{"types":"./dist/core/MemoryNamespace.d.mts","default":"./dist/core/MemoryNamespace.mjs"},"./memory-notes":{"types":"./dist/capabilities/MemoryNotes.d.mts","default":"./dist/capabilities/MemoryNotes.mjs"},"./memory-reference":{"types":"./dist/core/MemoryReference.d.mts","default":"./dist/core/MemoryReference.mjs"},"./memory-revalidation":{"types":"./dist/core/MemoryRevalidation.d.mts","default":"./dist/core/MemoryRevalidation.mjs"},"./memory-store":{"types":"./dist/core/MemoryStore.d.mts","default":"./dist/core/MemoryStore.mjs"},"./message-delivery":{"types":"./dist/durable/MessageDelivery.d.mts","default":"./dist/durable/MessageDelivery.mjs"},"./messaging":{"types":"./dist/capabilities/Messaging.d.mts","default":"./dist/capabilities/Messaging.mjs"},"./messaging-host":{"types":"./dist/engine/MessagingHost.d.mts","default":"./dist/engine/MessagingHost.mjs"},"./model-context":{"types":"./dist/capabilities/ModelContext.d.mts","default":"./dist/capabilities/ModelContext.mjs"},"./operation-authorizer":{"types":"./dist/durable/OperationAuthorizer.d.mts","default":"./dist/durable/OperationAuthorizer.mjs"},"./output":{"types":"./dist/engine/Output.d.mts","default":"./dist/engine/Output.mjs"},"./page-capture":{"types":"./dist/sandbox/PageCapture.d.mts","default":"./dist/sandbox/PageCapture.mjs"},"./page-crawl":{"types":"./dist/sandbox/PageCrawl.d.mts","default":"./dist/sandbox/PageCrawl.mjs"},"./page-screenshot":{"types":"./dist/sandbox/PageScreenshot.d.mts","default":"./dist/sandbox/PageScreenshot.mjs"},"./persistent-history":{"types":"./dist/durable/PersistentHistory.d.mts","default":"./dist/durable/PersistentHistory.mjs"},"./prepared-input-admission":{"types":"./dist/durable/PreparedInputAdmission.d.mts","default":"./dist/durable/PreparedInputAdmission.mjs"},"./receipt":{"types":"./dist/core/Receipt.d.mts","default":"./dist/core/Receipt.mjs"},"./records":{"types":"./dist/durable/Records.d.mts","default":"./dist/durable/Records.mjs"},"./recovery":{"types":"./dist/durable/Recovery.d.mts","default":"./dist/durable/Recovery.mjs"},"./redaction":{"types":"./dist/capabilities/Redaction.d.mts","default":"./dist/capabilities/Redaction.mjs"},"./remembering":{"types":"./dist/capabilities/Remembering.d.mts","default":"./dist/capabilities/Remembering.mjs"},"./remembering-store":{"types":"./dist/core/RememberingStore.d.mts","default":"./dist/core/RememberingStore.mjs"},"./run-event":{"types":"./dist/core/RunEvent.d.mts","default":"./dist/core/RunEvent.mjs"},"./run-event-sink":{"types":"./dist/engine/RunEventSink.d.mts","default":"./dist/engine/RunEventSink.mjs"},"./run-hooks":{"types":"./dist/capabilities/RunHooks.d.mts","default":"./dist/capabilities/RunHooks.mjs"},"./run-journal":{"types":"./dist/durable/RunJournal.d.mts","default":"./dist/durable/RunJournal.mjs"},"./run-options":{"types":"./dist/engine/RunOptions.d.mts","default":"./dist/engine/RunOptions.mjs"},"./run-policy-usage":{"types":"./dist/core/RunPolicyUsage.d.mts","default":"./dist/core/RunPolicyUsage.mjs"},"./sandbox":{"types":"./dist/sandbox/Sandbox.d.mts","default":"./dist/sandbox/Sandbox.mjs"},"./schedule":{"types":"./dist/durable/Schedule.d.mts","default":"./dist/durable/Schedule.mjs"},"./schedule-transition":{"types":"./dist/durable/ScheduleTransition.d.mts","default":"./dist/durable/ScheduleTransition.mjs"},"./scheduling":{"types":"./dist/durable/Scheduling.d.mts","default":"./dist/durable/Scheduling.mjs"},"./semantic-memory":{"types":"./dist/capabilities/SemanticMemory.d.mts","default":"./dist/capabilities/SemanticMemory.mjs"},"./semantic-memory-index":{"types":"./dist/core/SemanticMemoryIndex.d.mts","default":"./dist/core/SemanticMemoryIndex.mjs"},"./semantic-memory-revalidation":{"types":"./dist/core/SemanticMemoryRevalidation.d.mts","default":"./dist/core/SemanticMemoryRevalidation.mjs"},"./sql-memory-store":{"types":"./dist/durable/SqlMemoryStore.d.mts","default":"./dist/durable/SqlMemoryStore.mjs"},"./subagent":{"types":"./dist/capabilities/Subagent.d.mts","default":"./dist/capabilities/Subagent.mjs"},"./subagent-contract":{"types":"./dist/core/SubagentContract.d.mts","default":"./dist/core/SubagentContract.mjs"},"./subagent-host":{"types":"./dist/engine/SubagentHost.d.mts","default":"./dist/engine/SubagentHost.mjs"},"./subagent-reservations":{"types":"./dist/capabilities/SubagentReservations.d.mts","default":"./dist/capabilities/SubagentReservations.mjs"},"./submission-ledger":{"types":"./dist/durable/SubmissionLedger.d.mts","default":"./dist/durable/SubmissionLedger.mjs"},"./submission-status":{"types":"./dist/durable/SubmissionStatus.d.mts","default":"./dist/durable/SubmissionStatus.mjs"},"./subscription":{"types":"./dist/durable/Subscription.d.mts","default":"./dist/durable/Subscription.mjs"},"./subscription-input":{"types":"./dist/durable/SubscriptionInput.d.mts","default":"./dist/durable/SubscriptionInput.mjs"},"./subscription-tools":{"types":"./dist/durable/SubscriptionTools.d.mts","default":"./dist/durable/SubscriptionTools.mjs"},"./subscription-transition":{"types":"./dist/durable/SubscriptionTransition.d.mts","default":"./dist/durable/SubscriptionTransition.mjs"},"./subscriptions":{"types":"./dist/durable/Subscriptions.d.mts","default":"./dist/durable/Subscriptions.mjs"},"./testing/certification":{"types":"./dist/durable/Certification.d.mts","default":"./dist/durable/Certification.mjs"},"./testing/durable-failpoint-test-control":{"types":"./dist/durable/DurableFailpointTestControl.d.mts","default":"./dist/durable/DurableFailpointTestControl.mjs"},"./testing/message-delivery-store-conformance":{"types":"./dist/durable/MessageDeliveryStoreConformance.d.mts","default":"./dist/durable/MessageDeliveryStoreConformance.mjs"},"./testing/schedule-store-conformance":{"types":"./dist/durable/ScheduleStoreConformance.d.mts","default":"./dist/durable/ScheduleStoreConformance.mjs"},"./testing/submission-ledger-conformance":{"types":"./dist/durable/SubmissionLedgerConformance.d.mts","default":"./dist/durable/SubmissionLedgerConformance.mjs"},"./testing/subscription-store-conformance":{"types":"./dist/durable/SubscriptionStoreConformance.d.mts","default":"./dist/durable/SubscriptionStoreConformance.mjs"},"./testing/thread-store-conformance":{"types":"./dist/durable/ThreadStoreConformance.d.mts","default":"./dist/durable/ThreadStoreConformance.mjs"},"./thread":{"types":"./dist/core/Thread.d.mts","default":"./dist/core/Thread.mjs"},"./thread-context-history":{"types":"./dist/durable/ThreadContextHistory.d.mts","default":"./dist/durable/ThreadContextHistory.mjs"},"./thread-context-history-projection":{"types":"./dist/durable/ThreadContextHistoryProjection.d.mts","default":"./dist/durable/ThreadContextHistoryProjection.mjs"},"./thread-history":{"types":"./dist/engine/ThreadHistory.d.mts","default":"./dist/engine/ThreadHistory.mjs"},"./thread-invariants":{"types":"./dist/durable/ThreadInvariants.d.mts","default":"./dist/durable/ThreadInvariants.mjs"},"./thread-projection":{"types":"./dist/durable/ThreadProjection.d.mts","default":"./dist/durable/ThreadProjection.mjs"},"./thread-projection-maintenance":{"types":"./dist/durable/ThreadProjectionMaintenance.d.mts","default":"./dist/durable/ThreadProjectionMaintenance.mjs"},"./thread-store":{"types":"./dist/durable/ThreadStore.d.mts","default":"./dist/durable/ThreadStore.mjs"},"./tool-broker":{"types":"./dist/engine/ToolBroker.d.mts","default":"./dist/engine/ToolBroker.mjs"},"./tool-discovery":{"types":"./dist/capabilities/ToolDiscovery.d.mts","default":"./dist/capabilities/ToolDiscovery.mjs"},"./tool-exposure":{"types":"./dist/ToolExposure.d.mts","default":"./dist/ToolExposure.mjs"},"./tool-reconciler":{"types":"./dist/durable/ToolReconciler.d.mts","default":"./dist/durable/ToolReconciler.mjs"},"./tool-result":{"types":"./dist/core/ToolResult.d.mts","default":"./dist/core/ToolResult.mjs"},"./usage":{"types":"./dist/core/Usage.d.mts","default":"./dist/core/Usage.mjs"},"./wake-scheduler":{"types":"./dist/durable/WakeScheduler.d.mts","default":"./dist/durable/WakeScheduler.mjs"},"./web-capture":{"types":"./dist/capabilities/WebCapture.d.mts","default":"./dist/capabilities/WebCapture.mjs"},"./web-search":{"types":"./dist/capabilities/WebSearch.d.mts","default":"./dist/capabilities/WebSearch.mjs"},"./worker":{"types":"./dist/core/Worker.d.mts","default":"./dist/core/Worker.mjs"},"./worker-admission":{"types":"./dist/durable/WorkerAdmission.d.mts","default":"./dist/durable/WorkerAdmission.mjs"},"./worker-host":{"types":"./dist/durable/WorkerHost.d.mts","default":"./dist/durable/WorkerHost.mjs"},"./lifecycle-publication":{"types":"./dist/durable/LifecyclePublication.d.mts","default":"./dist/durable/LifecyclePublication.mjs"}},"description":"Effect-native agents, execution, subagents, and sandbox contracts in one tree-shakeable package.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/effect-agent"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json","test":"vp test --passWithNoTests"}}
@@ -1670,7 +1670,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1670
1670
  submissionId: SubmissionId,
1671
1671
  ): boolean => {
1672
1672
  const runId = runIdForSubmission(submissionId);
1673
- const certificate = makeThreadContextCertificate();
1673
+ const certificate = makeThreadContextCertificate(runId.length);
1674
1674
 
1675
1675
  for (const entry of records) {
1676
1676
  const { payload, recordId } = entry.record;
@@ -1727,7 +1727,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1727
1727
  if (
1728
1728
  state.context !== undefined &&
1729
1729
  submissionId !== undefined &&
1730
- !submissionId.includes(":") &&
1730
+ submissionId.length === state.submissionId.length &&
1731
1731
  (journalOwner === undefined || journalOwner === runIdForSubmission(submissionId))
1732
1732
  ) {
1733
1733
  const runId = runIdForSubmission(submissionId);
@@ -1804,33 +1804,33 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1804
1804
  return { canonical: Stream.fromIterable([...state.records, ...suffix]), seed: state.seed };
1805
1805
  });
1806
1806
 
1807
+ const encodeRecoveryCheckpoint = Effect.fnUntraced(function* (
1808
+ state: RecoveryCheckpointState,
1809
+ ): Effect.fn.Return<Option.Option<PersistedJson>, DurableWorkerFailure> {
1810
+ const encoded = yield* Schema.encodeEffect(RecoveryCheckpointState)(state).pipe(Effect.option);
1811
+
1812
+ if (Option.isNone(encoded)) return Option.none();
1813
+ const digest = yield* withCrypto(digestJson(encoded.value));
1814
+
1815
+ // Serialization removes shared in-memory references before applying persisted JSON bounds.
1816
+ return yield* Schema.encodeEffect(Schema.fromJsonString(RecoveryCheckpointContents))(
1817
+ RecoveryCheckpointContents.make({ state, digest }),
1818
+ ).pipe(
1819
+ Effect.flatMap(Schema.decodeUnknownEffect(Schema.fromJsonString(PersistedJson))),
1820
+ Effect.option,
1821
+ );
1822
+ });
1823
+
1807
1824
  const persistRecoveryCheckpoint = Effect.fn("DurableAgentRuntime.persistRecoveryCheckpoint")(
1808
1825
  function* (
1809
1826
  ctx: AttemptAppendContext,
1810
1827
  submission: SubmissionSnapshot,
1811
- state: RecoveryCheckpointState,
1828
+ contents: PersistedJson,
1812
1829
  tail: { readonly sequence: CanonicalSequence; readonly digest: Digest },
1813
1830
  createdAt: DateTime.Utc,
1814
1831
  ): Effect.fn.Return<void, DurableWorkerFailure> {
1815
1832
  if (store.recoveryCheckpoints === undefined) return;
1816
1833
 
1817
- const encoded = yield* Schema.encodeEffect(RecoveryCheckpointState)(state).pipe(
1818
- Effect.option,
1819
- );
1820
-
1821
- if (Option.isNone(encoded)) return;
1822
- const digest = yield* withCrypto(digestJson(encoded.value));
1823
-
1824
- // Serialization removes shared in-memory references before applying persisted JSON bounds.
1825
- const contents = yield* Schema.encodeEffect(
1826
- Schema.fromJsonString(RecoveryCheckpointContents),
1827
- )(RecoveryCheckpointContents.make({ state, digest })).pipe(
1828
- Effect.flatMap(Schema.decodeUnknownEffect(Schema.fromJsonString(PersistedJson))),
1829
- Effect.option,
1830
- );
1831
-
1832
- if (Option.isNone(contents)) return;
1833
-
1834
1834
  const checkpoint = ThreadCheckpoint.make({
1835
1835
  schemaVersion: 1,
1836
1836
  threadId: ctx.threadId,
@@ -1840,7 +1840,7 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1840
1840
  agentDefinitionDigest: submission.agentDigests.agent,
1841
1841
  modelDigest: submission.agentDigests.model,
1842
1842
  toolDigest: submission.agentDigests.tools,
1843
- state: contents.value,
1843
+ state: contents,
1844
1844
  createdAt,
1845
1845
  });
1846
1846
 
@@ -1890,7 +1890,11 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1890
1890
 
1891
1891
  if (projection === undefined) {
1892
1892
  const source = canonicalRange(ctx.threadId, tail.sequence);
1893
- const certificate = makeThreadContextCertificate();
1893
+
1894
+ const certificate = makeThreadContextCertificate(
1895
+ runIdForSubmission(submission.submissionId).length,
1896
+ );
1897
+
1894
1898
  const metadata = makeJournalMetadata(undefined);
1895
1899
  const retained: Array<CanonicalRecordEnvelope> = [];
1896
1900
 
@@ -1920,9 +1924,23 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1920
1924
  );
1921
1925
 
1922
1926
  if (Option.isNone(prompt)) return;
1923
- let seed: JournalCheckpointSeed | undefined;
1924
- let records = identities;
1925
- let submissionIds: ReadonlyArray<SubmissionId> = [submission.submissionId];
1927
+
1928
+ const contextState = RecoveryCheckpointState.make({
1929
+ schemaVersion: 2,
1930
+ policyAccountingVersion: 1,
1931
+ submissionId: submission.submissionId,
1932
+ submissionIds: [submission.submissionId],
1933
+ context: ThreadContextCheckpoint.make({
1934
+ throughSequence: tail.sequence,
1935
+ prompt: prompt.value,
1936
+ ...(projection.contextWindowId === undefined
1937
+ ? {}
1938
+ : { contextWindowId: projection.contextWindowId }),
1939
+ }),
1940
+ records: identities,
1941
+ });
1942
+
1943
+ let state = contextState;
1926
1944
 
1927
1945
  if (
1928
1946
  previous.state.submissionId === submission.submissionId &&
@@ -1934,33 +1952,24 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
1934
1952
  );
1935
1953
 
1936
1954
  if (checkpointSuffixCompatible(previous.state.seed, suffix, previous.state.records)) {
1937
- seed = previous.state.seed;
1938
- records = [...previous.state.records, ...suffix];
1939
- submissionIds = previous.state.submissionIds;
1955
+ state = RecoveryCheckpointState.make({
1956
+ ...contextState,
1957
+ seed: previous.state.seed,
1958
+ records: [...previous.state.records, ...suffix],
1959
+ submissionIds: previous.state.submissionIds,
1960
+ });
1940
1961
  }
1941
1962
  }
1942
1963
 
1943
- yield* persistRecoveryCheckpoint(
1944
- ctx,
1945
- submission,
1946
- RecoveryCheckpointState.make({
1947
- schemaVersion: 2,
1948
- policyAccountingVersion: 1,
1949
- submissionId: submission.submissionId,
1950
- submissionIds,
1951
- ...(seed === undefined ? {} : { seed }),
1952
- context: ThreadContextCheckpoint.make({
1953
- throughSequence: tail.sequence,
1954
- prompt: prompt.value,
1955
- ...(projection.contextWindowId === undefined
1956
- ? {}
1957
- : { contextWindowId: projection.contextWindowId }),
1958
- }),
1959
- records,
1960
- }),
1961
- tail,
1962
- yield* DateTime.now,
1963
- );
1964
+ let contents = yield* encodeRecoveryCheckpoint(state);
1965
+
1966
+ // Prefer retaining same-Run recovery, but keep eligible Thread context when the combined
1967
+ // cache exceeds bounds. That Run can still recover from its unchanged canonical history.
1968
+ if (Option.isNone(contents) && state.seed !== undefined)
1969
+ contents = yield* encodeRecoveryCheckpoint(contextState);
1970
+ if (Option.isNone(contents)) return;
1971
+
1972
+ yield* persistRecoveryCheckpoint(ctx, submission, contents.value, tail, yield* DateTime.now);
1964
1973
  });
1965
1974
 
1966
1975
  const readAllTolerant = Effect.fn("DurableAgentRuntime.readAllTolerant")(
@@ -5183,10 +5192,14 @@ const make = Effect.fn("DurableAgentRuntime.make")(function* (
5183
5192
  )
5184
5193
  return;
5185
5194
 
5195
+ const contents = yield* encodeRecoveryCheckpoint(validated.value);
5196
+
5197
+ if (Option.isNone(contents)) return;
5198
+
5186
5199
  yield* persistRecoveryCheckpoint(
5187
5200
  ctx,
5188
5201
  submission,
5189
- validated.value,
5202
+ contents.value,
5190
5203
  tail,
5191
5204
  replacement.record.createdAt,
5192
5205
  );
@@ -158,6 +158,14 @@ export interface LifecyclePublicationStorage {
158
158
  readonly acknowledge: (
159
159
  publications: LifecyclePublicationBatch,
160
160
  ) => Effect.Effect<void, LifecyclePublicationError>;
161
+ /** Optional atomic acknowledgement of up to 100 successfully published owner batches.
162
+ * Validate every exact batch before consuming any debt. Empty waves succeed without writes.
163
+ * Wrappers that validate acknowledgement authority must wrap this method too.
164
+ * Custom services may omit this; drains then acknowledge each batch immediately.
165
+ */
166
+ readonly acknowledgeMany?: (
167
+ batches: ReadonlyArray<LifecyclePublicationBatch>,
168
+ ) => Effect.Effect<void, LifecyclePublicationError>;
161
169
  /**
162
170
  * Claim a due owner batch and persist its retry before dispatch. Eight automatic attempts;
163
171
  * 1s exponential backoff capped at 60s, after the dispatch timeout. The final attempt parks
@@ -265,7 +273,9 @@ const withSource = Effect.fn("LifecyclePublication.withSource")(
265
273
  * One finite wave for the host's existing maintenance coordinator. Persist the next deadline
266
274
  * before dispatch, so interruption and process loss retain the same facts without another timer.
267
275
  * Finish independent owner batches before surfacing failures; interruption stops the wave.
268
- * Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.
276
+ * Acknowledgements are exact and idempotent. An optional storage wave acknowledgement commits
277
+ * completed batches in groups of up to 100, including when a later dispatch is interrupted. No producer or
278
+ * external Tool is re-executed here.
269
279
  */
270
280
  export const drainLifecyclePublications = Effect.fn("LifecyclePublication.drain")(function* (
271
281
  storage: LifecyclePublicationStorage,
@@ -275,37 +285,50 @@ export const drainLifecyclePublications = Effect.fn("LifecyclePublication.drain"
275
285
  ) {
276
286
  const handler = yield* LifecyclePublicationHandler;
277
287
  const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit, options);
278
-
288
+ const acknowledgeMany = storage.acknowledgeMany;
289
+ const published: Array<LifecyclePublicationBatch> = [];
279
290
  let failures: Cause.Cause<LifecyclePublicationError> = Cause.empty;
280
291
 
281
- for (const batch of pending) {
282
- yield* Effect.gen(function* () {
283
- if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;
284
- yield* Effect.scoped(
285
- Effect.gen(function* () {
286
- const publications = yield* Effect.forEach(batch, withSource);
292
+ return yield* Effect.gen(function* () {
293
+ for (const batch of pending) {
294
+ yield* Effect.gen(function* () {
295
+ if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;
296
+ yield* Effect.scoped(
297
+ Effect.gen(function* () {
298
+ const publications = yield* Effect.forEach(batch, withSource);
287
299
 
288
- yield* handler.publish(publications);
289
- }),
290
- ).pipe(
291
- Effect.timeoutOrElse({
292
- duration: timeoutMillis,
293
- orElse: () => LifecyclePublicationError.make({ reason: "unavailable" }),
294
- }),
295
- );
296
- yield* storage.acknowledge(batch);
297
- }).pipe(
298
- Effect.catchCauseIf(
299
- (cause) => !Cause.hasInterrupts(cause),
300
- (cause) => {
301
- failures = Cause.combine(failures, cause);
300
+ yield* handler.publish(publications);
301
+ }),
302
+ ).pipe(
303
+ Effect.timeoutOrElse({
304
+ duration: timeoutMillis,
305
+ orElse: () => LifecyclePublicationError.make({ reason: "unavailable" }),
306
+ }),
307
+ );
308
+ if (acknowledgeMany === undefined) yield* storage.acknowledge(batch);
309
+ else published.push(batch);
310
+ }).pipe(
311
+ Effect.catchCauseIf(
312
+ (cause) => !Cause.hasInterrupts(cause),
313
+ (cause) => {
314
+ failures = Cause.combine(failures, cause);
302
315
 
303
- return Effect.void;
304
- },
305
- ),
306
- );
307
- }
308
- if (failures.reasons.length > 0) return yield* Effect.failCause(failures);
316
+ return Effect.void;
317
+ },
318
+ ),
319
+ );
320
+ }
321
+ if (failures.reasons.length > 0) return yield* Effect.failCause(failures);
309
322
 
310
- return pending.length;
323
+ return pending.length;
324
+ }).pipe(
325
+ Effect.onExit(() =>
326
+ acknowledgeMany === undefined || published.length === 0
327
+ ? Effect.void
328
+ : Effect.gen(function* () {
329
+ for (let offset = 0; offset < published.length; offset += 100)
330
+ yield* acknowledgeMany(published.slice(offset, offset + 100));
331
+ }),
332
+ ),
333
+ );
311
334
  });
@@ -66,16 +66,17 @@ export class RecoveryCheckpointContents extends Schema.Class<RecoveryCheckpointC
66
66
  digest: Digest,
67
67
  }) {}
68
68
 
69
- export const RECOVERY_ENGINE_VERSION = "effect-agent/recovery@3";
69
+ export const RECOVERY_ENGINE_VERSION = "effect-agent/recovery@4";
70
70
 
71
71
  /**
72
72
  * Prove that indexed original-input absence also means absent prefix Run/control evidence.
73
- * Only cache consumers with colon-free Submission IDs use this certificate. For those IDs,
74
- * every possible control marker is exactly :run:<submission-id>:. Parsing here can only decline
75
- * caching; it never supplies an execution identity. Separator-bearing identities use full replay.
73
+ * A certificate covers only Run IDs with the given length. Every possible control marker for
74
+ * those IDs is exactly :<run-id>:, including markers nested inside opaque IDs. Cache consumers
75
+ * must have the checkpoint owner's ID length; shorter/longer aliases require full replay.
76
+ * Parsing here can only decline caching; it never supplies an execution identity.
76
77
  * The temporary anchor set is discarded after certification, not persisted with the context.
77
78
  */
78
- export const makeThreadContextCertificate = () => {
79
+ export const makeThreadContextCertificate = (runIdLength: number) => {
79
80
  const anchored = new Set<string>();
80
81
  let valid = true;
81
82
 
@@ -99,9 +100,9 @@ export const makeThreadContextCertificate = () => {
99
100
  start !== -1;
100
101
  start = record.recordId.indexOf(":run:", start + 1)
101
102
  ) {
102
- const end = record.recordId.indexOf(":", start + 5);
103
+ const end = start + 1 + runIdLength;
103
104
 
104
- if (end !== -1 && !anchored.has(record.recordId.slice(start + 1, end))) {
105
+ if (record.recordId[end] === ":" && !anchored.has(record.recordId.slice(start + 1, end))) {
105
106
  valid = false;
106
107
 
107
108
  return;