@effect-agent/platform-cloudflare 0.1.0-beta.44 → 0.1.0-beta.45
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/index.d.mts +30 -30
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{prepared-admission-BKp_Upw2.mjs → prepared-admission-BhW2eT_a.mjs} +3 -3
- package/dist/prepared-admission-BhW2eT_a.mjs.map +1 -0
- package/dist/scheduling.mjs +1 -1
- package/dist/subscriptions.mjs +1 -1
- package/package.json +1 -1
- package/src/alarm.ts +259 -265
- package/src/layers.ts +3 -3
- package/dist/prepared-admission-BKp_Upw2.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject","#dispatch","EffectCfDurableObject"],"sources":["../src/wake-scheduler.ts","../src/progress-wait.ts","../src/transport.ts","../src/layers.ts","../src/thread-object.ts","../src/code-mode-executor.ts","../src/memory.ts"],"sourcesContent":["import type { ThreadId } from \"@effect-agent/core\";\nimport { makeWakeSubscriptionHub, WakeScheduler } from \"@effect-agent/thread\";\nimport { Effect, Layer, PubSub, Schema, Stream } from \"effect\";\n\nimport { DurableAlarmService } from \"./alarm.ts\";\nimport { ThreadObjectIdentity, ThreadObjectNamespace } from \"./bindings.ts\";\nimport { safeCauseMessage } from \"./boundary.ts\";\n\n/**\n * Bounded in-memory wake buffer for same-incarnation `awaitSettlement` subscribers. Wake\n * hints are droppable by contract (consumers pair every subscription with ledger polls), so\n * a full buffer slides out the oldest hint and an eviction simply loses the buffer — the\n * poll interval and the persisted alarm keep liveness (persistence §14).\n */\nconst WAKE_BUFFER_CAPACITY = 1_024;\n\n/** A remote wake stub call failed; always swallowed and logged (hints are droppable). */\nclass RemoteWakeDropped extends Schema.TaggedError<RemoteWakeDropped>()(\"RemoteWakeDropped\", {\n threadId: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n}) {}\n\n/**\n * The DC `WakeScheduler` (plan §1.4):\n *\n * - `notify(local)` → `setAlarm(now)` — durable, cheap, coalescing (the alarm slot keeps the\n * earliest deadline) — plus a same-incarnation PubSub hint for `awaitSettlement` waiters.\n * - `notify(remote)` → fire-and-forget `wake()` on the owning Object's stub with every error\n * swallowed and logged: hints are droppable, and the target's own alarm/scan pairing (the\n * maintenance pass re-polls unsettled children) guarantees liveness without this call.\n * - `wakes` → the bounded sliding PubSub only. No important state lives in memory: the\n * subscription accelerates waiters within one incarnation and the settlement poll interval\n * is the correctness path.\n */\nexport const cloudflareWakeSchedulerLayer: Layer.Layer<\n WakeScheduler,\n never,\n DurableAlarmService | ThreadObjectIdentity | ThreadObjectNamespace\n> = Layer.effect(WakeScheduler)(\n Effect.gen(function* () {\n const alarm = yield* DurableAlarmService;\n const identity = yield* ThreadObjectIdentity;\n const { namespace } = yield* ThreadObjectNamespace;\n const hints = yield* PubSub.sliding<ThreadId>(WAKE_BUFFER_CAPACITY);\n const progress = yield* makeWakeSubscriptionHub;\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(hints));\n\n const notifyLocal = (threadId: ThreadId) =>\n progress.notify(threadId).pipe(\n Effect.andThen(PubSub.publish(hints, threadId)),\n Effect.andThen(alarm.scheduleNow),\n Effect.catch((error) =>\n // `notify` never fails by contract; a failed alarm write degrades to \"hint lost\"\n // and the pass re-arm (or the next entry point's pre-arm) restores the invariant.\n Effect.logWarning(\"CloudflareWakeScheduler: local alarm wake failed\", error),\n ),\n Effect.asVoid,\n );\n\n const notifyRemote = (threadId: ThreadId) =>\n Effect.tryPromise({\n try: () => namespace.get(namespace.idFromName(threadId)).wake(),\n catch: (cause) =>\n RemoteWakeDropped.make({\n threadId,\n message: safeCauseMessage(cause, \"The remote wake failed without a diagnostic\"),\n cause,\n }),\n }).pipe(\n Effect.catch((error) =>\n Effect.logWarning(`CloudflareWakeScheduler: remote wake of ${threadId} dropped`, error),\n ),\n Effect.asVoid,\n );\n\n return WakeScheduler.of({\n notify: (threadId) =>\n threadId === identity.threadId ? notifyLocal(threadId) : notifyRemote(threadId),\n subscribe: progress.subscribe,\n wakes: Stream.fromPubSub(hints),\n });\n }),\n);\n","import { Context, Deferred, Effect, Layer, Ref, type Scope } from \"effect\";\n\n/** Cancellation tombstones are bounded hints, never durable authority. */\nconst MAX_CANCELLATION_TOMBSTONES = 1_024;\n\ntype ActiveRegistration = ReadonlySet<Deferred.Deferred<void>>;\ntype Registration = ActiveRegistration | \"cancelled\";\ntype Registrations = ReadonlyMap<string, Registration>;\n\n/**\n * Per-incarnation cancellation registry for long-lived progress RPCs. The public runtime owns\n * the actual wake registration; this host-only registry lets an interrupted Worker Effect ask\n * the Object to interrupt its scoped wait before the Worker execution context itself ends.\n */\nexport class ProgressWaitRegistry extends Context.Service<\n ProgressWaitRegistry,\n {\n /** Register a Scope-owned cancellation signal, observing any early cancel tombstone. */\n readonly subscribe: (\n waiterId: string,\n ) => Effect.Effect<Effect.Effect<void>, never, Scope.Scope>;\n /** Cancel a registered waiter, or remember a bounded early cancellation. */\n readonly cancel: (waiterId: string) => Effect.Effect<void>;\n }\n>()(\"@effect-agent/platform-cloudflare/ProgressWaitRegistry\") {\n static readonly layer: Layer.Layer<ProgressWaitRegistry> = Layer.effect(\n ProgressWaitRegistry,\n Effect.gen(function* () {\n const registrations = yield* Ref.make<Registrations>(new Map());\n\n const remove = (waiterId: string, deferred: Deferred.Deferred<void>) =>\n Ref.update(registrations, (current) => {\n const existing = current.get(waiterId);\n\n if (existing === undefined || existing === \"cancelled\" || !existing.has(deferred)) {\n return current;\n }\n const next = new Map(current);\n const active = new Set(existing);\n\n active.delete(deferred);\n if (active.size === 0) {\n next.delete(waiterId);\n } else {\n next.set(waiterId, active);\n }\n\n return next;\n });\n\n const subscribe = Effect.fn(\"ProgressWaitRegistry.subscribe\")(\n (waiterId: string): Effect.Effect<Effect.Effect<void>, never, Scope.Scope> =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<void>();\n\n yield* Effect.addFinalizer(() => remove(waiterId, deferred));\n\n const cancelled = yield* Ref.modify(registrations, (current) => {\n const existing = current.get(waiterId);\n const next = new Map(current);\n\n if (existing === \"cancelled\") {\n return [true, current] as const;\n }\n const active = new Set(existing ?? []);\n\n active.add(deferred);\n next.set(waiterId, active);\n\n return [false, next] as const;\n });\n\n return { cancelled, deferred };\n }).pipe(\n Effect.map(({ cancelled, deferred }) =>\n cancelled ? Effect.void : Deferred.await(deferred),\n ),\n ),\n );\n\n const cancel = Effect.fn(\"ProgressWaitRegistry.cancel\")(function* (waiterId: string) {\n const waiters = yield* Ref.modify(registrations, (current) => {\n const existing = current.get(waiterId);\n const next = new Map(current);\n\n if (existing === undefined) {\n next.set(waiterId, \"cancelled\");\n let tombstones = 0;\n\n for (const registration of next.values()) {\n if (registration === \"cancelled\") tombstones += 1;\n }\n if (tombstones > MAX_CANCELLATION_TOMBSTONES) {\n for (const [id, registration] of next) {\n if (registration !== \"cancelled\") continue;\n next.delete(id);\n break;\n }\n }\n\n return [[], next] as const;\n }\n if (existing === \"cancelled\") return [[], current] as const;\n next.delete(waiterId);\n\n return [[...existing], next] as const;\n });\n\n yield* Effect.forEach(waiters, (waiter) => Deferred.succeed(waiter, undefined), {\n discard: true,\n });\n });\n\n return ProgressWaitRegistry.of({ subscribe, cancel });\n }),\n );\n}\n","import { ThreadPortTransport, portTransportFailure } from \"@effect-agent/storage-cloudflare\";\nimport { Effect, Layer } from \"effect\";\n\nimport { ThreadObjectNamespace } from \"./bindings.ts\";\n\n/**\n * `ThreadPortTransport` over native Durable Object JS RPC (decision D-P6-3): one\n * `portCall(envelope)` on the stub of the Object that owns the addressed Thread\n * (`namespace.idFromName(threadId)` — the identity rule, plan §1.2). The envelopes are\n * already Schema-encoded JSON, so the RPC boundary carries only structured-cloneable values;\n * the protocol module stays transport-agnostic and fetch-with-JSON remains the documented\n * fallback carrier.\n *\n * Every delivery problem — stub construction, RPC rejection, overload, deploy-in-progress —\n * surfaces as `PortTransportError` (preserving the platform stub's own `retryable` signal\n * when present) and NEVER as a fabricated answer: on `resolveAdmission` the routing layer\n * turns exactly this error into `AdmissionIndeterminate` (SUB-031).\n */\nexport const threadPortTransportLayer: Layer.Layer<\n ThreadPortTransport,\n never,\n ThreadObjectNamespace\n> = Layer.effect(ThreadPortTransport)(\n Effect.gen(function* () {\n const { namespace } = yield* ThreadObjectNamespace;\n\n return ThreadPortTransport.of({\n call: (threadId, request) =>\n Effect.tryPromise({\n try: () => namespace.get(namespace.idFromName(threadId)).portCall(request),\n catch: (cause) => portTransportFailure(threadId, cause),\n }).pipe(\n Effect.withSpan(\"CloudflarePortTransport.call\", {\n attributes: { threadId },\n }),\n ),\n });\n }),\n);\n","import { ThreadId } from \"@effect-agent/core\";\nimport type {\n RunContextPreparation,\n RunCostEstimator,\n RunToolFailureObserver,\n} from \"@effect-agent/engine\";\nimport {\n CurrentToolFailureObserver,\n RunContextPreparationPassthrough,\n RunToolAuthorization,\n toolFailureObserverLayer,\n} from \"@effect-agent/engine\";\nimport {\n threadStoreLayer,\n executePortRequest,\n routedThreadStoreLayer,\n routedSubmissionLedgerLayer,\n storageConfigLayer,\n storageFailpointLayer,\n submissionLedgerLayer,\n type DoStorageFailpointHandler,\n type DoStorageInitializationError,\n type DoStorageOptions,\n type DoStorageFailpoint,\n type PortRequest,\n type PortResponse,\n} from \"@effect-agent/storage-cloudflare\";\nimport {\n compileRegistrations,\n DurableAgentRuntime,\n DurableRuntimeConfig,\n DurableRuntimeFailpoint,\n ProducerId,\n operationAuthorizerLayer,\n ToolReconciler,\n type AgentRegistration,\n type ThreadStore,\n type DigestError,\n type DurableRuntimeFailpointHandler,\n type OperationAuthorizerService,\n type ResolvedBinding,\n type SubmissionLedger,\n type WakeScheduler,\n} from \"@effect-agent/thread\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport type { Crypto } from \"effect\";\nimport { Context, Duration, Effect, Layer, Schema } from \"effect\";\n\nimport {\n ThreadMaintenance,\n ThreadMaintenanceFailpoint,\n DurableAlarmService,\n type ThreadMaintenanceFailpointHandler,\n} from \"./alarm.ts\";\nimport {\n ThreadObjectIdentity,\n DurableObjectContext,\n type ThreadObjectNamespace,\n} from \"./bindings.ts\";\nimport {\n CLOUDFLARE_RUNTIME_DEFAULTS,\n CloudflareDurableRuntimeConfig,\n CloudflareDurableRuntimeConfigValue,\n CloudflarePlatformConfigError,\n} from \"./config.ts\";\nimport { ProgressWaitRegistry } from \"./progress-wait.ts\";\nimport { threadPortTransportLayer } from \"./transport.ts\";\nimport { cloudflareWakeSchedulerLayer } from \"./wake-scheduler.ts\";\n\n/**\n * Raw (unvalidated) construction options for `ThreadObject.make`, mirroring\n * `NodeDurableRuntimeOptions`. Optional fields default to the documented production values\n * (`CLOUDFLARE_RUNTIME_DEFAULTS`); everything is schema-decoded into\n * `CloudflareDurableRuntimeConfigValue` before any resource opens (deployment §5 gate 1).\n */\nexport interface CloudflareDurableRuntimeOptions {\n readonly deploymentId: string;\n /** Head of the minted producer identity `{producerPrefix}:{threadId}`. */\n readonly producerPrefix: string;\n /** Milliseconds; default 30s (D5). */\n readonly ownershipLeaseDuration?: number | undefined;\n /** Milliseconds; default 100. */\n readonly alarmBackoffBase?: number | undefined;\n /** Milliseconds; default 5000. */\n readonly alarmBackoffCap?: number | undefined;\n /** Milliseconds; default 1000. Bounds every alarm re-arm delay. */\n readonly wakeScanInterval?: number | undefined;\n /** Milliseconds; default 500. */\n readonly settlementPollInterval?: number | undefined;\n /** Milliseconds; default 10000. */\n readonly leaseRenewalInterval?: number | undefined;\n /** Milliseconds; default 500. */\n readonly abortPollInterval?: number | undefined;\n /** Deployment-owned pricing authority used by durable cost budgets and settlements. */\n readonly estimateCostMicrousd?: RunCostEstimator | undefined;\n /** Closed trusted Tool failure reporting. Omission masks ambient observers at construction. */\n readonly toolFailureObserver?: RunToolFailureObserver | undefined;\n /** Milliseconds; default 25. */\n readonly observationPollInterval?: number | undefined;\n /** Bytes; default just under the 2 MB platform value limit. */\n readonly maxStoredValueBytes?: number | undefined;\n /** Default false. */\n readonly verifyOnOpen?: boolean | undefined;\n /** Nonterminal Submissions per lane before admission refuses; default 256. */\n readonly maxQueueDepthPerLane?: number | undefined;\n /** Encoded input bytes per Submission; default = the stored-value bound. */\n readonly maxInputBytes?: number | undefined;\n /** `ctx.storage.sql.databaseSize` ceiling at admission; default 9 GB (10 GB platform cap). */\n readonly maxDatabaseBytes?: number | undefined;\n /**\n * Durable Object storage fault injection (`ledger:*` / `append:*` locations). Handlers are\n * constructed per incarnation WITH the live `DurableObjectState`, so eviction harnesses can\n * map an armed hit to `ctx.abort()` — the platform's real failure mode. Default none.\n */\n readonly storageFailpoint?: ((ctx: DurableObjectState) => DoStorageFailpointHandler) | undefined;\n /** Coordinator fault injection (`submit:*` / `terminalize:*` locations); default none. */\n readonly runtimeFailpoint?:\n | ((ctx: DurableObjectState) => DurableRuntimeFailpointHandler)\n | undefined;\n /** Thread-maintenance generation/alarm fault injection; default none. */\n readonly maintenanceFailpoint?:\n | ((ctx: DurableObjectState) => ThreadMaintenanceFailpointHandler)\n | undefined;\n /** Host-supplied fail-closed authorization policy; defaults to service possession. */\n readonly operationAuthorizer?: OperationAuthorizerService | undefined;\n /**\n * Reconciliation policy consulted for open ordinary Tool Calls before an Unknown Outcome\n * is recorded (durability §10, DUR-009). Defaults to the fail-closed\n * `ToolReconciler.uncertain`.\n */\n readonly toolReconciler?: Layer.Layer<ToolReconciler> | undefined;\n}\n\n/** Services supplied before the application graph is built, including its dependencies. */\nexport type CloudflareBootstrapServices =\n | CloudflareDurableRuntimeConfig\n | ThreadObjectIdentity\n | DurableRuntimeConfig\n | Crypto.Crypto\n | DoStorageFailpoint\n | DurableRuntimeFailpoint\n | ThreadMaintenanceFailpoint\n | RunContextPreparation\n | RunToolAuthorization\n | ToolReconciler;\n\n/** Every construction failure of the assembled Cloudflare durable runtime stack. */\nexport type CloudflareDurableRuntimeInitializationError =\n | CloudflarePlatformConfigError\n | DigestError\n | DoStorageInitializationError;\n\n/** The services `ThreadObject.layer` provides. */\nexport type CloudflareDurableRuntimeServices =\n | DurableAgentRuntime\n | SubmissionLedger\n | ThreadStore\n | WakeScheduler\n | DurableAlarmService\n | ThreadMaintenance\n | ThreadObjectPorts\n | ProgressWaitRegistry;\n\n/**\n * Owner-side execution port for a `portCall` request the wire endpoint has already decoded.\n * It executes against THIS Object's LOCAL port facets — never the routed decorators, so a\n * request cannot bounce between Objects — and returns the typed response for the endpoint to\n * encode.\n */\nexport class ThreadObjectPorts extends Context.Service<\n ThreadObjectPorts,\n {\n readonly handle: (request: PortRequest) => Effect.Effect<PortResponse>;\n }\n>()(\"@effect-agent/platform-cloudflare/ThreadObjectPorts\") {}\n\nconst decodeConfigValue = Schema.decodeUnknownEffect(CloudflareDurableRuntimeConfigValue);\nconst decodeThreadId = Schema.decodeUnknownEffect(ThreadId);\nconst decodeProducerId = Schema.decodeUnknownEffect(ProducerId);\n\nconst configFromOptions = (\n options: CloudflareDurableRuntimeOptions,\n): Effect.Effect<CloudflareDurableRuntimeConfigValue, CloudflarePlatformConfigError> =>\n decodeConfigValue({\n deploymentId: options.deploymentId,\n producerPrefix: options.producerPrefix,\n ownershipLeaseDuration:\n options.ownershipLeaseDuration ?? CLOUDFLARE_RUNTIME_DEFAULTS.ownershipLeaseDuration,\n alarmBackoffBase: options.alarmBackoffBase ?? CLOUDFLARE_RUNTIME_DEFAULTS.alarmBackoffBase,\n alarmBackoffCap: options.alarmBackoffCap ?? CLOUDFLARE_RUNTIME_DEFAULTS.alarmBackoffCap,\n wakeScanInterval: options.wakeScanInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.wakeScanInterval,\n settlementPollInterval:\n options.settlementPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.settlementPollInterval,\n leaseRenewalInterval:\n options.leaseRenewalInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.leaseRenewalInterval,\n abortPollInterval: options.abortPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.abortPollInterval,\n observationPollInterval:\n options.observationPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.observationPollInterval,\n maxStoredValueBytes:\n options.maxStoredValueBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxStoredValueBytes,\n verifyOnOpen: options.verifyOnOpen ?? CLOUDFLARE_RUNTIME_DEFAULTS.verifyOnOpen,\n limits: {\n maxQueueDepthPerLane:\n options.maxQueueDepthPerLane ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxQueueDepthPerLane,\n maxInputBytes: Math.min(\n options.maxInputBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxInputBytes,\n options.maxStoredValueBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxStoredValueBytes,\n ),\n maxDatabaseBytes: options.maxDatabaseBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxDatabaseBytes,\n },\n }).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `Invalid Cloudflare durable runtime configuration: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/**\n * The Thread this Object owns, from the Object identity rule (plan §1.2): Thread\n * Objects are addressed exclusively by `idFromName(threadId)`, so `ctx.id.name` IS the\n * Thread ID. An unnamed Object (from `newUniqueId`) is a deployment error, not a lane.\n */\nconst threadIdFromState = (\n ctx: DurableObjectState,\n): Effect.Effect<ThreadId, CloudflarePlatformConfigError> =>\n ctx.id.name === undefined\n ? Effect.fail(\n CloudflarePlatformConfigError.make({\n message:\n \"This Durable Object was not created via idFromName(threadId); Thread \" +\n \"Objects must be addressed by their Thread identity (plan §1.2).\",\n }),\n )\n : decodeThreadId(ctx.id.name).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `The Durable Object name is not a valid ThreadId: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/**\n * Validate deployment settings and derive services before building application dependencies.\n * The native class factory builds this Layer inside its constructor gate. Custom Effect hosts\n * can provide it around the complete application Layer with the native context already supplied.\n */\nexport const layerConfig = (\n options: CloudflareDurableRuntimeOptions,\n): Layer.Layer<CloudflareBootstrapServices, CloudflarePlatformConfigError, DurableObjectContext> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const config = yield* configFromOptions(options);\n const threadId = yield* threadIdFromState(ctx);\n\n const producerId = yield* decodeProducerId(`${config.producerPrefix}:${threadId}`).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `The minted producer identity is invalid: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n return Layer.mergeAll(\n Layer.succeed(CloudflareDurableRuntimeConfig, config),\n Layer.succeed(ThreadObjectIdentity, { threadId, producerId }),\n DurableRuntimeConfig.layer({\n deploymentId: config.deploymentId,\n producerId,\n settlementPollInterval: Duration.millis(config.settlementPollInterval),\n leaseRenewalInterval: Duration.millis(config.leaseRenewalInterval),\n abortPollInterval: Duration.millis(config.abortPollInterval),\n ...(options.estimateCostMicrousd === undefined\n ? {}\n : { estimateCostMicrousd: options.estimateCostMicrousd }),\n }),\n BrowserCrypto.layer,\n storageFailpointLayer({ storage: ctx.storage, failpoint: options.storageFailpoint?.(ctx) }),\n options.runtimeFailpoint === undefined\n ? DurableRuntimeFailpoint.layer\n : Layer.succeed(DurableRuntimeFailpoint, { hit: options.runtimeFailpoint(ctx) }),\n options.maintenanceFailpoint === undefined\n ? ThreadMaintenanceFailpoint.layer\n : Layer.succeed(ThreadMaintenanceFailpoint, {\n hit: options.maintenanceFailpoint(ctx),\n }),\n options.toolReconciler ?? ToolReconciler.uncertain,\n options.operationAuthorizer === undefined\n ? Layer.empty\n : operationAuthorizerLayer(options.operationAuthorizer),\n options.toolFailureObserver === undefined\n ? Layer.succeed(CurrentToolFailureObserver, undefined)\n : toolFailureObserverLayer(options.toolFailureObserver),\n RunContextPreparationPassthrough,\n RunToolAuthorization.allowAll,\n );\n }),\n );\n\n/**\n * Register typed Agents and version declarations. Hashing and dependency capture happen in\n * this Layer's Scope, after application Layers have been provided. Every Agent's instruction,\n * Tool, Schema, and model requirements remain visible until satisfied by Layer composition.\n * Use Layer.unwrap for registration values that need effectful application setup.\n */\nexport const layer = <const Entries extends ReadonlyArray<AgentRegistration>>(\n registrations: Entries,\n) => Layer.unwrap(Effect.map(compileRegistrations(registrations), layerFromBindings));\n\n/**\n * Assemble the durable runtime from already-resolved Agent Bindings.\n * Use `ThreadObject.layer` to compile typed Agent registrations instead.\n * Supply host services through `ThreadObject.make` or `ThreadObject.layerConfig` and\n * the Durable Object context and namespace Layers when composing a custom host.\n */\nexport const layerFromBindings = (\n bindings: ReadonlyArray<ResolvedBinding>,\n): Layer.Layer<\n CloudflareDurableRuntimeServices,\n DoStorageInitializationError,\n DurableObjectContext | ThreadObjectNamespace | CloudflareBootstrapServices\n> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const config = yield* CloudflareDurableRuntimeConfig;\n const { threadId } = yield* ThreadObjectIdentity;\n\n const storageOptions: DoStorageOptions = {\n storage: ctx.storage,\n observationPollInterval: config.observationPollInterval,\n ownershipLeaseDuration: config.ownershipLeaseDuration,\n maxStoredValueBytes: config.maxStoredValueBytes,\n verifyOnOpen: config.verifyOnOpen,\n };\n\n const infrastructure = Layer.mergeAll(\n storageConfigLayer(storageOptions),\n SqliteClient.layer({ storage: ctx.storage }),\n );\n\n // The same local ports serve routed decorators and owner-side RPC execution.\n // The RPC executor must never receive routed ports and bounce requests between Objects.\n const localPorts = Layer.mergeAll(threadStoreLayer, submissionLedgerLayer).pipe(\n Layer.provide(infrastructure),\n );\n\n const portsEndpointLayer = Layer.effect(ThreadObjectPorts)(\n Effect.gen(function* () {\n const local = yield* Effect.context<SubmissionLedger | ThreadStore>();\n\n return ThreadObjectPorts.of({\n handle: (request) => executePortRequest(request).pipe(Effect.provide(local)),\n });\n }),\n ).pipe(Layer.provide(localPorts));\n\n const routedPorts = Layer.mergeAll(\n routedSubmissionLedgerLayer({ localThreadId: threadId }),\n routedThreadStoreLayer({ localThreadId: threadId }),\n ).pipe(Layer.provide(localPorts), Layer.provide(threadPortTransportLayer));\n\n const base = Layer.mergeAll(DurableAlarmService.layer, ProgressWaitRegistry.layer);\n\n const runtimeStack = DurableAgentRuntime.layerWithServices.pipe(\n Layer.provideMerge(routedPorts),\n Layer.provideMerge(cloudflareWakeSchedulerLayer),\n Layer.provideMerge(base),\n );\n\n return Layer.mergeAll(\n runtimeStack,\n ThreadMaintenance.layer(bindings).pipe(Layer.provide(runtimeStack)),\n portsEndpointLayer,\n );\n }),\n );\n","import type { AgentId } from \"@effect-agent/core\";\nimport { SubmissionId } from \"@effect-agent/core\";\nimport {\n decodePortRequest,\n encodePortResponse,\n type PortRequest,\n} from \"@effect-agent/storage-cloudflare\";\nimport {\n AppendConflict,\n ThreadNotMaterialized,\n ThreadRead,\n ThreadStore,\n ThreadStoreError,\n DigestError,\n DurableAgentRuntime,\n DurableRuntimeFailpointError,\n FenceRejected,\n IntegrityReport,\n LedgerError,\n ObligationReport,\n ObligationThresholds,\n OperationAuthorizationRequest,\n OperationAuthorizer,\n OperationDenied,\n OwnershipLost,\n PersistedJson,\n RecoveryExplanation,\n RecoveryReport,\n RetryCommand,\n RetryRefused,\n RunJournalError,\n SettlementConflict,\n SubmissionLedger,\n SubmissionLookupByKey,\n WakeScheduler,\n type DurableSubmitAgent,\n} from \"@effect-agent/thread\";\nimport { Effect, Layer, Option, Schema, Stream } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectState as EffectCfDurableObjectState,\n WorkerEnvironment,\n} from \"effect-cf\";\n\nimport {\n ThreadMaintenance,\n DurableAlarmError,\n DurableAlarmService,\n type MaintenancePassFailure,\n} from \"./alarm.ts\";\nimport {\n ThreadObjectIdentity,\n DurableObjectContext,\n ThreadObjectNamespace,\n threadNamespaceFromEnv,\n type CloudflareBindingError,\n} from \"./bindings.ts\";\nimport {\n AbortRecorded,\n ApprovalRecorded,\n HostFailed,\n HostProtocolError,\n ObservedPage,\n ProgressObserved,\n ProgressCancelled,\n SettlementReached,\n SubmitSucceeded,\n UnknownResolutionRecorded,\n boundHostDiagnostic,\n decodeAbortCommand,\n decodeAwaitProgressRequest,\n decodeCancelProgressRequest,\n decodeApprovalDecisionCommand,\n decodeObservePageRequest,\n decodeReceipt,\n decodeSubmitRequest,\n decodeUnknownResolutionCommand,\n encodeHostResponse,\n type HostFailure,\n type HostResponse,\n} from \"./client.ts\";\nimport { AdmissionLimitExceeded, CloudflareDurableRuntimeConfig } from \"./config.ts\";\nimport {\n layerConfig,\n ThreadObjectPorts,\n type CloudflareDurableRuntimeInitializationError,\n type CloudflareDurableRuntimeOptions,\n type CloudflareDurableRuntimeServices,\n type CloudflareBootstrapServices,\n} from \"./layers.ts\";\nimport { ProgressWaitRegistry } from \"./progress-wait.ts\";\n\nexport {\n layer,\n layerConfig,\n type CloudflareDurableRuntimeOptions as RuntimeOptions,\n type CloudflareDurableRuntimeServices as Services,\n type CloudflareDurableRuntimeInitializationError as InitializationError,\n type CloudflareBootstrapServices as BootstrapServices,\n} from \"./layers.ts\";\n\n/**\n * `ThreadObject.make(application, options)` — the Thread Durable Object\n * (plan §1.4,\n * D-P6-1): a factory returning a class that applications export from their Worker entry.\n * One SQLite-backed Object per Thread is the serialized owner (durability §6); the\n * Object never runs `runResolvedWorker`'s infinite loop — each ingress event or alarm runs\n * ONE bounded `runRecovery` + `processThreadResolved` pass, and the persisted alarm\n * (the single multiplexed slot, D-P6-2) finishes accepted work across evictions WITHOUT any\n * incoming request.\n *\n * Constructor gate (`blockConcurrencyWhile`) is LOCAL-ONLY: schema migration and the\n * exact-version check, configuration decode, and the defensive ensure-alarm half of the\n * alarm invariant. It deliberately does NOT run the recovery pass: parent recovery can\n * require child-Object reads and vice versa, and two Objects blocked in constructor gates\n * awaiting each other's RPC would deadlock (plan §1.4). Instead every pass runs\n * `runRecovery` BEFORE any claim, so reconciliation still strictly precedes new work.\n */\n\n/** Construction options for one deployed Thread Object class. */\nexport interface Options<\n ApplicationServices = never,\n EventServices = never,\n EventLayerError = never,\n> extends CloudflareDurableRuntimeOptions {\n /** Accept transient native RPC tracing through effect-cf; disabled by default. */\n readonly rpcTracing?: boolean;\n /**\n * Name of the Worker `env` binding carrying THIS class's `DurableObjectNamespace` — the\n * Object's route back to sibling Thread Objects for the WP2 cross-Object port calls\n * and remote wakes (DEPLOY-010: the binding enters through a Layer, never ambiently).\n */\n readonly namespaceBinding: string;\n /** Acquired and finalized per native event, with access to the complete application runtime. */\n readonly eventLayer?: Layer.Layer<\n EventServices,\n EventLayerError,\n | RuntimeServices\n | ApplicationServices\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n >;\n}\n\ntype EndpointServices =\n | CloudflareDurableRuntimeServices\n | CloudflareBootstrapServices\n | DurableObjectContext;\ntype RuntimeServices = EndpointServices | ThreadObjectNamespace;\ntype ThreadObjectInitializationError =\n | CloudflareDurableRuntimeInitializationError\n | CloudflareBindingError\n | MaintenancePassFailure;\n\n/** Classify only a decoded port request so new protocol members cannot bypass pre-arming. */\nconst isMutatingPortRequest = (request: PortRequest): boolean => {\n switch (request._tag) {\n case \"LedgerAdmit\":\n case \"LedgerMarkReady\":\n case \"LedgerRequestAbort\":\n case \"LedgerRecordChildSettled\":\n case \"StoreMaterialize\":\n case \"StoreAppend\":\n return true;\n case \"LedgerLookup\":\n case \"LedgerResolveAdmission\":\n case \"StoreReadPage\":\n case \"StoreInspectTail\":\n case \"StoreExport\":\n return false;\n }\n request satisfies never;\n\n return false;\n};\n\n/** The literal encoded `PortFailed(PortProtocolError)` fallback (same shape as WP2's). */\nconst encodedPortProtocolFailure = (message: string): unknown => ({\n _tag: \"PortFailed\",\n failure: { _tag: \"PortProtocolError\", message: boundHostDiagnostic(message) },\n});\n\nconst protocolFailure = (context: string) => (error: { readonly message: string }) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`${context}: ${error.message}`),\n });\n\n/** Fold one endpoint's typed failures into the uniform `HostResponse` envelope. */\nconst respond = <Result extends HostResponse, Failure extends HostFailure>(\n effect: Effect.Effect<Result, Failure, EndpointServices>,\n): Effect.Effect<HostResponse, never, EndpointServices> =>\n effect.pipe(\n Effect.map((result): HostResponse => result),\n Effect.catch((failure) => Effect.succeed<HostResponse>(HostFailed.make({ failure }))),\n );\n\n/** Encode the response envelope; an unencodable response degrades to a protocol failure. */\nconst encodeResponse = (response: HostResponse): Effect.Effect<unknown> =>\n encodeHostResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed<unknown>({\n _tag: \"HostFailed\",\n failure: {\n _tag: \"HostProtocolError\",\n message: boundHostDiagnostic(`The host response could not be encoded: ${error.message}`),\n },\n }),\n ),\n );\n\nconst utf8Bytes = (value: PersistedJson): number =>\n new TextEncoder().encode(JSON.stringify(value)).length;\n\n/**\n * The admission-limits gate, BEFORE `runtime.submit` touches the ledger (exit gate\n * \"resource limits are checked before admission\"; DEPLOY-007). A replayed idempotency key is\n * exempt: its accepted-work obligation already exists, and returning the original Receipt\n * consumes no new quota. Refusals are typed `AdmissionLimitExceeded` and nothing is written.\n */\nconst gateAdmissionLimits = Effect.fn(\"ThreadObject.gateAdmissionLimits\")(function* (request: {\n readonly principal: SubmissionLookupByKey[\"principal\"];\n readonly idempotencyKey: SubmissionLookupByKey[\"idempotencyKey\"];\n readonly inputPayload: PersistedJson;\n}) {\n const identity = yield* ThreadObjectIdentity;\n const config = yield* CloudflareDurableRuntimeConfig;\n const ledger = yield* SubmissionLedger;\n const { ctx } = yield* DurableObjectContext;\n\n const existing = yield* ledger.lookup(\n SubmissionLookupByKey.make({\n threadId: identity.threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n }),\n );\n\n if (Option.isSome(existing)) return;\n\n const inputBytes = utf8Bytes(request.inputPayload);\n\n if (inputBytes > config.limits.maxInputBytes) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"input-bytes\",\n actual: inputBytes,\n maximum: config.limits.maxInputBytes,\n });\n }\n\n // One Thread per Object (durability §5): the local scan IS this lane's queue.\n const nonterminal = yield* Stream.runCollect(ledger.scanNonterminal);\n\n if (nonterminal.length >= config.limits.maxQueueDepthPerLane) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"queue-depth\",\n actual: nonterminal.length,\n maximum: config.limits.maxQueueDepthPerLane,\n });\n }\n\n const databaseBytes = yield* Effect.sync(() => ctx.storage.sql.databaseSize);\n\n if (databaseBytes > config.limits.maxDatabaseBytes) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"database-bytes\",\n actual: databaseBytes,\n maximum: config.limits.maxDatabaseBytes,\n });\n }\n});\n\n/**\n * The submit-capable projection of an Agent Binding on the OBJECT side: the input arrived\n * already encoded through the real input schema on the Worker side (`client.ts`), so the\n * Object admits the canonical `PersistedJson` payload as-is; the resolved Binding re-derives\n * everything else from the stored `(agentId, agentDigests)` at claim time (SUB-023).\n */\nconst passthroughSubmitAgent = (agentId: AgentId): DurableSubmitAgent<typeof PersistedJson> => ({\n definition: {\n id: agentId,\n input: PersistedJson,\n },\n});\n\nconst submitEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeSubmitRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The submit request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n\n yield* gateAdmissionLimits(request);\n\n // Alarm invariant: the generation + alarm commit BEFORE the admission, and maintenance\n // cannot acknowledge that generation until this mutation leaves its public RPC seam.\n const receipt = yield* maintenance.withMutation(\n runtime.submit(passthroughSubmitAgent(request.agentId), request.inputPayload, {\n threadId: identity.threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n definitions: request.definitions,\n }),\n );\n\n return SubmitSucceeded.make({ receipt });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst awaitSettlementEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeReceipt(encoded).pipe(\n Effect.mapError(protocolFailure(\"The receipt could not be decoded\")),\n Effect.flatMap((receipt) =>\n Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n const settlement = yield* runtime.awaitSettlement(receipt);\n\n return SettlementReached.make({ settlement });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst awaitProgressEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAwaitProgressRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The progress request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n const registry = yield* ProgressWaitRegistry;\n\n yield* Effect.scoped(\n Effect.gen(function* () {\n const cancelled = yield* registry.subscribe(request.waiterId);\n\n yield* Effect.raceFirst(\n runtime.awaitProgress(identity.threadId, request.afterSequence),\n cancelled,\n );\n }),\n );\n\n return ProgressObserved.make();\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst cancelProgressEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeCancelProgressRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The progress cancellation could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const registry = yield* ProgressWaitRegistry;\n\n yield* registry.cancel(request.waiterId);\n\n return ProgressCancelled.make();\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst observePageEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeObservePageRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The observe request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const store = yield* ThreadStore;\n // The same fail-closed authorization seam the runtime's `observe` consults (P7 WP1);\n // the default reference preserves the possession behavior.\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"observe\",\n threadId: identity.threadId,\n }),\n );\n\n const records = yield* Stream.runCollect(\n store.read(\n ThreadRead.make({\n threadId: identity.threadId,\n ...(request.afterSequence === undefined\n ? {}\n : { afterSequence: request.afterSequence }),\n limit: request.limit,\n }),\n ),\n );\n\n return ObservedPage.make({ records: [...records] });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst abortEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAbortCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The abort command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.abort(command));\n\n return AbortRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst resolveApprovalEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeApprovalDecisionCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The approval command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.resolveApproval(command));\n\n return ApprovalRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst resolveUnknownEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeUnknownResolutionCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The resolution command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.resolveUnknown(command));\n\n return UnknownResolutionRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\n// ---------------------------------------------------------------------------\n// P7 administrative entry points (plan §3): explain/verify/retry/obligations over the SAME\n// envelope discipline as the host protocol — closed request/response Schema unions, typed\n// failures that re-decode to identical tags, protocol anomalies answered typed. The envelopes\n// live here (not `client.ts`) because no Worker-side client consumption exists yet; `wake`\n// already exists as the `wake()` entry point.\n// ---------------------------------------------------------------------------\n\n/** Explain one Submission (`submissionId` present) or every nonterminal lane member. */\nexport class AdminExplainRequest extends Schema.Class<AdminExplainRequest>(\n \"@effect-agent/platform-cloudflare/AdminExplainRequest\",\n)({\n submissionId: Schema.optionalKey(SubmissionId),\n}) {}\n\n/** Verify carries no parameters — the addressed Object IS the lane. */\nexport class AdminVerifyRequest extends Schema.Class<AdminVerifyRequest>(\n \"@effect-agent/platform-cloudflare/AdminVerifyRequest\",\n)({}) {}\n\n/** Every typed failure of the four admin entry points, plus the protocol's own errors. */\nexport const AdminFailure = Schema.Union([\n OperationDenied,\n RetryRefused,\n LedgerError,\n RunJournalError,\n DigestError,\n OwnershipLost,\n SettlementConflict,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n DurableRuntimeFailpointError,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nexport type AdminFailure = typeof AdminFailure.Type;\n\nexport class ExplainedRecovery extends Schema.TaggedClass<ExplainedRecovery>(\n \"@effect-agent/platform-cloudflare/ExplainedRecovery\",\n)(\"ExplainedRecovery\", {\n explanations: Schema.Array(RecoveryExplanation).check(Schema.isMaxLength(1_024)),\n}) {}\n\nexport class VerifiedIntegrity extends Schema.TaggedClass<VerifiedIntegrity>(\n \"@effect-agent/platform-cloudflare/VerifiedIntegrity\",\n)(\"VerifiedIntegrity\", {\n report: IntegrityReport,\n}) {}\n\nexport class RetryExecuted extends Schema.TaggedClass<RetryExecuted>(\n \"@effect-agent/platform-cloudflare/RetryExecuted\",\n)(\"RetryExecuted\", {\n report: RecoveryReport,\n}) {}\n\nexport class ObligationsScanned extends Schema.TaggedClass<ObligationsScanned>(\n \"@effect-agent/platform-cloudflare/ObligationsScanned\",\n)(\"ObligationsScanned\", {\n report: ObligationReport,\n}) {}\n\n/** The admin entry point failed TYPED on the Object; the failure re-decodes verbatim. */\nexport class AdminFailed extends Schema.TaggedClass<AdminFailed>(\n \"@effect-agent/platform-cloudflare/AdminFailed\",\n)(\"AdminFailed\", {\n failure: AdminFailure,\n}) {}\n\n/** The uniform answer of one admin entry point. Callers narrow by the tag their call implies. */\nexport const AdminResponse = Schema.Union([\n ExplainedRecovery,\n VerifiedIntegrity,\n RetryExecuted,\n ObligationsScanned,\n AdminFailed,\n]);\n\nexport type AdminResponse = typeof AdminResponse.Type;\n\nexport const decodeAdminExplainRequest = Schema.decodeUnknownEffect(AdminExplainRequest);\nexport const decodeAdminVerifyRequest = Schema.decodeUnknownEffect(AdminVerifyRequest);\nexport const decodeRetryCommand = Schema.decodeUnknownEffect(RetryCommand);\nexport const decodeObligationThresholds = Schema.decodeUnknownEffect(ObligationThresholds);\nexport const encodeAdminResponse = Schema.encodeEffect(AdminResponse);\nexport const decodeAdminResponse = Schema.decodeUnknownEffect(AdminResponse);\n\n/** Fold one admin endpoint's typed failures into the uniform `AdminResponse` envelope. */\nconst respondAdmin = <Result extends AdminResponse, Failure extends AdminFailure>(\n effect: Effect.Effect<Result, Failure, EndpointServices>,\n): Effect.Effect<AdminResponse, never, EndpointServices> =>\n effect.pipe(\n Effect.map((result): AdminResponse => result),\n Effect.catch((failure) => Effect.succeed<AdminResponse>(AdminFailed.make({ failure }))),\n );\n\n/** Encode the admin response envelope; an unencodable response degrades to a protocol failure. */\nconst encodeAdminResponseTotal = (response: AdminResponse): Effect.Effect<unknown> =>\n encodeAdminResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed<unknown>({\n _tag: \"AdminFailed\",\n failure: {\n _tag: \"HostProtocolError\",\n message: boundHostDiagnostic(`The admin response could not be encoded: ${error.message}`),\n },\n }),\n ),\n );\n\nconst explainEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAdminExplainRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The explain request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n\n const explanations =\n request.submissionId === undefined\n ? yield* runtime.explainThread(identity.threadId)\n : [yield* runtime.explain(request.submissionId)];\n\n return ExplainedRecovery.make({ explanations });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst verifyEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAdminVerifyRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The verify request could not be decoded\")),\n Effect.flatMap(() =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n const report = yield* runtime.verify(identity.threadId);\n\n return VerifiedIntegrity.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst retryEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeRetryCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The retry command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n // Retry may repair durable state, so its generation + alarm commit before the mutation.\n const report = yield* maintenance.withMutation(runtime.retry(command));\n\n return RetryExecuted.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst obligationsEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeObligationThresholds(encoded).pipe(\n Effect.mapError(protocolFailure(\"The obligation thresholds could not be decoded\")),\n Effect.flatMap((thresholds) =>\n Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n const report = yield* runtime.scanObligations(thresholds);\n\n return ObligationsScanned.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\n/**\n * Owner-side `portCall`: wrap a mutating envelope in the same pre-armed generation protocol as\n * public RPC (a routed mutation committed by THIS Object must already carry the alarm that will\n * finish it), execute on the LOCAL facets (never the routed decorators), then arm an immediate\n * alarm so the mutated lane is processed promptly. Protocol anomalies answer\n * `PortFailed(PortProtocolError)`.\n */\nconst portCallEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n Effect.gen(function* () {\n const ports = yield* ThreadObjectPorts;\n const maintenance = yield* ThreadMaintenance;\n const alarm = yield* DurableAlarmService;\n\n const decoded = yield* decodePortRequest(encoded).pipe(\n Effect.map((request) => ({ _tag: \"success\" as const, request })),\n Effect.catch((error) => Effect.succeed({ _tag: \"failure\" as const, message: error.message })),\n );\n\n if (decoded._tag === \"failure\") {\n return encodedPortProtocolFailure(\n `The port request could not be decoded: ${decoded.message}`,\n );\n }\n const mutating = isMutatingPortRequest(decoded.request);\n\n const handled = yield* (\n mutating\n ? maintenance.withMutation(ports.handle(decoded.request))\n : ports.handle(decoded.request)\n ).pipe(Effect.exit);\n\n if (handled._tag === \"Failure\") {\n // Without the committed generation/alarm the invariant cannot be promised; refuse before\n // the port mutation runs. `ports.handle` itself is total, so this is the maintenance error.\n return encodedPortProtocolFailure(\n \"The owner Object could not arm its maintenance alarm before the mutation.\",\n );\n }\n\n const response = yield* encodePortResponse(handled.value).pipe(\n Effect.catch((error) =>\n Effect.succeed(\n encodedPortProtocolFailure(`The port response could not be encoded: ${error.message}`),\n ),\n ),\n );\n\n if (mutating) {\n // Prompt processing hint; the pre-armed alarm already guarantees convergence.\n yield* alarm.scheduleNow.pipe(\n Effect.catch((error) =>\n Effect.logWarning(\"ThreadObject.portCall: immediate re-arm failed\", error),\n ),\n );\n }\n\n return response;\n });\n\nconst wakeEndpoint: Effect.Effect<void, never, EndpointServices> = Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const wake = yield* WakeScheduler;\n\n // Route the remote hint through this incarnation's scheduler so scoped progress waiters and\n // the alarm receive the same hint. Delivery remains droppable; canonical storage is authority.\n yield* wake.notify(identity.threadId);\n});\n\nconst alarmEndpoint: Effect.Effect<void, MaintenancePassFailure, EndpointServices> = Effect.gen(\n function* () {\n const maintenance = yield* ThreadMaintenance;\n\n // Typed pass failures propagate: the rejected promise makes workerd retry the alarm\n // (at-least-once delivery), and the dirty generation retains a committed slot meanwhile.\n yield* maintenance.pass;\n },\n);\n\nconst gateEndpoint: Effect.Effect<void, MaintenancePassFailure, EndpointServices> = Effect.gen(\n function* () {\n // Forcing ThreadMaintenance forces the whole Layer stack: migration + exact-version\n // check + configuration decode (DEPLOY-008 fails typed here, before any mutation), then\n // the defensive local ensure-alarm half of the invariant. LOCAL-ONLY by construction.\n const maintenance = yield* ThreadMaintenance;\n\n yield* maintenance.ensureAlarm;\n },\n);\n\n/**\n * Adapter from effect-cf's native Durable Object services to Effect Agent's existing platform\n * ports. effect-cf owns the cached ManagedRuntime and supplies these values once per Object\n * incarnation; the durable runtime continues to depend only on the narrow services below.\n */\nconst effectCfPlatformLayer = (\n namespaceBinding: string,\n rpcTracing = false,\n): Layer.Layer<\n DurableObjectContext | ThreadObjectNamespace,\n CloudflareBindingError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n> => {\n const context = Layer.effect(DurableObjectContext)(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const env = yield* WorkerEnvironment;\n\n return DurableObjectContext.of({ ctx: state.raw, env });\n }),\n );\n\n const namespace = Layer.effect(ThreadObjectNamespace)(\n Effect.gen(function* () {\n const env = yield* WorkerEnvironment;\n const binding = yield* threadNamespaceFromEnv(env, namespaceBinding);\n\n return ThreadObjectNamespace.of({\n namespace: binding,\n ...(rpcTracing === true ? { rpcTracing: namespaceBinding } : {}),\n });\n }),\n );\n\n return Layer.merge(context, namespace);\n};\n\n/** The public endpoints and effect-cf invocation hook of one Thread Object instance. */\nexport interface Instance<EventServices = never> extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, RuntimeServices | EventServices>\n> {\n submitEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n awaitSettlementEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n awaitProgressEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n cancelProgressEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n observePage(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n abortEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n resolveApprovalEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n resolveUnknownEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n explainEncoded(encoded: unknown): Promise<unknown>;\n verifyEncoded(encoded: unknown): Promise<unknown>;\n retryEncoded(encoded: unknown): Promise<unknown>;\n obligationsEncoded(encoded: unknown): Promise<unknown>;\n portCall(encoded: unknown): Promise<unknown>;\n wake(): Promise<void>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\n/** The constructor shape workerd instantiates for each Thread Object. */\nexport interface Class<EventServices = never> {\n new (ctx: DurableObjectState, env: Cloudflare.Env): Instance<EventServices>;\n}\n\n/**\n * Export a composed application Layer as a native Durable Object class.\n * Bootstrap services are provided to the whole graph before it acquires, so application Layers\n * can yield effect-cf's WorkerEnvironment and DurableObjectState, derived identity, and Crypto.\n * Application dependencies remain visible until Layer.provide satisfies them. effect-cf owns the\n * cached ManagedRuntime, native RPC methods, event scopes, and telemetry flushing.\n * Initialization is local and bounded inside the constructor gate. Cloudflare eviction does not\n * guarantee finalizers; put resources requiring timely release in scoped operations or eventLayer.\n */\nexport const make = <\n ApplicationServices,\n ApplicationError,\n EventServices = never,\n EventLayerError = never,\n>(\n applicationLayer: Layer.Layer<\n CloudflareDurableRuntimeServices | ApplicationServices,\n ApplicationError,\n | CloudflareBootstrapServices\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | DurableObjectContext\n | ThreadObjectNamespace\n >,\n options: Options<ApplicationServices, EventServices, EventLayerError>,\n): Class<ApplicationServices | EventServices> => {\n const application = applicationLayer.pipe(\n Layer.provideMerge(layerConfig(options)),\n Layer.provideMerge(effectCfPlatformLayer(options.namespaceBinding, options.rpcTracing)),\n );\n\n // The storage/config Layer must acquire inside Cloudflare's constructor gate. effect-cf owns\n // the ManagedRuntime, while this effectContext ensures its first Layer build enters the gate\n // before migration, compatibility checks, or alarm inspection touch Object storage.\n const runtime: Layer.Layer<\n RuntimeServices | ApplicationServices,\n ThreadObjectInitializationError | ApplicationError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(\n Effect.gen(function* () {\n const services = yield* Layer.buildWithScope(application, scope);\n\n yield* gateEndpoint.pipe(Effect.provide(services));\n\n return services;\n }),\n );\n }),\n );\n\n const rpc = {\n submitEncoded: (encoded: unknown) => submitEndpoint(encoded),\n awaitSettlementEncoded: (encoded: unknown) => awaitSettlementEndpoint(encoded),\n awaitProgressEncoded: (encoded: unknown) => awaitProgressEndpoint(encoded),\n cancelProgressEncoded: (encoded: unknown) => cancelProgressEndpoint(encoded),\n observePage: (encoded: unknown) => observePageEndpoint(encoded),\n abortEncoded: (encoded: unknown) => abortEndpoint(encoded),\n resolveApprovalEncoded: (encoded: unknown) => resolveApprovalEndpoint(encoded),\n resolveUnknownEncoded: (encoded: unknown) => resolveUnknownEndpoint(encoded),\n explainEncoded: (encoded: unknown) => explainEndpoint(encoded),\n verifyEncoded: (encoded: unknown) => verifyEndpoint(encoded),\n retryEncoded: (encoded: unknown) => retryEndpoint(encoded),\n obligationsEncoded: (encoded: unknown) => obligationsEndpoint(encoded),\n portCall: (encoded: unknown) => portCallEndpoint(encoded),\n wake: () => wakeEndpoint,\n } satisfies EffectCfDurableObject.DurableObjectRpc<\n RuntimeServices | ApplicationServices | EventServices\n >;\n\n type NativeOptions = EffectCfDurableObject.DurableObjectOptions<\n RuntimeServices | ApplicationServices,\n EventServices,\n EventLayerError,\n typeof rpc\n >;\n\n const EffectCfThreadObject = EffectCfDurableObject.make<\n RuntimeServices | ApplicationServices,\n ThreadObjectInitializationError | ApplicationError,\n EventServices,\n EventLayerError,\n typeof rpc\n >(runtime, {\n ...(options.rpcTracing === true ? { rpcTracing: { service: options.namespaceBinding } } : {}),\n ...(options.eventLayer === undefined ? {} : { eventLayer: options.eventLayer }),\n // Force the gated runtime Layer when Cloudflare loads this Object incarnation. Recovery stays\n // in each bounded pass so cross-Object initialization cannot deadlock.\n initialize: Effect.void,\n rpc,\n alarm: () => alarmEndpoint,\n // This host owns the raw alarm and supplies event services through options.eventLayer.\n // Upstream's conditional alarm-registration check cannot reduce over generic application\n // services. Options and the rpc satisfies check above retain their Effect requirements.\n } as NativeOptions);\n\n // effect-cf's class type keeps `alarm` optional even when the handler option is present. This\n // concrete override reflects this factory's stronger contract while delegating execution to\n // the effect-cf runtime unchanged.\n class ThreadObject extends EffectCfThreadObject {\n override alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void {\n return super.alarm?.(alarmInfo);\n }\n }\n\n return ThreadObject;\n};\n","import {\n CodeExecutionHost,\n CodeExecutionResourceUse,\n CodeExecutionResult,\n CodeExecutionTimeoutError,\n CodeExecutor,\n CodeExecutorStartError,\n CodeExecutorTerminatedError,\n CodeExecutorUnsupportedError,\n CodeExecutionProtocolError,\n CodeHostCall,\n CodeHostCallLimitError,\n CodeHostCallResult,\n CodeOutputLimitError,\n CodeProgramFailedError,\n CodeSourceError,\n SandboxImplementation,\n type CodeExecutorExecute,\n type CodeExecutionRequest,\n} from \"@effect-agent/sandbox\";\nimport { RpcTarget } from \"cloudflare:workers\";\nimport { Clock, Duration, Effect, Exit, Fiber, Layer, Option, Queue, Schema } from \"effect\";\n\nimport { safeCauseDiagnostic, safeCauseMessage } from \"./boundary.ts\";\n\n/**\n * The Cloudflare Dynamic Worker `CodeExecutor` adapter (C4 of ADR-0017;\n * DEPLOY-011). Each pass loads one fresh Worker through the Worker Loader\n * with `globalOutbound: null`, so generated code has no ambient network,\n * bindings, or secrets; its only authority is the pass-scoped RPC target that\n * routes back into the owning event's `CodeExecutionHost` service. Platform\n * CPU limits stop synchronous runaway programs; the executor-owned wall-clock\n * deadline interrupts asynchronously suspended passes. Deployment class `E`\n * only: the adapter records no persistent state and a later pass may run in a\n * completely different isolate.\n */\nexport const dynamicWorkerImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-dynamic-worker\",\n});\n\ninterface CodeModePassHost extends Rpc.RpcTargetBranded {\n readonly call: (hostCall: unknown) => Promise<unknown>;\n}\n\ninterface CodeModeHarnessEntrypoint extends Rpc.WorkerEntrypointBranded {\n readonly run: (host: CodeModePassHost) => Promise<unknown>;\n}\n\n/**\n * One object-capability endpoint for one execution pass. Workers RPC invokes\n * the target in the request context where it was created, so the native\n * Promise returned by `dispatch` and the Effect fiber that settles it share\n * one I/O owner. Passing the target as `run()`'s argument also scopes the\n * remote stub to that RPC call; no request state lives at module scope.\n */\nclass CodeModePassHostTarget extends RpcTarget implements CodeModePassHost {\n readonly #dispatch: (hostCall: unknown) => Promise<unknown>;\n\n constructor(dispatch: (hostCall: unknown) => Promise<unknown>) {\n super();\n this.#dispatch = dispatch;\n }\n\n call(hostCall: unknown): Promise<unknown> {\n return this.#dispatch(hostCall);\n }\n}\n\n/**\n * The fixed harness loaded as the dynamic worker's main module. The generated\n * source becomes `program.mjs` (`export default (<expression>);`) — a module,\n * never `eval`. The harness installs namespace globals and a bounded console,\n * imports the program, invokes it exactly once, and returns one envelope the\n * host validates through Effect Schema.\n */\nconst HARNESS_MODULE = String.raw`\nimport { WorkerEntrypoint } from \"cloudflare:workers\";\nimport programDefault from \"./program.js\";\n\nconst encoder = new TextEncoder();\nconst utf8 = (text) => encoder.encode(text).byteLength;\nconst safeText = (value) => {\n try {\n if (value instanceof Error) return (value.name + \": \" + value.message).slice(0, 4000);\n if (typeof value === \"string\") return value.slice(0, 4000);\n const encoded = JSON.stringify(value);\n return (encoded === undefined ? String(value) : encoded).slice(0, 4000);\n } catch {\n return \"[unserializable value]\";\n }\n};\nconst safeJson = (value) => {\n try {\n const encoded = JSON.stringify(value);\n if (encoded !== undefined && encoded.length <= 4000) return JSON.parse(encoded);\n } catch {}\n return safeText(value);\n};\n\nexport default class CodeModeHarness extends WorkerEntrypoint {\n async run(host) {\n const config = this.env.CODE_MODE_PASS;\n const limits = config.limits;\n const logs = [];\n let logBytes = 0;\n let fatal;\n const boundedLogs = () => logs.slice(0, 4096);\n const write = (...values) => {\n const joined = values.map(safeText).join(\" \");\n const line = joined.length > 16000 ? joined.slice(0, 15999) + \"…\" : joined;\n const bytes = utf8(line);\n if (logs.length >= 4096 || logBytes + bytes > limits.maxLogBytes) {\n fatal = fatal ?? { _tag: \"log-limit\", observed: logBytes + bytes, logs: boundedLogs() };\n throw new Error(\"code-mode log limit exceeded\");\n }\n logs.push(line);\n logBytes += bytes;\n };\n globalThis.console = { log: write, info: write, warn: write, error: write, debug: write };\n\n let hostCalls = 0;\n const makeMethod = (namespace, method) => async (argument) => {\n hostCalls += 1;\n if (hostCalls > limits.maxHostCalls) {\n fatal = fatal ?? { _tag: \"host-call-limit\", logs: boundedLogs() };\n throw new Error(\"code-mode host-call limit exceeded\");\n }\n let argText;\n try {\n argText = JSON.stringify(argument);\n } catch {}\n if (argText === undefined || utf8(argText) > limits.maxHostCallArgumentBytes) {\n fatal = fatal ?? {\n _tag: \"argument-limit\",\n observed: argText === undefined ? 0 : utf8(argText),\n logs: boundedLogs(),\n };\n throw new Error(\"code-mode host-call argument limit exceeded\");\n }\n const outcome = await host.call({\n namespace,\n method,\n argument: JSON.parse(argText),\n });\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallSuccess\") {\n return outcome.value;\n }\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallFailure\") {\n throw outcome.error;\n }\n fatal = fatal ?? { _tag: \"protocol\", message: \"host returned an unrecognized outcome\" };\n throw new Error(\"code-mode host protocol violation\");\n };\n for (const namespace of config.namespaces) {\n const methods = {};\n for (const method of namespace.methods) {\n methods[method] = makeMethod(namespace.name, method);\n }\n globalThis[namespace.name] = methods;\n }\n\n // program.js is imported statically at the top of this module, so a\n // syntactically invalid program fails the whole harness at load (mapped\n // to a source error by the host). Using a static import keeps this module\n // free of dynamic-import expressions, which single-script Miniflare hosts\n // reject. The isolation boundary does NOT depend on the ordering of this\n // import versus the console/namespace shims installed below: the loaded\n // Worker has globalOutbound: null and no bindings, secrets, or env from\n // the Worker Loader config BEFORE any module in the graph evaluates, so\n // module-level program code has no ambient authority regardless. The\n // shims below are usability wrappers (bounded console, namespace globals),\n // and the accepted program is a single async-function expression whose\n // body runs only when invoked here — after the shims exist.\n const program = programDefault;\n if (typeof program !== \"function\") {\n return { _tag: \"source-not-a-function\", actual: typeof program };\n }\n try {\n const value = await program();\n if (fatal !== undefined) return fatal;\n let text;\n try {\n text = JSON.stringify(value);\n } catch {}\n if (text === undefined) {\n return {\n _tag: \"program-failed\",\n reason: \"non-json-result\",\n thrown: null,\n message: \"The program must return a JSON value\",\n logs: boundedLogs(),\n };\n }\n const resultBytes = utf8(text);\n if (resultBytes > limits.maxResultBytes) {\n return { _tag: \"result-limit\", observed: resultBytes, logs: boundedLogs() };\n }\n return {\n _tag: \"completed\",\n value: JSON.parse(text),\n logs: boundedLogs(),\n hostCalls,\n logBytes,\n resultBytes,\n };\n } catch (cause) {\n if (fatal !== undefined) return fatal;\n return {\n _tag: \"program-failed\",\n reason: cause instanceof Error ? \"threw\" : \"rejected\",\n thrown: safeJson(cause),\n message: safeText(cause),\n logs: boundedLogs(),\n };\n }\n }\n}\n`;\n\nconst BoundedLogs = Schema.Array(Schema.String.check(Schema.isMaxLength(16 * 1024))).check(\n Schema.isMaxLength(4_096),\n);\n\nconst HarnessCompleted = Schema.TaggedStruct(\"completed\", {\n value: Schema.Json,\n logs: BoundedLogs,\n hostCalls: Schema.Natural,\n logBytes: Schema.Natural,\n resultBytes: Schema.Natural,\n});\n\nconst HarnessSourceInvalid = Schema.TaggedStruct(\"source-invalid\", {\n message: Schema.String,\n});\n\nconst HarnessNotAFunction = Schema.TaggedStruct(\"source-not-a-function\", {\n actual: Schema.String,\n});\n\nconst HarnessProgramFailed = Schema.TaggedStruct(\"program-failed\", {\n reason: Schema.Literals([\"threw\", \"rejected\", \"non-json-result\"]),\n thrown: Schema.Json,\n message: Schema.String,\n logs: BoundedLogs,\n});\n\nconst HarnessLogLimit = Schema.TaggedStruct(\"log-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessArgumentLimit = Schema.TaggedStruct(\"argument-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessResultLimit = Schema.TaggedStruct(\"result-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessHostCallLimit = Schema.TaggedStruct(\"host-call-limit\", {\n logs: BoundedLogs,\n});\n\nconst HarnessProtocol = Schema.TaggedStruct(\"protocol\", {\n message: Schema.String,\n});\n\nconst HarnessOutcome = Schema.Union([\n HarnessCompleted,\n HarnessSourceInvalid,\n HarnessNotAFunction,\n HarnessProgramFailed,\n HarnessLogLimit,\n HarnessArgumentLimit,\n HarnessResultLimit,\n HarnessHostCallLimit,\n HarnessProtocol,\n]);\n\nconst HarnessPassConfig = Schema.Struct({\n namespaces: Schema.Array(\n Schema.Struct({\n name: Schema.NonEmptyString,\n methods: Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(64)),\n }),\n ).check(Schema.isMaxLength(32)),\n limits: Schema.Struct({\n maxLogBytes: Schema.Natural,\n maxResultBytes: Schema.Natural,\n maxHostCalls: Schema.Natural,\n maxHostCallArgumentBytes: Schema.Natural,\n }),\n});\n\nconst encodeHarnessPassConfig = Schema.encodeSync(HarnessPassConfig);\nconst encodeJsonPayload = Schema.encodeSync(Schema.fromJsonString(Schema.Json));\nconst decodeJsonPayload = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));\n\nconst decodeHarnessOutcome = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(HarnessOutcome)(value);\n } catch {\n return Option.none<typeof HarnessOutcome.Type>();\n }\n};\n\nconst decodeHostCall = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCall)(value);\n } catch {\n return Option.none<CodeHostCall>();\n }\n};\n\nconst decodeHostCallResult = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCallResult)(value);\n } catch {\n return Option.none<CodeHostCallResult>();\n }\n};\n\n/** Dispose a Cloudflare RPC handle when the runtime supplies its untyped disposal hook. @internal */\nexport const disposeRpcHandle = (handle: unknown): Effect.Effect<void> =>\n Effect.try({\n try: () => {\n if ((typeof handle !== \"object\" && typeof handle !== \"function\") || handle === null) return;\n if (!(Symbol.dispose in handle)) return;\n const dispose = Reflect.get(handle, Symbol.dispose);\n\n if (typeof dispose === \"function\") {\n Reflect.apply(dispose, handle, []);\n }\n },\n catch: (cause) =>\n safeCauseDiagnostic(cause, \"The Cloudflare RPC disposal hook failed without a diagnostic\"),\n }).pipe(\n Effect.catch((diagnostic) =>\n Effect.logWarning(`Cloudflare RPC handle disposal failed: ${diagnostic}`).pipe(\n Effect.ignoreCause,\n ),\n ),\n );\n\n/**\n * Project a host outcome to the plain JSON envelope the harness reads. A\n * `CodeExecutionHost` may return either real `CodeHostCallResult` instances\n * (the substitute and conformance kit) or plain-object equivalents (the Code\n * Mode capability's broker route), so this reads the shared fields rather than\n * `Schema.encodeSync`, which would reject a plain object.\n */\ninterface EncodedHostResultPayload {\n readonly encodedPayload: string;\n readonly resultBytes: number;\n}\n\nconst encodeHostResultPayload = (\n outcome: CodeHostCallResult,\n): EncodedHostResultPayload | undefined => {\n try {\n const payload = outcome._tag === \"CodeHostCallSuccess\" ? outcome.value : outcome.error;\n const encodedPayload = encodeJsonPayload(payload);\n\n return {\n encodedPayload,\n resultBytes: utf8ByteLength(encodedPayload),\n };\n } catch {\n return undefined;\n }\n};\n\nconst utf8ByteLength = (value: string): number => {\n let total = 0;\n\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n\n total += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;\n }\n\n return total;\n};\n\ninterface QueuedHostCall {\n readonly call: CodeHostCall;\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n}\n\ntype HostWork =\n | { readonly _tag: \"call\"; readonly queued: QueuedHostCall }\n | { readonly _tag: \"limit\" };\n\ntype HostDispatchError =\n | CodeExecutionTimeoutError\n | CodeOutputLimitError\n | CodeExecutionProtocolError\n | CodeHostCallLimitError;\n\n/** Reserved global names the harness owns inside the dynamic worker. */\nconst reservedHarnessGlobals = new Set([\"console\"]);\n\nexport interface DynamicWorkerCodeExecutorOptions {\n /** The `worker_loader` binding. */\n readonly loader: WorkerLoader;\n /** Compatibility date for dynamic workers; defaults to `2025-05-01`. */\n readonly compatibilityDate?: string | undefined;\n}\n\nconst makeExecute = (\n options: DynamicWorkerCodeExecutorOptions,\n clock: Clock.Clock,\n): CodeExecutorExecute =>\n Effect.fn(\"DynamicWorkerCodeExecutor.execute\")(function* (request: CodeExecutionRequest) {\n if (request.network._tag !== \"NetworkDisabled\") {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"network\",\n message:\n \"The Dynamic Worker executor denies all egress with globalOutbound: null; an allowlist is not supported in the first slice\",\n });\n }\n const sourceBytes = utf8ByteLength(request.source);\n\n if (sourceBytes > request.limits.maxSourceBytes) {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"oversized\",\n message: `Source is ${sourceBytes} bytes; the request allows ${request.limits.maxSourceBytes}`,\n });\n }\n for (const namespace of request.namespaces) {\n if (reservedHarnessGlobals.has(namespace.name)) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"namespaces\",\n message: `Namespace ${namespace.name} collides with a harness binding`,\n });\n }\n }\n const host = yield* CodeExecutionHost;\n\n // This synchronous clock access is confined to callbacks that must compute a timeout\n // immediately. The Clock service remains the authority, so tests and hosts can replace it.\n const startedAt = clock.monotonicTimeNanosUnsafe();\n const passDeadline = startedAt + Duration.toNanosUnsafe(request.limits.maxWallTime);\n\n const remainingPassWallTime = (): Duration.Duration => {\n const now = clock.monotonicTimeNanosUnsafe();\n\n return Duration.nanos(passDeadline > now ? passDeadline - now : 0n);\n };\n\n let issuedHostCalls = 0;\n let passOpen = true;\n const queuedHostCalls: Array<QueuedHostCall> = [];\n let passFailure: HostDispatchError | undefined;\n\n const failPass = (error: HostDispatchError): void => {\n if (passFailure === undefined) passFailure = error;\n };\n\n const rejectQueuedHostCalls = (reason: Error): void => {\n for (const queued of queuedHostCalls.splice(0)) {\n queued.reject(reason);\n }\n };\n\n const queue = yield* Queue.unbounded<HostWork>();\n\n const deliverHostOutcome = (\n queued: QueuedHostCall,\n outcome: CodeHostCallResult,\n ): Effect.Effect<void, CodeExecutionProtocolError | CodeOutputLimitError> =>\n Effect.gen(function* () {\n const decoded = decodeHostCallResult(outcome);\n\n if (Option.isNone(decoded)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a value outside the CodeHostCallResult schema\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n const encoded = encodeHostResultPayload(decoded.value);\n\n if (encoded === undefined || encoded.resultBytes > request.limits.maxHostCallResultBytes) {\n const error = CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-result\",\n limit: request.limits.maxHostCallResultBytes,\n observed: encoded?.resultBytes ?? 0,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const normalizedPayload = decodeJsonPayload(encoded.encodedPayload);\n\n if (Option.isNone(normalizedPayload)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a result that could not cross the JSON boundary\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n queued.resolve(\n decoded.value._tag === \"CodeHostCallSuccess\"\n ? { _tag: \"CodeHostCallSuccess\", value: normalizedPayload.value }\n : { _tag: \"CodeHostCallFailure\", error: normalizedPayload.value },\n );\n });\n\n // Workers RPC into the loader isolate cannot settle on the fiber blocked\n // in `entrypoint.run()`. A Scope-owned sibling fiber keeps that\n // independence while inheriting the pass Context and dying with the Scope.\n const serveHostCalls = Effect.gen(function* () {\n while (true) {\n const work = yield* Queue.take(queue);\n\n if (work._tag === \"limit\") {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const queued = work.queued;\n\n yield* host.call(queued.call).pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () => {\n const error = CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n });\n\n failPass(error);\n\n return error;\n },\n }),\n Effect.flatMap((outcome) => deliverHostOutcome(queued, outcome)),\n Effect.tapError(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode host call failed\"))),\n ),\n Effect.onInterrupt(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode pass is closing\"))),\n ),\n );\n }\n });\n\n const server = yield* serveHostCalls.pipe(Effect.forkScoped);\n\n const dispatch = (hostCall: unknown): Promise<unknown> => {\n if (!passOpen) {\n return Promise.reject(new Error(\"Code Mode pass is closing\"));\n }\n issuedHostCalls += 1;\n if (issuedHostCalls > request.limits.maxHostCalls) {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n Queue.offerUnsafe(queue, { _tag: \"limit\" });\n\n return Promise.reject(new Error(\"host-call limit exceeded\"));\n }\n const decoded = decodeHostCall(hostCall);\n\n if (Option.isNone(decoded)) {\n return Promise.reject(new TypeError(\"host calls must match the CodeHostCall schema\"));\n }\n\n return new Promise((resolve, reject) => {\n const queued = { call: decoded.value, resolve, reject };\n\n queuedHostCalls.push(queued);\n Queue.offerUnsafe(queue, { _tag: \"call\", queued });\n });\n };\n\n const closeAdmission = Effect.sync(() => {\n passOpen = false;\n rejectQueuedHostCalls(new Error(\"Code Mode pass is closing\"));\n });\n\n yield* Effect.addFinalizer(() => closeAdmission.pipe(Effect.andThen(Fiber.interrupt(server))));\n\n // No `allowExperimental`: the runtime only accepts it when the CALLING\n // worker carries the `experimental` compatibility flag, which deployed\n // consumers cannot set — the option would reject every pass in\n // production. The harness needs no experimental runtime features.\n const workerCode: WorkerLoaderWorkerCode = {\n compatibilityDate: options.compatibilityDate ?? \"2025-05-01\",\n mainModule: \"harness.js\",\n modules: {\n \"harness.js\": HARNESS_MODULE,\n \"program.js\": `export default (\\n${request.source}\\n);`,\n },\n env: {\n CODE_MODE_PASS: encodeHarnessPassConfig({\n namespaces: request.namespaces.map((namespace) => ({\n name: namespace.name,\n methods: namespace.methods,\n })),\n limits: {\n maxLogBytes: request.limits.maxLogBytes,\n maxResultBytes: request.limits.maxResultBytes,\n maxHostCalls: request.limits.maxHostCalls,\n maxHostCallArgumentBytes: request.limits.maxHostCallArgumentBytes,\n },\n }),\n },\n globalOutbound: null,\n ...(request.limits.cpuMillis === undefined\n ? {}\n : {\n limits: {\n cpuMs: request.limits.cpuMillis,\n subRequests: request.limits.maxHostCalls + 8,\n },\n }),\n };\n\n const worker = yield* Effect.acquireRelease(\n Effect.try({\n try: () => options.loader.load(workerCode),\n catch: (cause) => {\n const text = safeCauseMessage(cause, \"The Worker Loader failed without a diagnostic\");\n\n // Blame the program's source ONLY on a genuine compile diagnostic;\n // any other load rejection is an infrastructure start failure, not\n // the model's fault (see classifyWorkerFailure for the same split).\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: `The Worker Loader rejected the pass: ${text}`.slice(0, 8_000),\n cause,\n });\n },\n }),\n disposeRpcHandle,\n );\n\n const entrypoint = yield* Effect.acquireRelease(\n Effect.try({\n try: () => worker.getEntrypoint<CodeModeHarnessEntrypoint>(),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n }),\n disposeRpcHandle,\n );\n\n const rpc = Effect.tryPromise({\n try: () => entrypoint.run(new CodeModePassHostTarget(dispatch)),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n });\n\n const exit = yield* Effect.raceFirst(\n rpc.pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () =>\n CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n }),\n }),\n ),\n Fiber.join(server),\n ).pipe(Effect.exit);\n\n yield* closeAdmission;\n yield* Fiber.interrupt(server);\n if (passFailure !== undefined) {\n return yield* passFailure;\n }\n if (Exit.isFailure(exit)) {\n return yield* Effect.failCause(exit.cause);\n }\n const raw = exit.value;\n const finishedAt = clock.monotonicTimeNanosUnsafe();\n\n const outcome = decodeHarnessOutcome(raw);\n\n if (Option.isNone(outcome)) {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The dynamic worker returned a value outside the harness envelope schema\",\n });\n }\n switch (outcome.value._tag) {\n case \"completed\": {\n return CodeExecutionResult.make({\n implementation: dynamicWorkerImplementation,\n value: outcome.value.value,\n logs: outcome.value.logs,\n resourceUse: CodeExecutionResourceUse.make({\n wallTime: Duration.nanos(finishedAt > startedAt ? finishedAt - startedAt : 0n),\n hostCalls: outcome.value.hostCalls,\n logBytes: outcome.value.logBytes,\n resultBytes: outcome.value.resultBytes,\n }),\n });\n }\n case \"source-invalid\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n case \"source-not-a-function\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"not-a-function\",\n message: `The source expression evaluated to ${outcome.value.actual}; it must evaluate to one async function`,\n });\n }\n case \"program-failed\": {\n return yield* CodeProgramFailedError.make({\n implementation: dynamicWorkerImplementation,\n reason: outcome.value.reason,\n thrown: outcome.value.thrown,\n message: outcome.value.message.slice(0, 8_000),\n logs: outcome.value.logs,\n });\n }\n case \"log-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"logs\",\n limit: request.limits.maxLogBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"argument-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-argument\",\n limit: request.limits.maxHostCallArgumentBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"result-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"result\",\n limit: request.limits.maxResultBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"host-call-limit\": {\n return yield* CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: outcome.value.logs,\n });\n }\n case \"protocol\": {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n }\n });\n\n/**\n * Expected worker-level failures map into the typed union with bounded\n * diagnostics; anything unrecognized stays a start/termination error rather\n * than a fabricated program result.\n */\nconst classifyWorkerFailure = (\n cause: unknown,\n maxWallTime: Duration.Duration,\n):\n | CodeExecutionTimeoutError\n | CodeExecutorTerminatedError\n | CodeExecutorStartError\n | CodeSourceError => {\n const text = safeCauseDiagnostic(cause, \"[unserializable worker failure]\");\n\n // `WorkerLoader.load()` is lazy, so a module-compile error in the generated\n // program surfaces here at first use. Blame the program's source ONLY on a\n // genuine compile diagnostic (a `SyntaxError` or an explicit compile\n // failure) — the fixed harness is valid, so the fault is in program.js. A\n // bare \"failed to start Worker\" without a compile diagnostic is an\n // infrastructure start failure, not the model's fault, so it must NOT be\n // misclassified as a source error.\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n if (/cpu/i.test(text)) {\n return CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"cpu\",\n maxWallTime,\n logs: [],\n });\n }\n if (/failed to start worker/i.test(text)) {\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n cause,\n });\n }\n\n return CodeExecutorTerminatedError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n });\n};\n\n/** Layer building the Dynamic Worker `CodeExecutor` from resolved bindings. */\nexport const dynamicWorkerCodeExecutorLayer = (\n options: DynamicWorkerCodeExecutorOptions,\n): Layer.Layer<CodeExecutor> =>\n Layer.effect(\n CodeExecutor,\n Effect.gen(function* () {\n const clock = yield* Clock.Clock;\n\n return CodeExecutor.of({ execute: makeExecute(options, clock) });\n }),\n );\n\n/** Assemble Code Mode handlers with the isolated Dynamic Worker executor. */\nexport const CloudflareCodeMode = {\n /**\n * Provide the selected tool handlers at construction, where Code Mode captures them.\n * Their errors and remaining dependencies stay visible. The definition still owns the\n * allowlist and limits; the runtime supplies the live Tool broker for each scoped pass.\n */\n layer: <A, E, R, Handlers, HandlerError, HandlerRequirements>(\n definition: { readonly handlers: Layer.Layer<A, E, R> },\n options: DynamicWorkerCodeExecutorOptions & {\n readonly handlers: Layer.Layer<Handlers, HandlerError, HandlerRequirements>;\n },\n ) =>\n definition.handlers.pipe(\n Layer.provide(options.handlers),\n Layer.provide(dynamicWorkerCodeExecutorLayer(options)),\n ),\n};\n","import {\n type MemoryLookup,\n type MemoryReader,\n type MemoryWrite,\n Memory,\n MemoryAccess,\n MemoryDocument,\n MemoryMutationFailpoint,\n MemoryNamespace,\n MemoryNamespaceAddress,\n MemoryRecallLimits,\n MemoryStorageError,\n MemoryWriter,\n type MemoryIndexSearch,\n type SemanticCandidateLimits,\n type SemanticMemoryProfile,\n} from \"@effect-agent/core\";\nimport {\n type DoMemoryStorageLimits,\n type MemoryOwnerAuthorizer,\n decodeMemoryWire,\n defaultDoMemoryStorageLimits,\n defaultMemoryRpcLimits,\n doMemoryStoreLayerWithFailpoints,\n encodeMemoryWire,\n handleMemoryOwnerRequest,\n MemoryOwnerIdentity,\n MemoryOwnerRequest,\n MemoryOwnerResponse,\n MemoryRpcError,\n MemoryRpcLimits,\n type MemoryOwnerFailure,\n} from \"@effect-agent/storage-cloudflare\";\nimport { Principal } from \"@effect-agent/thread\";\nimport { Clock, Context, Effect, Layer, Schema } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nexport interface MemoryObjectRpc extends Rpc.DurableObjectBranded {\n memory(encoded: string): Promise<string>;\n}\n\nexport class MemoryObjectNamespace extends Context.Service<\n MemoryObjectNamespace,\n {\n readonly namespace: DurableObjectNamespace<MemoryObjectRpc>;\n }\n>()(\"@effect-agent/platform-cloudflare/MemoryObjectNamespace\") {}\n\n/** Namespace version and identity are already canonicalized by MemoryNamespace. */\nexport const memoryObjectName = (namespace: MemoryNamespace.Any): string => namespace.address;\n\n/**\n * Effect-native, host-bound memory client. Recall revalidates the entire admitted lookup\n * in one RPC and renders it locally. No retries or per-source splitting occur here.\n * Interrupted callers stop waiting; the owner has its own deadline. A timed-out write\n * may have committed: reconcile by sending the identical operation ID and command.\n */\nconst makeMemoryClient = Effect.fn(\"CloudflareMemoryClient.make\")(function* <\n Namespace extends MemoryNamespace.Any,\n>(\n access: MemoryAccess<Namespace>,\n principal: Principal,\n rpcLimits: MemoryRpcLimits = defaultMemoryRpcLimits,\n) {\n const validated = yield* Schema.decodeUnknownEffect(MemoryRpcLimits)(rpcLimits).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n\n const bound = yield* Schema.decodeUnknownEffect(MemoryAccess.Wire)(access).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n\n principal = yield* Schema.decodeUnknownEffect(Principal)(principal).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n const { namespace } = yield* MemoryObjectNamespace;\n\n const call = Effect.fn(\"CloudflareMemoryClient.call\")(function* (request: MemoryOwnerRequest) {\n const decoded = yield* Schema.decodeUnknownEffect(MemoryOwnerRequest)(request).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n\n const encoded = yield* encodeMemoryWire(MemoryOwnerRequest, decoded, validated.maxRequestBytes);\n\n const raw = yield* Effect.tryPromise({\n try: () =>\n namespace.get(namespace.idFromName(memoryObjectName(bound.namespace))).memory(encoded),\n catch: () => MemoryRpcError.make({ reason: \"unavailable\" }),\n });\n\n const response = yield* decodeMemoryWire(MemoryOwnerResponse, raw, validated.maxResponseBytes);\n\n if (response._tag === \"Failed\") return yield* response.failure;\n if (\n !MemoryNamespace.equals(response.access.namespace, bound.namespace) ||\n response.access.scope !== bound.scope\n )\n return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return response;\n });\n\n const withinDeadline = <A, E, R>(effect: Effect.Effect<A, E, R>, timeoutMillis: number) =>\n effect.pipe(\n Effect.timeoutOrElse({\n duration: timeoutMillis,\n orElse: () => Effect.fail(MemoryRpcError.make({ reason: \"timeout\" })),\n }),\n );\n\n const revalidate = Effect.fn(\"CloudflareMemoryClient.revalidate\")(function* (\n lookup: MemoryLookup,\n limits: MemoryRecallLimits,\n ) {\n limits = yield* Schema.decodeUnknownEffect(MemoryRecallLimits)(limits).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n const timeoutMillis = Math.min(validated.timeoutMillis, limits.timeoutMillis);\n\n return yield* Effect.gen(function* () {\n const response = yield* call({\n _tag: \"Revalidate\",\n version: 1,\n access: bound,\n principal,\n lookup,\n limits,\n deadlineMillis: (yield* Clock.currentTimeMillis) + timeoutMillis,\n });\n\n if (response._tag !== \"Lookup\") return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return response.lookup;\n }).pipe((effect) => withinDeadline(effect, timeoutMillis));\n });\n\n const change = Effect.fn(\"CloudflareMemoryClient.change\")(function* (\n write: MemoryWrite<Namespace>,\n ) {\n if (!MemoryNamespace.equals(write.key.namespace, bound.namespace))\n return yield* MemoryRpcError.make({ reason: \"denied\" });\n\n return yield* Effect.gen(function* () {\n const response = yield* call({\n _tag: \"Change\",\n version: 1,\n access: bound,\n principal,\n write,\n deadlineMillis: (yield* Clock.currentTimeMillis) + validated.timeoutMillis,\n });\n\n if (response._tag !== \"Changed\" || response.document.key.id !== write.key.id)\n return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return yield* MemoryDocument.restore(access.namespace, response.document);\n }).pipe((effect) => withinDeadline(effect, validated.timeoutMillis));\n });\n\n const revalidateSemantic = Effect.fn(\"CloudflareMemoryClient.revalidateSemantic\")(function* (\n found: MemoryIndexSearch<Namespace>,\n profile: SemanticMemoryProfile,\n limits: SemanticCandidateLimits,\n ) {\n return yield* Effect.gen(function* () {\n const response = yield* call({\n _tag: \"RevalidateSemantic\",\n version: 1,\n access: bound,\n principal,\n found,\n profile,\n limits,\n deadlineMillis: (yield* Clock.currentTimeMillis) + validated.timeoutMillis,\n });\n\n if (response._tag !== \"Semantic\") return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return response.result;\n }).pipe((effect) => withinDeadline(effect, validated.timeoutMillis));\n });\n\n /**\n * Revalidate in one owner RPC, then render whole passages within the caller's budget.\n * The bound source is essential: unavailable/stale results and matches that cannot fit\n * fail instead of silently producing empty context. No-match remains successful.\n * The single outcome has sourceId \"memory\". No embedding or candidate search is performed.\n * Use revalidate with Memory.recall for multiple readers sharing one output budget.\n */\n const recall = Effect.fn(\"CloudflareMemoryClient.recall\")(function* (\n lookup: MemoryLookup,\n limits: MemoryRecallLimits,\n estimateTokens?: (text: string) => number,\n ) {\n return yield* Memory.recall(\n [{ id: \"memory\", essential: true, read: revalidate(lookup, limits) }],\n limits,\n estimateTokens,\n );\n });\n\n return { recall, revalidate, revalidateSemantic, change };\n});\n\nexport const CloudflareMemoryClient = {\n /** Bind access and principal using the MemoryObjectNamespace supplied by the application. */\n make: makeMemoryClient,\n /** Use a resolved Worker or Durable Object binding without manual service provisioning. */\n fromBinding: Effect.fn(\"CloudflareMemoryClient.fromBinding\")(function* <\n Namespace extends MemoryNamespace.Any,\n >(\n binding: DurableObjectNamespace<MemoryObjectRpc>,\n options: {\n readonly access: MemoryAccess<Namespace>;\n readonly principal: Principal;\n readonly rpcLimits?: MemoryRpcLimits;\n },\n ) {\n return yield* makeMemoryClient(options.access, options.principal, options.rpcLimits).pipe(\n Effect.provideService(MemoryObjectNamespace, { namespace: binding }),\n );\n }),\n};\n\n/**\n * Optional activity-processor destination. Keeps domain write errors intact; transport,\n * authorization and deadline failures become the existing MemoryStorageError contract.\n * Receipts remain authoritative, including after caller interruption or lost replies.\n */\nexport const cloudflareMemoryWriterLayer = (\n access: MemoryAccess,\n principal: Principal,\n limits: MemoryRpcLimits = defaultMemoryRpcLimits,\n) =>\n Layer.effect(\n MemoryWriter,\n Effect.gen(function* () {\n const client = yield* CloudflareMemoryClient.make(access, principal, limits);\n\n return MemoryWriter.fromAdapter({\n change: (write) =>\n client.change(write).pipe(\n Effect.catchTag(\"MemoryRpcError\", (error) =>\n Effect.fail(\n MemoryStorageError.make({\n operation: `memory RPC ${error.reason}`,\n reason:\n error.reason === \"unavailable\" || error.reason === \"timeout\"\n ? \"unavailable\"\n : \"invalid-input\",\n }),\n ),\n ),\n Effect.catchTag([\"MemoryRecallError\", \"MemoryIndexError\", \"SemanticMemoryError\"], () =>\n Effect.fail(\n MemoryStorageError.make({ operation: \"memory RPC response\", reason: \"corrupt\" }),\n ),\n ),\n ),\n });\n }),\n );\n\ntype OwnerServices = MemoryReader | MemoryWriter | MemoryOwnerAuthorizer | MemoryOwnerIdentity;\n\nexport interface MemoryObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, OwnerServices>\n> {\n memory(encoded: string): Promise<string>;\n}\n\nexport interface MemoryObjectClass {\n new (ctx: globalThis.DurableObjectState, env: Cloudflare.Env): MemoryObjectInstance;\n}\n\n/**\n * Dedicated SQLite owner, independent of Thread lifetimes. The host binds authorization\n * after restoring its namespace definition from MemoryOwnerIdentity. Do not retain\n * cleanup-scoped resources in the host Layer; it lives for the DO incarnation.\n */\nconst makeMemoryObject = <E>(\n host: Layer.Layer<\n MemoryOwnerAuthorizer,\n E,\n MemoryOwnerIdentity | DurableObjectState.DurableObjectState | WorkerEnvironment\n >,\n options: {\n readonly storageLimits?: DoMemoryStorageLimits;\n readonly rpcLimits?: MemoryRpcLimits;\n readonly failpoints?: Layer.Layer<\n MemoryMutationFailpoint,\n never,\n DurableObjectState.DurableObjectState\n >;\n } = {},\n): MemoryObjectClass => {\n const identity = Layer.effect(\n MemoryOwnerIdentity,\n Effect.gen(function* () {\n const state = yield* DurableObjectState.DurableObjectState;\n\n const address = yield* Schema.decodeUnknownEffect(MemoryNamespaceAddress)(\n state.raw.id.name,\n ).pipe(Effect.mapError(() => MemoryRpcError.make({ reason: \"denied\" })));\n\n return { namespace: MemoryNamespace.Any.make({ address }) };\n }),\n );\n\n const store = Layer.unwrap(\n Effect.map(DurableObjectState.DurableObjectState, (state) =>\n doMemoryStoreLayerWithFailpoints(\n state.raw.storage,\n options.storageLimits ?? defaultDoMemoryStorageLimits,\n ),\n ),\n ).pipe(Layer.provide(options.failpoints ?? MemoryMutationFailpoint.layer));\n\n const application = Layer.merge(store, host).pipe(Layer.provideMerge(identity));\n\n const runtime: Layer.Layer<\n OwnerServices,\n E | MemoryOwnerFailure,\n DurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* DurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n yield* Schema.decodeUnknownEffect(MemoryRpcLimits)(\n options.rpcLimits ?? defaultMemoryRpcLimits,\n ).pipe(Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })));\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = { memory: (encoded: string) => handleMemoryOwnerRequest(encoded, options.rpcLimits) };\n\n return EffectCfDurableObject.make<\n OwnerServices,\n E | MemoryOwnerFailure,\n never,\n never,\n typeof rpc\n >(runtime, { rpc });\n};\n\nexport const MemoryObject = {\n /** Build the SQLite Durable Object class with the application's owner authorization Layer. */\n make: makeMemoryObject,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject","#dispatch","EffectCfDurableObject"],"sources":["../src/wake-scheduler.ts","../src/progress-wait.ts","../src/transport.ts","../src/layers.ts","../src/thread-object.ts","../src/code-mode-executor.ts","../src/memory.ts"],"sourcesContent":["import type { ThreadId } from \"@effect-agent/core\";\nimport { makeWakeSubscriptionHub, WakeScheduler } from \"@effect-agent/thread\";\nimport { Effect, Layer, PubSub, Schema, Stream } from \"effect\";\n\nimport { DurableAlarmService } from \"./alarm.ts\";\nimport { ThreadObjectIdentity, ThreadObjectNamespace } from \"./bindings.ts\";\nimport { safeCauseMessage } from \"./boundary.ts\";\n\n/**\n * Bounded in-memory wake buffer for same-incarnation `awaitSettlement` subscribers. Wake\n * hints are droppable by contract (consumers pair every subscription with ledger polls), so\n * a full buffer slides out the oldest hint and an eviction simply loses the buffer — the\n * poll interval and the persisted alarm keep liveness (persistence §14).\n */\nconst WAKE_BUFFER_CAPACITY = 1_024;\n\n/** A remote wake stub call failed; always swallowed and logged (hints are droppable). */\nclass RemoteWakeDropped extends Schema.TaggedError<RemoteWakeDropped>()(\"RemoteWakeDropped\", {\n threadId: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n}) {}\n\n/**\n * The DC `WakeScheduler` (plan §1.4):\n *\n * - `notify(local)` → `setAlarm(now)` — durable, cheap, coalescing (the alarm slot keeps the\n * earliest deadline) — plus a same-incarnation PubSub hint for `awaitSettlement` waiters.\n * - `notify(remote)` → fire-and-forget `wake()` on the owning Object's stub with every error\n * swallowed and logged: hints are droppable, and the target's own alarm/scan pairing (the\n * maintenance pass re-polls unsettled children) guarantees liveness without this call.\n * - `wakes` → the bounded sliding PubSub only. No important state lives in memory: the\n * subscription accelerates waiters within one incarnation and the settlement poll interval\n * is the correctness path.\n */\nexport const cloudflareWakeSchedulerLayer: Layer.Layer<\n WakeScheduler,\n never,\n DurableAlarmService | ThreadObjectIdentity | ThreadObjectNamespace\n> = Layer.effect(WakeScheduler)(\n Effect.gen(function* () {\n const alarm = yield* DurableAlarmService;\n const identity = yield* ThreadObjectIdentity;\n const { namespace } = yield* ThreadObjectNamespace;\n const hints = yield* PubSub.sliding<ThreadId>(WAKE_BUFFER_CAPACITY);\n const progress = yield* makeWakeSubscriptionHub;\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(hints));\n\n const notifyLocal = (threadId: ThreadId) =>\n progress.notify(threadId).pipe(\n Effect.andThen(PubSub.publish(hints, threadId)),\n Effect.andThen(alarm.scheduleNow),\n Effect.catch((error) =>\n // `notify` never fails by contract; a failed alarm write degrades to \"hint lost\"\n // and the pass re-arm (or the next entry point's pre-arm) restores the invariant.\n Effect.logWarning(\"CloudflareWakeScheduler: local alarm wake failed\", error),\n ),\n Effect.asVoid,\n );\n\n const notifyRemote = (threadId: ThreadId) =>\n Effect.tryPromise({\n try: () => namespace.get(namespace.idFromName(threadId)).wake(),\n catch: (cause) =>\n RemoteWakeDropped.make({\n threadId,\n message: safeCauseMessage(cause, \"The remote wake failed without a diagnostic\"),\n cause,\n }),\n }).pipe(\n Effect.catch((error) =>\n Effect.logWarning(`CloudflareWakeScheduler: remote wake of ${threadId} dropped`, error),\n ),\n Effect.asVoid,\n );\n\n return WakeScheduler.of({\n notify: (threadId) =>\n threadId === identity.threadId ? notifyLocal(threadId) : notifyRemote(threadId),\n subscribe: progress.subscribe,\n wakes: Stream.fromPubSub(hints),\n });\n }),\n);\n","import { Context, Deferred, Effect, Layer, Ref, type Scope } from \"effect\";\n\n/** Cancellation tombstones are bounded hints, never durable authority. */\nconst MAX_CANCELLATION_TOMBSTONES = 1_024;\n\ntype ActiveRegistration = ReadonlySet<Deferred.Deferred<void>>;\ntype Registration = ActiveRegistration | \"cancelled\";\ntype Registrations = ReadonlyMap<string, Registration>;\n\n/**\n * Per-incarnation cancellation registry for long-lived progress RPCs. The public runtime owns\n * the actual wake registration; this host-only registry lets an interrupted Worker Effect ask\n * the Object to interrupt its scoped wait before the Worker execution context itself ends.\n */\nexport class ProgressWaitRegistry extends Context.Service<\n ProgressWaitRegistry,\n {\n /** Register a Scope-owned cancellation signal, observing any early cancel tombstone. */\n readonly subscribe: (\n waiterId: string,\n ) => Effect.Effect<Effect.Effect<void>, never, Scope.Scope>;\n /** Cancel a registered waiter, or remember a bounded early cancellation. */\n readonly cancel: (waiterId: string) => Effect.Effect<void>;\n }\n>()(\"@effect-agent/platform-cloudflare/ProgressWaitRegistry\") {\n static readonly layer: Layer.Layer<ProgressWaitRegistry> = Layer.effect(\n ProgressWaitRegistry,\n Effect.gen(function* () {\n const registrations = yield* Ref.make<Registrations>(new Map());\n\n const remove = (waiterId: string, deferred: Deferred.Deferred<void>) =>\n Ref.update(registrations, (current) => {\n const existing = current.get(waiterId);\n\n if (existing === undefined || existing === \"cancelled\" || !existing.has(deferred)) {\n return current;\n }\n const next = new Map(current);\n const active = new Set(existing);\n\n active.delete(deferred);\n if (active.size === 0) {\n next.delete(waiterId);\n } else {\n next.set(waiterId, active);\n }\n\n return next;\n });\n\n const subscribe = Effect.fn(\"ProgressWaitRegistry.subscribe\")(\n (waiterId: string): Effect.Effect<Effect.Effect<void>, never, Scope.Scope> =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<void>();\n\n yield* Effect.addFinalizer(() => remove(waiterId, deferred));\n\n const cancelled = yield* Ref.modify(registrations, (current) => {\n const existing = current.get(waiterId);\n const next = new Map(current);\n\n if (existing === \"cancelled\") {\n return [true, current] as const;\n }\n const active = new Set(existing ?? []);\n\n active.add(deferred);\n next.set(waiterId, active);\n\n return [false, next] as const;\n });\n\n return { cancelled, deferred };\n }).pipe(\n Effect.map(({ cancelled, deferred }) =>\n cancelled ? Effect.void : Deferred.await(deferred),\n ),\n ),\n );\n\n const cancel = Effect.fn(\"ProgressWaitRegistry.cancel\")(function* (waiterId: string) {\n const waiters = yield* Ref.modify(registrations, (current) => {\n const existing = current.get(waiterId);\n const next = new Map(current);\n\n if (existing === undefined) {\n next.set(waiterId, \"cancelled\");\n let tombstones = 0;\n\n for (const registration of next.values()) {\n if (registration === \"cancelled\") tombstones += 1;\n }\n if (tombstones > MAX_CANCELLATION_TOMBSTONES) {\n for (const [id, registration] of next) {\n if (registration !== \"cancelled\") continue;\n next.delete(id);\n break;\n }\n }\n\n return [[], next] as const;\n }\n if (existing === \"cancelled\") return [[], current] as const;\n next.delete(waiterId);\n\n return [[...existing], next] as const;\n });\n\n yield* Effect.forEach(waiters, (waiter) => Deferred.succeed(waiter, undefined), {\n discard: true,\n });\n });\n\n return ProgressWaitRegistry.of({ subscribe, cancel });\n }),\n );\n}\n","import { ThreadPortTransport, portTransportFailure } from \"@effect-agent/storage-cloudflare\";\nimport { Effect, Layer } from \"effect\";\n\nimport { ThreadObjectNamespace } from \"./bindings.ts\";\n\n/**\n * `ThreadPortTransport` over native Durable Object JS RPC (decision D-P6-3): one\n * `portCall(envelope)` on the stub of the Object that owns the addressed Thread\n * (`namespace.idFromName(threadId)` — the identity rule, plan §1.2). The envelopes are\n * already Schema-encoded JSON, so the RPC boundary carries only structured-cloneable values;\n * the protocol module stays transport-agnostic and fetch-with-JSON remains the documented\n * fallback carrier.\n *\n * Every delivery problem — stub construction, RPC rejection, overload, deploy-in-progress —\n * surfaces as `PortTransportError` (preserving the platform stub's own `retryable` signal\n * when present) and NEVER as a fabricated answer: on `resolveAdmission` the routing layer\n * turns exactly this error into `AdmissionIndeterminate` (SUB-031).\n */\nexport const threadPortTransportLayer: Layer.Layer<\n ThreadPortTransport,\n never,\n ThreadObjectNamespace\n> = Layer.effect(ThreadPortTransport)(\n Effect.gen(function* () {\n const { namespace } = yield* ThreadObjectNamespace;\n\n return ThreadPortTransport.of({\n call: (threadId, request) =>\n Effect.tryPromise({\n try: () => namespace.get(namespace.idFromName(threadId)).portCall(request),\n catch: (cause) => portTransportFailure(threadId, cause),\n }).pipe(\n Effect.withSpan(\"CloudflarePortTransport.call\", {\n attributes: { threadId },\n }),\n ),\n });\n }),\n);\n","import { ThreadId } from \"@effect-agent/core\";\nimport type {\n RunContextPreparation,\n RunCostEstimator,\n RunToolFailureObserver,\n} from \"@effect-agent/engine\";\nimport {\n CurrentToolFailureObserver,\n RunContextPreparationPassthrough,\n RunToolAuthorization,\n toolFailureObserverLayer,\n} from \"@effect-agent/engine\";\nimport {\n threadStoreLayer,\n executePortRequest,\n routedThreadStoreLayer,\n routedSubmissionLedgerLayer,\n storageConfigLayer,\n storageFailpointLayer,\n submissionLedgerLayer,\n type DoStorageFailpointHandler,\n type DoStorageInitializationError,\n type DoStorageOptions,\n type DoStorageFailpoint,\n type PortRequest,\n type PortResponse,\n} from \"@effect-agent/storage-cloudflare\";\nimport {\n compileRegistrations,\n DurableAgentRuntime,\n DurableRuntimeConfig,\n DurableRuntimeFailpoint,\n ProducerId,\n operationAuthorizerLayer,\n ToolReconciler,\n type AgentRegistration,\n type ThreadStore,\n type DigestError,\n type DurableRuntimeFailpointHandler,\n type OperationAuthorizerService,\n type ResolvedBinding,\n type SubmissionLedger,\n type WakeScheduler,\n} from \"@effect-agent/thread\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport type { Crypto } from \"effect\";\nimport { Context, Duration, Effect, Layer, Schema } from \"effect\";\n\nimport {\n ThreadMaintenance,\n ThreadMaintenanceFailpoint,\n DurableAlarmService,\n type ThreadMaintenanceFailpointHandler,\n} from \"./alarm.ts\";\nimport {\n ThreadObjectIdentity,\n DurableObjectContext,\n type ThreadObjectNamespace,\n} from \"./bindings.ts\";\nimport {\n CLOUDFLARE_RUNTIME_DEFAULTS,\n CloudflareDurableRuntimeConfig,\n CloudflareDurableRuntimeConfigValue,\n CloudflarePlatformConfigError,\n} from \"./config.ts\";\nimport { ProgressWaitRegistry } from \"./progress-wait.ts\";\nimport { threadPortTransportLayer } from \"./transport.ts\";\nimport { cloudflareWakeSchedulerLayer } from \"./wake-scheduler.ts\";\n\n/**\n * Raw (unvalidated) construction options for `ThreadObject.make`, mirroring\n * `NodeDurableAgentRuntimeOptions`. Optional fields default to the documented production values\n * (`CLOUDFLARE_RUNTIME_DEFAULTS`); everything is schema-decoded into\n * `CloudflareDurableRuntimeConfigValue` before any resource opens (deployment §5 gate 1).\n */\nexport interface CloudflareDurableRuntimeOptions {\n readonly deploymentId: string;\n /** Head of the minted producer identity `{producerPrefix}:{threadId}`. */\n readonly producerPrefix: string;\n /** Milliseconds; default 30s (D5). */\n readonly ownershipLeaseDuration?: number | undefined;\n /** Milliseconds; default 100. */\n readonly alarmBackoffBase?: number | undefined;\n /** Milliseconds; default 5000. */\n readonly alarmBackoffCap?: number | undefined;\n /** Milliseconds; default 1000. Bounds every alarm re-arm delay. */\n readonly wakeScanInterval?: number | undefined;\n /** Milliseconds; default 500. */\n readonly settlementPollInterval?: number | undefined;\n /** Milliseconds; default 10000. */\n readonly leaseRenewalInterval?: number | undefined;\n /** Milliseconds; default 500. */\n readonly abortPollInterval?: number | undefined;\n /** Deployment-owned pricing authority used by durable cost budgets and settlements. */\n readonly estimateCostMicrousd?: RunCostEstimator | undefined;\n /** Closed trusted Tool failure reporting. Omission masks ambient observers at construction. */\n readonly toolFailureObserver?: RunToolFailureObserver | undefined;\n /** Milliseconds; default 25. */\n readonly observationPollInterval?: number | undefined;\n /** Bytes; default just under the 2 MB platform value limit. */\n readonly maxStoredValueBytes?: number | undefined;\n /** Default false. */\n readonly verifyOnOpen?: boolean | undefined;\n /** Nonterminal Submissions per lane before admission refuses; default 256. */\n readonly maxQueueDepthPerLane?: number | undefined;\n /** Encoded input bytes per Submission; default = the stored-value bound. */\n readonly maxInputBytes?: number | undefined;\n /** `ctx.storage.sql.databaseSize` ceiling at admission; default 9 GB (10 GB platform cap). */\n readonly maxDatabaseBytes?: number | undefined;\n /**\n * Durable Object storage fault injection (`ledger:*` / `append:*` locations). Handlers are\n * constructed per incarnation WITH the live `DurableObjectState`, so eviction harnesses can\n * map an armed hit to `ctx.abort()` — the platform's real failure mode. Default none.\n */\n readonly storageFailpoint?: ((ctx: DurableObjectState) => DoStorageFailpointHandler) | undefined;\n /** Coordinator fault injection (`submit:*` / `terminalize:*` locations); default none. */\n readonly runtimeFailpoint?:\n | ((ctx: DurableObjectState) => DurableRuntimeFailpointHandler)\n | undefined;\n /** Thread-maintenance generation/alarm fault injection; default none. */\n readonly maintenanceFailpoint?:\n | ((ctx: DurableObjectState) => ThreadMaintenanceFailpointHandler)\n | undefined;\n /** Host-supplied fail-closed authorization policy; defaults to service possession. */\n readonly operationAuthorizer?: OperationAuthorizerService | undefined;\n /**\n * Reconciliation policy consulted for open ordinary Tool Calls before an Unknown Outcome\n * is recorded (durability §10, DUR-009). Defaults to the fail-closed\n * `ToolReconciler.uncertain`.\n */\n readonly toolReconciler?: Layer.Layer<ToolReconciler> | undefined;\n}\n\n/** Services supplied before the application graph is built, including its dependencies. */\nexport type CloudflareBootstrapServices =\n | CloudflareDurableRuntimeConfig\n | ThreadObjectIdentity\n | DurableRuntimeConfig\n | Crypto.Crypto\n | DoStorageFailpoint\n | DurableRuntimeFailpoint\n | ThreadMaintenanceFailpoint\n | RunContextPreparation\n | RunToolAuthorization\n | ToolReconciler;\n\n/** Every construction failure of the assembled Cloudflare durable runtime stack. */\nexport type CloudflareDurableRuntimeInitializationError =\n | CloudflarePlatformConfigError\n | DigestError\n | DoStorageInitializationError;\n\n/** The services `ThreadObject.layer` provides. */\nexport type CloudflareDurableRuntimeServices =\n | DurableAgentRuntime\n | SubmissionLedger\n | ThreadStore\n | WakeScheduler\n | DurableAlarmService\n | ThreadMaintenance\n | ThreadObjectPorts\n | ProgressWaitRegistry;\n\n/**\n * Owner-side execution port for a `portCall` request the wire endpoint has already decoded.\n * It executes against THIS Object's LOCAL port facets — never the routed decorators, so a\n * request cannot bounce between Objects — and returns the typed response for the endpoint to\n * encode.\n */\nexport class ThreadObjectPorts extends Context.Service<\n ThreadObjectPorts,\n {\n readonly handle: (request: PortRequest) => Effect.Effect<PortResponse>;\n }\n>()(\"@effect-agent/platform-cloudflare/ThreadObjectPorts\") {}\n\nconst decodeConfigValue = Schema.decodeUnknownEffect(CloudflareDurableRuntimeConfigValue);\nconst decodeThreadId = Schema.decodeUnknownEffect(ThreadId);\nconst decodeProducerId = Schema.decodeUnknownEffect(ProducerId);\n\nconst configFromOptions = (\n options: CloudflareDurableRuntimeOptions,\n): Effect.Effect<CloudflareDurableRuntimeConfigValue, CloudflarePlatformConfigError> =>\n decodeConfigValue({\n deploymentId: options.deploymentId,\n producerPrefix: options.producerPrefix,\n ownershipLeaseDuration:\n options.ownershipLeaseDuration ?? CLOUDFLARE_RUNTIME_DEFAULTS.ownershipLeaseDuration,\n alarmBackoffBase: options.alarmBackoffBase ?? CLOUDFLARE_RUNTIME_DEFAULTS.alarmBackoffBase,\n alarmBackoffCap: options.alarmBackoffCap ?? CLOUDFLARE_RUNTIME_DEFAULTS.alarmBackoffCap,\n wakeScanInterval: options.wakeScanInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.wakeScanInterval,\n settlementPollInterval:\n options.settlementPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.settlementPollInterval,\n leaseRenewalInterval:\n options.leaseRenewalInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.leaseRenewalInterval,\n abortPollInterval: options.abortPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.abortPollInterval,\n observationPollInterval:\n options.observationPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.observationPollInterval,\n maxStoredValueBytes:\n options.maxStoredValueBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxStoredValueBytes,\n verifyOnOpen: options.verifyOnOpen ?? CLOUDFLARE_RUNTIME_DEFAULTS.verifyOnOpen,\n limits: {\n maxQueueDepthPerLane:\n options.maxQueueDepthPerLane ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxQueueDepthPerLane,\n maxInputBytes: Math.min(\n options.maxInputBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxInputBytes,\n options.maxStoredValueBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxStoredValueBytes,\n ),\n maxDatabaseBytes: options.maxDatabaseBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxDatabaseBytes,\n },\n }).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `Invalid Cloudflare durable runtime configuration: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/**\n * The Thread this Object owns, from the Object identity rule (plan §1.2): Thread\n * Objects are addressed exclusively by `idFromName(threadId)`, so `ctx.id.name` IS the\n * Thread ID. An unnamed Object (from `newUniqueId`) is a deployment error, not a lane.\n */\nconst threadIdFromState = (\n ctx: DurableObjectState,\n): Effect.Effect<ThreadId, CloudflarePlatformConfigError> =>\n ctx.id.name === undefined\n ? Effect.fail(\n CloudflarePlatformConfigError.make({\n message:\n \"This Durable Object was not created via idFromName(threadId); Thread \" +\n \"Objects must be addressed by their Thread identity (plan §1.2).\",\n }),\n )\n : decodeThreadId(ctx.id.name).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `The Durable Object name is not a valid ThreadId: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/**\n * Validate deployment settings and derive services before building application dependencies.\n * The native class factory builds this Layer inside its constructor gate. Custom Effect hosts\n * can provide it around the complete application Layer with the native context already supplied.\n */\nexport const layerConfig = (\n options: CloudflareDurableRuntimeOptions,\n): Layer.Layer<CloudflareBootstrapServices, CloudflarePlatformConfigError, DurableObjectContext> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const config = yield* configFromOptions(options);\n const threadId = yield* threadIdFromState(ctx);\n\n const producerId = yield* decodeProducerId(`${config.producerPrefix}:${threadId}`).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `The minted producer identity is invalid: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n return Layer.mergeAll(\n Layer.succeed(CloudflareDurableRuntimeConfig, config),\n Layer.succeed(ThreadObjectIdentity, { threadId, producerId }),\n DurableRuntimeConfig.layer({\n deploymentId: config.deploymentId,\n producerId,\n settlementPollInterval: Duration.millis(config.settlementPollInterval),\n leaseRenewalInterval: Duration.millis(config.leaseRenewalInterval),\n abortPollInterval: Duration.millis(config.abortPollInterval),\n ...(options.estimateCostMicrousd === undefined\n ? {}\n : { estimateCostMicrousd: options.estimateCostMicrousd }),\n }),\n BrowserCrypto.layer,\n storageFailpointLayer({ storage: ctx.storage, failpoint: options.storageFailpoint?.(ctx) }),\n options.runtimeFailpoint === undefined\n ? DurableRuntimeFailpoint.layer\n : Layer.succeed(DurableRuntimeFailpoint, { hit: options.runtimeFailpoint(ctx) }),\n options.maintenanceFailpoint === undefined\n ? ThreadMaintenanceFailpoint.layer\n : Layer.succeed(ThreadMaintenanceFailpoint, {\n hit: options.maintenanceFailpoint(ctx),\n }),\n options.toolReconciler ?? ToolReconciler.uncertain,\n options.operationAuthorizer === undefined\n ? Layer.empty\n : operationAuthorizerLayer(options.operationAuthorizer),\n options.toolFailureObserver === undefined\n ? Layer.succeed(CurrentToolFailureObserver, undefined)\n : toolFailureObserverLayer(options.toolFailureObserver),\n RunContextPreparationPassthrough,\n RunToolAuthorization.allowAll,\n );\n }),\n );\n\n/**\n * Register typed Agents and version declarations. Hashing and dependency capture happen in\n * this Layer's Scope, after application Layers have been provided. Every Agent's instruction,\n * Tool, Schema, and model requirements remain visible until satisfied by Layer composition.\n * Use Layer.unwrap for registration values that need effectful application setup.\n */\nexport const layer = <const Entries extends ReadonlyArray<AgentRegistration>>(\n registrations: Entries,\n) => Layer.unwrap(Effect.map(compileRegistrations(registrations), layerFromBindings));\n\n/**\n * Assemble the durable runtime from already-resolved Agent Bindings.\n * Use `ThreadObject.layer` to compile typed Agent registrations instead.\n * Supply host services through `ThreadObject.make` or `ThreadObject.layerConfig` and\n * the Durable Object context and namespace Layers when composing a custom host.\n */\nexport const layerFromBindings = (\n bindings: ReadonlyArray<ResolvedBinding>,\n): Layer.Layer<\n CloudflareDurableRuntimeServices,\n DoStorageInitializationError,\n DurableObjectContext | ThreadObjectNamespace | CloudflareBootstrapServices\n> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const config = yield* CloudflareDurableRuntimeConfig;\n const { threadId } = yield* ThreadObjectIdentity;\n\n const storageOptions: DoStorageOptions = {\n storage: ctx.storage,\n observationPollInterval: config.observationPollInterval,\n ownershipLeaseDuration: config.ownershipLeaseDuration,\n maxStoredValueBytes: config.maxStoredValueBytes,\n verifyOnOpen: config.verifyOnOpen,\n };\n\n const infrastructure = Layer.mergeAll(\n storageConfigLayer(storageOptions),\n SqliteClient.layer({ storage: ctx.storage }),\n );\n\n // The same local ports serve routed decorators and owner-side RPC execution.\n // The RPC executor must never receive routed ports and bounce requests between Objects.\n const localPorts = Layer.mergeAll(threadStoreLayer, submissionLedgerLayer).pipe(\n Layer.provide(infrastructure),\n );\n\n const portsEndpointLayer = Layer.effect(ThreadObjectPorts)(\n Effect.gen(function* () {\n const local = yield* Effect.context<SubmissionLedger | ThreadStore>();\n\n return ThreadObjectPorts.of({\n handle: (request) => executePortRequest(request).pipe(Effect.provide(local)),\n });\n }),\n ).pipe(Layer.provide(localPorts));\n\n const routedPorts = Layer.mergeAll(\n routedSubmissionLedgerLayer({ localThreadId: threadId }),\n routedThreadStoreLayer({ localThreadId: threadId }),\n ).pipe(Layer.provide(localPorts), Layer.provide(threadPortTransportLayer));\n\n const base = Layer.mergeAll(DurableAlarmService.layer, ProgressWaitRegistry.layer);\n\n const runtimeStack = DurableAgentRuntime.layerWithBindings(bindings).pipe(\n Layer.provideMerge(routedPorts),\n Layer.provideMerge(cloudflareWakeSchedulerLayer),\n Layer.provideMerge(base),\n );\n\n return Layer.mergeAll(\n runtimeStack,\n ThreadMaintenance.layer.pipe(Layer.provide(runtimeStack)),\n portsEndpointLayer,\n );\n }),\n );\n","import type { AgentId } from \"@effect-agent/core\";\nimport { SubmissionId } from \"@effect-agent/core\";\nimport {\n decodePortRequest,\n encodePortResponse,\n type PortRequest,\n} from \"@effect-agent/storage-cloudflare\";\nimport {\n AppendConflict,\n ThreadNotMaterialized,\n ThreadRead,\n ThreadStore,\n ThreadStoreError,\n DigestError,\n DurableAgentRuntime,\n DurableRuntimeFailpointError,\n FenceRejected,\n IntegrityReport,\n LedgerError,\n ObligationReport,\n ObligationThresholds,\n OperationAuthorizationRequest,\n OperationAuthorizer,\n OperationDenied,\n OwnershipLost,\n PersistedJson,\n RecoveryExplanation,\n RecoveryReport,\n RetryCommand,\n RetryRefused,\n RunJournalError,\n SettlementConflict,\n SubmissionLedger,\n SubmissionLookupByKey,\n WakeScheduler,\n type DurableSubmitAgent,\n} from \"@effect-agent/thread\";\nimport { Effect, Layer, Option, Schema, Stream } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectState as EffectCfDurableObjectState,\n WorkerEnvironment,\n} from \"effect-cf\";\n\nimport {\n ThreadMaintenance,\n DurableAlarmError,\n DurableAlarmService,\n type MaintenancePassFailure,\n} from \"./alarm.ts\";\nimport {\n ThreadObjectIdentity,\n DurableObjectContext,\n ThreadObjectNamespace,\n threadNamespaceFromEnv,\n type CloudflareBindingError,\n} from \"./bindings.ts\";\nimport {\n AbortRecorded,\n ApprovalRecorded,\n HostFailed,\n HostProtocolError,\n ObservedPage,\n ProgressObserved,\n ProgressCancelled,\n SettlementReached,\n SubmitSucceeded,\n UnknownResolutionRecorded,\n boundHostDiagnostic,\n decodeAbortCommand,\n decodeAwaitProgressRequest,\n decodeCancelProgressRequest,\n decodeApprovalDecisionCommand,\n decodeObservePageRequest,\n decodeReceipt,\n decodeSubmitRequest,\n decodeUnknownResolutionCommand,\n encodeHostResponse,\n type HostFailure,\n type HostResponse,\n} from \"./client.ts\";\nimport { AdmissionLimitExceeded, CloudflareDurableRuntimeConfig } from \"./config.ts\";\nimport {\n layerConfig,\n ThreadObjectPorts,\n type CloudflareDurableRuntimeInitializationError,\n type CloudflareDurableRuntimeOptions,\n type CloudflareDurableRuntimeServices,\n type CloudflareBootstrapServices,\n} from \"./layers.ts\";\nimport { ProgressWaitRegistry } from \"./progress-wait.ts\";\n\nexport {\n layer,\n layerConfig,\n type CloudflareDurableRuntimeOptions as RuntimeOptions,\n type CloudflareDurableRuntimeServices as Services,\n type CloudflareDurableRuntimeInitializationError as InitializationError,\n type CloudflareBootstrapServices as BootstrapServices,\n} from \"./layers.ts\";\n\n/**\n * `ThreadObject.make(application, options)` — the Thread Durable Object\n * (plan §1.4,\n * D-P6-1): a factory returning a class that applications export from their Worker entry.\n * One SQLite-backed Object per Thread is the serialized owner (durability §6); the\n * Object never runs `runResolvedWorker`'s infinite loop — each ingress event or alarm runs\n * ONE bounded `runRecovery` + `processThreadResolved` pass, and the persisted alarm\n * (the single multiplexed slot, D-P6-2) finishes accepted work across evictions WITHOUT any\n * incoming request.\n *\n * Constructor gate (`blockConcurrencyWhile`) is LOCAL-ONLY: schema migration and the\n * exact-version check, configuration decode, and the defensive ensure-alarm half of the\n * alarm invariant. It deliberately does NOT run the recovery pass: parent recovery can\n * require child-Object reads and vice versa, and two Objects blocked in constructor gates\n * awaiting each other's RPC would deadlock (plan §1.4). Instead every pass runs\n * `runRecovery` BEFORE any claim, so reconciliation still strictly precedes new work.\n */\n\n/** Construction options for one deployed Thread Object class. */\nexport interface Options<\n ApplicationServices = never,\n EventServices = never,\n EventLayerError = never,\n> extends CloudflareDurableRuntimeOptions {\n /** Accept transient native RPC tracing through effect-cf; disabled by default. */\n readonly rpcTracing?: boolean;\n /**\n * Name of the Worker `env` binding carrying THIS class's `DurableObjectNamespace` — the\n * Object's route back to sibling Thread Objects for the WP2 cross-Object port calls\n * and remote wakes (DEPLOY-010: the binding enters through a Layer, never ambiently).\n */\n readonly namespaceBinding: string;\n /** Acquired and finalized per native event, with access to the complete application runtime. */\n readonly eventLayer?: Layer.Layer<\n EventServices,\n EventLayerError,\n | RuntimeServices\n | ApplicationServices\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n >;\n}\n\ntype EndpointServices =\n | CloudflareDurableRuntimeServices\n | CloudflareBootstrapServices\n | DurableObjectContext;\ntype RuntimeServices = EndpointServices | ThreadObjectNamespace;\ntype ThreadObjectInitializationError =\n | CloudflareDurableRuntimeInitializationError\n | CloudflareBindingError\n | MaintenancePassFailure;\n\n/** Classify only a decoded port request so new protocol members cannot bypass pre-arming. */\nconst isMutatingPortRequest = (request: PortRequest): boolean => {\n switch (request._tag) {\n case \"LedgerAdmit\":\n case \"LedgerMarkReady\":\n case \"LedgerRequestAbort\":\n case \"LedgerRecordChildSettled\":\n case \"StoreMaterialize\":\n case \"StoreAppend\":\n return true;\n case \"LedgerLookup\":\n case \"LedgerResolveAdmission\":\n case \"StoreReadPage\":\n case \"StoreInspectTail\":\n case \"StoreExport\":\n return false;\n }\n request satisfies never;\n\n return false;\n};\n\n/** The literal encoded `PortFailed(PortProtocolError)` fallback (same shape as WP2's). */\nconst encodedPortProtocolFailure = (message: string): unknown => ({\n _tag: \"PortFailed\",\n failure: { _tag: \"PortProtocolError\", message: boundHostDiagnostic(message) },\n});\n\nconst protocolFailure = (context: string) => (error: { readonly message: string }) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`${context}: ${error.message}`),\n });\n\n/** Fold one endpoint's typed failures into the uniform `HostResponse` envelope. */\nconst respond = <Result extends HostResponse, Failure extends HostFailure>(\n effect: Effect.Effect<Result, Failure, EndpointServices>,\n): Effect.Effect<HostResponse, never, EndpointServices> =>\n effect.pipe(\n Effect.map((result): HostResponse => result),\n Effect.catch((failure) => Effect.succeed<HostResponse>(HostFailed.make({ failure }))),\n );\n\n/** Encode the response envelope; an unencodable response degrades to a protocol failure. */\nconst encodeResponse = (response: HostResponse): Effect.Effect<unknown> =>\n encodeHostResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed<unknown>({\n _tag: \"HostFailed\",\n failure: {\n _tag: \"HostProtocolError\",\n message: boundHostDiagnostic(`The host response could not be encoded: ${error.message}`),\n },\n }),\n ),\n );\n\nconst utf8Bytes = (value: PersistedJson): number =>\n new TextEncoder().encode(JSON.stringify(value)).length;\n\n/**\n * The admission-limits gate, BEFORE `runtime.submit` touches the ledger (exit gate\n * \"resource limits are checked before admission\"; DEPLOY-007). A replayed idempotency key is\n * exempt: its accepted-work obligation already exists, and returning the original Receipt\n * consumes no new quota. Refusals are typed `AdmissionLimitExceeded` and nothing is written.\n */\nconst gateAdmissionLimits = Effect.fn(\"ThreadObject.gateAdmissionLimits\")(function* (request: {\n readonly principal: SubmissionLookupByKey[\"principal\"];\n readonly idempotencyKey: SubmissionLookupByKey[\"idempotencyKey\"];\n readonly inputPayload: PersistedJson;\n}) {\n const identity = yield* ThreadObjectIdentity;\n const config = yield* CloudflareDurableRuntimeConfig;\n const ledger = yield* SubmissionLedger;\n const { ctx } = yield* DurableObjectContext;\n\n const existing = yield* ledger.lookup(\n SubmissionLookupByKey.make({\n threadId: identity.threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n }),\n );\n\n if (Option.isSome(existing)) return;\n\n const inputBytes = utf8Bytes(request.inputPayload);\n\n if (inputBytes > config.limits.maxInputBytes) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"input-bytes\",\n actual: inputBytes,\n maximum: config.limits.maxInputBytes,\n });\n }\n\n // One Thread per Object (durability §5): the local scan IS this lane's queue.\n const nonterminal = yield* Stream.runCollect(ledger.scanNonterminal);\n\n if (nonterminal.length >= config.limits.maxQueueDepthPerLane) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"queue-depth\",\n actual: nonterminal.length,\n maximum: config.limits.maxQueueDepthPerLane,\n });\n }\n\n const databaseBytes = yield* Effect.sync(() => ctx.storage.sql.databaseSize);\n\n if (databaseBytes > config.limits.maxDatabaseBytes) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"database-bytes\",\n actual: databaseBytes,\n maximum: config.limits.maxDatabaseBytes,\n });\n }\n});\n\n/**\n * The submit-capable projection of an Agent Binding on the OBJECT side: the input arrived\n * already encoded through the real input schema on the Worker side (`client.ts`), so the\n * Object admits the canonical `PersistedJson` payload as-is; the resolved Binding re-derives\n * everything else from the stored `(agentId, agentDigests)` at claim time (SUB-023).\n */\nconst passthroughSubmitAgent = (agentId: AgentId): DurableSubmitAgent<typeof PersistedJson> => ({\n definition: {\n id: agentId,\n input: PersistedJson,\n },\n});\n\nconst submitEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeSubmitRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The submit request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n\n yield* gateAdmissionLimits(request);\n\n // Alarm invariant: the generation + alarm commit BEFORE the admission, and maintenance\n // cannot acknowledge that generation until this mutation leaves its public RPC seam.\n const receipt = yield* maintenance.withMutation(\n runtime.submit(passthroughSubmitAgent(request.agentId), request.inputPayload, {\n threadId: identity.threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n definitions: request.definitions,\n }),\n );\n\n return SubmitSucceeded.make({ receipt });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst awaitSettlementEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeReceipt(encoded).pipe(\n Effect.mapError(protocolFailure(\"The receipt could not be decoded\")),\n Effect.flatMap((receipt) =>\n Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n const settlement = yield* runtime.awaitSettlement(receipt);\n\n return SettlementReached.make({ settlement });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst awaitProgressEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAwaitProgressRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The progress request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n const registry = yield* ProgressWaitRegistry;\n\n yield* Effect.scoped(\n Effect.gen(function* () {\n const cancelled = yield* registry.subscribe(request.waiterId);\n\n yield* Effect.raceFirst(\n runtime.awaitProgress(identity.threadId, request.afterSequence),\n cancelled,\n );\n }),\n );\n\n return ProgressObserved.make();\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst cancelProgressEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeCancelProgressRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The progress cancellation could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const registry = yield* ProgressWaitRegistry;\n\n yield* registry.cancel(request.waiterId);\n\n return ProgressCancelled.make();\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst observePageEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeObservePageRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The observe request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const store = yield* ThreadStore;\n // The same fail-closed authorization seam the runtime's `observe` consults (P7 WP1);\n // the default reference preserves the possession behavior.\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"observe\",\n threadId: identity.threadId,\n }),\n );\n\n const records = yield* Stream.runCollect(\n store.read(\n ThreadRead.make({\n threadId: identity.threadId,\n ...(request.afterSequence === undefined\n ? {}\n : { afterSequence: request.afterSequence }),\n limit: request.limit,\n }),\n ),\n );\n\n return ObservedPage.make({ records: [...records] });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst abortEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAbortCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The abort command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.abort(command));\n\n return AbortRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst resolveApprovalEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeApprovalDecisionCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The approval command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.resolveApproval(command));\n\n return ApprovalRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst resolveUnknownEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeUnknownResolutionCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The resolution command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.resolveUnknown(command));\n\n return UnknownResolutionRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\n// ---------------------------------------------------------------------------\n// P7 administrative entry points (plan §3): explain/verify/retry/obligations over the SAME\n// envelope discipline as the host protocol — closed request/response Schema unions, typed\n// failures that re-decode to identical tags, protocol anomalies answered typed. The envelopes\n// live here (not `client.ts`) because no Worker-side client consumption exists yet; `wake`\n// already exists as the `wake()` entry point.\n// ---------------------------------------------------------------------------\n\n/** Explain one Submission (`submissionId` present) or every nonterminal lane member. */\nexport class AdminExplainRequest extends Schema.Class<AdminExplainRequest>(\n \"@effect-agent/platform-cloudflare/AdminExplainRequest\",\n)({\n submissionId: Schema.optionalKey(SubmissionId),\n}) {}\n\n/** Verify carries no parameters — the addressed Object IS the lane. */\nexport class AdminVerifyRequest extends Schema.Class<AdminVerifyRequest>(\n \"@effect-agent/platform-cloudflare/AdminVerifyRequest\",\n)({}) {}\n\n/** Every typed failure of the four admin entry points, plus the protocol's own errors. */\nexport const AdminFailure = Schema.Union([\n OperationDenied,\n RetryRefused,\n LedgerError,\n RunJournalError,\n DigestError,\n OwnershipLost,\n SettlementConflict,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n DurableRuntimeFailpointError,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nexport type AdminFailure = typeof AdminFailure.Type;\n\nexport class ExplainedRecovery extends Schema.TaggedClass<ExplainedRecovery>(\n \"@effect-agent/platform-cloudflare/ExplainedRecovery\",\n)(\"ExplainedRecovery\", {\n explanations: Schema.Array(RecoveryExplanation).check(Schema.isMaxLength(1_024)),\n}) {}\n\nexport class VerifiedIntegrity extends Schema.TaggedClass<VerifiedIntegrity>(\n \"@effect-agent/platform-cloudflare/VerifiedIntegrity\",\n)(\"VerifiedIntegrity\", {\n report: IntegrityReport,\n}) {}\n\nexport class RetryExecuted extends Schema.TaggedClass<RetryExecuted>(\n \"@effect-agent/platform-cloudflare/RetryExecuted\",\n)(\"RetryExecuted\", {\n report: RecoveryReport,\n}) {}\n\nexport class ObligationsScanned extends Schema.TaggedClass<ObligationsScanned>(\n \"@effect-agent/platform-cloudflare/ObligationsScanned\",\n)(\"ObligationsScanned\", {\n report: ObligationReport,\n}) {}\n\n/** The admin entry point failed TYPED on the Object; the failure re-decodes verbatim. */\nexport class AdminFailed extends Schema.TaggedClass<AdminFailed>(\n \"@effect-agent/platform-cloudflare/AdminFailed\",\n)(\"AdminFailed\", {\n failure: AdminFailure,\n}) {}\n\n/** The uniform answer of one admin entry point. Callers narrow by the tag their call implies. */\nexport const AdminResponse = Schema.Union([\n ExplainedRecovery,\n VerifiedIntegrity,\n RetryExecuted,\n ObligationsScanned,\n AdminFailed,\n]);\n\nexport type AdminResponse = typeof AdminResponse.Type;\n\nexport const decodeAdminExplainRequest = Schema.decodeUnknownEffect(AdminExplainRequest);\nexport const decodeAdminVerifyRequest = Schema.decodeUnknownEffect(AdminVerifyRequest);\nexport const decodeRetryCommand = Schema.decodeUnknownEffect(RetryCommand);\nexport const decodeObligationThresholds = Schema.decodeUnknownEffect(ObligationThresholds);\nexport const encodeAdminResponse = Schema.encodeEffect(AdminResponse);\nexport const decodeAdminResponse = Schema.decodeUnknownEffect(AdminResponse);\n\n/** Fold one admin endpoint's typed failures into the uniform `AdminResponse` envelope. */\nconst respondAdmin = <Result extends AdminResponse, Failure extends AdminFailure>(\n effect: Effect.Effect<Result, Failure, EndpointServices>,\n): Effect.Effect<AdminResponse, never, EndpointServices> =>\n effect.pipe(\n Effect.map((result): AdminResponse => result),\n Effect.catch((failure) => Effect.succeed<AdminResponse>(AdminFailed.make({ failure }))),\n );\n\n/** Encode the admin response envelope; an unencodable response degrades to a protocol failure. */\nconst encodeAdminResponseTotal = (response: AdminResponse): Effect.Effect<unknown> =>\n encodeAdminResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed<unknown>({\n _tag: \"AdminFailed\",\n failure: {\n _tag: \"HostProtocolError\",\n message: boundHostDiagnostic(`The admin response could not be encoded: ${error.message}`),\n },\n }),\n ),\n );\n\nconst explainEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAdminExplainRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The explain request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n\n const explanations =\n request.submissionId === undefined\n ? yield* runtime.explainThread(identity.threadId)\n : [yield* runtime.explain(request.submissionId)];\n\n return ExplainedRecovery.make({ explanations });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst verifyEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAdminVerifyRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The verify request could not be decoded\")),\n Effect.flatMap(() =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n const report = yield* runtime.verify(identity.threadId);\n\n return VerifiedIntegrity.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst retryEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeRetryCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The retry command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n // Retry may repair durable state, so its generation + alarm commit before the mutation.\n const report = yield* maintenance.withMutation(runtime.retry(command));\n\n return RetryExecuted.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst obligationsEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeObligationThresholds(encoded).pipe(\n Effect.mapError(protocolFailure(\"The obligation thresholds could not be decoded\")),\n Effect.flatMap((thresholds) =>\n Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n const report = yield* runtime.scanObligations(thresholds);\n\n return ObligationsScanned.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\n/**\n * Owner-side `portCall`: wrap a mutating envelope in the same pre-armed generation protocol as\n * public RPC (a routed mutation committed by THIS Object must already carry the alarm that will\n * finish it), execute on the LOCAL facets (never the routed decorators), then arm an immediate\n * alarm so the mutated lane is processed promptly. Protocol anomalies answer\n * `PortFailed(PortProtocolError)`.\n */\nconst portCallEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n Effect.gen(function* () {\n const ports = yield* ThreadObjectPorts;\n const maintenance = yield* ThreadMaintenance;\n const alarm = yield* DurableAlarmService;\n\n const decoded = yield* decodePortRequest(encoded).pipe(\n Effect.map((request) => ({ _tag: \"success\" as const, request })),\n Effect.catch((error) => Effect.succeed({ _tag: \"failure\" as const, message: error.message })),\n );\n\n if (decoded._tag === \"failure\") {\n return encodedPortProtocolFailure(\n `The port request could not be decoded: ${decoded.message}`,\n );\n }\n const mutating = isMutatingPortRequest(decoded.request);\n\n const handled = yield* (\n mutating\n ? maintenance.withMutation(ports.handle(decoded.request))\n : ports.handle(decoded.request)\n ).pipe(Effect.exit);\n\n if (handled._tag === \"Failure\") {\n // Without the committed generation/alarm the invariant cannot be promised; refuse before\n // the port mutation runs. `ports.handle` itself is total, so this is the maintenance error.\n return encodedPortProtocolFailure(\n \"The owner Object could not arm its maintenance alarm before the mutation.\",\n );\n }\n\n const response = yield* encodePortResponse(handled.value).pipe(\n Effect.catch((error) =>\n Effect.succeed(\n encodedPortProtocolFailure(`The port response could not be encoded: ${error.message}`),\n ),\n ),\n );\n\n if (mutating) {\n // Prompt processing hint; the pre-armed alarm already guarantees convergence.\n yield* alarm.scheduleNow.pipe(\n Effect.catch((error) =>\n Effect.logWarning(\"ThreadObject.portCall: immediate re-arm failed\", error),\n ),\n );\n }\n\n return response;\n });\n\nconst wakeEndpoint: Effect.Effect<void, never, EndpointServices> = Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const wake = yield* WakeScheduler;\n\n // Route the remote hint through this incarnation's scheduler so scoped progress waiters and\n // the alarm receive the same hint. Delivery remains droppable; canonical storage is authority.\n yield* wake.notify(identity.threadId);\n});\n\nconst alarmEndpoint: Effect.Effect<void, MaintenancePassFailure, EndpointServices> = Effect.gen(\n function* () {\n const maintenance = yield* ThreadMaintenance;\n\n // Typed pass failures propagate: the rejected promise makes workerd retry the alarm\n // (at-least-once delivery), and the dirty generation retains a committed slot meanwhile.\n yield* maintenance.pass;\n },\n);\n\nconst gateEndpoint: Effect.Effect<void, MaintenancePassFailure, EndpointServices> = Effect.gen(\n function* () {\n // Forcing ThreadMaintenance forces the whole Layer stack: migration + exact-version\n // check + configuration decode (DEPLOY-008 fails typed here, before any mutation), then\n // the defensive local ensure-alarm half of the invariant. LOCAL-ONLY by construction.\n const maintenance = yield* ThreadMaintenance;\n\n yield* maintenance.ensureAlarm;\n },\n);\n\n/**\n * Adapter from effect-cf's native Durable Object services to Effect Agent's existing platform\n * ports. effect-cf owns the cached ManagedRuntime and supplies these values once per Object\n * incarnation; the durable runtime continues to depend only on the narrow services below.\n */\nconst effectCfPlatformLayer = (\n namespaceBinding: string,\n rpcTracing = false,\n): Layer.Layer<\n DurableObjectContext | ThreadObjectNamespace,\n CloudflareBindingError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n> => {\n const context = Layer.effect(DurableObjectContext)(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const env = yield* WorkerEnvironment;\n\n return DurableObjectContext.of({ ctx: state.raw, env });\n }),\n );\n\n const namespace = Layer.effect(ThreadObjectNamespace)(\n Effect.gen(function* () {\n const env = yield* WorkerEnvironment;\n const binding = yield* threadNamespaceFromEnv(env, namespaceBinding);\n\n return ThreadObjectNamespace.of({\n namespace: binding,\n ...(rpcTracing === true ? { rpcTracing: namespaceBinding } : {}),\n });\n }),\n );\n\n return Layer.merge(context, namespace);\n};\n\n/** The public endpoints and effect-cf invocation hook of one Thread Object instance. */\nexport interface Instance<EventServices = never> extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, RuntimeServices | EventServices>\n> {\n submitEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n awaitSettlementEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n awaitProgressEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n cancelProgressEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n observePage(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n abortEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n resolveApprovalEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n resolveUnknownEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n explainEncoded(encoded: unknown): Promise<unknown>;\n verifyEncoded(encoded: unknown): Promise<unknown>;\n retryEncoded(encoded: unknown): Promise<unknown>;\n obligationsEncoded(encoded: unknown): Promise<unknown>;\n portCall(encoded: unknown): Promise<unknown>;\n wake(): Promise<void>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\n/** The constructor shape workerd instantiates for each Thread Object. */\nexport interface Class<EventServices = never> {\n new (ctx: DurableObjectState, env: Cloudflare.Env): Instance<EventServices>;\n}\n\n/**\n * Export a composed application Layer as a native Durable Object class.\n * Bootstrap services are provided to the whole graph before it acquires, so application Layers\n * can yield effect-cf's WorkerEnvironment and DurableObjectState, derived identity, and Crypto.\n * Application dependencies remain visible until Layer.provide satisfies them. effect-cf owns the\n * cached ManagedRuntime, native RPC methods, event scopes, and telemetry flushing.\n * Initialization is local and bounded inside the constructor gate. Cloudflare eviction does not\n * guarantee finalizers; put resources requiring timely release in scoped operations or eventLayer.\n */\nexport const make = <\n ApplicationServices,\n ApplicationError,\n EventServices = never,\n EventLayerError = never,\n>(\n applicationLayer: Layer.Layer<\n CloudflareDurableRuntimeServices | ApplicationServices,\n ApplicationError,\n | CloudflareBootstrapServices\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | DurableObjectContext\n | ThreadObjectNamespace\n >,\n options: Options<ApplicationServices, EventServices, EventLayerError>,\n): Class<ApplicationServices | EventServices> => {\n const application = applicationLayer.pipe(\n Layer.provideMerge(layerConfig(options)),\n Layer.provideMerge(effectCfPlatformLayer(options.namespaceBinding, options.rpcTracing)),\n );\n\n // The storage/config Layer must acquire inside Cloudflare's constructor gate. effect-cf owns\n // the ManagedRuntime, while this effectContext ensures its first Layer build enters the gate\n // before migration, compatibility checks, or alarm inspection touch Object storage.\n const runtime: Layer.Layer<\n RuntimeServices | ApplicationServices,\n ThreadObjectInitializationError | ApplicationError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(\n Effect.gen(function* () {\n const services = yield* Layer.buildWithScope(application, scope);\n\n yield* gateEndpoint.pipe(Effect.provide(services));\n\n return services;\n }),\n );\n }),\n );\n\n const rpc = {\n submitEncoded: (encoded: unknown) => submitEndpoint(encoded),\n awaitSettlementEncoded: (encoded: unknown) => awaitSettlementEndpoint(encoded),\n awaitProgressEncoded: (encoded: unknown) => awaitProgressEndpoint(encoded),\n cancelProgressEncoded: (encoded: unknown) => cancelProgressEndpoint(encoded),\n observePage: (encoded: unknown) => observePageEndpoint(encoded),\n abortEncoded: (encoded: unknown) => abortEndpoint(encoded),\n resolveApprovalEncoded: (encoded: unknown) => resolveApprovalEndpoint(encoded),\n resolveUnknownEncoded: (encoded: unknown) => resolveUnknownEndpoint(encoded),\n explainEncoded: (encoded: unknown) => explainEndpoint(encoded),\n verifyEncoded: (encoded: unknown) => verifyEndpoint(encoded),\n retryEncoded: (encoded: unknown) => retryEndpoint(encoded),\n obligationsEncoded: (encoded: unknown) => obligationsEndpoint(encoded),\n portCall: (encoded: unknown) => portCallEndpoint(encoded),\n wake: () => wakeEndpoint,\n } satisfies EffectCfDurableObject.DurableObjectRpc<\n RuntimeServices | ApplicationServices | EventServices\n >;\n\n type NativeOptions = EffectCfDurableObject.DurableObjectOptions<\n RuntimeServices | ApplicationServices,\n EventServices,\n EventLayerError,\n typeof rpc\n >;\n\n const EffectCfThreadObject = EffectCfDurableObject.make<\n RuntimeServices | ApplicationServices,\n ThreadObjectInitializationError | ApplicationError,\n EventServices,\n EventLayerError,\n typeof rpc\n >(runtime, {\n ...(options.rpcTracing === true ? { rpcTracing: { service: options.namespaceBinding } } : {}),\n ...(options.eventLayer === undefined ? {} : { eventLayer: options.eventLayer }),\n // Force the gated runtime Layer when Cloudflare loads this Object incarnation. Recovery stays\n // in each bounded pass so cross-Object initialization cannot deadlock.\n initialize: Effect.void,\n rpc,\n alarm: () => alarmEndpoint,\n // This host owns the raw alarm and supplies event services through options.eventLayer.\n // Upstream's conditional alarm-registration check cannot reduce over generic application\n // services. Options and the rpc satisfies check above retain their Effect requirements.\n } as NativeOptions);\n\n // effect-cf's class type keeps `alarm` optional even when the handler option is present. This\n // concrete override reflects this factory's stronger contract while delegating execution to\n // the effect-cf runtime unchanged.\n class ThreadObject extends EffectCfThreadObject {\n override alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void {\n return super.alarm?.(alarmInfo);\n }\n }\n\n return ThreadObject;\n};\n","import {\n CodeExecutionHost,\n CodeExecutionResourceUse,\n CodeExecutionResult,\n CodeExecutionTimeoutError,\n CodeExecutor,\n CodeExecutorStartError,\n CodeExecutorTerminatedError,\n CodeExecutorUnsupportedError,\n CodeExecutionProtocolError,\n CodeHostCall,\n CodeHostCallLimitError,\n CodeHostCallResult,\n CodeOutputLimitError,\n CodeProgramFailedError,\n CodeSourceError,\n SandboxImplementation,\n type CodeExecutorExecute,\n type CodeExecutionRequest,\n} from \"@effect-agent/sandbox\";\nimport { RpcTarget } from \"cloudflare:workers\";\nimport { Clock, Duration, Effect, Exit, Fiber, Layer, Option, Queue, Schema } from \"effect\";\n\nimport { safeCauseDiagnostic, safeCauseMessage } from \"./boundary.ts\";\n\n/**\n * The Cloudflare Dynamic Worker `CodeExecutor` adapter (C4 of ADR-0017;\n * DEPLOY-011). Each pass loads one fresh Worker through the Worker Loader\n * with `globalOutbound: null`, so generated code has no ambient network,\n * bindings, or secrets; its only authority is the pass-scoped RPC target that\n * routes back into the owning event's `CodeExecutionHost` service. Platform\n * CPU limits stop synchronous runaway programs; the executor-owned wall-clock\n * deadline interrupts asynchronously suspended passes. Deployment class `E`\n * only: the adapter records no persistent state and a later pass may run in a\n * completely different isolate.\n */\nexport const dynamicWorkerImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-dynamic-worker\",\n});\n\ninterface CodeModePassHost extends Rpc.RpcTargetBranded {\n readonly call: (hostCall: unknown) => Promise<unknown>;\n}\n\ninterface CodeModeHarnessEntrypoint extends Rpc.WorkerEntrypointBranded {\n readonly run: (host: CodeModePassHost) => Promise<unknown>;\n}\n\n/**\n * One object-capability endpoint for one execution pass. Workers RPC invokes\n * the target in the request context where it was created, so the native\n * Promise returned by `dispatch` and the Effect fiber that settles it share\n * one I/O owner. Passing the target as `run()`'s argument also scopes the\n * remote stub to that RPC call; no request state lives at module scope.\n */\nclass CodeModePassHostTarget extends RpcTarget implements CodeModePassHost {\n readonly #dispatch: (hostCall: unknown) => Promise<unknown>;\n\n constructor(dispatch: (hostCall: unknown) => Promise<unknown>) {\n super();\n this.#dispatch = dispatch;\n }\n\n call(hostCall: unknown): Promise<unknown> {\n return this.#dispatch(hostCall);\n }\n}\n\n/**\n * The fixed harness loaded as the dynamic worker's main module. The generated\n * source becomes `program.mjs` (`export default (<expression>);`) — a module,\n * never `eval`. The harness installs namespace globals and a bounded console,\n * imports the program, invokes it exactly once, and returns one envelope the\n * host validates through Effect Schema.\n */\nconst HARNESS_MODULE = String.raw`\nimport { WorkerEntrypoint } from \"cloudflare:workers\";\nimport programDefault from \"./program.js\";\n\nconst encoder = new TextEncoder();\nconst utf8 = (text) => encoder.encode(text).byteLength;\nconst safeText = (value) => {\n try {\n if (value instanceof Error) return (value.name + \": \" + value.message).slice(0, 4000);\n if (typeof value === \"string\") return value.slice(0, 4000);\n const encoded = JSON.stringify(value);\n return (encoded === undefined ? String(value) : encoded).slice(0, 4000);\n } catch {\n return \"[unserializable value]\";\n }\n};\nconst safeJson = (value) => {\n try {\n const encoded = JSON.stringify(value);\n if (encoded !== undefined && encoded.length <= 4000) return JSON.parse(encoded);\n } catch {}\n return safeText(value);\n};\n\nexport default class CodeModeHarness extends WorkerEntrypoint {\n async run(host) {\n const config = this.env.CODE_MODE_PASS;\n const limits = config.limits;\n const logs = [];\n let logBytes = 0;\n let fatal;\n const boundedLogs = () => logs.slice(0, 4096);\n const write = (...values) => {\n const joined = values.map(safeText).join(\" \");\n const line = joined.length > 16000 ? joined.slice(0, 15999) + \"…\" : joined;\n const bytes = utf8(line);\n if (logs.length >= 4096 || logBytes + bytes > limits.maxLogBytes) {\n fatal = fatal ?? { _tag: \"log-limit\", observed: logBytes + bytes, logs: boundedLogs() };\n throw new Error(\"code-mode log limit exceeded\");\n }\n logs.push(line);\n logBytes += bytes;\n };\n globalThis.console = { log: write, info: write, warn: write, error: write, debug: write };\n\n let hostCalls = 0;\n const makeMethod = (namespace, method) => async (argument) => {\n hostCalls += 1;\n if (hostCalls > limits.maxHostCalls) {\n fatal = fatal ?? { _tag: \"host-call-limit\", logs: boundedLogs() };\n throw new Error(\"code-mode host-call limit exceeded\");\n }\n let argText;\n try {\n argText = JSON.stringify(argument);\n } catch {}\n if (argText === undefined || utf8(argText) > limits.maxHostCallArgumentBytes) {\n fatal = fatal ?? {\n _tag: \"argument-limit\",\n observed: argText === undefined ? 0 : utf8(argText),\n logs: boundedLogs(),\n };\n throw new Error(\"code-mode host-call argument limit exceeded\");\n }\n const outcome = await host.call({\n namespace,\n method,\n argument: JSON.parse(argText),\n });\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallSuccess\") {\n return outcome.value;\n }\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallFailure\") {\n throw outcome.error;\n }\n fatal = fatal ?? { _tag: \"protocol\", message: \"host returned an unrecognized outcome\" };\n throw new Error(\"code-mode host protocol violation\");\n };\n for (const namespace of config.namespaces) {\n const methods = {};\n for (const method of namespace.methods) {\n methods[method] = makeMethod(namespace.name, method);\n }\n globalThis[namespace.name] = methods;\n }\n\n // program.js is imported statically at the top of this module, so a\n // syntactically invalid program fails the whole harness at load (mapped\n // to a source error by the host). Using a static import keeps this module\n // free of dynamic-import expressions, which single-script Miniflare hosts\n // reject. The isolation boundary does NOT depend on the ordering of this\n // import versus the console/namespace shims installed below: the loaded\n // Worker has globalOutbound: null and no bindings, secrets, or env from\n // the Worker Loader config BEFORE any module in the graph evaluates, so\n // module-level program code has no ambient authority regardless. The\n // shims below are usability wrappers (bounded console, namespace globals),\n // and the accepted program is a single async-function expression whose\n // body runs only when invoked here — after the shims exist.\n const program = programDefault;\n if (typeof program !== \"function\") {\n return { _tag: \"source-not-a-function\", actual: typeof program };\n }\n try {\n const value = await program();\n if (fatal !== undefined) return fatal;\n let text;\n try {\n text = JSON.stringify(value);\n } catch {}\n if (text === undefined) {\n return {\n _tag: \"program-failed\",\n reason: \"non-json-result\",\n thrown: null,\n message: \"The program must return a JSON value\",\n logs: boundedLogs(),\n };\n }\n const resultBytes = utf8(text);\n if (resultBytes > limits.maxResultBytes) {\n return { _tag: \"result-limit\", observed: resultBytes, logs: boundedLogs() };\n }\n return {\n _tag: \"completed\",\n value: JSON.parse(text),\n logs: boundedLogs(),\n hostCalls,\n logBytes,\n resultBytes,\n };\n } catch (cause) {\n if (fatal !== undefined) return fatal;\n return {\n _tag: \"program-failed\",\n reason: cause instanceof Error ? \"threw\" : \"rejected\",\n thrown: safeJson(cause),\n message: safeText(cause),\n logs: boundedLogs(),\n };\n }\n }\n}\n`;\n\nconst BoundedLogs = Schema.Array(Schema.String.check(Schema.isMaxLength(16 * 1024))).check(\n Schema.isMaxLength(4_096),\n);\n\nconst HarnessCompleted = Schema.TaggedStruct(\"completed\", {\n value: Schema.Json,\n logs: BoundedLogs,\n hostCalls: Schema.Natural,\n logBytes: Schema.Natural,\n resultBytes: Schema.Natural,\n});\n\nconst HarnessSourceInvalid = Schema.TaggedStruct(\"source-invalid\", {\n message: Schema.String,\n});\n\nconst HarnessNotAFunction = Schema.TaggedStruct(\"source-not-a-function\", {\n actual: Schema.String,\n});\n\nconst HarnessProgramFailed = Schema.TaggedStruct(\"program-failed\", {\n reason: Schema.Literals([\"threw\", \"rejected\", \"non-json-result\"]),\n thrown: Schema.Json,\n message: Schema.String,\n logs: BoundedLogs,\n});\n\nconst HarnessLogLimit = Schema.TaggedStruct(\"log-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessArgumentLimit = Schema.TaggedStruct(\"argument-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessResultLimit = Schema.TaggedStruct(\"result-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessHostCallLimit = Schema.TaggedStruct(\"host-call-limit\", {\n logs: BoundedLogs,\n});\n\nconst HarnessProtocol = Schema.TaggedStruct(\"protocol\", {\n message: Schema.String,\n});\n\nconst HarnessOutcome = Schema.Union([\n HarnessCompleted,\n HarnessSourceInvalid,\n HarnessNotAFunction,\n HarnessProgramFailed,\n HarnessLogLimit,\n HarnessArgumentLimit,\n HarnessResultLimit,\n HarnessHostCallLimit,\n HarnessProtocol,\n]);\n\nconst HarnessPassConfig = Schema.Struct({\n namespaces: Schema.Array(\n Schema.Struct({\n name: Schema.NonEmptyString,\n methods: Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(64)),\n }),\n ).check(Schema.isMaxLength(32)),\n limits: Schema.Struct({\n maxLogBytes: Schema.Natural,\n maxResultBytes: Schema.Natural,\n maxHostCalls: Schema.Natural,\n maxHostCallArgumentBytes: Schema.Natural,\n }),\n});\n\nconst encodeHarnessPassConfig = Schema.encodeSync(HarnessPassConfig);\nconst encodeJsonPayload = Schema.encodeSync(Schema.fromJsonString(Schema.Json));\nconst decodeJsonPayload = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));\n\nconst decodeHarnessOutcome = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(HarnessOutcome)(value);\n } catch {\n return Option.none<typeof HarnessOutcome.Type>();\n }\n};\n\nconst decodeHostCall = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCall)(value);\n } catch {\n return Option.none<CodeHostCall>();\n }\n};\n\nconst decodeHostCallResult = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCallResult)(value);\n } catch {\n return Option.none<CodeHostCallResult>();\n }\n};\n\n/** Dispose a Cloudflare RPC handle when the runtime supplies its untyped disposal hook. @internal */\nexport const disposeRpcHandle = (handle: unknown): Effect.Effect<void> =>\n Effect.try({\n try: () => {\n if ((typeof handle !== \"object\" && typeof handle !== \"function\") || handle === null) return;\n if (!(Symbol.dispose in handle)) return;\n const dispose = Reflect.get(handle, Symbol.dispose);\n\n if (typeof dispose === \"function\") {\n Reflect.apply(dispose, handle, []);\n }\n },\n catch: (cause) =>\n safeCauseDiagnostic(cause, \"The Cloudflare RPC disposal hook failed without a diagnostic\"),\n }).pipe(\n Effect.catch((diagnostic) =>\n Effect.logWarning(`Cloudflare RPC handle disposal failed: ${diagnostic}`).pipe(\n Effect.ignoreCause,\n ),\n ),\n );\n\n/**\n * Project a host outcome to the plain JSON envelope the harness reads. A\n * `CodeExecutionHost` may return either real `CodeHostCallResult` instances\n * (the substitute and conformance kit) or plain-object equivalents (the Code\n * Mode capability's broker route), so this reads the shared fields rather than\n * `Schema.encodeSync`, which would reject a plain object.\n */\ninterface EncodedHostResultPayload {\n readonly encodedPayload: string;\n readonly resultBytes: number;\n}\n\nconst encodeHostResultPayload = (\n outcome: CodeHostCallResult,\n): EncodedHostResultPayload | undefined => {\n try {\n const payload = outcome._tag === \"CodeHostCallSuccess\" ? outcome.value : outcome.error;\n const encodedPayload = encodeJsonPayload(payload);\n\n return {\n encodedPayload,\n resultBytes: utf8ByteLength(encodedPayload),\n };\n } catch {\n return undefined;\n }\n};\n\nconst utf8ByteLength = (value: string): number => {\n let total = 0;\n\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n\n total += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;\n }\n\n return total;\n};\n\ninterface QueuedHostCall {\n readonly call: CodeHostCall;\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n}\n\ntype HostWork =\n | { readonly _tag: \"call\"; readonly queued: QueuedHostCall }\n | { readonly _tag: \"limit\" };\n\ntype HostDispatchError =\n | CodeExecutionTimeoutError\n | CodeOutputLimitError\n | CodeExecutionProtocolError\n | CodeHostCallLimitError;\n\n/** Reserved global names the harness owns inside the dynamic worker. */\nconst reservedHarnessGlobals = new Set([\"console\"]);\n\nexport interface DynamicWorkerCodeExecutorOptions {\n /** The `worker_loader` binding. */\n readonly loader: WorkerLoader;\n /** Compatibility date for dynamic workers; defaults to `2025-05-01`. */\n readonly compatibilityDate?: string | undefined;\n}\n\nconst makeExecute = (\n options: DynamicWorkerCodeExecutorOptions,\n clock: Clock.Clock,\n): CodeExecutorExecute =>\n Effect.fn(\"DynamicWorkerCodeExecutor.execute\")(function* (request: CodeExecutionRequest) {\n if (request.network._tag !== \"NetworkDisabled\") {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"network\",\n message:\n \"The Dynamic Worker executor denies all egress with globalOutbound: null; an allowlist is not supported in the first slice\",\n });\n }\n const sourceBytes = utf8ByteLength(request.source);\n\n if (sourceBytes > request.limits.maxSourceBytes) {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"oversized\",\n message: `Source is ${sourceBytes} bytes; the request allows ${request.limits.maxSourceBytes}`,\n });\n }\n for (const namespace of request.namespaces) {\n if (reservedHarnessGlobals.has(namespace.name)) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"namespaces\",\n message: `Namespace ${namespace.name} collides with a harness binding`,\n });\n }\n }\n const host = yield* CodeExecutionHost;\n\n // This synchronous clock access is confined to callbacks that must compute a timeout\n // immediately. The Clock service remains the authority, so tests and hosts can replace it.\n const startedAt = clock.monotonicTimeNanosUnsafe();\n const passDeadline = startedAt + Duration.toNanosUnsafe(request.limits.maxWallTime);\n\n const remainingPassWallTime = (): Duration.Duration => {\n const now = clock.monotonicTimeNanosUnsafe();\n\n return Duration.nanos(passDeadline > now ? passDeadline - now : 0n);\n };\n\n let issuedHostCalls = 0;\n let passOpen = true;\n const queuedHostCalls: Array<QueuedHostCall> = [];\n let passFailure: HostDispatchError | undefined;\n\n const failPass = (error: HostDispatchError): void => {\n if (passFailure === undefined) passFailure = error;\n };\n\n const rejectQueuedHostCalls = (reason: Error): void => {\n for (const queued of queuedHostCalls.splice(0)) {\n queued.reject(reason);\n }\n };\n\n const queue = yield* Queue.unbounded<HostWork>();\n\n const deliverHostOutcome = (\n queued: QueuedHostCall,\n outcome: CodeHostCallResult,\n ): Effect.Effect<void, CodeExecutionProtocolError | CodeOutputLimitError> =>\n Effect.gen(function* () {\n const decoded = decodeHostCallResult(outcome);\n\n if (Option.isNone(decoded)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a value outside the CodeHostCallResult schema\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n const encoded = encodeHostResultPayload(decoded.value);\n\n if (encoded === undefined || encoded.resultBytes > request.limits.maxHostCallResultBytes) {\n const error = CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-result\",\n limit: request.limits.maxHostCallResultBytes,\n observed: encoded?.resultBytes ?? 0,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const normalizedPayload = decodeJsonPayload(encoded.encodedPayload);\n\n if (Option.isNone(normalizedPayload)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a result that could not cross the JSON boundary\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n queued.resolve(\n decoded.value._tag === \"CodeHostCallSuccess\"\n ? { _tag: \"CodeHostCallSuccess\", value: normalizedPayload.value }\n : { _tag: \"CodeHostCallFailure\", error: normalizedPayload.value },\n );\n });\n\n // Workers RPC into the loader isolate cannot settle on the fiber blocked\n // in `entrypoint.run()`. A Scope-owned sibling fiber keeps that\n // independence while inheriting the pass Context and dying with the Scope.\n const serveHostCalls = Effect.gen(function* () {\n while (true) {\n const work = yield* Queue.take(queue);\n\n if (work._tag === \"limit\") {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const queued = work.queued;\n\n yield* host.call(queued.call).pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () => {\n const error = CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n });\n\n failPass(error);\n\n return error;\n },\n }),\n Effect.flatMap((outcome) => deliverHostOutcome(queued, outcome)),\n Effect.tapError(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode host call failed\"))),\n ),\n Effect.onInterrupt(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode pass is closing\"))),\n ),\n );\n }\n });\n\n const server = yield* serveHostCalls.pipe(Effect.forkScoped);\n\n const dispatch = (hostCall: unknown): Promise<unknown> => {\n if (!passOpen) {\n return Promise.reject(new Error(\"Code Mode pass is closing\"));\n }\n issuedHostCalls += 1;\n if (issuedHostCalls > request.limits.maxHostCalls) {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n Queue.offerUnsafe(queue, { _tag: \"limit\" });\n\n return Promise.reject(new Error(\"host-call limit exceeded\"));\n }\n const decoded = decodeHostCall(hostCall);\n\n if (Option.isNone(decoded)) {\n return Promise.reject(new TypeError(\"host calls must match the CodeHostCall schema\"));\n }\n\n return new Promise((resolve, reject) => {\n const queued = { call: decoded.value, resolve, reject };\n\n queuedHostCalls.push(queued);\n Queue.offerUnsafe(queue, { _tag: \"call\", queued });\n });\n };\n\n const closeAdmission = Effect.sync(() => {\n passOpen = false;\n rejectQueuedHostCalls(new Error(\"Code Mode pass is closing\"));\n });\n\n yield* Effect.addFinalizer(() => closeAdmission.pipe(Effect.andThen(Fiber.interrupt(server))));\n\n // No `allowExperimental`: the runtime only accepts it when the CALLING\n // worker carries the `experimental` compatibility flag, which deployed\n // consumers cannot set — the option would reject every pass in\n // production. The harness needs no experimental runtime features.\n const workerCode: WorkerLoaderWorkerCode = {\n compatibilityDate: options.compatibilityDate ?? \"2025-05-01\",\n mainModule: \"harness.js\",\n modules: {\n \"harness.js\": HARNESS_MODULE,\n \"program.js\": `export default (\\n${request.source}\\n);`,\n },\n env: {\n CODE_MODE_PASS: encodeHarnessPassConfig({\n namespaces: request.namespaces.map((namespace) => ({\n name: namespace.name,\n methods: namespace.methods,\n })),\n limits: {\n maxLogBytes: request.limits.maxLogBytes,\n maxResultBytes: request.limits.maxResultBytes,\n maxHostCalls: request.limits.maxHostCalls,\n maxHostCallArgumentBytes: request.limits.maxHostCallArgumentBytes,\n },\n }),\n },\n globalOutbound: null,\n ...(request.limits.cpuMillis === undefined\n ? {}\n : {\n limits: {\n cpuMs: request.limits.cpuMillis,\n subRequests: request.limits.maxHostCalls + 8,\n },\n }),\n };\n\n const worker = yield* Effect.acquireRelease(\n Effect.try({\n try: () => options.loader.load(workerCode),\n catch: (cause) => {\n const text = safeCauseMessage(cause, \"The Worker Loader failed without a diagnostic\");\n\n // Blame the program's source ONLY on a genuine compile diagnostic;\n // any other load rejection is an infrastructure start failure, not\n // the model's fault (see classifyWorkerFailure for the same split).\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: `The Worker Loader rejected the pass: ${text}`.slice(0, 8_000),\n cause,\n });\n },\n }),\n disposeRpcHandle,\n );\n\n const entrypoint = yield* Effect.acquireRelease(\n Effect.try({\n try: () => worker.getEntrypoint<CodeModeHarnessEntrypoint>(),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n }),\n disposeRpcHandle,\n );\n\n const rpc = Effect.tryPromise({\n try: () => entrypoint.run(new CodeModePassHostTarget(dispatch)),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n });\n\n const exit = yield* Effect.raceFirst(\n rpc.pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () =>\n CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n }),\n }),\n ),\n Fiber.join(server),\n ).pipe(Effect.exit);\n\n yield* closeAdmission;\n yield* Fiber.interrupt(server);\n if (passFailure !== undefined) {\n return yield* passFailure;\n }\n if (Exit.isFailure(exit)) {\n return yield* Effect.failCause(exit.cause);\n }\n const raw = exit.value;\n const finishedAt = clock.monotonicTimeNanosUnsafe();\n\n const outcome = decodeHarnessOutcome(raw);\n\n if (Option.isNone(outcome)) {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The dynamic worker returned a value outside the harness envelope schema\",\n });\n }\n switch (outcome.value._tag) {\n case \"completed\": {\n return CodeExecutionResult.make({\n implementation: dynamicWorkerImplementation,\n value: outcome.value.value,\n logs: outcome.value.logs,\n resourceUse: CodeExecutionResourceUse.make({\n wallTime: Duration.nanos(finishedAt > startedAt ? finishedAt - startedAt : 0n),\n hostCalls: outcome.value.hostCalls,\n logBytes: outcome.value.logBytes,\n resultBytes: outcome.value.resultBytes,\n }),\n });\n }\n case \"source-invalid\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n case \"source-not-a-function\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"not-a-function\",\n message: `The source expression evaluated to ${outcome.value.actual}; it must evaluate to one async function`,\n });\n }\n case \"program-failed\": {\n return yield* CodeProgramFailedError.make({\n implementation: dynamicWorkerImplementation,\n reason: outcome.value.reason,\n thrown: outcome.value.thrown,\n message: outcome.value.message.slice(0, 8_000),\n logs: outcome.value.logs,\n });\n }\n case \"log-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"logs\",\n limit: request.limits.maxLogBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"argument-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-argument\",\n limit: request.limits.maxHostCallArgumentBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"result-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"result\",\n limit: request.limits.maxResultBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"host-call-limit\": {\n return yield* CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: outcome.value.logs,\n });\n }\n case \"protocol\": {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n }\n });\n\n/**\n * Expected worker-level failures map into the typed union with bounded\n * diagnostics; anything unrecognized stays a start/termination error rather\n * than a fabricated program result.\n */\nconst classifyWorkerFailure = (\n cause: unknown,\n maxWallTime: Duration.Duration,\n):\n | CodeExecutionTimeoutError\n | CodeExecutorTerminatedError\n | CodeExecutorStartError\n | CodeSourceError => {\n const text = safeCauseDiagnostic(cause, \"[unserializable worker failure]\");\n\n // `WorkerLoader.load()` is lazy, so a module-compile error in the generated\n // program surfaces here at first use. Blame the program's source ONLY on a\n // genuine compile diagnostic (a `SyntaxError` or an explicit compile\n // failure) — the fixed harness is valid, so the fault is in program.js. A\n // bare \"failed to start Worker\" without a compile diagnostic is an\n // infrastructure start failure, not the model's fault, so it must NOT be\n // misclassified as a source error.\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n if (/cpu/i.test(text)) {\n return CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"cpu\",\n maxWallTime,\n logs: [],\n });\n }\n if (/failed to start worker/i.test(text)) {\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n cause,\n });\n }\n\n return CodeExecutorTerminatedError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n });\n};\n\n/** Layer building the Dynamic Worker `CodeExecutor` from resolved bindings. */\nexport const dynamicWorkerCodeExecutorLayer = (\n options: DynamicWorkerCodeExecutorOptions,\n): Layer.Layer<CodeExecutor> =>\n Layer.effect(\n CodeExecutor,\n Effect.gen(function* () {\n const clock = yield* Clock.Clock;\n\n return CodeExecutor.of({ execute: makeExecute(options, clock) });\n }),\n );\n\n/** Assemble Code Mode handlers with the isolated Dynamic Worker executor. */\nexport const CloudflareCodeMode = {\n /**\n * Provide the selected tool handlers at construction, where Code Mode captures them.\n * Their errors and remaining dependencies stay visible. The definition still owns the\n * allowlist and limits; the runtime supplies the live Tool broker for each scoped pass.\n */\n layer: <A, E, R, Handlers, HandlerError, HandlerRequirements>(\n definition: { readonly handlers: Layer.Layer<A, E, R> },\n options: DynamicWorkerCodeExecutorOptions & {\n readonly handlers: Layer.Layer<Handlers, HandlerError, HandlerRequirements>;\n },\n ) =>\n definition.handlers.pipe(\n Layer.provide(options.handlers),\n Layer.provide(dynamicWorkerCodeExecutorLayer(options)),\n ),\n};\n","import {\n type MemoryLookup,\n type MemoryReader,\n type MemoryWrite,\n Memory,\n MemoryAccess,\n MemoryDocument,\n MemoryMutationFailpoint,\n MemoryNamespace,\n MemoryNamespaceAddress,\n MemoryRecallLimits,\n MemoryStorageError,\n MemoryWriter,\n type MemoryIndexSearch,\n type SemanticCandidateLimits,\n type SemanticMemoryProfile,\n} from \"@effect-agent/core\";\nimport {\n type DoMemoryStorageLimits,\n type MemoryOwnerAuthorizer,\n decodeMemoryWire,\n defaultDoMemoryStorageLimits,\n defaultMemoryRpcLimits,\n doMemoryStoreLayerWithFailpoints,\n encodeMemoryWire,\n handleMemoryOwnerRequest,\n MemoryOwnerIdentity,\n MemoryOwnerRequest,\n MemoryOwnerResponse,\n MemoryRpcError,\n MemoryRpcLimits,\n type MemoryOwnerFailure,\n} from \"@effect-agent/storage-cloudflare\";\nimport { Principal } from \"@effect-agent/thread\";\nimport { Clock, Context, Effect, Layer, Schema } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nexport interface MemoryObjectRpc extends Rpc.DurableObjectBranded {\n memory(encoded: string): Promise<string>;\n}\n\nexport class MemoryObjectNamespace extends Context.Service<\n MemoryObjectNamespace,\n {\n readonly namespace: DurableObjectNamespace<MemoryObjectRpc>;\n }\n>()(\"@effect-agent/platform-cloudflare/MemoryObjectNamespace\") {}\n\n/** Namespace version and identity are already canonicalized by MemoryNamespace. */\nexport const memoryObjectName = (namespace: MemoryNamespace.Any): string => namespace.address;\n\n/**\n * Effect-native, host-bound memory client. Recall revalidates the entire admitted lookup\n * in one RPC and renders it locally. No retries or per-source splitting occur here.\n * Interrupted callers stop waiting; the owner has its own deadline. A timed-out write\n * may have committed: reconcile by sending the identical operation ID and command.\n */\nconst makeMemoryClient = Effect.fn(\"CloudflareMemoryClient.make\")(function* <\n Namespace extends MemoryNamespace.Any,\n>(\n access: MemoryAccess<Namespace>,\n principal: Principal,\n rpcLimits: MemoryRpcLimits = defaultMemoryRpcLimits,\n) {\n const validated = yield* Schema.decodeUnknownEffect(MemoryRpcLimits)(rpcLimits).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n\n const bound = yield* Schema.decodeUnknownEffect(MemoryAccess.Wire)(access).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n\n principal = yield* Schema.decodeUnknownEffect(Principal)(principal).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n const { namespace } = yield* MemoryObjectNamespace;\n\n const call = Effect.fn(\"CloudflareMemoryClient.call\")(function* (request: MemoryOwnerRequest) {\n const decoded = yield* Schema.decodeUnknownEffect(MemoryOwnerRequest)(request).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n\n const encoded = yield* encodeMemoryWire(MemoryOwnerRequest, decoded, validated.maxRequestBytes);\n\n const raw = yield* Effect.tryPromise({\n try: () =>\n namespace.get(namespace.idFromName(memoryObjectName(bound.namespace))).memory(encoded),\n catch: () => MemoryRpcError.make({ reason: \"unavailable\" }),\n });\n\n const response = yield* decodeMemoryWire(MemoryOwnerResponse, raw, validated.maxResponseBytes);\n\n if (response._tag === \"Failed\") return yield* response.failure;\n if (\n !MemoryNamespace.equals(response.access.namespace, bound.namespace) ||\n response.access.scope !== bound.scope\n )\n return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return response;\n });\n\n const withinDeadline = <A, E, R>(effect: Effect.Effect<A, E, R>, timeoutMillis: number) =>\n effect.pipe(\n Effect.timeoutOrElse({\n duration: timeoutMillis,\n orElse: () => Effect.fail(MemoryRpcError.make({ reason: \"timeout\" })),\n }),\n );\n\n const revalidate = Effect.fn(\"CloudflareMemoryClient.revalidate\")(function* (\n lookup: MemoryLookup,\n limits: MemoryRecallLimits,\n ) {\n limits = yield* Schema.decodeUnknownEffect(MemoryRecallLimits)(limits).pipe(\n Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })),\n );\n const timeoutMillis = Math.min(validated.timeoutMillis, limits.timeoutMillis);\n\n return yield* Effect.gen(function* () {\n const response = yield* call({\n _tag: \"Revalidate\",\n version: 1,\n access: bound,\n principal,\n lookup,\n limits,\n deadlineMillis: (yield* Clock.currentTimeMillis) + timeoutMillis,\n });\n\n if (response._tag !== \"Lookup\") return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return response.lookup;\n }).pipe((effect) => withinDeadline(effect, timeoutMillis));\n });\n\n const change = Effect.fn(\"CloudflareMemoryClient.change\")(function* (\n write: MemoryWrite<Namespace>,\n ) {\n if (!MemoryNamespace.equals(write.key.namespace, bound.namespace))\n return yield* MemoryRpcError.make({ reason: \"denied\" });\n\n return yield* Effect.gen(function* () {\n const response = yield* call({\n _tag: \"Change\",\n version: 1,\n access: bound,\n principal,\n write,\n deadlineMillis: (yield* Clock.currentTimeMillis) + validated.timeoutMillis,\n });\n\n if (response._tag !== \"Changed\" || response.document.key.id !== write.key.id)\n return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return yield* MemoryDocument.restore(access.namespace, response.document);\n }).pipe((effect) => withinDeadline(effect, validated.timeoutMillis));\n });\n\n const revalidateSemantic = Effect.fn(\"CloudflareMemoryClient.revalidateSemantic\")(function* (\n found: MemoryIndexSearch<Namespace>,\n profile: SemanticMemoryProfile,\n limits: SemanticCandidateLimits,\n ) {\n return yield* Effect.gen(function* () {\n const response = yield* call({\n _tag: \"RevalidateSemantic\",\n version: 1,\n access: bound,\n principal,\n found,\n profile,\n limits,\n deadlineMillis: (yield* Clock.currentTimeMillis) + validated.timeoutMillis,\n });\n\n if (response._tag !== \"Semantic\") return yield* MemoryRpcError.make({ reason: \"protocol\" });\n\n return response.result;\n }).pipe((effect) => withinDeadline(effect, validated.timeoutMillis));\n });\n\n /**\n * Revalidate in one owner RPC, then render whole passages within the caller's budget.\n * The bound source is essential: unavailable/stale results and matches that cannot fit\n * fail instead of silently producing empty context. No-match remains successful.\n * The single outcome has sourceId \"memory\". No embedding or candidate search is performed.\n * Use revalidate with Memory.recall for multiple readers sharing one output budget.\n */\n const recall = Effect.fn(\"CloudflareMemoryClient.recall\")(function* (\n lookup: MemoryLookup,\n limits: MemoryRecallLimits,\n estimateTokens?: (text: string) => number,\n ) {\n return yield* Memory.recall(\n [{ id: \"memory\", essential: true, read: revalidate(lookup, limits) }],\n limits,\n estimateTokens,\n );\n });\n\n return { recall, revalidate, revalidateSemantic, change };\n});\n\nexport const CloudflareMemoryClient = {\n /** Bind access and principal using the MemoryObjectNamespace supplied by the application. */\n make: makeMemoryClient,\n /** Use a resolved Worker or Durable Object binding without manual service provisioning. */\n fromBinding: Effect.fn(\"CloudflareMemoryClient.fromBinding\")(function* <\n Namespace extends MemoryNamespace.Any,\n >(\n binding: DurableObjectNamespace<MemoryObjectRpc>,\n options: {\n readonly access: MemoryAccess<Namespace>;\n readonly principal: Principal;\n readonly rpcLimits?: MemoryRpcLimits;\n },\n ) {\n return yield* makeMemoryClient(options.access, options.principal, options.rpcLimits).pipe(\n Effect.provideService(MemoryObjectNamespace, { namespace: binding }),\n );\n }),\n};\n\n/**\n * Optional activity-processor destination. Keeps domain write errors intact; transport,\n * authorization and deadline failures become the existing MemoryStorageError contract.\n * Receipts remain authoritative, including after caller interruption or lost replies.\n */\nexport const cloudflareMemoryWriterLayer = (\n access: MemoryAccess,\n principal: Principal,\n limits: MemoryRpcLimits = defaultMemoryRpcLimits,\n) =>\n Layer.effect(\n MemoryWriter,\n Effect.gen(function* () {\n const client = yield* CloudflareMemoryClient.make(access, principal, limits);\n\n return MemoryWriter.fromAdapter({\n change: (write) =>\n client.change(write).pipe(\n Effect.catchTag(\"MemoryRpcError\", (error) =>\n Effect.fail(\n MemoryStorageError.make({\n operation: `memory RPC ${error.reason}`,\n reason:\n error.reason === \"unavailable\" || error.reason === \"timeout\"\n ? \"unavailable\"\n : \"invalid-input\",\n }),\n ),\n ),\n Effect.catchTag([\"MemoryRecallError\", \"MemoryIndexError\", \"SemanticMemoryError\"], () =>\n Effect.fail(\n MemoryStorageError.make({ operation: \"memory RPC response\", reason: \"corrupt\" }),\n ),\n ),\n ),\n });\n }),\n );\n\ntype OwnerServices = MemoryReader | MemoryWriter | MemoryOwnerAuthorizer | MemoryOwnerIdentity;\n\nexport interface MemoryObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, OwnerServices>\n> {\n memory(encoded: string): Promise<string>;\n}\n\nexport interface MemoryObjectClass {\n new (ctx: globalThis.DurableObjectState, env: Cloudflare.Env): MemoryObjectInstance;\n}\n\n/**\n * Dedicated SQLite owner, independent of Thread lifetimes. The host binds authorization\n * after restoring its namespace definition from MemoryOwnerIdentity. Do not retain\n * cleanup-scoped resources in the host Layer; it lives for the DO incarnation.\n */\nconst makeMemoryObject = <E>(\n host: Layer.Layer<\n MemoryOwnerAuthorizer,\n E,\n MemoryOwnerIdentity | DurableObjectState.DurableObjectState | WorkerEnvironment\n >,\n options: {\n readonly storageLimits?: DoMemoryStorageLimits;\n readonly rpcLimits?: MemoryRpcLimits;\n readonly failpoints?: Layer.Layer<\n MemoryMutationFailpoint,\n never,\n DurableObjectState.DurableObjectState\n >;\n } = {},\n): MemoryObjectClass => {\n const identity = Layer.effect(\n MemoryOwnerIdentity,\n Effect.gen(function* () {\n const state = yield* DurableObjectState.DurableObjectState;\n\n const address = yield* Schema.decodeUnknownEffect(MemoryNamespaceAddress)(\n state.raw.id.name,\n ).pipe(Effect.mapError(() => MemoryRpcError.make({ reason: \"denied\" })));\n\n return { namespace: MemoryNamespace.Any.make({ address }) };\n }),\n );\n\n const store = Layer.unwrap(\n Effect.map(DurableObjectState.DurableObjectState, (state) =>\n doMemoryStoreLayerWithFailpoints(\n state.raw.storage,\n options.storageLimits ?? defaultDoMemoryStorageLimits,\n ),\n ),\n ).pipe(Layer.provide(options.failpoints ?? MemoryMutationFailpoint.layer));\n\n const application = Layer.merge(store, host).pipe(Layer.provideMerge(identity));\n\n const runtime: Layer.Layer<\n OwnerServices,\n E | MemoryOwnerFailure,\n DurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* DurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n yield* Schema.decodeUnknownEffect(MemoryRpcLimits)(\n options.rpcLimits ?? defaultMemoryRpcLimits,\n ).pipe(Effect.mapError(() => MemoryRpcError.make({ reason: \"protocol\" })));\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = { memory: (encoded: string) => handleMemoryOwnerRequest(encoded, options.rpcLimits) };\n\n return EffectCfDurableObject.make<\n OwnerServices,\n E | MemoryOwnerFailure,\n never,\n never,\n typeof rpc\n >(runtime, { rpc });\n};\n\nexport const MemoryObject = {\n /** Build the SQLite Durable Object class with the application's owner authorization Layer. */\n make: makeMemoryObject,\n};\n"],"mappings":"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"}
|