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

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.
@@ -1,4 +1,4 @@
1
1
  import { Receipt } from "../core/Receipt.mjs";
2
- import { a as DurableApprovalSuspension, c as RecoveryFailure, d as childReservationIdFor, f as isolateRecovery, i as DurableApprovalResolver, l as RecoveryReport, m as recoveryRepairRecordId, n as DurableAgentRuntime, o as DurableRuntimeConfig, p as recoveryRepairBatchId, s as RecoveryBlocked, t as ApprovalSuspensionError, u as RecoverySweepResult } from "../DurableAgentRuntime-pr7cCaZw.mjs";
2
+ import { a as DurableApprovalSuspension, c as RecoveryFailure, d as childReservationIdFor, f as isolateRecovery, i as DurableApprovalResolver, l as RecoveryReport, m as recoveryRepairRecordId, n as DurableAgentRuntime, o as DurableRuntimeConfig, p as recoveryRepairBatchId, s as RecoveryBlocked, t as ApprovalSuspensionError, u as RecoverySweepResult } from "../DurableAgentRuntime-BpB5rBcu.mjs";
3
3
  import { c as threadCreatedBatchId, l as threadCreatedRecordId } from "../WorkerAdmission-Cmcxd6nS.mjs";
4
4
  export { ApprovalSuspensionError, DurableAgentRuntime, DurableApprovalResolver, DurableApprovalSuspension, DurableRuntimeConfig, Receipt, RecoveryBlocked, RecoveryFailure, RecoveryReport, RecoverySweepResult, childReservationIdFor, isolateRecovery, recoveryRepairBatchId, recoveryRepairRecordId, threadCreatedBatchId, threadCreatedRecordId };
@@ -105,6 +105,25 @@ export declare const makeMessageDeliveryFixture: (messageId?: any, owner?: any,
105
105
  readonly reportKind?: "update" | undefined;
106
106
  } | undefined;
107
107
  readonly messageAdmission?: {
108
+ readonly schemaVersion: 1;
109
+ readonly message: {
110
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
111
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
112
+ };
113
+ readonly peerName: string;
114
+ readonly sender: {
115
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
116
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
117
+ };
118
+ readonly returnAddress: {
119
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
120
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
121
+ };
122
+ readonly inReplyTo?: {
123
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
124
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
125
+ } | undefined;
126
+ } | {
108
127
  readonly _tag: "WorkerCompletion";
109
128
  readonly budgetExhausted: boolean;
110
129
  readonly schemaVersion: 1;
@@ -145,25 +164,6 @@ export declare const makeMessageDeliveryFixture: (messageId?: any, owner?: any,
145
164
  readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
146
165
  };
147
166
  readonly update: Update;
148
- } | {
149
- readonly schemaVersion: 1;
150
- readonly message: {
151
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
152
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
153
- };
154
- readonly peerName: string;
155
- readonly sender: {
156
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
157
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
158
- };
159
- readonly returnAddress: {
160
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
161
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
162
- };
163
- readonly inReplyTo?: {
164
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
165
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
166
- } | undefined;
167
167
  } | undefined;
168
168
  };
169
169
  readonly envelopeDigest: string & import("effect/Brand").Brand<"@effect-agent/thread/Digest">;
@@ -288,6 +288,25 @@ export declare const makeWorkerUpdateDeliveryFixture: (id: string) => Effect.Eff
288
288
  readonly reportKind?: "update" | undefined;
289
289
  } | undefined;
290
290
  readonly messageAdmission?: {
291
+ readonly schemaVersion: 1;
292
+ readonly message: {
293
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
294
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
295
+ };
296
+ readonly peerName: string;
297
+ readonly sender: {
298
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
299
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
300
+ };
301
+ readonly returnAddress: {
302
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
303
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
304
+ };
305
+ readonly inReplyTo?: {
306
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
307
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
308
+ } | undefined;
309
+ } | {
291
310
  readonly _tag: "WorkerCompletion";
292
311
  readonly budgetExhausted: boolean;
293
312
  readonly schemaVersion: 1;
@@ -328,25 +347,6 @@ export declare const makeWorkerUpdateDeliveryFixture: (id: string) => Effect.Eff
328
347
  readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
329
348
  };
330
349
  readonly update: Update;
331
- } | {
332
- readonly schemaVersion: 1;
333
- readonly message: {
334
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
335
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
336
- };
337
- readonly peerName: string;
338
- readonly sender: {
339
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
340
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
341
- };
342
- readonly returnAddress: {
343
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
344
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
345
- };
346
- readonly inReplyTo?: {
347
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
348
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
349
- } | undefined;
350
350
  } | undefined;
351
351
  };
352
352
  readonly envelopeDigest: string & import("effect/Brand").Brand<"@effect-agent/thread/Digest">;
package/dist/index.mjs CHANGED
@@ -69,7 +69,7 @@ import { t as Recovery_exports } from "./durable/Recovery.mjs";
69
69
  import { t as Admin_exports } from "./durable/Admin.mjs";
70
70
  import { t as Digest_exports } from "./durable/Digest.mjs";
71
71
  import { t as AgentRegistration_exports } from "./durable/AgentRegistration.mjs";
72
- import { r as DurableAgentRuntime_exports } from "./DurableAgentRuntime-pr7cCaZw.mjs";
72
+ import { r as DurableAgentRuntime_exports } from "./DurableAgentRuntime-BpB5rBcu.mjs";
73
73
  import { n as RunJournal_exports } from "./RunJournal-CA2bsvHn.mjs";
74
74
  import { t as ThreadStore_exports } from "./durable/ThreadStore.mjs";
75
75
  import { t as CommittedActivity_exports } from "./durable/CommittedActivity.mjs";
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.161","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
  );
@@ -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;