effect-durable-agent-cloudflare 0.1.0-alpha.4 → 0.1.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"durable-object-CjWWNyek.js","names":["#host"],"sources":["../src/rpc-codec.ts","../src/durable-object.ts"],"sourcesContent":["import * as Schema from \"effect/Schema\";\n\nimport {\n DurableEventEnvelope,\n EDADurableEvent,\n effectDurableAgentNamespace,\n} from \"effect-durable-agent/types/events\";\n\n/** Encode one durable event into a structured-clone-safe Durable Object RPC value. */\nexport const encodeEdaRpcDurableEvent = (event: DurableEventEnvelope): DurableEventEnvelope => {\n const encoded =\n event.namespace === effectDurableAgentNamespace\n ? Schema.encodeSync(EDADurableEvent)(Schema.decodeUnknownSync(EDADurableEvent)(event))\n : Schema.encodeSync(DurableEventEnvelope)(event);\n return Schema.decodeUnknownSync(DurableEventEnvelope)(encoded);\n};\n","import { DurableObject } from \"cloudflare:workers\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport type { DurableTranscriptMessage } from \"effect-durable-agent/domain/message-transcript\";\nimport { encodeEdaRpcDurableEvent } from \"./rpc-codec\";\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport type { CommittedDurableEvent as CommittedDurableEventValue } from \"effect-durable-agent/services/session-store\";\nimport type {\n CommittedCommandTerminalEvent,\n EDARuntimeConfig,\n} from \"effect-durable-agent/services/runtime\";\nimport {\n EDACommand,\n type EDACommand as EDACommandValue,\n} from \"effect-durable-agent/types/commands\";\nimport type { EDASubmittable } from \"effect-durable-agent/services/session-state\";\nimport { CommandId, SequenceNumber, SessionId } from \"effect-durable-agent/types/core\";\nimport {\n EDATraceMetadata,\n makeEDATraceMetadataFromParent,\n makeRootEDATraceMetadata,\n parseEDATraceparent,\n} from \"effect-durable-agent/types/tracing\";\nimport {\n decodeEdaRpcCommand,\n decodeEdaRpcSubmittables,\n EDASessionDurableObjectHost,\n type EDASessionDurableObjectHostOptions,\n type EDASessionDurableObjectStorage,\n} from \"./durable-object-runtime\";\n\n/** Raw RPC shape decoded before admitting one session command. */\nexport interface EDASessionCommandRpcInput {\n readonly command: unknown;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape decoded before admitting a durable command/app-event batch. */\nexport interface EDASessionSubmitBatchRpcInput {\n readonly items: ReadonlyArray<unknown>;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape for read/destroy operations that only need a session id. */\nexport interface EDASessionScopedRpcInput {\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape for WebSocket event-stream upgrades with a resume cursor. */\nexport interface EDASessionEventsRpcInput {\n readonly afterSeq?: number;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape decoded before blocking on one command terminal event. */\nexport interface EDASessionBlockOnCommandRpcInput {\n readonly afterSeq?: number;\n readonly commandId: string;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Constructor options for concrete app subclasses of the EDA Durable Object base. */\nexport type EDASessionDurableObjectOptions = Omit<\n EDASessionDurableObjectHostOptions,\n \"background\" | \"storage\"\n>;\n\n/** Resolve a concrete EDA session Durable Object binding by domain session id. */\nexport const getEDASessionDurableObjectByName = <T extends EDASessionDurableObject<object>>(\n namespace: DurableObjectNamespace<T>,\n sessionId: string,\n): DurableObjectStub<T> => namespace.getByName(sessionId);\n\n/**\n * Base class for raw Cloudflare Durable Object hosts of one EDA session.\n *\n * Concrete products should extend this class, pass provider/tool layers from\n * their own constructor, and register only that subclass in Wrangler. The base\n * class is deliberately not exported from `workers/app.ts` and owns no binding\n * name or routing convention.\n */\nexport abstract class EDASessionDurableObject<\n EnvType extends object = object,\n> extends DurableObject<EnvType> {\n readonly #host: EDASessionDurableObjectHost;\n\n protected constructor(\n ctx: DurableObjectState,\n env: EnvType,\n options: EDASessionDurableObjectOptions,\n ) {\n super(ctx, env);\n const storage = toEDASessionStorage(this.ctx.storage);\n this.#host = new EDASessionDurableObjectHost({\n ...options,\n background: this.ctx,\n storage,\n });\n\n this.ctx.blockConcurrencyWhile(async () => {\n await Effect.runPromise(EDASessionDurableObjectHost.migrate(storage));\n });\n }\n\n async fetch(request: Request): Promise<Response> {\n const upgrade = request.headers.get(\"Upgrade\");\n if (upgrade?.toLowerCase() !== \"websocket\") {\n return new Response(\"Expected WebSocket upgrade.\", { status: 426 });\n }\n\n const url = new URL(request.url);\n const sessionIdRaw = url.searchParams.get(\"sessionId\");\n if (sessionIdRaw === null) {\n return new Response(\"Missing sessionId.\", { status: 400 });\n }\n const afterSeq = Number(url.searchParams.get(\"afterSeq\") ?? \"0\");\n if (!Number.isInteger(afterSeq) || afterSeq < 0) {\n return new Response(\"Invalid afterSeq.\", { status: 400 });\n }\n\n const pair = new WebSocketPair();\n const client = pair[0];\n const server = pair[1];\n this.ctx.acceptWebSocket(server);\n await this.#host.acceptEventWebSocket({\n afterSeq: SequenceNumber.make(afterSeq),\n sessionId: this.parseSessionId(sessionIdRaw),\n trace: traceMetadataFromRequest(request),\n webSocket: server,\n });\n return new Response(null, { status: 101, webSocket: client });\n }\n\n async submit(input: EDASessionCommandRpcInput): Promise<CommittedDurableEventValue> {\n await this.restoreAcceptedEventWebSockets();\n const committed = await this.#host.submit({\n command: await decodeCommand(input.command),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed);\n }\n\n async submitBatch(\n input: EDASessionSubmitBatchRpcInput,\n ): Promise<ReadonlyArray<CommittedDurableEventValue>> {\n await this.restoreAcceptedEventWebSockets();\n const committed = await this.#host.submitBatch({\n items: await decodeSubmittables(input.items),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return committed.map(encodeEdaRpcCommittedDurableEvent);\n }\n\n async submitAndBlock(input: EDASessionCommandRpcInput): Promise<CommittedCommandTerminalEvent> {\n await this.restoreAcceptedEventWebSockets();\n const committed = await this.#host.submitAndBlock({\n command: await decodeCommand(input.command),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed) as CommittedCommandTerminalEvent;\n }\n\n async blockOnCommand(\n input: EDASessionBlockOnCommandRpcInput,\n ): Promise<CommittedCommandTerminalEvent> {\n await this.restoreAcceptedEventWebSockets();\n const committed = await this.#host.blockOnCommand({\n ...(input.afterSeq === undefined ? {} : { afterSeq: SequenceNumber.make(input.afterSeq) }),\n commandId: CommandId.make(input.commandId),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed) as CommittedCommandTerminalEvent;\n }\n\n async snapshot(input: EDASessionScopedRpcInput): Promise<EDASessionSnapshot> {\n await this.restoreAcceptedEventWebSockets();\n const snapshot = await this.#host.snapshot({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcSessionSnapshot(snapshot);\n }\n\n async messages(\n input: EDASessionScopedRpcInput,\n ): Promise<ReadonlyArray<DurableTranscriptMessage>> {\n await this.restoreAcceptedEventWebSockets();\n return await this.#host.messages({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n }\n\n async webSocketMessage(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n await this.#host.webSocketMessage(webSocket, message);\n }\n\n async webSocketClose(\n webSocket: WebSocket,\n _code: number,\n _reason: string,\n _wasClean: boolean,\n ): Promise<void> {\n await this.#host.webSocketClose(webSocket);\n }\n\n async webSocketError(webSocket: WebSocket, _error: unknown): Promise<void> {\n await this.#host.webSocketError(webSocket);\n }\n\n async destroySession(input: EDASessionScopedRpcInput): Promise<void> {\n await this.#host.destroy({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n await this.ctx.storage.deleteAlarm();\n await this.ctx.storage.deleteAll();\n }\n\n async alarm(): Promise<void> {\n await this.restoreAcceptedEventWebSockets();\n const sessionId = this.sessionIdFromObjectName();\n await this.#host.alarm(\n sessionId === undefined ? undefined : { sessionId, trace: makeRootEDATraceMetadata() },\n );\n }\n\n private parseSessionId(input: string): SessionId {\n const sessionId = SessionId.make(input);\n const objectName = this.ctx.id.name;\n if (objectName !== undefined && objectName !== sessionId) {\n throw new Error(`EDA Durable Object name ${objectName} cannot serve session ${sessionId}`);\n }\n return sessionId;\n }\n\n private sessionIdFromObjectName(): SessionId | undefined {\n return this.ctx.id.name === undefined ? undefined : SessionId.make(this.ctx.id.name);\n }\n\n private async restoreAcceptedEventWebSockets(): Promise<void> {\n await this.#host.restoreEventWebSockets(this.ctx.getWebSockets());\n }\n}\n\nconst toEDASessionStorage = (storage: DurableObjectStorage): EDASessionDurableObjectStorage => {\n // SAFETY: the adapter interface is the exact SQL, transaction, and alarm subset\n // of DurableObjectStorage; its looser row generic also supports test implementations.\n return storage as EDASessionDurableObjectStorage;\n};\n\nconst decodeTraceMetadata = (input: unknown): EDATraceMetadata =>\n Schema.decodeUnknownSync(EDATraceMetadata)(input);\n\nconst traceMetadataFromRequest = (request: Request): EDATraceMetadata => {\n const parent = parseEDATraceparent(\n request.headers.get(\"traceparent\"),\n request.headers.get(\"tracestate\"),\n );\n return parent === null ? makeRootEDATraceMetadata() : makeEDATraceMetadataFromParent(parent);\n};\n\n/** Convenience config constructor for subclasses that need only provider/model ids. */\nexport const edaRuntimeConfig = (input: {\n readonly maxToolCallsPerRun?: number;\n readonly modelId: string;\n readonly provider: string;\n readonly systemPrompt?: string;\n}): EDARuntimeConfig => ({\n modelSelection: { modelId: input.modelId, provider: input.provider },\n ...(input.maxToolCallsPerRun === undefined\n ? {}\n : { maxToolCallsPerRun: input.maxToolCallsPerRun }),\n ...(input.systemPrompt === undefined ? {} : { systemPrompt: input.systemPrompt }),\n});\n\n/** Encode committed events into structured-clone-safe Durable Object RPC payloads. */\nexport const encodeEdaRpcCommittedDurableEvent = (\n event: CommittedDurableEventValue,\n): CommittedDurableEventValue => ({\n position: event.position,\n event: encodeEdaRpcDurableEvent(event.event),\n});\n\n/** Encode runtime snapshots into structured-clone-safe Durable Object RPC payloads. */\nexport const encodeEdaRpcSessionSnapshot = (snapshot: EDASessionSnapshot): EDASessionSnapshot => ({\n ...snapshot,\n reducerStates: new Map(snapshot.reducerStates),\n state: {\n ...snapshot.state,\n commands: new Map(\n Array.from(snapshot.state.commands, ([commandId, record]) => [\n commandId,\n encodeCommandCarrierForRpc(record),\n ]),\n ),\n commandQueues: {\n ...snapshot.state.commandQueues,\n activeControlCommands: snapshot.state.commandQueues.activeControlCommands.map(\n encodeCommandCarrierForRpc,\n ),\n pendingCommands: snapshot.state.commandQueues.pendingCommands.map(encodeCommandCarrierForRpc),\n queuedCommands: snapshot.state.commandQueues.queuedCommands.map(encodeCommandCarrierForRpc),\n },\n },\n});\n\nconst encodeCommandCarrierForRpc = <A extends { readonly command?: EDACommandValue }>(\n value: A,\n): A =>\n value.command === undefined\n ? value\n : {\n ...value,\n command: Schema.encodeSync(EDACommand)(value.command) as EDACommandValue,\n };\n\nconst decodeCommand = (input: unknown): Promise<EDACommandValue> =>\n Effect.runPromise(decodeEdaRpcCommand(input));\n\nconst decodeSubmittables = (\n input: ReadonlyArray<unknown>,\n): Promise<ReadonlyArray<EDASubmittable>> => Effect.runPromise(decodeEdaRpcSubmittables(input));\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"durable-object-runtime-LgOJbsVm.js","names":["EDAWebSocketAttachment","SubscriberId","EDA_WS_CLOSE_PROTOCOL_ERROR","EDAWebSocketLaggedFrame","EDA_WS_CLOSE_LAGGED","EDAWebSocketErrorFrame","EDA_WS_CLOSE_SEND_FAILED","defaultEDAWebSocketFlowControl"],"sources":["../src/durable-object-keepalive.ts","../src/durable-object-store.ts","../src/durable-object-sink-checkpoints.ts","../src/durable-object-runtime.ts"],"sourcesContent":["import * as Effect from \"effect/Effect\";\nimport type * as Fiber from \"effect/Fiber\";\n\n/** Default alarm cadence for keeping an active Durable Object warm. */\nexport const defaultDurableObjectKeepAliveIntervalMs = 30_000;\n\n/** Minimal Durable Object storage alarm surface needed by the EDA host keepalive. */\nexport interface DurableObjectAlarmStorage {\n readonly getAlarm: () => number | null | Promise<number | null>;\n readonly setAlarm: (scheduledTimeMs: number) => void | Promise<void>;\n readonly deleteAlarm: () => void | Promise<void>;\n}\n\n/** Optional host hook for background alarm writes started from synchronous observers. */\nexport interface DurableObjectBackgroundWaiter {\n readonly waitUntil: (promise: Promise<unknown>) => void;\n}\n\n/** Configuration for the in-memory active-work heartbeat. */\nexport interface DurableObjectKeepAliveOptions {\n /** Alarm interval while at least one host-tracked fiber is still unsettled. */\n readonly intervalMs?: number;\n /** Clock used for scheduling; tests can inject a deterministic clock. */\n readonly now?: () => number;\n /** Receives best-effort release/reschedule failures that cannot be awaited by the caller. */\n readonly onBackgroundError?: (error: unknown) => void;\n}\n\n/** Idempotent lease for one host-tracked active Effect fiber/root. */\nexport interface DurableObjectKeepAliveLease {\n readonly release: () => Promise<void>;\n}\n\n/**\n * Alarm-backed in-memory keepalive for a raw Durable Object host.\n *\n * The active lease count is intentionally not durable: if the object is evicted\n * or crashes, the fibers the leases represented are gone too, and normal EDA\n * durable recovery must explain any escaped lifecycle boundaries.\n */\nexport class DurableObjectKeepAlive {\n private readonly intervalMs: number;\n private readonly now: () => number;\n private readonly onBackgroundError: (error: unknown) => void;\n private activeLeases = 0;\n private generation = 0;\n private scheduleTail: Promise<void> = Promise.resolve();\n private shutdownRequested = false;\n\n constructor(\n private readonly storage: DurableObjectAlarmStorage,\n private readonly background: DurableObjectBackgroundWaiter | undefined = undefined,\n options: DurableObjectKeepAliveOptions = {},\n ) {\n this.intervalMs = options.intervalMs ?? defaultDurableObjectKeepAliveIntervalMs;\n this.now = options.now ?? (() => Date.now());\n this.onBackgroundError = options.onBackgroundError ?? (() => undefined);\n }\n\n /** Number of active unsettled host roots currently holding the heartbeat. */\n get activeLeaseCount(): number {\n return this.activeLeases;\n }\n\n /** Acquire one active-work lease and arm the heartbeat if this is the first lease. */\n acquire(): Promise<DurableObjectKeepAliveLease> {\n if (this.shutdownRequested) {\n return Promise.reject(new Error(\"DurableObjectKeepAlive is shut down\"));\n }\n this.activeLeases += 1;\n const generation = this.generation;\n let released = false;\n\n return this.reschedule().then(\n () => ({\n release: async () => {\n if (released) {\n return;\n }\n released = true;\n if (generation !== this.generation) {\n return;\n }\n this.activeLeases = Math.max(0, this.activeLeases - 1);\n await this.reschedule();\n },\n }),\n async (error) => {\n released = true;\n if (generation !== this.generation) {\n throw error;\n }\n this.activeLeases = Math.max(0, this.activeLeases - 1);\n await this.reschedule().catch(this.onBackgroundError);\n throw error;\n },\n );\n }\n\n /** Run a promise while holding a lease. Intended for host adapters, not EDA internals. */\n async runWhileActive<A>(fn: () => Promise<A>): Promise<A> {\n const lease = await this.acquire();\n try {\n return await fn();\n } finally {\n await lease.release();\n }\n }\n\n /**\n * Track an already-forked Effect fiber as active host work until it settles.\n *\n * Use this with `ManagedRuntime.runFork(...)` when the fiber needs an already\n * built runtime context. The returned lease can be released manually, but it\n * is normally released by the fiber observer.\n */\n async trackFiber<A, E>(fiber: Fiber.Fiber<A, E>): Promise<DurableObjectKeepAliveLease> {\n const lease = await this.acquire();\n fiber.addObserver(() => {\n this.waitUntil(\n lease.release().catch((error) => {\n this.onBackgroundError(error);\n }),\n );\n });\n\n if (fiber.pollUnsafe() !== undefined) {\n await lease.release();\n }\n\n return lease;\n }\n\n /**\n * Fork an Effect as host-tracked active work.\n *\n * This mirrors Effect's host-runner pattern: observe the root fiber and release\n * the alarm lease when it settles. It deliberately does not patch Effect\n * internals or try to classify runnable vs suspended fibers.\n */\n async fork<A, E>(effect: Effect.Effect<A, E>): Promise<Fiber.Fiber<A, E>> {\n const fiber = Effect.runFork(effect);\n await this.trackFiber(fiber);\n return fiber;\n }\n\n /** Handle the Durable Object `alarm()` callback and re-arm while work remains. */\n alarm(): Promise<void> {\n return this.reschedule();\n }\n\n /** Permanently stop the heartbeat and prevent later lease releases from re-arming it. */\n shutdown(): Promise<void> {\n this.shutdownRequested = true;\n this.generation += 1;\n this.activeLeases = 0;\n return this.reschedule();\n }\n\n /** Start a fresh lease generation after the host intentionally resets its durable state. */\n restart(): void {\n this.shutdownRequested = false;\n }\n\n private waitUntil(promise: Promise<unknown>): void {\n if (this.background !== undefined) {\n this.background.waitUntil(promise);\n return;\n }\n void promise;\n }\n\n private reschedule(): Promise<void> {\n this.scheduleTail = this.scheduleTail.catch(() => undefined).then(() => this.syncAlarm());\n return this.scheduleTail;\n }\n\n private async syncAlarm(): Promise<void> {\n if (this.shutdownRequested || this.activeLeases === 0) {\n await this.storage.deleteAlarm();\n return;\n }\n\n const desiredAt = this.now() + this.intervalMs;\n const currentAt = await this.storage.getAlarm();\n if (currentAt === null || currentAt > desiredAt) {\n await this.storage.setAlarm(desiredAt);\n }\n }\n}\n\n/** Hold a Durable Object heartbeat lease for the lifetime of an Effect. */\nexport const withDurableObjectKeepAlive =\n (keepAlive: DurableObjectKeepAlive) =>\n <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>\n Effect.acquireUseRelease(\n Effect.promise(() => keepAlive.acquire()),\n () => effect,\n (lease) => Effect.promise(() => lease.release()),\n );\n","import * as Cause from \"effect/Cause\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Option from \"effect/Option\";\nimport * as Schema from \"effect/Schema\";\nimport * as Stream from \"effect/Stream\";\n\nimport {\n SequenceNumber,\n SessionId,\n SummaryId,\n durablePosition,\n} from \"effect-durable-agent/types/core\";\nimport { CompactionSummaryArtifact } from \"effect-durable-agent/domain/context-projection\";\nimport {\n DurableEventEnvelope,\n assistantMessageCommittedEventType,\n assistantMessageImportedEventType,\n assistantPartialCommittedEventType,\n commandAdmittedEventType,\n commandCancelledEventType,\n commandCompletedEventType,\n commandFailedEventType,\n commandStartedEventType,\n contextRebasedEventType,\n decodeUnknownEDADurableEventSync,\n effectDurableAgentNamespace,\n steeringMessageQueuedEventType,\n summaryCreatedEventType,\n systemMessageCommittedEventType,\n userMessageCommittedEventType,\n} from \"effect-durable-agent/types/events\";\nimport {\n CommittedDurableEvent,\n DurableAppendBatch,\n DurableAppendEntry,\n EDASessionStore,\n EDASessionStoreError,\n type EDAReducerCheckpoint,\n type EDASessionStoreShape,\n type SaveReducerCheckpointInput,\n} from \"effect-durable-agent/services/session-store\";\nimport { annotateEdaSpan, committedBatchAttributes } from \"effect-durable-agent/services/tracing\";\nimport type {\n DurableObjectSessionStorage,\n DurableObjectSessionStoreOptions,\n DurableObjectSqlStorage,\n} from \"./durable-object-storage\";\n\n/** Safe payload ceiling below the Durable Object SQLite 2 MB value limit. */\n/** Conservative JSON limit below the Durable Object SQLite per-value ceiling. */\nexport const durableObjectSerializedJsonHardCapBytes = 1_500_000;\n\nconst ProjectionPayload = Schema.Record(Schema.String, Schema.Unknown);\nconst AdmittedCommandProjection = Schema.Struct({\n commandId: Schema.Unknown,\n idempotencyKey: Schema.optionalKey(Schema.Unknown),\n});\n\ninterface DurableObjectEventRow {\n readonly seq: number;\n readonly event_id: string;\n readonly namespace: string;\n readonly type: string;\n readonly schema_version: number;\n readonly created_at_ms: number;\n readonly trace_json: string;\n readonly fact_json: string;\n}\n\ninterface DurableObjectEventHeadRow {\n readonly head: number | null;\n}\n\ninterface DurableObjectEventPageCursor {\n readonly afterSeq: SequenceNumber;\n readonly throughSeq: SequenceNumber | undefined;\n}\n\ninterface DurableObjectMigrationRow {\n readonly version: number | null;\n}\n\ninterface DurableObjectMessagePayloadRow {\n readonly context_seq: number;\n readonly payload_json: string;\n}\n\ninterface DurableObjectSummaryPayloadRow {\n readonly payload_json: string;\n}\n\ninterface DurableObjectCommandLookupRow {\n readonly admitted_seq: number;\n}\n\ninterface DurableObjectCommandInputPayloadRow {\n readonly payload_json: string;\n}\n\ninterface DurableObjectReducerCheckpointRow {\n readonly reducer_name: string;\n readonly schema_version: number;\n readonly through_seq: number;\n readonly payload_json: string;\n readonly updated_at_ms: number;\n}\n\n/** Single squashed schema version for the current pre-release DO store. */\nconst durableObjectSessionStoreSchemaVersion = 1;\nconst jsonEncoder = new TextEncoder();\n\n/**\n * Bound one synchronous DO SQLite event-log read/decode to a small CPU and memory slice.\n *\n * A single logical event can already approach the per-row JSON hard cap, and logical decode may\n * touch sidecar rows. Sixteen rows keeps worst-case page memory materially below isolate limits\n * while still amortizing SQL cursor setup for normal small framework events. Revisit with page\n * duration/byte telemetry before increasing.\n */\nconst durableObjectEventReadPageRows = 16;\n\n/**\n * Durable Object SQLite-backed implementation of the semantic `EDASessionStore`.\n *\n * This adapter is the only place EDA framework storage code touches DO SQL. It\n * translates domain append intent into synchronous SQLite writes while keeping\n * `SessionState` and runners SQL-agnostic.\n */\nexport class DurableObjectSessionStore {\n /** Run the single squashed framework migration for the current pre-release schema. */\n static readonly migrate = (storage: DurableObjectSessionStorage) =>\n migrateDurableObjectSessionStore(storage);\n\n /** Build a session-scoped store after migrations have completed. */\n static readonly make = ({\n sessionId,\n storage,\n }: DurableObjectSessionStoreOptions): Effect.Effect<EDASessionStoreShape, EDASessionStoreError> =>\n Effect.gen(function* () {\n yield* DurableObjectSessionStore.migrate(storage);\n return makeDurableObjectSessionStore(sessionId, storage);\n });\n\n /** Layer constructor used by the Durable Object host runtime graph. */\n static readonly layer = (options: DurableObjectSessionStoreOptions) =>\n Layer.effect(EDASessionStore, DurableObjectSessionStore.make(options));\n}\n\n/**\n * Create all framework-owned tables in one idempotent startup step.\n *\n * The project is still pre-release, so this remains a squashed version-1 schema\n * rather than a chain of compatibility migrations.\n */\nconst migrateDurableObjectSessionStore = (storage: DurableObjectSessionStorage) =>\n Effect.try({\n try: () =>\n storage.transactionSync(() => {\n const { sql } = storage;\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_schema_migrations (\n id INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL DEFAULT (datetime('now'))\n )\n `);\n\n const currentVersion =\n sql\n .exec<DurableObjectMigrationRow>(\n \"SELECT COALESCE(MAX(id), 0) AS version FROM _eda_schema_migrations\",\n )\n .one().version ?? 0;\n\n if (currentVersion < durableObjectSessionStoreSchemaVersion) {\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_event_log (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n event_id TEXT NOT NULL UNIQUE,\n namespace TEXT NOT NULL,\n type TEXT NOT NULL,\n schema_version INTEGER NOT NULL,\n created_at_ms INTEGER NOT NULL,\n trace_json TEXT NOT NULL,\n fact_json TEXT NOT NULL\n )\n `);\n sql.exec(`\n CREATE INDEX IF NOT EXISTS _eda_event_log_namespace_type_seq_idx\n ON _eda_event_log(namespace, type, seq)\n `);\n\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_command_state (\n command_id TEXT PRIMARY KEY,\n admitted_seq INTEGER NOT NULL,\n status TEXT NOT NULL,\n idempotency_key TEXT,\n payload_json TEXT NOT NULL\n )\n `);\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_command_inputs (\n command_id TEXT PRIMARY KEY,\n admitted_seq INTEGER NOT NULL UNIQUE,\n payload_json TEXT NOT NULL\n )\n `);\n sql.exec(`\n CREATE INDEX IF NOT EXISTS _eda_command_state_status_seq_idx\n ON _eda_command_state(status, admitted_seq)\n `);\n sql.exec(`\n CREATE UNIQUE INDEX IF NOT EXISTS _eda_command_state_idempotency_idx\n ON _eda_command_state(idempotency_key) WHERE idempotency_key IS NOT NULL\n `);\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_context_messages (\n message_id TEXT PRIMARY KEY,\n context_seq INTEGER NOT NULL UNIQUE,\n payload_json TEXT NOT NULL\n )\n `);\n sql.exec(`\n CREATE INDEX IF NOT EXISTS _eda_context_messages_context_seq_idx\n ON _eda_context_messages(context_seq)\n `);\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_context_summaries (\n summary_id TEXT PRIMARY KEY,\n created_seq INTEGER NOT NULL UNIQUE,\n payload_json TEXT NOT NULL\n )\n `);\n sql.exec(`\n CREATE INDEX IF NOT EXISTS _eda_context_summaries_created_seq_idx\n ON _eda_context_summaries(created_seq)\n `);\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_reducer_checkpoints (\n reducer_name TEXT PRIMARY KEY,\n schema_version INTEGER NOT NULL,\n through_seq INTEGER NOT NULL,\n payload_json TEXT NOT NULL,\n updated_at_ms INTEGER NOT NULL\n )\n `);\n sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_sink_cursors (\n sink_name TEXT PRIMARY KEY,\n after_seq INTEGER NOT NULL,\n payload_json TEXT NOT NULL\n )\n `);\n sql.exec(\n \"INSERT INTO _eda_schema_migrations (id) VALUES (?)\",\n durableObjectSessionStoreSchemaVersion,\n );\n }\n }),\n catch: (error) => durableStoreError(\"migrating DurableObjectSessionStore\", error),\n });\n\n/**\n * Interpret the semantic store API with native DO SQLite.\n *\n * All writes that affect durable ordering happen inside `transactionSync`; replay\n * and lookup reads stay synchronous SQL wrapped in Effect boundaries.\n */\nconst makeDurableObjectSessionStore = (\n sessionId: SessionId,\n storage: DurableObjectSessionStorage,\n): EDASessionStoreShape => {\n const { sql } = storage;\n const ensureSession = (event: DurableEventEnvelope) => {\n if (event.sessionId !== sessionId) {\n throw new Error(\n `DurableObjectSessionStore is scoped to session ${sessionId}; received ${event.sessionId}`,\n );\n }\n };\n\n /**\n * Insert one append entry or return its existing idempotent event position.\n *\n * The event row is the sequence allocator. Artifact/projection writes happen\n * only for newly inserted events, preventing duplicate appends from advancing\n * body rows or metadata.\n */\n const insertOrRead = (entry: DurableAppendEntry): CommittedDurableEvent => {\n const { event } = entry;\n ensureSession(event);\n const existing = readCommittedByEventIdOptional(sql, sessionId, event.eventId);\n if (existing !== undefined) {\n return existing;\n }\n\n const encoded = encodeEventLogRow(event);\n sql.exec(\n `\n INSERT INTO _eda_event_log (\n event_id,\n namespace,\n type,\n schema_version,\n created_at_ms,\n trace_json,\n fact_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n `,\n encoded.eventId,\n encoded.namespace,\n encoded.type,\n encoded.schemaVersion,\n encoded.createdAtMs,\n encoded.traceJson,\n encoded.factJson,\n );\n const row = readEventLogRowByEventId(sql, event.eventId);\n applySynchronousProjections(sql, entry, SequenceNumber.make(row.seq), encoded.factJson);\n return rowToCommittedDurableEvent(sql, row, sessionId);\n };\n\n /** Execute an entire append batch as one synchronous SQLite transaction. */\n const append = (batch: DurableAppendBatch) =>\n Effect.try({\n try: () => storage.transactionSync(() => batch.entries.map(insertOrRead)),\n catch: (error) => durableStoreError(\"appending DurableObjectSessionStore batch\", error),\n }).pipe(Effect.tap((committed) => annotateEdaSpan(committedBatchAttributes(committed))));\n\n return {\n append,\n eventsAfter: (afterSeq) => makeCommittedEventStream(sql, sessionId, afterSeq),\n loadCommittedEventsBySeq: (seqs) =>\n Effect.try({\n try: () =>\n uniqueSequenceNumbers(seqs)\n .sort((left, right) => left - right)\n .map((seq) => readCommittedBySeq(sql, sessionId, seq)),\n catch: (error) =>\n durableStoreError(\"loading DurableObjectSessionStore events by seq\", error),\n }),\n findCommandAdmission: (input) =>\n Effect.try({\n try: () => {\n const row = findCommandAdmissionRow(sql, input.commandId, input.idempotencyKey);\n return row === undefined\n ? undefined\n : readCommittedBySeq(sql, sessionId, row.admitted_seq);\n },\n catch: (error) => durableStoreError(\"finding command admission\", error),\n }),\n loadSummaryArtifact: (summaryId) =>\n Effect.try({\n try: () => readSummaryPayloadOptional(sql, summaryId),\n catch: (error) => durableStoreError(\"loading DurableObjectSessionStore summary\", error),\n }),\n loadReducerCheckpoint: (name) =>\n Effect.try({\n try: () => readReducerCheckpoint(sql, name),\n catch: (error) =>\n durableStoreError(`loading DurableObjectSessionStore reducer checkpoint ${name}`, error),\n }),\n saveReducerCheckpoint: (checkpoint) =>\n Effect.try({\n try: () => writeReducerCheckpoint(sql, checkpoint),\n catch: (error) =>\n durableStoreError(\n `saving DurableObjectSessionStore reducer checkpoint ${checkpoint.name}`,\n error,\n ),\n }),\n saveReducerCheckpoints: (checkpoints) =>\n Effect.try({\n try: () =>\n storage.transactionSync(() =>\n checkpoints.forEach((checkpoint) => writeReducerCheckpoint(sql, checkpoint)),\n ),\n catch: (error) =>\n durableStoreError(\"saving DurableObjectSessionStore reducer checkpoints\", error),\n }),\n };\n};\n\nconst makeCommittedEventStream = (\n sql: DurableObjectSqlStorage,\n sessionId: SessionId,\n afterSeq: SequenceNumber,\n): Stream.Stream<CommittedDurableEvent, EDASessionStoreError> =>\n Stream.fromPull(\n Effect.sync(() => {\n let cursor: DurableObjectEventPageCursor = { afterSeq, throughSeq: undefined };\n let done = false;\n return Effect.gen(function* () {\n if (done) {\n return yield* Cause.done();\n }\n // DO SQLite is synchronous; yield between bounded pages so eager consumers do not\n // monopolize the isolate with one long replay/decode loop.\n yield* Effect.yieldNow;\n const page = yield* readCommittedEventPage(sql, sessionId, cursor);\n if (page.events.length === 0) {\n done = true;\n return yield* Cause.done();\n }\n if (Option.isSome(page.next)) {\n cursor = page.next.value;\n } else {\n done = true;\n }\n return page.events as readonly [CommittedDurableEvent, ...Array<CommittedDurableEvent>];\n });\n }),\n );\n\nconst readCommittedEventPage = (\n sql: DurableObjectSqlStorage,\n sessionId: SessionId,\n cursor: DurableObjectEventPageCursor,\n): Effect.Effect<\n {\n readonly events: ReadonlyArray<CommittedDurableEvent>;\n readonly next: Option.Option<DurableObjectEventPageCursor>;\n },\n EDASessionStoreError\n> =>\n Effect.try({\n try: () => {\n const throughSeq = cursor.throughSeq ?? readEventLogHead(sql);\n if (cursor.afterSeq >= throughSeq) {\n return { events: [], next: Option.none() };\n }\n\n const events = sql\n .exec<DurableObjectEventRow>(\n `\n SELECT seq, event_id, namespace, type, schema_version, created_at_ms, trace_json, fact_json\n FROM _eda_event_log\n WHERE seq > ? AND seq <= ?\n ORDER BY seq ASC\n LIMIT ?\n `,\n cursor.afterSeq,\n throughSeq,\n durableObjectEventReadPageRows,\n )\n .toArray()\n .map((row) => rowToCommittedDurableEvent(sql, row, sessionId));\n const lastSeq = events.at(-1)?.position.seq ?? cursor.afterSeq;\n return {\n events,\n next:\n lastSeq < throughSeq\n ? Option.some({ afterSeq: lastSeq, throughSeq } satisfies DurableObjectEventPageCursor)\n : Option.none(),\n };\n },\n catch: (error) => durableStoreError(\"replaying DurableObjectSessionStore events\", error),\n });\n\nconst readEventLogHead = (sql: DurableObjectSqlStorage): SequenceNumber =>\n SequenceNumber.make(\n sql\n .exec<DurableObjectEventHeadRow>(\n `\n SELECT COALESCE(MAX(seq), 0) AS head\n FROM _eda_event_log\n `,\n )\n .one().head ?? 0,\n );\n\nconst uniqueSequenceNumbers = (seqs: ReadonlyArray<SequenceNumber>): Array<SequenceNumber> =>\n Array.from(new Set(seqs.map((seq) => Number(seq)))).map((seq) => SequenceNumber.make(seq));\n\nconst readEventLogRowByEventId = (\n sql: DurableObjectSqlStorage,\n eventId: DurableEventEnvelope[\"eventId\"],\n): DurableObjectEventRow =>\n sql\n .exec<DurableObjectEventRow>(\n `\n SELECT seq, event_id, namespace, type, schema_version, created_at_ms, trace_json, fact_json\n FROM _eda_event_log\n WHERE event_id = ?\n `,\n eventId,\n )\n .one();\n\nconst readCommittedByEventIdOptional = (\n sql: DurableObjectSqlStorage,\n sessionId: SessionId,\n eventId: DurableEventEnvelope[\"eventId\"],\n): CommittedDurableEvent | undefined => {\n const row = sql\n .exec<DurableObjectEventRow>(\n `\n SELECT seq, event_id, namespace, type, schema_version, created_at_ms, trace_json, fact_json\n FROM _eda_event_log\n WHERE event_id = ?\n `,\n eventId,\n )\n .toArray()[0];\n return row === undefined ? undefined : rowToCommittedDurableEvent(sql, row, sessionId);\n};\n\nconst readReducerCheckpoint = (\n sql: DurableObjectSqlStorage,\n name: string,\n): EDAReducerCheckpoint | undefined => {\n const row = sql\n .exec<DurableObjectReducerCheckpointRow>(\n `\n SELECT reducer_name, schema_version, through_seq, payload_json, updated_at_ms\n FROM _eda_reducer_checkpoints\n WHERE reducer_name = ?\n `,\n name,\n )\n .toArray()[0];\n return row === undefined\n ? undefined\n : {\n name: row.reducer_name,\n schemaVersion: row.schema_version,\n throughSeq: SequenceNumber.make(row.through_seq),\n payload: JSON.parse(row.payload_json),\n updatedAtMs: row.updated_at_ms,\n };\n};\n\nconst writeReducerCheckpoint = (\n sql: DurableObjectSqlStorage,\n checkpoint: SaveReducerCheckpointInput,\n): void => {\n sql.exec(\n `\n INSERT INTO _eda_reducer_checkpoints (\n reducer_name,\n schema_version,\n through_seq,\n payload_json,\n updated_at_ms\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(reducer_name) DO UPDATE SET\n schema_version = excluded.schema_version,\n through_seq = excluded.through_seq,\n payload_json = excluded.payload_json,\n updated_at_ms = excluded.updated_at_ms\n `,\n checkpoint.name,\n checkpoint.schemaVersion,\n checkpoint.throughSeq,\n stringifyJsonForColumn(checkpoint.payload, \"_eda_reducer_checkpoints.payload_json\"),\n checkpoint.updatedAtMs,\n );\n};\n\nconst readMessagePayloadByContextSeq = (\n sql: DurableObjectSqlStorage,\n contextSeq: number,\n): DurableObjectMessagePayloadRow => {\n const message = sql\n .exec<DurableObjectMessagePayloadRow>(\n `\n SELECT context_seq, payload_json\n FROM _eda_context_messages\n WHERE context_seq = ?\n `,\n contextSeq,\n )\n .toArray()[0];\n if (message === undefined) {\n throw new Error(`Context message at seq ${contextSeq} missing from _eda_context_messages`);\n }\n return message;\n};\n\nconst readCommittedBySeq = (\n sql: DurableObjectSqlStorage,\n sessionId: SessionId,\n seq: number,\n): CommittedDurableEvent => {\n const row = sql\n .exec<DurableObjectEventRow>(\n `\n SELECT seq, event_id, namespace, type, schema_version, created_at_ms, trace_json, fact_json\n FROM _eda_event_log\n WHERE seq = ?\n `,\n seq,\n )\n .one();\n return rowToCommittedDurableEvent(sql, row, sessionId);\n};\n\nconst rowToCommittedDurableEvent = (\n sql: DurableObjectSqlStorage,\n row: DurableObjectEventRow,\n sessionId: SessionId,\n): CommittedDurableEvent =>\n CommittedDurableEvent.make({\n position: durablePosition(SequenceNumber.make(row.seq)),\n event: decodeDurableEvent({\n namespace: row.namespace,\n type: row.type,\n schemaVersion: row.schema_version,\n durability: \"durable\",\n eventId: row.event_id,\n sessionId,\n createdAtMs: row.created_at_ms,\n trace: JSON.parse(row.trace_json),\n payload: readLogicalPayload(sql, row),\n }),\n });\n\nconst decodeDurableEvent = (input: unknown): DurableEventEnvelope => {\n const event = Schema.decodeUnknownSync(DurableEventEnvelope)(input);\n return event.namespace === effectDurableAgentNamespace\n ? decodeUnknownEDADurableEventSync(event)\n : event;\n};\n\ninterface EncodedEventLogRow {\n readonly eventId: string;\n readonly namespace: string;\n readonly type: string;\n readonly schemaVersion: number;\n readonly createdAtMs: number;\n readonly traceJson: string;\n readonly factJson: string;\n}\n\nconst encodeEventLogRow = (event: DurableEventEnvelope): EncodedEventLogRow => {\n const encoded = Schema.encodeSync(DurableEventEnvelope)(event);\n return {\n eventId: encoded.eventId,\n namespace: encoded.namespace,\n type: encoded.type,\n schemaVersion: encoded.schemaVersion,\n createdAtMs: encoded.createdAtMs,\n traceJson: stringifyJsonForColumn(encoded.trace, \"_eda_event_log.trace_json\"),\n factJson: stringifyJsonForColumn(\n eventLogFactPayload(encoded.namespace, encoded.type, encoded.payload),\n \"_eda_event_log.fact_json\",\n ),\n };\n};\n\nconst readLogicalPayload = (sql: DurableObjectSqlStorage, row: DurableObjectEventRow): unknown => {\n if (row.namespace !== effectDurableAgentNamespace) {\n return JSON.parse(row.fact_json);\n }\n if (row.type === commandAdmittedEventType) {\n const commandId = readCommandIdFromFact(row);\n const command = readCommandInputPayload(sql, commandId);\n return { command };\n }\n if (contextMessageEventTypes.has(row.type)) {\n return JSON.parse(readMessagePayloadByContextSeq(sql, row.seq).payload_json);\n }\n if (row.type === summaryCreatedEventType) {\n return {\n ...(JSON.parse(row.fact_json) as Record<string, unknown>),\n summary: readSummaryPayloadFromCreatedSeq(sql, row.seq),\n };\n }\n return JSON.parse(row.fact_json);\n};\n\nconst eventLogFactPayload = (namespace: string, type: string, payload: unknown): unknown => {\n if (\n namespace !== effectDurableAgentNamespace ||\n typeof payload !== \"object\" ||\n payload === null\n ) {\n return payload;\n }\n\n const record = payload as Record<string, unknown>;\n switch (type) {\n case commandAdmittedEventType:\n return { command: commandFact(record.command) };\n case systemMessageCommittedEventType:\n return pick(record, [\"messageId\"]);\n case userMessageCommittedEventType:\n return pick(record, [\"commandId\", \"messageId\"]);\n case steeringMessageQueuedEventType:\n return pick(record, [\"commandId\", \"messageId\", \"runId\"]);\n case assistantMessageCommittedEventType:\n case assistantMessageImportedEventType:\n return pick(record, [\"messageId\", \"runId\", \"turnId\", \"inferenceId\"]);\n case assistantPartialCommittedEventType:\n return pick(record, [\"messageId\", \"runId\", \"turnId\", \"inferenceId\", \"reason\"]);\n case summaryCreatedEventType:\n return pick(record, [\"compactionId\", \"summaryId\", \"sourceFromSeq\", \"sourceToSeq\"]);\n default:\n return payload;\n }\n};\n\nconst commandFact = (command: unknown): unknown => {\n if (typeof command !== \"object\" || command === null) {\n return command;\n }\n const record = command as Record<string, unknown>;\n return record._tag === \"SubmitMessage\"\n ? pick(record, [\"_tag\", \"commandId\", \"disposition\", \"idempotencyKey\"])\n : command;\n};\n\nconst pick = (\n record: Record<string, unknown>,\n keys: ReadonlyArray<string>,\n): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n for (const key of keys) {\n if (record[key] !== undefined) {\n out[key] = record[key];\n }\n }\n return out;\n};\n\nconst readCommandIdFromFact = (row: DurableObjectEventRow): string => {\n const commandId = (\n JSON.parse(row.fact_json) as { readonly command?: { readonly commandId?: unknown } }\n ).command?.commandId;\n if (typeof commandId !== \"string\") {\n throw new Error(`CommandAdmitted fact at seq ${row.seq} missing command.commandId`);\n }\n return commandId;\n};\n\nconst readCommandInputPayload = (sql: DurableObjectSqlStorage, commandId: string): unknown => {\n const row = sql\n .exec<DurableObjectCommandInputPayloadRow>(\n `\n SELECT payload_json\n FROM _eda_command_inputs\n WHERE command_id = ?\n `,\n commandId,\n )\n .toArray()[0];\n if (row === undefined) {\n throw new Error(`Command input ${commandId} missing from _eda_command_inputs`);\n }\n return JSON.parse(row.payload_json);\n};\n\nconst readSummaryPayloadOptional = (\n sql: DurableObjectSqlStorage,\n summaryId: SummaryId,\n): CompactionSummaryArtifact | undefined => {\n const row = sql\n .exec<DurableObjectSummaryPayloadRow>(\n `\n SELECT payload_json\n FROM _eda_context_summaries\n WHERE summary_id = ?\n `,\n summaryId,\n )\n .toArray()[0];\n return row === undefined\n ? undefined\n : Schema.decodeUnknownSync(CompactionSummaryArtifact)(JSON.parse(row.payload_json));\n};\n\nconst readSummaryPayloadFromCreatedSeq = (\n sql: DurableObjectSqlStorage,\n createdSeq: number,\n): unknown => {\n const row = sql\n .exec<DurableObjectSummaryPayloadRow>(\n `\n SELECT payload_json\n FROM _eda_context_summaries\n WHERE created_seq = ?\n `,\n createdSeq,\n )\n .toArray()[0];\n if (row === undefined) {\n throw new Error(`SummaryCreated at seq ${createdSeq} missing from _eda_context_summaries`);\n }\n return JSON.parse(row.payload_json);\n};\n\n/**\n * Maintain bounded storage projections in the same transaction as the event.\n *\n * These rows are durability aids, not a second source of lifecycle truth: event\n * order still comes from `_eda_event_log.seq`, while projections make command\n * lookup and body-sidecar hydration bounded.\n */\nconst applySynchronousProjections = (\n sql: DurableObjectSqlStorage,\n entry: DurableAppendEntry,\n seq: SequenceNumber,\n factJson: string,\n): void => {\n const { event } = entry;\n if (event.namespace !== effectDurableAgentNamespace) {\n return;\n }\n\n writeCommandProjection(sql, event, seq, factJson);\n writeCommandInputProjection(sql, event, seq);\n writeMessageProjection(sql, event, seq);\n writeSummaryProjection(sql, event, seq);\n writeContextRebaseProjection(sql, event, seq);\n};\n\nconst writeCommandProjection = (\n sql: DurableObjectSqlStorage,\n event: DurableEventEnvelope,\n seq: SequenceNumber,\n factJson: string,\n): void => {\n const payload = Schema.decodeUnknownSync(ProjectionPayload)(event.payload);\n switch (event.type) {\n case commandAdmittedEventType: {\n const command = Schema.decodeUnknownSync(AdmittedCommandProjection)(payload.command);\n const commandId = command.commandId;\n if (commandId === undefined) {\n throw new Error(\"CommandAdmitted missing command.commandId\");\n }\n sql.exec(\n `\n INSERT INTO _eda_command_state (\n command_id,\n admitted_seq,\n status,\n idempotency_key,\n payload_json\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(command_id) DO UPDATE SET\n admitted_seq = excluded.admitted_seq,\n status = excluded.status,\n idempotency_key = excluded.idempotency_key,\n payload_json = excluded.payload_json\n `,\n commandId,\n seq,\n \"admitted\",\n command.idempotencyKey ?? null,\n factJson,\n );\n return;\n }\n case commandStartedEventType:\n writeCommandStatus(sql, payload.commandId, seq, \"started\", factJson);\n return;\n case commandCompletedEventType:\n writeCommandStatus(sql, payload.commandId, seq, \"completed\", factJson);\n return;\n case commandFailedEventType:\n writeCommandStatus(sql, payload.commandId, seq, \"failed\", factJson);\n return;\n case commandCancelledEventType:\n writeCommandStatus(sql, payload.commandId, seq, \"cancelled\", factJson);\n return;\n default:\n return;\n }\n};\n\nconst writeCommandStatus = (\n sql: DurableObjectSqlStorage,\n commandId: unknown,\n seq: SequenceNumber,\n status: string,\n payloadJson: string,\n): void => {\n if (commandId === undefined) {\n throw new Error(`${status} command event missing commandId`);\n }\n sql.exec(\n `\n INSERT INTO _eda_command_state (\n command_id,\n admitted_seq,\n status,\n idempotency_key,\n payload_json\n ) VALUES (?, ?, ?, NULL, ?)\n ON CONFLICT(command_id) DO UPDATE SET\n status = excluded.status,\n payload_json = excluded.payload_json\n `,\n commandId,\n seq,\n status,\n payloadJson,\n );\n};\n\nconst writeCommandInputProjection = (\n sql: DurableObjectSqlStorage,\n event: DurableEventEnvelope,\n seq: SequenceNumber,\n): void => {\n if (event.type !== commandAdmittedEventType) {\n return;\n }\n const encoded = Schema.encodeSync(DurableEventEnvelope)(event);\n const command = (encoded.payload as { readonly command?: { readonly commandId?: unknown } })\n .command;\n const commandId = command?.commandId;\n if (commandId === undefined) {\n throw new Error(\"CommandAdmitted missing command.commandId\");\n }\n sql.exec(\n `\n INSERT INTO _eda_command_inputs (\n command_id,\n admitted_seq,\n payload_json\n ) VALUES (?, ?, ?)\n ON CONFLICT(command_id) DO UPDATE SET\n admitted_seq = excluded.admitted_seq,\n payload_json = excluded.payload_json\n `,\n commandId,\n seq,\n stringifyJsonForColumn(command, \"_eda_command_inputs.payload_json\"),\n );\n};\n\nconst contextMessageEventTypes = new Set<string>([\n systemMessageCommittedEventType,\n userMessageCommittedEventType,\n steeringMessageQueuedEventType,\n assistantMessageCommittedEventType,\n assistantMessageImportedEventType,\n assistantPartialCommittedEventType,\n]);\n\n/** Persist model-visible message bodies with the seq that exposed them to context. */\nconst writeMessageProjection = (\n sql: DurableObjectSqlStorage,\n event: DurableEventEnvelope,\n seq: SequenceNumber,\n): void => {\n if (!contextMessageEventTypes.has(event.type)) {\n return;\n }\n\n const encoded = Schema.encodeSync(DurableEventEnvelope)(event);\n const messageId = (encoded.payload as { readonly messageId?: unknown }).messageId;\n if (messageId === undefined) {\n throw new Error(`${event.type} missing messageId`);\n }\n\n sql.exec(\n `\n INSERT INTO _eda_context_messages (\n message_id,\n context_seq,\n payload_json\n ) VALUES (?, ?, ?)\n ON CONFLICT(message_id) DO UPDATE SET\n context_seq = excluded.context_seq,\n payload_json = excluded.payload_json\n `,\n messageId,\n seq,\n stringifyJsonForColumn(encoded.payload, \"_eda_context_messages.payload_json\"),\n );\n};\n\n/**\n * Persist a cumulative summary artifact without making it the active context.\n *\n * `ContextRebased` selects summaries in the framework reduced-state checkpoint;\n * failed compactions can leave orphaned summaries without changing future context.\n */\nconst writeSummaryProjection = (\n sql: DurableObjectSqlStorage,\n event: DurableEventEnvelope,\n seq: SequenceNumber,\n): void => {\n if (event.type !== summaryCreatedEventType) {\n return;\n }\n\n const payload = event.payload as {\n readonly compactionId?: unknown;\n readonly summaryId?: unknown;\n readonly summary?: unknown;\n };\n const summaryId = payload.summaryId;\n if (summaryId === undefined) {\n throw new Error(\"SummaryCreated missing summaryId\");\n }\n if (payload.summary === undefined) {\n throw new Error(\"SummaryCreated requires summary payload\");\n }\n\n const summary = Schema.decodeUnknownSync(CompactionSummaryArtifact)(payload.summary);\n if (summary.summaryId !== summaryId) {\n throw new Error(\"SummaryCreated summaryId does not match summary payload\");\n }\n if (summary.compactionId !== payload.compactionId) {\n throw new Error(\"SummaryCreated compactionId does not match summary payload\");\n }\n\n sql.exec(\n `\n INSERT INTO _eda_context_summaries (\n summary_id,\n created_seq,\n payload_json\n ) VALUES (?, ?, ?)\n ON CONFLICT(summary_id) DO UPDATE SET\n created_seq = excluded.created_seq,\n payload_json = excluded.payload_json\n `,\n summaryId,\n seq,\n stringifyJsonForColumn(summary, \"_eda_context_summaries.payload_json\"),\n );\n};\n\n/** Validate that `ContextRebased` points at a committed summary sidecar. */\nconst writeContextRebaseProjection = (\n sql: DurableObjectSqlStorage,\n event: DurableEventEnvelope,\n _seq: SequenceNumber,\n): void => {\n if (event.type !== contextRebasedEventType) {\n return;\n }\n\n const payload = event.payload as {\n readonly compactionId?: unknown;\n readonly retainedFromContextSeq?: unknown;\n readonly summaryId?: unknown;\n };\n if (payload.summaryId === undefined) {\n throw new Error(\"ContextRebased missing summaryId\");\n }\n const summary = readSummaryPayloadOptional(sql, SummaryId.make(String(payload.summaryId)));\n if (summary === undefined) {\n throw new Error(`ContextRebased references unknown summaryId ${String(payload.summaryId)}`);\n }\n if (summary.compactionId !== payload.compactionId) {\n throw new Error(\"ContextRebased summary compactionId does not match event payload\");\n }\n if (summary.retainedFromContextSeq !== payload.retainedFromContextSeq) {\n throw new Error(\"ContextRebased retained cursor does not match summary payload\");\n }\n};\n\n/**\n * Lookup prior command admission through `_eda_command_state` instead of genesis replay.\n *\n * Idempotency key wins over explicit command id so caller-owned retry keys remain\n * the stable dedupe surface for external ingress.\n */\nconst findCommandAdmissionRow = (\n sql: DurableObjectSqlStorage,\n commandId: unknown,\n idempotencyKey: unknown,\n): DurableObjectCommandLookupRow | undefined => {\n if (idempotencyKey !== undefined) {\n const row = sql\n .exec<DurableObjectCommandLookupRow>(\n `\n SELECT admitted_seq\n FROM _eda_command_state\n WHERE idempotency_key = ?\n `,\n idempotencyKey,\n )\n .toArray()[0];\n if (row !== undefined) {\n return row;\n }\n }\n\n if (commandId === undefined) {\n return undefined;\n }\n return sql\n .exec<DurableObjectCommandLookupRow>(\n `\n SELECT admitted_seq\n FROM _eda_command_state\n WHERE command_id = ?\n `,\n commandId,\n )\n .toArray()[0];\n};\n\n/** Serialize and size-check one JSON column before it reaches DO SQLite. */\nconst stringifyJsonForColumn = (value: unknown, column: string): string => {\n const json = JSON.stringify(value);\n if (json === undefined) {\n throw new Error(`${column} value is not JSON serializable`);\n }\n const bytes = jsonEncoder.encode(json).byteLength;\n if (bytes > durableObjectSerializedJsonHardCapBytes) {\n throw new Error(\n `${column} serialized JSON is ${bytes} bytes; hard cap is ${durableObjectSerializedJsonHardCapBytes} bytes`,\n );\n }\n return json;\n};\n\nconst durableStoreError = (operation: string, cause: unknown) =>\n new EDASessionStoreError({\n message:\n cause instanceof Error ? `${operation}: ${cause.message}` : `${operation}: ${String(cause)}`,\n });\n","import * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\n\nimport { SequenceNumber } from \"effect-durable-agent/types/core\";\nimport { EDASessionStoreError } from \"effect-durable-agent/services/session-store\";\nimport {\n SinkCheckpointStore,\n type EDASinkName,\n type SinkCheckpointStoreShape,\n} from \"effect-durable-agent/services/sink-checkpoint-store\";\nimport type { DurableObjectSessionStorage } from \"./durable-object-storage\";\n\n/**\n * Durable Object SQLite adapter for EDA sink checkpoints.\n *\n * Checkpoint SQL stays in the host layer for the same reason session storage SQL\n * does: framework sink code should depend on checkpoint semantics, not table access.\n */\nexport class DurableObjectSinkCheckpointStore {\n /** Ensure the fixed `_eda_sink_cursors` table exists during host startup. */\n static readonly migrate = (storage: DurableObjectSessionStorage) =>\n migrateSinkCheckpointStore(storage);\n\n /** Build the semantic checkpoint store over native DO SQLite. */\n static readonly make = (\n storage: DurableObjectSessionStorage,\n ): Effect.Effect<SinkCheckpointStoreShape, EDASessionStoreError> =>\n makeDurableObjectSinkCheckpointStore(storage);\n\n static readonly layer = (storage: DurableObjectSessionStorage) =>\n Layer.effect(SinkCheckpointStore, DurableObjectSinkCheckpointStore.make(storage));\n}\n\n/** Create the sink checkpoint table inside the current EDA storage schema. */\nconst migrateSinkCheckpointStore = (\n storage: DurableObjectSessionStorage,\n): Effect.Effect<void, EDASessionStoreError> =>\n Effect.try({\n try: () => {\n storage.sql.exec(`\n CREATE TABLE IF NOT EXISTS _eda_sink_cursors (\n sink_name TEXT PRIMARY KEY,\n after_seq INTEGER NOT NULL,\n payload_json TEXT NOT NULL\n )\n `);\n },\n catch: (error) => sinkCheckpointError(\"migrating SinkCheckpointStore\", error),\n });\n\n/** Interpret checkpoint load/save/commit with idempotent upserts. */\nconst makeDurableObjectSinkCheckpointStore = (\n storage: DurableObjectSessionStorage,\n): Effect.Effect<SinkCheckpointStoreShape, EDASessionStoreError> =>\n Effect.gen(function* () {\n yield* DurableObjectSinkCheckpointStore.migrate(storage);\n const { sql } = storage;\n return {\n load: (sinkName: EDASinkName) =>\n Effect.try({\n try: () => {\n const rows = sql\n .exec<{ after_seq: number; payload_json: string }>(\n `SELECT after_seq, payload_json FROM _eda_sink_cursors WHERE sink_name = ?`,\n sinkName,\n )\n .toArray();\n const row = rows[0];\n return row === undefined\n ? { afterSeq: SequenceNumber.make(0), payload: undefined }\n : {\n afterSeq: SequenceNumber.make(row.after_seq),\n payload: JSON.parse(row.payload_json),\n };\n },\n catch: (error) => sinkCheckpointError(\"reading sink checkpoint\", error),\n }),\n saveState: (sinkName: EDASinkName, payload: unknown) =>\n Effect.try({\n try: () => {\n sql.exec(\n `\n INSERT INTO _eda_sink_cursors (sink_name, after_seq, payload_json)\n VALUES (?, 0, ?)\n ON CONFLICT(sink_name) DO UPDATE SET\n payload_json = excluded.payload_json\n `,\n sinkName,\n JSON.stringify(payload),\n );\n },\n catch: (error) => sinkCheckpointError(\"saving sink checkpoint state\", error),\n }),\n commit: (sinkName: EDASinkName, afterSeq: SequenceNumber, payload: unknown | undefined) =>\n Effect.try({\n try: () => {\n sql.exec(\n `\n INSERT INTO _eda_sink_cursors (sink_name, after_seq, payload_json)\n VALUES (?, ?, ?)\n ON CONFLICT(sink_name) DO UPDATE SET\n after_seq = excluded.after_seq,\n payload_json = excluded.payload_json\n `,\n sinkName,\n afterSeq,\n JSON.stringify(payload ?? { updatedAtMs: Date.now() }),\n );\n },\n catch: (error) => sinkCheckpointError(\"committing sink checkpoint\", error),\n }),\n } satisfies SinkCheckpointStoreShape;\n });\n\nconst sinkCheckpointError = (operation: string, cause: unknown) =>\n new EDASessionStoreError({\n message:\n cause instanceof Error ? `${operation}: ${cause.message}` : `${operation}: ${String(cause)}`,\n });\n","import { OpenAiClient, OpenAiLanguageModel } from \"@effect/ai-openai\";\nimport * as Deferred from \"effect/Deferred\";\nimport * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport * as Layer from \"effect/Layer\";\nimport * as ManagedRuntime from \"effect/ManagedRuntime\";\nimport * as Queue from \"effect/Queue\";\nimport * as Redacted from \"effect/Redacted\";\nimport * as Schema from \"effect/Schema\";\nimport * as Tracer from \"effect/Tracer\";\nimport type * as LanguageModel from \"effect/unstable/ai/LanguageModel\";\nimport * as FetchHttpClient from \"effect/unstable/http/FetchHttpClient\";\nimport * as HttpBody from \"effect/unstable/http/HttpBody\";\nimport * as HttpClient from \"effect/unstable/http/HttpClient\";\nimport * as HttpClientError from \"effect/unstable/http/HttpClientError\";\nimport * as HttpClientRequest from \"effect/unstable/http/HttpClientRequest\";\nimport * as HttpClientResponse from \"effect/unstable/http/HttpClientResponse\";\n\nimport type { DurableTranscriptMessage } from \"effect-durable-agent/domain/message-transcript\";\nimport { EDACommand } from \"effect-durable-agent/types/commands\";\nimport { CommandId, SequenceNumber, SessionId } from \"effect-durable-agent/types/core\";\nimport { DurableEventEnvelope } from \"effect-durable-agent/types/events\";\nimport {\n makeRootEDATraceMetadata,\n type EDATraceMetadata,\n} from \"effect-durable-agent/types/tracing\";\nimport { CompactionExecutor, CompactionPolicy } from \"effect-durable-agent/services/compaction\";\nimport { EDAKeepAlive } from \"effect-durable-agent/services/keep-alive\";\nimport { EDAPromptProjector } from \"effect-durable-agent/services/prompt-projector\";\nimport {\n EDAReducerRegistry,\n type EDAReducer,\n} from \"effect-durable-agent/services/reducer-registry\";\nimport { EDARuntime, type EDARuntimeConfig } from \"effect-durable-agent/services/runtime\";\nimport { makeEDARuntimeLayer } from \"effect-durable-agent/services/runtime-layer\";\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport {\n CommittedDurableEvent,\n EDASessionStoreError,\n} from \"effect-durable-agent/services/session-store\";\nimport type {\n EDASubmittable,\n SessionCommandAdmissionError,\n} from \"effect-durable-agent/services/session-state\";\nimport type { EDASink } from \"effect-durable-agent/services/sink-registry\";\nimport { compactSpanAttributes, toEdaExternalSpan } from \"effect-durable-agent/services/tracing\";\nimport type {\n EDAModelToolkit,\n EDAToolRegistryShape,\n} from \"effect-durable-agent/services/tool-registry\";\nimport {\n SubscriberLagged,\n SubscriberProtocolError,\n SubscriberSendFailed,\n runWebSocketSubscriber,\n} from \"effect-durable-agent/services/websocket-subscriber\";\nimport type {\n CommittedCommandTerminalEvent,\n EDARuntimeShape,\n} from \"effect-durable-agent/services/runtime\";\nimport {\n DurableObjectKeepAlive,\n type DurableObjectAlarmStorage,\n type DurableObjectBackgroundWaiter,\n} from \"./durable-object-keepalive\";\nimport { DurableObjectSessionStore } from \"./durable-object-store\";\nimport { DurableObjectSinkCheckpointStore } from \"./durable-object-sink-checkpoints\";\nimport type { DurableObjectSessionStorage } from \"./durable-object-storage\";\nimport {\n EDA_WS_CLOSE_LAGGED,\n EDA_WS_CLOSE_PROTOCOL_ERROR,\n EDA_WS_CLOSE_SEND_FAILED,\n EDAWebSocketAttachment,\n EDAWebSocketErrorFrame,\n EDAWebSocketLaggedFrame,\n SubscriberId,\n decodeEDAWebSocketAttachment,\n decodeEDAWebSocketClientMessage,\n defaultEDAWebSocketFlowControl,\n encodeEDAWebSocketServerFrame,\n laggedCloseReason,\n type EDAWebSocketClientFrame,\n type EDAWebSocketServerFrame,\n} from \"./websocket-protocol\";\nimport type { EDAWebSocketServerFrameEncoder } from \"effect-durable-agent/host/websocket-wire\";\n\n/** Durable Object storage capabilities needed by the EDA session host. */\nexport type EDASessionDurableObjectStorage = DurableObjectSessionStorage &\n DurableObjectAlarmStorage;\n\n/** Options for composing one EDA runtime inside a raw Durable Object. */\nexport interface EDADurableObjectRuntimeLayerOptions {\n readonly config: EDARuntimeConfig;\n readonly compactionExecutorLayer?: Layer.Layer<\n CompactionExecutor,\n never,\n LanguageModel.LanguageModel\n >;\n readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;\n readonly keepAlive?: DurableObjectKeepAlive;\n readonly modelLayer: Layer.Layer<LanguageModel.LanguageModel>;\n readonly promptProjectorLayer?: Layer.Layer<EDAPromptProjector>;\n readonly reducers?: ReadonlyArray<EDAReducer<any>>;\n readonly sessionId: SessionId;\n readonly sinks?: ReadonlyArray<EDASink>;\n readonly storage: EDASessionDurableObjectStorage;\n readonly toolkit?: EDAModelToolkit;\n readonly toolRegistry?: EDAToolRegistryShape;\n readonly tracer?: Tracer.Tracer;\n}\n\n/** Options for one live raw Durable Object host instance. */\nexport interface EDASessionDurableObjectHostOptions {\n readonly background?: DurableObjectBackgroundWaiter;\n readonly config: EDARuntimeConfig;\n readonly compactionExecutorLayer?: Layer.Layer<\n CompactionExecutor,\n never,\n LanguageModel.LanguageModel\n >;\n readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;\n readonly keepAlive?: DurableObjectKeepAlive;\n readonly modelLayer: Layer.Layer<LanguageModel.LanguageModel>;\n readonly promptProjectorLayer?: Layer.Layer<EDAPromptProjector>;\n readonly reducers?: ReadonlyArray<EDAReducer<any>>;\n readonly sinks?: ReadonlyArray<EDASink>;\n readonly storage: EDASessionDurableObjectStorage;\n readonly toolkit?: EDAModelToolkit | EDAToolkitFactory;\n readonly toolRegistry?: EDAToolRegistryShape | EDAToolRegistryFactory;\n readonly tracer?: Tracer.Tracer | EDATracerFactory;\n readonly webSocketProtocol?: EDAWebSocketServerFrameEncoder;\n}\n\n/** Per-session factory for provider-visible model toolkit definitions. */\nexport type EDAToolkitFactory = (input: { readonly sessionId: SessionId }) => EDAModelToolkit;\n\n/** Per-session factory for custom tool registry implementations. */\nexport type EDAToolRegistryFactory = (input: {\n readonly sessionId: SessionId;\n}) => EDAToolRegistryShape;\n\nexport type EDATracerFactory = (input: { readonly sessionId: SessionId }) => Tracer.Tracer;\n\n/** Typed host input for admitting one command through RPC or route code. */\nexport interface EDASessionSubmitInput {\n readonly command: EDACommand;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n}\n\n/** Typed host input for admitting commands and app events as one durable batch. */\nexport interface EDASessionSubmitBatchInput {\n readonly items: ReadonlyArray<EDASubmittable>;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n}\n\n/** Typed host input for waiting on a command terminal boundary. */\nexport interface EDASessionBlockOnCommandInput {\n readonly afterSeq?: SequenceNumber;\n readonly commandId: CommandId;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n}\n\n/** Typed host input for operations scoped only by session identity. */\nexport interface EDASessionScopedInput {\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n}\n\n/** Typed host input for opening a live event stream from a durable cursor. */\nexport interface EDASessionEventsInput {\n readonly afterSeq?: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n}\n\ninterface HostRuntimeState {\n readonly runtime: ManagedRuntime.ManagedRuntime<EDARuntime, SessionCommandAdmissionError>;\n readonly sessionId: SessionId;\n}\n\ninterface EventWebSocketState {\n readonly closed: Deferred.Deferred<void>;\n readonly incoming: Queue.Queue<EDAWebSocketClientFrame>;\n interrupt: (() => void) | undefined;\n lastAckedSeq: SequenceNumber;\n readonly sessionId: SessionId;\n readonly subscriberId: SubscriberId;\n}\n\nconst resolveRuntimeFactory = <A>(\n value: A | ((input: { readonly sessionId: SessionId }) => A) | undefined,\n sessionId: SessionId,\n): A | undefined =>\n typeof value === \"function\"\n ? (value as (input: { readonly sessionId: SessionId }) => A)({ sessionId })\n : value;\n\n/**\n * Compose the full EDA service graph for one raw Durable Object session.\n *\n * The layer is intentionally host-owned: tests can pass a fake model layer,\n * while the Worker host can pass a provider-backed layer from Env.\n */\nexport const makeEDADurableObjectRuntimeLayer = ({\n config,\n compactionExecutorLayer,\n compactionPolicyLayer,\n keepAlive,\n modelLayer,\n promptProjectorLayer,\n reducers,\n sessionId,\n sinks,\n storage,\n toolkit,\n toolRegistry,\n tracer,\n}: EDADurableObjectRuntimeLayerOptions): Layer.Layer<EDARuntime, SessionCommandAdmissionError> => {\n const Store = DurableObjectSessionStore.layer({ sessionId, storage });\n const KeepAlive =\n keepAlive === undefined\n ? EDAKeepAlive.Noop\n : EDAKeepAlive.FromAcquire(() => keepAlive.acquire());\n const SinkCheckpoints = DurableObjectSinkCheckpointStore.layer(storage);\n return makeEDARuntimeLayer({\n config,\n compactionExecutorLayer,\n compactionPolicyLayer,\n keepAliveLayer: KeepAlive,\n modelLayer,\n promptProjectorLayer,\n reducerRegistryLayer: EDAReducerRegistry.Live(reducers ?? []),\n sessionId,\n sessionStoreLayer: Store,\n sinkCheckpointStoreLayer: SinkCheckpoints,\n sinks,\n toolkit,\n toolRegistry,\n tracer,\n });\n};\n\n/** Provider request defaults accepted by EDA's OpenAI Responses model adapter. */\nexport type EDAOpenAiModelConfig = Omit<typeof OpenAiLanguageModel.Config.Service, \"model\">;\n\n/** OpenAI-backed Effect AI model layer for the default Worker host. */\nexport const makeEDADurableObjectOpenAiModelLayer = (options: {\n readonly aiGateway?: AiGateway;\n readonly apiKey?: string;\n readonly apiUrl?: string;\n readonly config?: EDAOpenAiModelConfig;\n readonly modelId: string;\n}): Layer.Layer<LanguageModel.LanguageModel> => {\n const apiKey = optionalNonEmptyString(options.apiKey);\n if (apiKey === undefined && options.aiGateway === undefined) {\n throw new Error(\n \"OPENAI_API_KEY is required unless the EDA OpenAI model layer is backed by a Cloudflare AI Gateway binding.\",\n );\n }\n\n const baseHttpClient =\n options.aiGateway === undefined\n ? FetchHttpClient.layer\n : Layer.succeed(HttpClient.HttpClient, makeCloudflareAiGatewayHttpClient(options.aiGateway));\n const client = OpenAiClient.layer({\n ...(apiKey === undefined ? {} : { apiKey: Redacted.make(apiKey) }),\n ...(options.apiUrl === undefined ? {} : { apiUrl: options.apiUrl }),\n }).pipe(Layer.provide(baseHttpClient));\n\n return OpenAiLanguageModel.layer({\n model: options.modelId,\n ...(options.config === undefined ? {} : { config: options.config }),\n }).pipe(Layer.provide(client));\n};\n\nconst OPENAI_API_BASE_PATH_PREFIX = \"/v1/\";\n\nconst makeCloudflareAiGatewayHttpClient = (gateway: AiGateway): HttpClient.HttpClient =>\n HttpClient.make((request, url, signal) =>\n Effect.tryPromise({\n try: async () => {\n const response = await gateway.run(\n {\n endpoint: openAiGatewayEndpointFromUrl(url),\n headers: requestHeadersForGateway(request),\n provider: \"openai\",\n query: requestBodyForGateway(request.body),\n },\n { signal },\n );\n return HttpClientResponse.fromWeb(request, response);\n },\n catch: (cause) =>\n new HttpClientError.HttpClientError({\n reason: new HttpClientError.TransportError({\n request,\n cause,\n description: \"Cloudflare AI Gateway request failed\",\n }),\n }),\n }),\n );\n\nconst openAiGatewayEndpointFromUrl = (url: URL): string => {\n const endpointPath = url.pathname.startsWith(OPENAI_API_BASE_PATH_PREFIX)\n ? url.pathname.slice(OPENAI_API_BASE_PATH_PREFIX.length)\n : url.pathname.replace(/^\\/+/, \"\");\n return `${endpointPath}${url.search}`;\n};\n\nconst requestHeadersForGateway = (\n request: HttpClientRequest.HttpClientRequest,\n): Record<string, string> =>\n Object.fromEntries(\n Object.entries(request.headers).filter((entry): entry is [string, string] => {\n const [key, value] = entry;\n return typeof value === \"string\" && key.toLowerCase() !== \"host\";\n }),\n );\n\nconst requestBodyForGateway = (body: HttpBody.HttpBody): unknown => {\n switch (body._tag) {\n case \"Empty\":\n return undefined;\n case \"Raw\":\n return body.body;\n case \"Uint8Array\":\n return JSON.parse(new TextDecoder().decode(body.body)) as unknown;\n default:\n throw new Error(`Unsupported OpenAI request body for Cloudflare AI Gateway: ${body._tag}`);\n }\n};\n\nconst optionalNonEmptyString = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n};\n\nconst hostSpanOptions = (\n trace: EDATraceMetadata,\n attributes: Record<string, string | number | boolean | undefined>,\n): Tracer.SpanOptionsNoTrace => ({\n kind: \"server\",\n attributes: compactSpanAttributes({ ...trace.attributes, ...attributes }),\n links: trace.links.map((link) => ({\n span: toEdaExternalSpan(link.context),\n attributes: link.attributes,\n })),\n ...(trace.parent === null ? {} : { parent: toEdaExternalSpan(trace.parent) }),\n});\n\n/** Raw Durable Object host controller for one EDA session object. */\nexport class EDASessionDurableObjectHost {\n private readonly keepAlive: DurableObjectKeepAlive;\n private readonly eventSockets = new WeakMap<WebSocket, EventWebSocketState>();\n private runtimeState: HostRuntimeState | undefined;\n private runtimePromise: Promise<HostRuntimeState> | undefined;\n\n constructor(private readonly options: EDASessionDurableObjectHostOptions) {\n this.keepAlive =\n options.keepAlive ?? new DurableObjectKeepAlive(options.storage, options.background);\n }\n\n /** Run idempotent host and event-store migrations. Safe from `blockConcurrencyWhile`. */\n static readonly migrate = (\n storage: EDASessionDurableObjectStorage,\n ): Effect.Effect<void, EDASessionStoreError> =>\n Effect.gen(function* () {\n yield* DurableObjectSessionStore.migrate(storage);\n yield* DurableObjectSinkCheckpointStore.migrate(storage);\n });\n\n /** Admit one command durably. Active runtime work holds EDA keep-alive leases internally. */\n async submit(input: EDASessionSubmitInput): Promise<CommittedDurableEvent> {\n const runtime = await this.getRuntime(input.sessionId);\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return await runtime.runtime.runPromise(\n Effect.gen(function* () {\n const eda = yield* EDARuntime;\n return yield* eda.submit(input.command);\n }).pipe(\n Effect.withSpan(\n \"agent.command.submit\",\n hostSpanOptions(trace, {\n \"eda.session.id\": input.sessionId,\n \"eda.command.kind\": input.command._tag,\n \"eda.command.id\": input.command.commandId,\n }),\n ),\n ),\n );\n }\n\n /** Submit an ordered durable batch of commands and app events. */\n async submitBatch(\n input: EDASessionSubmitBatchInput,\n ): Promise<ReadonlyArray<CommittedDurableEvent>> {\n const runtime = await this.getRuntime(input.sessionId);\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return await runtime.runtime.runPromise(\n Effect.gen(function* () {\n const eda = yield* EDARuntime;\n return yield* eda.submit(input.items);\n }).pipe(\n Effect.withSpan(\n \"agent.command.submit\",\n hostSpanOptions(trace, {\n \"eda.session.id\": input.sessionId,\n \"eda.command.submittable_count\": input.items.length,\n \"eda.command.count\": input.items.filter((item) => \"_tag\" in item).length,\n }),\n ),\n ),\n );\n }\n\n /** Admit one command and wait for its terminal command boundary. */\n async submitAndBlock(input: EDASessionSubmitInput): Promise<CommittedCommandTerminalEvent> {\n const runtime = await this.getRuntime(input.sessionId);\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return await runtime.runtime.runPromise(\n Effect.gen(function* () {\n const eda = yield* EDARuntime;\n return yield* eda.submitAndBlock(input.command);\n }).pipe(\n Effect.withSpan(\n \"agent.command.submit.wait\",\n hostSpanOptions(trace, {\n \"eda.session.id\": input.sessionId,\n \"eda.command.kind\": input.command._tag,\n \"eda.command.id\": input.command.commandId,\n }),\n ),\n ),\n );\n }\n\n /** Wait for an existing command to reach its terminal command boundary. */\n async blockOnCommand(\n input: EDASessionBlockOnCommandInput,\n ): Promise<CommittedCommandTerminalEvent> {\n const runtime = await this.getRuntime(input.sessionId);\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return await runtime.runtime.runPromise(\n Effect.gen(function* () {\n const eda = yield* EDARuntime;\n return yield* eda.blockOnCommand(input.commandId, input.afterSeq ?? SequenceNumber.make(0));\n }).pipe(\n Effect.withSpan(\n \"agent.command.wait\",\n hostSpanOptions(trace, {\n \"eda.session.id\": input.sessionId,\n \"eda.command.id\": input.commandId,\n \"eda.seq.after\": input.afterSeq,\n }),\n ),\n ),\n );\n }\n\n /** Read the authoritative live session snapshot. */\n snapshot(input: EDASessionScopedInput): Promise<EDASessionSnapshot> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.withRuntime(input.sessionId, (eda) =>\n eda\n .snapshot()\n .pipe(\n Effect.withSpan(\n \"agent.session.snapshot\",\n hostSpanOptions(trace, { \"eda.session.id\": input.sessionId }),\n ),\n ),\n );\n }\n\n /** Read durable transcript messages in committed order. */\n messages(input: EDASessionScopedInput): Promise<ReadonlyArray<DurableTranscriptMessage>> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.withRuntime(input.sessionId, (eda) =>\n eda\n .messages()\n .pipe(\n Effect.withSpan(\n \"agent.messages.list\",\n hostSpanOptions(trace, { \"eda.session.id\": input.sessionId }),\n ),\n ),\n );\n }\n\n /** Accept one WebSocket as the live event stream for this session. */\n async acceptEventWebSocket(\n input: EDASessionEventsInput & { readonly webSocket: WebSocket },\n ): Promise<void> {\n const attachment = EDAWebSocketAttachment.make({\n kind: \"eda-events-v1\",\n sessionId: input.sessionId,\n subscriberId: SubscriberId.make(crypto.randomUUID()),\n lastAckedSeq: input.afterSeq ?? SequenceNumber.make(0),\n trace: input.trace ?? makeRootEDATraceMetadata(),\n });\n input.webSocket.serializeAttachment(attachment);\n await this.startEventWebSocket(input.webSocket, attachment);\n }\n\n /** Restore hibernated event WebSockets whose in-memory subscriber fibers disappeared. */\n async restoreEventWebSockets(webSockets: ReadonlyArray<WebSocket>): Promise<void> {\n for (const webSocket of webSockets) {\n if (this.eventSockets.has(webSocket)) {\n continue;\n }\n const decoded = await decodeWebSocketAttachment(webSocket.deserializeAttachment());\n if (decoded._tag === \"Decoded\") {\n await this.startEventWebSocket(webSocket, decoded.attachment);\n } else if (decoded._tag === \"Malformed\") {\n closeWebSocket(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"attachment\");\n }\n }\n }\n\n /** Route one inbound WebSocket message into the subscriber ACK queue. */\n async webSocketMessage(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n const state = await this.ensureEventWebSocket(webSocket);\n if (state === undefined) {\n closeWebSocket(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return;\n }\n if (typeof message !== \"string\") {\n closeWebSocket(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"binary\");\n state.interrupt?.();\n return;\n }\n\n try {\n const frame = await Effect.runPromise(decodeEDAWebSocketClientMessage(message));\n await Effect.runPromise(Queue.offer(state.incoming, frame));\n } catch {\n closeWebSocket(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n state.interrupt?.();\n }\n }\n\n /** Interrupt subscriber work after the client closes the WebSocket. */\n async webSocketClose(webSocket: WebSocket): Promise<void> {\n const state = this.eventSockets.get(webSocket);\n if (state === undefined) {\n return;\n }\n await Effect.runPromise(Deferred.succeed(state.closed, undefined).pipe(Effect.ignore));\n state.interrupt?.();\n this.eventSockets.delete(webSocket);\n }\n\n /** Interrupt subscriber work after a host WebSocket error. */\n async webSocketError(webSocket: WebSocket): Promise<void> {\n const state = this.eventSockets.get(webSocket);\n if (state === undefined) {\n return;\n }\n await Effect.runPromise(Deferred.succeed(state.closed, undefined).pipe(Effect.ignore));\n state.interrupt?.();\n this.eventSockets.delete(webSocket);\n }\n\n /** Dispose any live runtime before the host deletes its Durable Object storage. */\n async destroy(_input: EDASessionScopedInput): Promise<void> {\n await this.keepAlive.shutdown();\n await this.dispose();\n this.runtimeState = undefined;\n this.runtimePromise = undefined;\n }\n\n /** Durable Object alarm hook: wake/recover the runtime and re-arm while EDA has active work. */\n async alarm(input?: EDASessionScopedInput): Promise<void> {\n const sessionId = input?.sessionId ?? this.runtimeState?.sessionId;\n if (sessionId !== undefined) {\n await this.getRuntime(sessionId);\n }\n await this.keepAlive.alarm();\n }\n\n /** Dispose the Effect runtime if the host wrapper is torn down by tests. */\n async dispose(): Promise<void> {\n await this.runtimeState?.runtime.dispose();\n }\n\n private async withRuntime<A>(\n sessionId: SessionId,\n f: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n ): Promise<A> {\n const runtime = await this.getRuntime(sessionId);\n return await runtime.runtime.runPromise(\n Effect.gen(function* () {\n const eda = yield* EDARuntime;\n return yield* f(eda);\n }),\n );\n }\n\n private async ensureEventWebSocket(\n webSocket: WebSocket,\n ): Promise<EventWebSocketState | undefined> {\n const existing = this.eventSockets.get(webSocket);\n if (existing !== undefined) {\n return existing;\n }\n const decoded = await decodeWebSocketAttachment(webSocket.deserializeAttachment());\n if (decoded._tag !== \"Decoded\") {\n return undefined;\n }\n await this.startEventWebSocket(webSocket, decoded.attachment);\n return this.eventSockets.get(webSocket);\n }\n\n private async startEventWebSocket(\n webSocket: WebSocket,\n attachment: EDAWebSocketAttachment,\n ): Promise<void> {\n if (this.eventSockets.has(webSocket)) {\n return;\n }\n const runtime = await this.getRuntime(attachment.sessionId);\n const resources = await runtime.runtime.runPromise(\n Effect.gen(function* () {\n const incoming = yield* Queue.unbounded<EDAWebSocketClientFrame>();\n const closed = yield* Deferred.make<void>();\n return { incoming, closed };\n }),\n );\n const state: EventWebSocketState = {\n ...resources,\n interrupt: undefined,\n lastAckedSeq: attachment.lastAckedSeq,\n sessionId: attachment.sessionId,\n subscriberId: attachment.subscriberId,\n };\n this.eventSockets.set(webSocket, state);\n\n const send = (frame: EDAWebSocketServerFrame): Effect.Effect<void, SubscriberSendFailed> =>\n Effect.try({\n try: () =>\n webSocket.send(encodeEDAWebSocketServerFrame(frame, this.options.webSocketProtocol)),\n catch: (cause) => new SubscriberSendFailed({ subscriberId: state.subscriberId, cause }),\n });\n const persistAck = (seq: SequenceNumber): Effect.Effect<void> =>\n Effect.sync(() => {\n state.lastAckedSeq = seq;\n webSocket.serializeAttachment({\n kind: \"eda-events-v1\",\n sessionId: state.sessionId,\n subscriberId: state.subscriberId,\n lastAckedSeq: seq,\n trace: attachment.trace,\n } satisfies EDAWebSocketAttachment);\n });\n\n const closeForError = (error: unknown): Effect.Effect<void> => {\n if (error instanceof SubscriberLagged || isTagged(error, \"SubscriberLagged\")) {\n const lagged = error as SubscriberLagged;\n return send(\n EDAWebSocketLaggedFrame.make({\n _tag: \"lagged\",\n resumeSeq: lagged.lastAckedSeq,\n reason: lagged.reason,\n }),\n ).pipe(\n Effect.ignore,\n Effect.andThen(\n Effect.sync(() =>\n closeWebSocket(\n webSocket,\n EDA_WS_CLOSE_LAGGED,\n laggedCloseReason(lagged.lastAckedSeq),\n ),\n ),\n ),\n );\n }\n if (error instanceof SubscriberProtocolError || isTagged(error, \"SubscriberProtocolError\")) {\n const protocolError = error as SubscriberProtocolError;\n return send(\n EDAWebSocketErrorFrame.make({\n _tag: \"error\",\n message: protocolError.message.slice(0, 120),\n }),\n ).pipe(\n Effect.ignore,\n Effect.andThen(\n Effect.sync(() => closeWebSocket(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\")),\n ),\n );\n }\n return Effect.sync(() => closeWebSocket(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"send-failed\"));\n };\n\n const program = Effect.scoped(\n runWebSocketSubscriber({\n subscriberId: state.subscriberId,\n resumeSeq: state.lastAckedSeq,\n policy: defaultEDAWebSocketFlowControl,\n transport: {\n send,\n incoming: state.incoming,\n closed: state.closed,\n persistAck,\n },\n }).pipe(\n Effect.catch((error) => closeForError(error)),\n Effect.ensuring(\n Effect.sync(() => {\n this.eventSockets.delete(webSocket);\n }),\n ),\n Effect.withSpan(\n \"agent.events.stream\",\n hostSpanOptions(attachment.trace, {\n \"eda.session.id\": state.sessionId,\n \"eda.subscriber.id\": state.subscriberId,\n \"eda.seq.after\": state.lastAckedSeq,\n }),\n ),\n ),\n );\n\n state.interrupt = runtime.runtime.runCallback(program, {\n onExit: (exit) => {\n this.eventSockets.delete(webSocket);\n if (Exit.isFailure(exit)) {\n closeWebSocket(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"subscriber-failed\");\n }\n },\n });\n }\n\n private async getRuntime(sessionId: SessionId): Promise<HostRuntimeState> {\n if (this.runtimeState !== undefined) {\n if (this.runtimeState.sessionId !== sessionId) {\n throw new Error(\n `EDASessionDurableObjectHost is scoped to session ${this.runtimeState.sessionId}; received ${sessionId}`,\n );\n }\n return this.runtimeState;\n }\n\n this.keepAlive.restart();\n const runtimePromise = this.runtimePromise ?? this.buildRuntime(sessionId);\n this.runtimePromise = runtimePromise;\n try {\n return await runtimePromise;\n } catch (error) {\n if (this.runtimePromise === runtimePromise) {\n this.runtimePromise = undefined;\n }\n throw error;\n }\n }\n\n private async buildRuntime(sessionId: SessionId): Promise<HostRuntimeState> {\n const runtime = ManagedRuntime.make(\n makeEDADurableObjectRuntimeLayer({\n config: this.options.config,\n compactionExecutorLayer: this.options.compactionExecutorLayer,\n compactionPolicyLayer: this.options.compactionPolicyLayer,\n keepAlive: this.keepAlive,\n modelLayer: this.options.modelLayer,\n promptProjectorLayer: this.options.promptProjectorLayer,\n reducers: this.options.reducers,\n sessionId,\n sinks: this.options.sinks,\n storage: this.options.storage,\n toolkit: resolveRuntimeFactory(this.options.toolkit, sessionId),\n toolRegistry: resolveRuntimeFactory(this.options.toolRegistry, sessionId),\n tracer: resolveRuntimeFactory(this.options.tracer, sessionId),\n }),\n );\n const state = { runtime, sessionId } satisfies HostRuntimeState;\n try {\n await runtime.context();\n this.runtimeState = state;\n return state;\n } catch (error) {\n await runtime.dispose().catch(() => undefined);\n throw error;\n }\n }\n}\n\ntype DecodedWebSocketAttachment =\n | { readonly _tag: \"Missing\" }\n | { readonly _tag: \"Malformed\" }\n | { readonly _tag: \"Decoded\"; readonly attachment: EDAWebSocketAttachment };\n\nconst decodeWebSocketAttachment = async (input: unknown): Promise<DecodedWebSocketAttachment> => {\n if (input === null || input === undefined) {\n return { _tag: \"Missing\" };\n }\n try {\n return {\n _tag: \"Decoded\",\n attachment: await Effect.runPromise(decodeEDAWebSocketAttachment(input)),\n };\n } catch {\n return { _tag: \"Malformed\" };\n }\n};\n\nconst closeWebSocket = (webSocket: WebSocket, code: number, reason: string): void => {\n try {\n webSocket.close(code, reason);\n } catch {\n // The peer may already have closed or the runtime may reject duplicate close.\n }\n};\n\nconst isTagged = (input: unknown, tag: string): boolean =>\n typeof input === \"object\" && input !== null && \"_tag\" in input && input._tag === tag;\n\n/** Decode a raw RPC command payload at the Durable Object boundary. */\nexport const encodeEdaRpcCommand = (input: EDACommand): unknown =>\n Schema.encodeSync(EDACommand)(input);\n\nconst EDARpcSubmittable = Schema.Union([EDACommand, DurableEventEnvelope]);\n\n/** Encode a command/app-event batch into structured-clone-safe RPC values. */\nexport const encodeEdaRpcSubmittables = (\n input: ReadonlyArray<EDASubmittable>,\n): ReadonlyArray<unknown> => input.map((item) => Schema.encodeSync(EDARpcSubmittable)(item));\n\n/** Decode a raw RPC command payload at the Durable Object boundary. */\nexport const decodeEdaRpcCommand = (\n input: unknown,\n): Effect.Effect<EDACommand, Schema.SchemaError> => Schema.decodeUnknownEffect(EDACommand)(input);\n\n/** Decode a raw RPC batch item at the Durable Object boundary. */\nexport const decodeEdaRpcSubmittable = (\n input: unknown,\n): Effect.Effect<EDASubmittable, Schema.SchemaError> =>\n Schema.decodeUnknownEffect(EDARpcSubmittable)(input);\n\n/** Decode raw RPC batch items at the Durable Object boundary. */\nexport const decodeEdaRpcSubmittables = (\n input: ReadonlyArray<unknown>,\n): Effect.Effect<ReadonlyArray<EDASubmittable>, Schema.SchemaError> =>\n Effect.forEach(input, decodeEdaRpcSubmittable);\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { _ as encodeEdaRpcCommand, a as EDASessionDurableObjectHostOptions, b as makeEDADurableObjectRuntimeLayer, c as EDASessionScopedInput, d as EDAToolRegistryFactory, f as EDAToolkitFactory, g as decodeEdaRpcSubmittables, h as decodeEdaRpcSubmittable, i as EDASessionDurableObjectHost, l as EDASessionSubmitBatchInput, m as decodeEdaRpcCommand, n as EDAOpenAiModelConfig, o as EDASessionDurableObjectStorage, p as EDATracerFactory, r as EDASessionBlockOnCommandInput, s as EDASessionEventsInput, t as EDADurableObjectRuntimeLayerOptions, u as EDASessionSubmitInput, v as encodeEdaRpcSubmittables, y as makeEDADurableObjectOpenAiModelLayer } from "./durable-object-runtime-Dehm7PsO.js";
2
- export { EDADurableObjectRuntimeLayerOptions, EDAOpenAiModelConfig, EDASessionBlockOnCommandInput, EDASessionDurableObjectHost, EDASessionDurableObjectHostOptions, EDASessionDurableObjectStorage, EDASessionEventsInput, EDASessionScopedInput, EDASessionSubmitBatchInput, EDASessionSubmitInput, EDAToolRegistryFactory, EDAToolkitFactory, EDATracerFactory, decodeEdaRpcCommand, decodeEdaRpcSubmittable, decodeEdaRpcSubmittables, encodeEdaRpcCommand, encodeEdaRpcSubmittables, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectRuntimeLayer };
@@ -1,2 +0,0 @@
1
- import { a as encodeEdaRpcCommand, c as makeEDADurableObjectRuntimeLayer, i as decodeEdaRpcSubmittables, n as decodeEdaRpcCommand, o as encodeEdaRpcSubmittables, r as decodeEdaRpcSubmittable, s as makeEDADurableObjectOpenAiModelLayer, t as EDASessionDurableObjectHost } from "./durable-object-runtime-LgOJbsVm.js";
2
- export { EDASessionDurableObjectHost, decodeEdaRpcCommand, decodeEdaRpcSubmittable, decodeEdaRpcSubmittables, encodeEdaRpcCommand, encodeEdaRpcSubmittables, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectRuntimeLayer };
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export * from \"./durable-object\";\nexport * from \"./durable-object-runtime\";\nexport * from \"./durable-object-storage\";\nexport * from \"./websocket-protocol\";\n"],"mappings":""}
@@ -1 +0,0 @@
1
- export * from "effect-durable-agent/host/websocket-protocol";
@@ -1,10 +0,0 @@
1
- import { n as __reExport, t as __exportAll } from "./chunk-BBjsoOtd.js";
2
- export * from "effect-durable-agent/host/websocket-protocol";
3
- //#region src/websocket-protocol.ts
4
- var websocket_protocol_exports = /* @__PURE__ */ __exportAll({});
5
- import * as import_effect_durable_agent_host_websocket_protocol from "effect-durable-agent/host/websocket-protocol";
6
- __reExport(websocket_protocol_exports, import_effect_durable_agent_host_websocket_protocol);
7
- //#endregion
8
- export { websocket_protocol_exports as t };
9
-
10
- //# sourceMappingURL=websocket-protocol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"websocket-protocol.js","names":[],"sources":["../src/websocket-protocol.ts"],"sourcesContent":["export * from \"effect-durable-agent/host/websocket-protocol\";\n"],"mappings":""}
File without changes