effect-durable-agent-cloudflare 0.1.0-alpha.19 → 0.1.0-alpha.20

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,5 +1,5 @@
1
- import { a as SessionOutcomeInput, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-Cko7gaMg.js";
2
- import { i as EDASessionControllerOptions, l as EDAWebSocketProjection } from "./session-controller-BfA5NAuY.js";
1
+ import { a as SessionOutcomeInput, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-C8wknrbN.js";
2
+ import { i as EDASessionControllerOptions, l as EDAWebSocketProjection } from "./session-controller-DCvQY3nj.js";
3
3
  import * as Schema from "effect/Schema";
4
4
  import { CommittedDurableEvent } from "effect-durable-agent/services/session-store";
5
5
  import { EDARuntimeConfig } from "effect-durable-agent/services/runtime";
@@ -286,6 +286,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
286
286
  readonly name: string;
287
287
  readonly isFailure: boolean;
288
288
  readonly result: unknown;
289
+ readonly providerExecuted: boolean;
289
290
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
290
291
  readonly options: {
291
292
  readonly [x: string]: Schema.Json;
@@ -307,6 +308,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
307
308
  readonly name: string;
308
309
  readonly isFailure: boolean;
309
310
  readonly result: unknown;
311
+ readonly providerExecuted: boolean;
310
312
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
311
313
  readonly options: {
312
314
  readonly [x: string]: Schema.Json;
@@ -327,6 +329,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
327
329
  readonly name: string;
328
330
  readonly isFailure: boolean;
329
331
  readonly result: unknown;
332
+ readonly providerExecuted: boolean;
330
333
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
331
334
  readonly options: {
332
335
  readonly [x: string]: Schema.Json;
@@ -517,6 +520,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
517
520
  readonly name: string;
518
521
  readonly isFailure: boolean;
519
522
  readonly result: unknown;
523
+ readonly providerExecuted: boolean;
520
524
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
521
525
  readonly options: {
522
526
  readonly [x: string]: Schema.Json;
@@ -581,6 +585,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
581
585
  readonly name: string;
582
586
  readonly isFailure: boolean;
583
587
  readonly result: unknown;
588
+ readonly providerExecuted: boolean;
584
589
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
585
590
  readonly options: {
586
591
  readonly [x: string]: Schema.Json;
@@ -1065,6 +1070,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1065
1070
  readonly name: string;
1066
1071
  readonly isFailure: boolean;
1067
1072
  readonly result: unknown;
1073
+ readonly providerExecuted: boolean;
1068
1074
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1069
1075
  readonly options: {
1070
1076
  readonly [x: string]: Schema.Json;
@@ -1129,6 +1135,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1129
1135
  readonly name: string;
1130
1136
  readonly isFailure: boolean;
1131
1137
  readonly result: unknown;
1138
+ readonly providerExecuted: boolean;
1132
1139
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1133
1140
  readonly options: {
1134
1141
  readonly [x: string]: Schema.Json;
@@ -1480,6 +1487,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1480
1487
  readonly name: string;
1481
1488
  readonly isFailure: boolean;
1482
1489
  readonly result: unknown;
1490
+ readonly providerExecuted: boolean;
1483
1491
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1484
1492
  readonly options: {
1485
1493
  readonly [x: string]: Schema.Json;
@@ -1501,6 +1509,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1501
1509
  readonly name: string;
1502
1510
  readonly isFailure: boolean;
1503
1511
  readonly result: unknown;
1512
+ readonly providerExecuted: boolean;
1504
1513
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1505
1514
  readonly options: {
1506
1515
  readonly [x: string]: Schema.Json;
@@ -1521,6 +1530,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1521
1530
  readonly name: string;
1522
1531
  readonly isFailure: boolean;
1523
1532
  readonly result: unknown;
1533
+ readonly providerExecuted: boolean;
1524
1534
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1525
1535
  readonly options: {
1526
1536
  readonly [x: string]: Schema.Json;
@@ -1711,6 +1721,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1711
1721
  readonly name: string;
1712
1722
  readonly isFailure: boolean;
1713
1723
  readonly result: unknown;
1724
+ readonly providerExecuted: boolean;
1714
1725
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1715
1726
  readonly options: {
1716
1727
  readonly [x: string]: Schema.Json;
@@ -1775,6 +1786,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
1775
1786
  readonly name: string;
1776
1787
  readonly isFailure: boolean;
1777
1788
  readonly result: unknown;
1789
+ readonly providerExecuted: boolean;
1778
1790
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1779
1791
  readonly options: {
1780
1792
  readonly [x: string]: Schema.Json;
@@ -2436,6 +2448,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
2436
2448
  readonly name: string;
2437
2449
  readonly isFailure: boolean;
2438
2450
  readonly result: unknown;
2451
+ readonly providerExecuted: boolean;
2439
2452
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
2440
2453
  readonly options: {
2441
2454
  readonly [x: string]: Schema.Json;
@@ -2500,6 +2513,7 @@ declare const encodeEdaRpcSessionSnapshot: (input: {
2500
2513
  readonly name: string;
2501
2514
  readonly isFailure: boolean;
2502
2515
  readonly result: unknown;
2516
+ readonly providerExecuted: boolean;
2503
2517
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
2504
2518
  readonly options: {
2505
2519
  readonly [x: string]: Schema.Json;
@@ -1,5 +1,5 @@
1
1
  import { a as SessionOutcomeInput, f as encodeEdaRpcDurableEvent, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-CkWEeWJG.js";
2
- import { t as EDASessionController } from "./session-controller-IrTPwdRt.js";
2
+ import { t as EDASessionController } from "./session-controller-zTTLb7tt.js";
3
3
  import { durableEventEnvelope } from "effect-durable-agent/types/events/durable";
4
4
  import * as Effect from "effect/Effect";
5
5
  import * as Schema from "effect/Schema";
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { i as DurableObjectSqlStorage, n as DurableObjectSessionStoreOptions, r as DurableObjectSqlCursor, t as DurableObjectSessionStorage } from "./durable-object-storage-BZCOHz9p.js";
2
- import { a as SessionOutcomeInput, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-Cko7gaMg.js";
3
- import { a as EDASessionEventsInput, c as EDASessionSubmitInput, d as EDAWebSocketProjectionInitial, f as EDAWebSocketProjectionResult, h as makeEDADurableObjectRuntimeLayer, i as EDASessionControllerOptions, l as EDAWebSocketProjection, m as EDASessionDurableObjectStorage, n as EDASessionBlockOnCommandInput, o as EDASessionScopedInput, p as EDADurableObjectRuntimeLayerOptions, r as EDASessionController, s as EDASessionSubmitBatchInput, t as EDAPreparedEventWebSocket, u as EDAWebSocketProjectionId } from "./session-controller-BfA5NAuY.js";
2
+ import { a as SessionOutcomeInput, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-C8wknrbN.js";
3
+ import { a as EDASessionEventsInput, c as EDASessionSubmitInput, d as EDAWebSocketProjectionInitial, f as EDAWebSocketProjectionResult, h as makeEDADurableObjectRuntimeLayer, i as EDASessionControllerOptions, l as EDAWebSocketProjection, m as EDASessionDurableObjectStorage, n as EDASessionBlockOnCommandInput, o as EDASessionScopedInput, p as EDADurableObjectRuntimeLayerOptions, r as EDASessionController, s as EDASessionSubmitBatchInput, t as EDAPreparedEventWebSocket, u as EDAWebSocketProjectionId } from "./session-controller-DCvQY3nj.js";
4
4
  import { EDASessionBlockOnCommandRpcInput, EDASessionCommandRpcInput, EDASessionDurableObject, EDASessionDurableObjectOptions, EDASessionEventsRpcInput, EDASessionGrantRunRpcInput, EDASessionRpcSurface, EDASessionRunRequestOutcomeRpcInput, EDASessionScopedRpcInput, EDASessionSubmitBatchRpcInput, EDA_WEB_SOCKET_PROJECTION_HEADER, edaRuntimeConfig, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcSessionSnapshot, getEDASessionDurableObjectByName } from "./durable-object.js";
5
5
  import { EDAOpenAiModelConfig, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer } from "./openai.js";
6
6
  import { a as encodeEdaRpcDurableEvent, i as encodeEdaRpcCommand, n as decodeEdaRpcCommand, o as encodeEdaRpcSubmittables, r as decodeEdaRpcSubmittables, t as EDARpcSubmittable } from "./rpc-codec-B2aLiNqt.js";
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { a as SessionOutcomeInput, c as EDARpcSubmittable, d as encodeEdaRpcCommand, f as encodeEdaRpcDurableEvent, i as SessionGrantRunInput, l as decodeEdaRpcCommand, n as SessionBlockInput, o as SessionScopedInput, p as encodeEdaRpcSubmittables, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput, u as decodeEdaRpcSubmittables } from "./rpc-spec-CkWEeWJG.js";
2
- import { n as EDAWebSocketProjectionId, r as makeEDADurableObjectRuntimeLayer, t as EDASessionController } from "./session-controller-IrTPwdRt.js";
2
+ import { n as EDAWebSocketProjectionId, r as makeEDADurableObjectRuntimeLayer, t as EDASessionController } from "./session-controller-zTTLb7tt.js";
3
3
  import { EDASessionDurableObject, EDA_WEB_SOCKET_PROJECTION_HEADER, edaRuntimeConfig, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcSessionSnapshot, getEDASessionDurableObjectByName } from "./durable-object.js";
4
4
  import "./storage.js";
5
5
  import { makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer } from "./openai.js";
package/dist/openai.d.ts CHANGED
@@ -2,7 +2,7 @@ import { ModelSelectionPayload } from "effect-durable-agent/types/events";
2
2
  import * as Layer from "effect/Layer";
3
3
  import { OpenAiLanguageModel } from "@effect/ai-openai";
4
4
  import { ModelResolver } from "effect-durable-agent/services/model-resolver";
5
- import * as LanguageModel from "effect/unstable/ai/LanguageModel";
5
+ import * as LanguageModel from "effect/ai/LanguageModel";
6
6
  //#region src/providers/openai.d.ts
7
7
  /** Provider request defaults accepted by EDA's OpenAI Responses model adapter. */
8
8
  type EDAOpenAiModelConfig = Omit<typeof OpenAiLanguageModel.Config.Service, "model">;
package/dist/openai.js CHANGED
@@ -3,11 +3,11 @@ import * as Layer from "effect/Layer";
3
3
  import { OpenAiClient, OpenAiLanguageModel } from "@effect/ai-openai";
4
4
  import { ModelResolver } from "effect-durable-agent/services/model-resolver";
5
5
  import * as Redacted from "effect/Redacted";
6
- import * as FetchHttpClient from "effect/unstable/http/FetchHttpClient";
7
- import "effect/unstable/http/HttpBody";
8
- import * as HttpClient from "effect/unstable/http/HttpClient";
9
- import * as HttpClientError from "effect/unstable/http/HttpClientError";
10
- import * as HttpClientResponse from "effect/unstable/http/HttpClientResponse";
6
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
7
+ import "effect/http/HttpBody";
8
+ import * as HttpClient from "effect/http/HttpClient";
9
+ import * as HttpClientError from "effect/http/HttpClientError";
10
+ import * as HttpClientResponse from "effect/http/HttpClientResponse";
11
11
  //#region src/providers/openai.ts
12
12
  /** Resolves each durable selection while sharing the provider transport for the runtime lifetime. */
13
13
  const makeEDADurableObjectOpenAiModelResolverLayer = (options) => {
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","names":[],"sources":["../src/providers/openai.ts"],"sourcesContent":["import { OpenAiClient, OpenAiLanguageModel } from \"@effect/ai-openai\";\nimport { ModelResolver } from \"effect-durable-agent/services/model-resolver\";\nimport type { ModelSelectionPayload } from \"effect-durable-agent/types/events\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Redacted from \"effect/Redacted\";\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 HttpClientResponse from \"effect/unstable/http/HttpClientResponse\";\n\n/** Provider request defaults accepted by EDA's OpenAI Responses model adapter. */\nexport type EDAOpenAiModelConfig = Omit<typeof OpenAiLanguageModel.Config.Service, \"model\">;\n\n/** Resolves each durable selection while sharing the provider transport for the runtime lifetime. */\nexport const makeEDADurableObjectOpenAiModelResolverLayer = (options: {\n readonly aiGateway?: AiGateway;\n readonly apiKey?: string;\n readonly apiUrl?: string;\n readonly resolve: (selection: ModelSelectionPayload | undefined) => {\n readonly modelId: string;\n readonly config: EDAOpenAiModelConfig;\n };\n}): Layer.Layer<ModelResolver> => {\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 resolver is backed by a Cloudflare AI Gateway binding.\",\n );\n }\n const transport =\n options.aiGateway === undefined\n ? FetchHttpClient.layer\n : Layer.succeed(HttpClient.HttpClient, makeAiGatewayHttpClient(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(transport));\n return Layer.effect(\n ModelResolver,\n Effect.gen(function* () {\n const provider = yield* OpenAiClient.OpenAiClient;\n return {\n resolve: Effect.fn(\"OpenAiModelResolver.resolve\")(function* (selection) {\n const resolved = options.resolve(selection);\n return yield* OpenAiLanguageModel.make({\n model: resolved.modelId,\n config: resolved.config,\n }).pipe(Effect.provideService(OpenAiClient.OpenAiClient, provider));\n }),\n };\n }),\n ).pipe(Layer.provide(client));\n};\n\n/** OpenAI-backed Effect AI model layer for a Cloudflare Worker. */\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 httpClient =\n options.aiGateway === undefined\n ? FetchHttpClient.layer\n : Layer.succeed(HttpClient.HttpClient, makeAiGatewayHttpClient(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(httpClient));\n\n return OpenAiLanguageModel.layer({\n model: options.modelId,\n ...(options.config === undefined ? {} : { config: options.config }),\n }).pipe(Layer.provide(client));\n};\n\nconst makeAiGatewayHttpClient = (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: endpointFromUrl(url),\n headers: Object.fromEntries(\n Object.entries(request.headers).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\" && entry[0].toLowerCase() !== \"host\",\n ),\n ),\n provider: \"openai\",\n query: requestBody(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 endpointFromUrl = (url: URL): string => {\n const path = url.pathname.startsWith(\"/v1/\")\n ? url.pathname.slice(\"/v1/\".length)\n : url.pathname.replace(/^\\/+/, \"\");\n return `${path}${url.search}`;\n};\n\nconst requestBody = (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"],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","names":[],"sources":["../src/providers/openai.ts"],"sourcesContent":["import { OpenAiClient, OpenAiLanguageModel } from \"@effect/ai-openai\";\nimport { ModelResolver } from \"effect-durable-agent/services/model-resolver\";\nimport type { ModelSelectionPayload } from \"effect-durable-agent/types/events\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Redacted from \"effect/Redacted\";\nimport type * as LanguageModel from \"effect/ai/LanguageModel\";\nimport * as FetchHttpClient from \"effect/http/FetchHttpClient\";\nimport * as HttpBody from \"effect/http/HttpBody\";\nimport * as HttpClient from \"effect/http/HttpClient\";\nimport * as HttpClientError from \"effect/http/HttpClientError\";\nimport * as HttpClientResponse from \"effect/http/HttpClientResponse\";\n\n/** Provider request defaults accepted by EDA's OpenAI Responses model adapter. */\nexport type EDAOpenAiModelConfig = Omit<typeof OpenAiLanguageModel.Config.Service, \"model\">;\n\n/** Resolves each durable selection while sharing the provider transport for the runtime lifetime. */\nexport const makeEDADurableObjectOpenAiModelResolverLayer = (options: {\n readonly aiGateway?: AiGateway;\n readonly apiKey?: string;\n readonly apiUrl?: string;\n readonly resolve: (selection: ModelSelectionPayload | undefined) => {\n readonly modelId: string;\n readonly config: EDAOpenAiModelConfig;\n };\n}): Layer.Layer<ModelResolver> => {\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 resolver is backed by a Cloudflare AI Gateway binding.\",\n );\n }\n const transport =\n options.aiGateway === undefined\n ? FetchHttpClient.layer\n : Layer.succeed(HttpClient.HttpClient, makeAiGatewayHttpClient(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(transport));\n return Layer.effect(\n ModelResolver,\n Effect.gen(function* () {\n const provider = yield* OpenAiClient.OpenAiClient;\n return {\n resolve: Effect.fn(\"OpenAiModelResolver.resolve\")(function* (selection) {\n const resolved = options.resolve(selection);\n return yield* OpenAiLanguageModel.make({\n model: resolved.modelId,\n config: resolved.config,\n }).pipe(Effect.provideService(OpenAiClient.OpenAiClient, provider));\n }),\n };\n }),\n ).pipe(Layer.provide(client));\n};\n\n/** OpenAI-backed Effect AI model layer for a Cloudflare Worker. */\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 httpClient =\n options.aiGateway === undefined\n ? FetchHttpClient.layer\n : Layer.succeed(HttpClient.HttpClient, makeAiGatewayHttpClient(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(httpClient));\n\n return OpenAiLanguageModel.layer({\n model: options.modelId,\n ...(options.config === undefined ? {} : { config: options.config }),\n }).pipe(Layer.provide(client));\n};\n\nconst makeAiGatewayHttpClient = (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: endpointFromUrl(url),\n headers: Object.fromEntries(\n Object.entries(request.headers).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\" && entry[0].toLowerCase() !== \"host\",\n ),\n ),\n provider: \"openai\",\n query: requestBody(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 endpointFromUrl = (url: URL): string => {\n const path = url.pathname.startsWith(\"/v1/\")\n ? url.pathname.slice(\"/v1/\".length)\n : url.pathname.replace(/^\\/+/, \"\");\n return `${path}${url.search}`;\n};\n\nconst requestBody = (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"],"mappings":"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"}
@@ -341,6 +341,7 @@ declare const edaSessionRpc: {
341
341
  readonly name: string;
342
342
  readonly isFailure: boolean;
343
343
  readonly result: unknown;
344
+ readonly providerExecuted: boolean;
344
345
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
345
346
  readonly options: {
346
347
  readonly [x: string]: Schema.Json;
@@ -392,6 +393,7 @@ declare const edaSessionRpc: {
392
393
  readonly name: string;
393
394
  readonly isFailure: boolean;
394
395
  readonly result: unknown;
396
+ readonly providerExecuted: boolean;
395
397
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
396
398
  readonly options: {
397
399
  readonly [x: string]: Schema.Json;
@@ -1298,6 +1300,7 @@ declare const edaSessionRpc: {
1298
1300
  readonly name: string;
1299
1301
  readonly isFailure: boolean;
1300
1302
  readonly result: unknown;
1303
+ readonly providerExecuted: boolean;
1301
1304
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1302
1305
  readonly options: {
1303
1306
  readonly [x: string]: Schema.Json;
@@ -1349,6 +1352,7 @@ declare const edaSessionRpc: {
1349
1352
  readonly name: string;
1350
1353
  readonly isFailure: boolean;
1351
1354
  readonly result: unknown;
1355
+ readonly providerExecuted: boolean;
1352
1356
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1353
1357
  readonly options: {
1354
1358
  readonly [x: string]: Schema.Json;
@@ -1435,6 +1439,7 @@ declare const edaSessionRpc: {
1435
1439
  readonly name: string;
1436
1440
  readonly isFailure: boolean;
1437
1441
  readonly result: unknown;
1442
+ readonly providerExecuted: boolean;
1438
1443
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1439
1444
  readonly options: {
1440
1445
  readonly [x: string]: Schema.Json;
@@ -1486,6 +1491,7 @@ declare const edaSessionRpc: {
1486
1491
  readonly name: string;
1487
1492
  readonly isFailure: boolean;
1488
1493
  readonly result: unknown;
1494
+ readonly providerExecuted: boolean;
1489
1495
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1490
1496
  readonly options: {
1491
1497
  readonly [x: string]: Schema.Json;
@@ -1572,6 +1578,7 @@ declare const edaSessionRpc: {
1572
1578
  readonly name: string;
1573
1579
  readonly isFailure: boolean;
1574
1580
  readonly result: unknown;
1581
+ readonly providerExecuted: boolean;
1575
1582
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1576
1583
  readonly options: {
1577
1584
  readonly [x: string]: Schema.Json;
@@ -1623,6 +1630,7 @@ declare const edaSessionRpc: {
1623
1630
  readonly name: string;
1624
1631
  readonly isFailure: boolean;
1625
1632
  readonly result: unknown;
1633
+ readonly providerExecuted: boolean;
1626
1634
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
1627
1635
  readonly options: {
1628
1636
  readonly [x: string]: Schema.Json;
@@ -2167,6 +2175,7 @@ declare const edaSessionRpc: {
2167
2175
  readonly toolCallId: string & import("effect/Brand").Brand<"ToolCallId">;
2168
2176
  readonly promptPart: {
2169
2177
  readonly type: "tool-result";
2178
+ readonly providerExecuted: boolean;
2170
2179
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
2171
2180
  readonly options: {
2172
2181
  readonly [x: string]: Schema.Json;
@@ -2244,6 +2253,7 @@ declare const edaSessionRpc: {
2244
2253
  readonly toolCallId: string & import("effect/Brand").Brand<"ToolCallId">;
2245
2254
  readonly promptPart: {
2246
2255
  readonly type: "tool-result";
2256
+ readonly providerExecuted: boolean;
2247
2257
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
2248
2258
  readonly options: {
2249
2259
  readonly [x: string]: Schema.Json;
@@ -2291,6 +2301,7 @@ declare const edaSessionRpc: {
2291
2301
  } | undefined;
2292
2302
  readonly promptPart: {
2293
2303
  readonly type: "tool-result";
2304
+ readonly providerExecuted: boolean;
2294
2305
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
2295
2306
  readonly options: {
2296
2307
  readonly [x: string]: Schema.Json;
@@ -3027,6 +3038,7 @@ declare const edaSessionRpc: {
3027
3038
  readonly name: string;
3028
3039
  readonly isFailure: boolean;
3029
3040
  readonly result: unknown;
3041
+ readonly providerExecuted: boolean;
3030
3042
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
3031
3043
  readonly options: {
3032
3044
  readonly [x: string]: Schema.Json;
@@ -3078,6 +3090,7 @@ declare const edaSessionRpc: {
3078
3090
  readonly name: string;
3079
3091
  readonly isFailure: boolean;
3080
3092
  readonly result: unknown;
3093
+ readonly providerExecuted: boolean;
3081
3094
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
3082
3095
  readonly options: {
3083
3096
  readonly [x: string]: Schema.Json;
@@ -3984,6 +3997,7 @@ declare const edaSessionRpc: {
3984
3997
  readonly name: string;
3985
3998
  readonly isFailure: boolean;
3986
3999
  readonly result: unknown;
4000
+ readonly providerExecuted: boolean;
3987
4001
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
3988
4002
  readonly options: {
3989
4003
  readonly [x: string]: Schema.Json;
@@ -4035,6 +4049,7 @@ declare const edaSessionRpc: {
4035
4049
  readonly name: string;
4036
4050
  readonly isFailure: boolean;
4037
4051
  readonly result: unknown;
4052
+ readonly providerExecuted: boolean;
4038
4053
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4039
4054
  readonly options: {
4040
4055
  readonly [x: string]: Schema.Json;
@@ -4121,6 +4136,7 @@ declare const edaSessionRpc: {
4121
4136
  readonly name: string;
4122
4137
  readonly isFailure: boolean;
4123
4138
  readonly result: unknown;
4139
+ readonly providerExecuted: boolean;
4124
4140
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4125
4141
  readonly options: {
4126
4142
  readonly [x: string]: Schema.Json;
@@ -4172,6 +4188,7 @@ declare const edaSessionRpc: {
4172
4188
  readonly name: string;
4173
4189
  readonly isFailure: boolean;
4174
4190
  readonly result: unknown;
4191
+ readonly providerExecuted: boolean;
4175
4192
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4176
4193
  readonly options: {
4177
4194
  readonly [x: string]: Schema.Json;
@@ -4258,6 +4275,7 @@ declare const edaSessionRpc: {
4258
4275
  readonly name: string;
4259
4276
  readonly isFailure: boolean;
4260
4277
  readonly result: unknown;
4278
+ readonly providerExecuted: boolean;
4261
4279
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4262
4280
  readonly options: {
4263
4281
  readonly [x: string]: Schema.Json;
@@ -4309,6 +4327,7 @@ declare const edaSessionRpc: {
4309
4327
  readonly name: string;
4310
4328
  readonly isFailure: boolean;
4311
4329
  readonly result: unknown;
4330
+ readonly providerExecuted: boolean;
4312
4331
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4313
4332
  readonly options: {
4314
4333
  readonly [x: string]: Schema.Json;
@@ -4853,6 +4872,7 @@ declare const edaSessionRpc: {
4853
4872
  readonly toolCallId: string & import("effect/Brand").Brand<"ToolCallId">;
4854
4873
  readonly promptPart: {
4855
4874
  readonly type: "tool-result";
4875
+ readonly providerExecuted: boolean;
4856
4876
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4857
4877
  readonly options: {
4858
4878
  readonly [x: string]: Schema.Json;
@@ -4930,6 +4950,7 @@ declare const edaSessionRpc: {
4930
4950
  readonly toolCallId: string & import("effect/Brand").Brand<"ToolCallId">;
4931
4951
  readonly promptPart: {
4932
4952
  readonly type: "tool-result";
4953
+ readonly providerExecuted: boolean;
4933
4954
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4934
4955
  readonly options: {
4935
4956
  readonly [x: string]: Schema.Json;
@@ -4977,6 +4998,7 @@ declare const edaSessionRpc: {
4977
4998
  } | undefined;
4978
4999
  readonly promptPart: {
4979
5000
  readonly type: "tool-result";
5001
+ readonly providerExecuted: boolean;
4980
5002
  readonly "~effect/ai/Prompt/Part": "~effect/ai/Prompt/Part";
4981
5003
  readonly options: {
4982
5004
  readonly [x: string]: Schema.Json;
@@ -6045,6 +6067,7 @@ declare const edaSessionRpc: {
6045
6067
  readonly name: Schema.String;
6046
6068
  readonly isFailure: Schema.Boolean;
6047
6069
  readonly result: Schema.Unknown;
6070
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6048
6071
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6049
6072
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6050
6073
  }>>;
@@ -6064,6 +6087,7 @@ declare const edaSessionRpc: {
6064
6087
  readonly name: Schema.String;
6065
6088
  readonly isFailure: Schema.Boolean;
6066
6089
  readonly result: Schema.Unknown;
6090
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6067
6091
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6068
6092
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6069
6093
  }>>;
@@ -6082,6 +6106,7 @@ declare const edaSessionRpc: {
6082
6106
  readonly name: Schema.String;
6083
6107
  readonly isFailure: Schema.Boolean;
6084
6108
  readonly result: Schema.Unknown;
6109
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6085
6110
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6086
6111
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6087
6112
  }>>;
@@ -6204,6 +6229,7 @@ declare const edaSessionRpc: {
6204
6229
  readonly name: Schema.String;
6205
6230
  readonly isFailure: Schema.Boolean;
6206
6231
  readonly result: Schema.Unknown;
6232
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6207
6233
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6208
6234
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6209
6235
  }>>, Schema.toType<Schema.Struct<{
@@ -6256,6 +6282,7 @@ declare const edaSessionRpc: {
6256
6282
  readonly name: Schema.String;
6257
6283
  readonly isFailure: Schema.Boolean;
6258
6284
  readonly result: Schema.Unknown;
6285
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6259
6286
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6260
6287
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6261
6288
  }>>, Schema.toType<Schema.Struct<{
@@ -6577,6 +6604,7 @@ declare const edaSessionRpc: {
6577
6604
  readonly name: Schema.String;
6578
6605
  readonly isFailure: Schema.Boolean;
6579
6606
  readonly result: Schema.Unknown;
6607
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6580
6608
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6581
6609
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6582
6610
  }>>, Schema.toType<Schema.Struct<{
@@ -6629,6 +6657,7 @@ declare const edaSessionRpc: {
6629
6657
  readonly name: Schema.String;
6630
6658
  readonly isFailure: Schema.Boolean;
6631
6659
  readonly result: Schema.Unknown;
6660
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6632
6661
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6633
6662
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6634
6663
  }>>, Schema.toType<Schema.Struct<{
@@ -6775,6 +6804,7 @@ declare const edaSessionRpc: {
6775
6804
  readonly name: Schema.String;
6776
6805
  readonly isFailure: Schema.Boolean;
6777
6806
  readonly result: Schema.Unknown;
6807
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6778
6808
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6779
6809
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6780
6810
  }>>, Schema.toType<Schema.Struct<{
@@ -6827,6 +6857,7 @@ declare const edaSessionRpc: {
6827
6857
  readonly name: Schema.String;
6828
6858
  readonly isFailure: Schema.Boolean;
6829
6859
  readonly result: Schema.Unknown;
6860
+ readonly providerExecuted: Schema.withDecodingDefault<Schema.Boolean>;
6830
6861
  readonly "~effect/ai/Prompt/Part": Schema.withDecodingDefaultKey<Schema.Literal<"~effect/ai/Prompt/Part">>;
6831
6862
  readonly options: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json>>>>;
6832
6863
  }>>, Schema.toType<Schema.Struct<{
@@ -6901,4 +6932,4 @@ declare const edaSessionRpc: {
6901
6932
  };
6902
6933
  //#endregion
6903
6934
  export { SessionOutcomeInput as a, SessionGrantRunInput as i, SessionBlockInput as n, SessionScopedInput as o, SessionCommandInput as r, edaSessionRpc as s, SessionBatchInput as t };
6904
- //# sourceMappingURL=rpc-spec-Cko7gaMg.d.ts.map
6935
+ //# sourceMappingURL=rpc-spec-C8wknrbN.d.ts.map
package/dist/rpc.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { a as SessionOutcomeInput, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-Cko7gaMg.js";
1
+ import { a as SessionOutcomeInput, i as SessionGrantRunInput, n as SessionBlockInput, o as SessionScopedInput, r as SessionCommandInput, s as edaSessionRpc, t as SessionBatchInput } from "./rpc-spec-C8wknrbN.js";
2
2
  import { a as encodeEdaRpcDurableEvent, i as encodeEdaRpcCommand, n as decodeEdaRpcCommand, o as encodeEdaRpcSubmittables, r as decodeEdaRpcSubmittables, t as EDARpcSubmittable } from "./rpc-codec-B2aLiNqt.js";
3
3
  export { EDARpcSubmittable, SessionBatchInput, SessionBlockInput, SessionCommandInput, SessionGrantRunInput, SessionOutcomeInput, SessionScopedInput, decodeEdaRpcCommand, decodeEdaRpcSubmittables, edaSessionRpc, encodeEdaRpcCommand, encodeEdaRpcDurableEvent, encodeEdaRpcSubmittables };
@@ -17,6 +17,7 @@ import { EDAWebSocketClientFrame, EDAWebSocketServerFrameEncoder, EDAWebSocketSe
17
17
  import { ModelResolver } from "effect-durable-agent/services/model-resolver";
18
18
  import { DurableTranscriptMessage } from "effect-durable-agent/domain/message-transcript";
19
19
  import { EDASubmittable, SessionCommandAdmissionError } from "effect-durable-agent/services/session-state";
20
+ import { IdGenerator } from "effect-durable-agent/services/id-generator";
20
21
  import { RunScheduler } from "effect-durable-agent/services/run-scheduler";
21
22
  import * as Tracer from "effect/Tracer";
22
23
  import { EDASink } from "effect-durable-agent/services/sink-registry";
@@ -111,6 +112,8 @@ type EDASessionDurableObjectStorage = DurableObjectSessionStorage & DurableObjec
111
112
  interface EDADurableObjectRuntimeLayerOptions {
112
113
  readonly appEvents?: EDAAppEvents;
113
114
  readonly config: EDARuntimeConfig;
115
+ /** Host-owned identity source, shared by every lifecycle service. Defaults to `IdGenerator.Live`. */
116
+ readonly idGeneratorLayer?: Layer.Layer<IdGenerator>;
114
117
  readonly compactionExecutorLayer?: Layer.Layer<CompactionExecutor>;
115
118
  readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;
116
119
  readonly keepAlive?: DurableObjectKeepAlive;
@@ -127,7 +130,7 @@ interface EDADurableObjectRuntimeLayerOptions {
127
130
  readonly tracer?: Tracer.Tracer;
128
131
  }
129
132
  /** Compose the platform-neutral runtime with Cloudflare persistence and lifecycle adapters. */
130
- declare const makeEDADurableObjectRuntimeLayer: ({ appEvents, config, compactionExecutorLayer, compactionPolicyLayer, keepAlive, modelResolverLayer, promptProjectorLayer, reducers, runSchedulerLayer, sessionEventObserverLayer, sessionId, sinks, storage, toolkit, toolRegistry, tracer }: EDADurableObjectRuntimeLayerOptions) => Layer.Layer<EDARuntime, SessionCommandAdmissionError>;
133
+ declare const makeEDADurableObjectRuntimeLayer: ({ appEvents, config, idGeneratorLayer, compactionExecutorLayer, compactionPolicyLayer, keepAlive, modelResolverLayer, promptProjectorLayer, reducers, runSchedulerLayer, sessionEventObserverLayer, sessionId, sinks, storage, toolkit, toolRegistry, tracer }: EDADurableObjectRuntimeLayerOptions) => Layer.Layer<EDARuntime, SessionCommandAdmissionError>;
131
134
  //#endregion
132
135
  //#region src/runtime/session-runtime.d.ts
133
136
  type EDAToolkitFactory = (input: {
@@ -144,6 +147,8 @@ interface EDASessionRuntimeOptions {
144
147
  readonly background?: DurableObjectBackgroundWaiter;
145
148
  readonly appEvents?: EDAAppEvents;
146
149
  readonly config: EDARuntimeConfig;
150
+ /** Host-owned identity source, shared by every lifecycle service. Defaults to `IdGenerator.Live`. */
151
+ readonly idGeneratorLayer?: Layer.Layer<IdGenerator>;
147
152
  readonly compactionExecutorLayer?: Layer.Layer<CompactionExecutor>;
148
153
  readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;
149
154
  readonly keepAlive?: DurableObjectKeepAlive;
@@ -290,4 +295,4 @@ declare class EDASessionController<ProjectionState extends object = never> {
290
295
  }
291
296
  //#endregion
292
297
  export { EDASessionEventsInput as a, EDASessionSubmitInput as c, EDAWebSocketProjectionInitial as d, EDAWebSocketProjectionResult as f, makeEDADurableObjectRuntimeLayer as h, EDASessionControllerOptions as i, EDAWebSocketProjection as l, EDASessionDurableObjectStorage as m, EDASessionBlockOnCommandInput as n, EDASessionScopedInput as o, EDADurableObjectRuntimeLayerOptions as p, EDASessionController as r, EDASessionSubmitBatchInput as s, EDAPreparedEventWebSocket as t, EDAWebSocketProjectionId as u };
293
- //# sourceMappingURL=session-controller-BfA5NAuY.d.ts.map
298
+ //# sourceMappingURL=session-controller-DCvQY3nj.d.ts.map
@@ -846,12 +846,13 @@ const durableStoreError = (operation, cause) => new EDASessionStoreError({ messa
846
846
  //#endregion
847
847
  //#region src/runtime/runtime-layer.ts
848
848
  /** Compose the platform-neutral runtime with Cloudflare persistence and lifecycle adapters. */
849
- const makeEDADurableObjectRuntimeLayer = ({ appEvents, config, compactionExecutorLayer, compactionPolicyLayer, keepAlive, modelResolverLayer, promptProjectorLayer, reducers, runSchedulerLayer, sessionEventObserverLayer, sessionId, sinks, storage, toolkit, toolRegistry, tracer }) => {
849
+ const makeEDADurableObjectRuntimeLayer = ({ appEvents, config, idGeneratorLayer, compactionExecutorLayer, compactionPolicyLayer, keepAlive, modelResolverLayer, promptProjectorLayer, reducers, runSchedulerLayer, sessionEventObserverLayer, sessionId, sinks, storage, toolkit, toolRegistry, tracer }) => {
850
850
  const lifecycle = keepAlive ?? new DurableObjectKeepAlive(storage);
851
851
  const keepAliveLayer = EDAKeepAlive.FromAcquire(() => lifecycle.acquire());
852
852
  return makeEDARuntimeLayer({
853
853
  appEvents,
854
854
  config,
855
+ idGeneratorLayer,
855
856
  compactionExecutorLayer,
856
857
  compactionPolicyLayer,
857
858
  keepAliveLayer,
@@ -936,6 +937,7 @@ var EDASessionRuntime = class {
936
937
  const runtime = ManagedRuntime.make(makeEDADurableObjectRuntimeLayer({
937
938
  appEvents: this.options.appEvents,
938
939
  config: this.options.config,
940
+ idGeneratorLayer: this.options.idGeneratorLayer,
939
941
  compactionExecutorLayer: this.options.compactionExecutorLayer,
940
942
  compactionPolicyLayer: this.options.compactionPolicyLayer,
941
943
  keepAlive: this.keepAlive,
@@ -1460,4 +1462,4 @@ const hostSpanOptions = (trace, attributes) => ({
1460
1462
  //#endregion
1461
1463
  export { EDAWebSocketProjectionId as n, makeEDADurableObjectRuntimeLayer as r, EDASessionController as t };
1462
1464
 
1463
- //# sourceMappingURL=session-controller-IrTPwdRt.js.map
1465
+ //# sourceMappingURL=session-controller-zTTLb7tt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-controller-zTTLb7tt.js","names":[],"sources":["../src/durable-object-keepalive.ts","../src/durable-object-sink-checkpoints.ts","../src/durable-object-store.ts","../src/runtime/runtime-layer.ts","../src/runtime/session-runtime.ts","../src/websocket/projection.ts","../src/websocket/attachment.ts","../src/websocket/connection-manager.ts","../src/session-controller.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/**\n * Optional host hook for background alarm writes started from synchronous observers.\n * Durable Objects already track their own async work; this hook does not keep an\n * accepted WebSocket active or prevent WebSocket hibernation.\n */\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 runSchedulingPending = false;\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 /** Durable delivery work survives the release of every in-memory active lease. */\n setRunSchedulingPending(pending: boolean): Promise<void> {\n this.runSchedulingPending = pending;\n return this.reschedule();\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 this.runSchedulingPending = false;\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 && !this.runSchedulingPending)) {\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 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 * 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 SummaryCreatedPayload,\n ContextRebasedPayload,\n DurableEventEnvelope,\n assistantMessageCommittedEventType,\n assistantMessageImportedEventType,\n assistantPartialCommittedEventType,\n commandAdmittedEventType,\n commandCancelledEventType,\n commandCompletedEventType,\n commandFailedEventType,\n commandStartedEventType,\n contextRebasedEventType,\n decodeDurableEventSync,\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 position: durablePosition(SequenceNumber.make(row.seq)),\n event: decodeDurableEventSync({\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\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 = Schema.decodeUnknownSync(Schema.Record(Schema.String, Schema.Unknown))(payload);\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 {\n command: { commandId },\n } = Schema.decodeUnknownSync(\n Schema.Struct({\n command: Schema.Struct({ commandId: Schema.String }),\n }),\n )(JSON.parse(row.fact_json));\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 } = Schema.decodeUnknownSync(\n Schema.Struct({ command: Schema.Record(Schema.String, Schema.Unknown) }),\n )(encoded.payload);\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 } = Schema.decodeUnknownSync(Schema.Struct({ messageId: Schema.Unknown }))(\n encoded.payload,\n );\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 = Schema.decodeUnknownSync(SummaryCreatedPayload)(event.payload);\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 = Schema.decodeUnknownSync(ContextRebasedPayload)(event.payload);\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 type { EDAAppEvents } from \"effect-durable-agent/services/session-store\";\nimport type { RunScheduler } from \"effect-durable-agent/services/run-scheduler\";\nimport { RunSchedulingWakeup } from \"effect-durable-agent/services/run-scheduling-wakeup\";\nimport { EDASessionStoreError } from \"effect-durable-agent/services/session-store\";\nimport * as Effect from \"effect/Effect\";\nimport type { ModelResolver } from \"effect-durable-agent/services/model-resolver\";\nimport * as Layer from \"effect/Layer\";\nimport type * as Tracer from \"effect/Tracer\";\n\nimport { CompactionExecutor, CompactionPolicy } from \"effect-durable-agent/services/compaction\";\nimport type { IdGenerator } from \"effect-durable-agent/services/id-generator\";\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 { SessionEventObserver } from \"effect-durable-agent/services/session-event-observer\";\nimport type { SessionCommandAdmissionError } from \"effect-durable-agent/services/session-state\";\nimport type { EDASink } from \"effect-durable-agent/services/sink-registry\";\nimport type {\n EDAModelToolkit,\n EDAToolRegistryShape,\n} from \"effect-durable-agent/services/tool-registry\";\nimport type { SessionId } from \"effect-durable-agent/types/core\";\nimport {\n DurableObjectKeepAlive,\n type DurableObjectAlarmStorage,\n} from \"../durable-object-keepalive\";\nimport { DurableObjectSinkCheckpointStore } from \"../durable-object-sink-checkpoints\";\nimport type { DurableObjectSessionStorage } from \"../durable-object-storage\";\nimport { DurableObjectSessionStore } from \"../durable-object-store\";\n\n/** Storage capabilities used by one EDA session Durable Object. */\nexport type EDASessionDurableObjectStorage = DurableObjectSessionStorage &\n DurableObjectAlarmStorage;\n\n/** Host adapters and application policy needed to build one session runtime. */\nexport interface EDADurableObjectRuntimeLayerOptions {\n readonly appEvents?: EDAAppEvents;\n readonly config: EDARuntimeConfig;\n /** Host-owned identity source, shared by every lifecycle service. Defaults to `IdGenerator.Live`. */\n readonly idGeneratorLayer?: Layer.Layer<IdGenerator>;\n readonly compactionExecutorLayer?: Layer.Layer<CompactionExecutor>;\n readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;\n readonly keepAlive?: DurableObjectKeepAlive;\n readonly modelResolverLayer: Layer.Layer<ModelResolver>;\n readonly promptProjectorLayer?: Layer.Layer<EDAPromptProjector>;\n readonly runSchedulerLayer?: Layer.Layer<RunScheduler>;\n readonly reducers?: ReadonlyArray<EDAReducer>;\n readonly sessionEventObserverLayer?: Layer.Layer<SessionEventObserver>;\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/** Compose the platform-neutral runtime with Cloudflare persistence and lifecycle adapters. */\nexport const makeEDADurableObjectRuntimeLayer = ({\n appEvents,\n config,\n idGeneratorLayer,\n compactionExecutorLayer,\n compactionPolicyLayer,\n keepAlive,\n modelResolverLayer,\n promptProjectorLayer,\n reducers,\n runSchedulerLayer,\n sessionEventObserverLayer,\n sessionId,\n sinks,\n storage,\n toolkit,\n toolRegistry,\n tracer,\n}: EDADurableObjectRuntimeLayerOptions): Layer.Layer<EDARuntime, SessionCommandAdmissionError> => {\n const lifecycle = keepAlive ?? new DurableObjectKeepAlive(storage);\n const keepAliveLayer = EDAKeepAlive.FromAcquire(() => lifecycle.acquire());\n return makeEDARuntimeLayer({\n appEvents,\n config,\n idGeneratorLayer,\n compactionExecutorLayer,\n compactionPolicyLayer,\n keepAliveLayer,\n modelResolverLayer,\n promptProjectorLayer,\n runSchedulerLayer,\n runSchedulingWakeupLayer: Layer.succeed(RunSchedulingWakeup, {\n setPending: (pending) =>\n Effect.tryPromise({\n try: () => lifecycle.setRunSchedulingPending(pending),\n catch: (error) =>\n new EDASessionStoreError({\n message: `Persisting run scheduling wakeup: ${String(error)}`,\n }),\n }),\n }),\n reducerRegistryLayer: EDAReducerRegistry.Live(reducers ?? []),\n sessionEventObserverLayer,\n sessionId,\n sessionStoreLayer: DurableObjectSessionStore.layer({ sessionId, storage }),\n sinkCheckpointStoreLayer: DurableObjectSinkCheckpointStore.layer(storage),\n sinks,\n toolkit,\n toolRegistry,\n tracer,\n });\n};\n","import type { IdGenerator } from \"effect-durable-agent/services/id-generator\";\nimport type { EDAAppEvents } from \"effect-durable-agent/services/session-store\";\nimport type { RunScheduler } from \"effect-durable-agent/services/run-scheduler\";\nimport type { ModelResolver } from \"effect-durable-agent/services/model-resolver\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as ManagedRuntime from \"effect/ManagedRuntime\";\nimport type * as Tracer from \"effect/Tracer\";\n\nimport type {\n CompactionExecutor,\n CompactionPolicy,\n} from \"effect-durable-agent/services/compaction\";\nimport {\n EDARuntime,\n type EDARuntimeConfig,\n type EDARuntimeShape,\n} from \"effect-durable-agent/services/runtime\";\nimport type { EDAPromptProjector } from \"effect-durable-agent/services/prompt-projector\";\nimport type { EDAReducer } from \"effect-durable-agent/services/reducer-registry\";\nimport type { SessionEventObserver } from \"effect-durable-agent/services/session-event-observer\";\nimport type { SessionCommandAdmissionError } from \"effect-durable-agent/services/session-state\";\nimport type { EDASink } from \"effect-durable-agent/services/sink-registry\";\nimport type {\n EDAModelToolkit,\n EDAToolRegistryShape,\n} from \"effect-durable-agent/services/tool-registry\";\nimport type { SessionId } from \"effect-durable-agent/types/core\";\nimport {\n DurableObjectKeepAlive,\n type DurableObjectBackgroundWaiter,\n} from \"../durable-object-keepalive\";\nimport { DurableObjectSinkCheckpointStore } from \"../durable-object-sink-checkpoints\";\nimport { DurableObjectSessionStore } from \"../durable-object-store\";\nimport {\n makeEDADurableObjectRuntimeLayer,\n type EDASessionDurableObjectStorage,\n} from \"./runtime-layer\";\n\nexport type EDAToolkitFactory = (input: { readonly sessionId: SessionId }) => EDAModelToolkit;\nexport type EDAToolRegistryFactory = (input: {\n readonly sessionId: SessionId;\n}) => EDAToolRegistryShape;\nexport type EDATracerFactory = (input: { readonly sessionId: SessionId }) => Tracer.Tracer;\n\n/** Configuration owned by the lazy per-isolate Effect runtime. */\nexport interface EDASessionRuntimeOptions {\n readonly background?: DurableObjectBackgroundWaiter;\n readonly appEvents?: EDAAppEvents;\n readonly config: EDARuntimeConfig;\n /** Host-owned identity source, shared by every lifecycle service. Defaults to `IdGenerator.Live`. */\n readonly idGeneratorLayer?: Layer.Layer<IdGenerator>;\n readonly compactionExecutorLayer?: Layer.Layer<CompactionExecutor>;\n readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;\n readonly keepAlive?: DurableObjectKeepAlive;\n readonly modelResolverLayer: Layer.Layer<ModelResolver>;\n readonly promptProjectorLayer?: Layer.Layer<EDAPromptProjector>;\n readonly runSchedulerLayer?: Layer.Layer<RunScheduler>;\n readonly reducers?: ReadonlyArray<EDAReducer>;\n readonly sessionEventObserverLayer: Layer.Layer<SessionEventObserver>;\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}\n\ninterface RuntimeState {\n readonly runtime: ManagedRuntime.ManagedRuntime<EDARuntime, SessionCommandAdmissionError>;\n readonly sessionId: SessionId;\n}\n\n/** Owns the disposable ManagedRuntime and nothing about WebSocket transport. */\nexport class EDASessionRuntime {\n readonly keepAlive: DurableObjectKeepAlive;\n private state: RuntimeState | undefined;\n private building: Promise<RuntimeState> | undefined;\n\n constructor(private readonly options: EDASessionRuntimeOptions) {\n this.keepAlive =\n options.keepAlive ?? new DurableObjectKeepAlive(options.storage, options.background);\n }\n\n static readonly migrate = (\n storage: EDASessionDurableObjectStorage,\n ): Effect.Effect<\n void,\n import(\"effect-durable-agent/services/session-store\").EDASessionStoreError\n > =>\n Effect.gen(function* () {\n yield* DurableObjectSessionStore.migrate(storage);\n yield* DurableObjectSinkCheckpointStore.migrate(storage);\n });\n\n isReady(sessionId: SessionId): boolean {\n return this.state?.sessionId === sessionId;\n }\n\n async prepare(sessionId: SessionId): Promise<void> {\n await this.get(sessionId);\n }\n\n async run<A>(\n sessionId: SessionId,\n operation: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n ): Promise<A> {\n const state = await this.get(sessionId);\n return await state.runtime.runPromise(\n Effect.gen(function* () {\n return yield* operation(yield* EDARuntime);\n }),\n );\n }\n\n async alarm(sessionId?: SessionId): Promise<void> {\n const resolved = sessionId ?? this.state?.sessionId;\n if (resolved !== undefined) {\n await this.run(resolved, (runtime) => runtime.retryRunSchedulingDelivery());\n }\n await this.keepAlive.alarm();\n }\n\n async destroy(): Promise<void> {\n await this.keepAlive.shutdown();\n await this.dispose();\n this.state = undefined;\n this.building = undefined;\n }\n\n async dispose(): Promise<void> {\n await this.state?.runtime.dispose();\n }\n\n private async get(sessionId: SessionId): Promise<RuntimeState> {\n if (this.state !== undefined) {\n if (this.state.sessionId !== sessionId) {\n throw new Error(\n `EDA session runtime is scoped to session ${this.state.sessionId}; received ${sessionId}`,\n );\n }\n return this.state;\n }\n\n this.keepAlive.restart();\n const building = this.building ?? this.build(sessionId);\n this.building = building;\n try {\n return await building;\n } catch (error) {\n if (this.building === building) this.building = undefined;\n throw error;\n }\n }\n\n private async build(sessionId: SessionId): Promise<RuntimeState> {\n const runtime = ManagedRuntime.make(\n makeEDADurableObjectRuntimeLayer({\n appEvents: this.options.appEvents,\n config: this.options.config,\n idGeneratorLayer: this.options.idGeneratorLayer,\n compactionExecutorLayer: this.options.compactionExecutorLayer,\n compactionPolicyLayer: this.options.compactionPolicyLayer,\n keepAlive: this.keepAlive,\n modelResolverLayer: this.options.modelResolverLayer,\n promptProjectorLayer: this.options.promptProjectorLayer,\n reducers: this.options.reducers,\n runSchedulerLayer: this.options.runSchedulerLayer,\n sessionEventObserverLayer: this.options.sessionEventObserverLayer,\n sessionId,\n sinks: this.options.sinks,\n storage: this.options.storage,\n toolkit: resolveFactory(this.options.toolkit, sessionId),\n toolRegistry: resolveFactory(this.options.toolRegistry, sessionId),\n tracer: resolveFactory(this.options.tracer, sessionId),\n }),\n );\n const state = { runtime, sessionId } satisfies RuntimeState;\n try {\n await runtime.context();\n this.state = state;\n return state;\n } catch (error) {\n await runtime.dispose().catch(() => undefined);\n throw error;\n }\n }\n}\n\nconst resolveFactory = <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","import type * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport type {\n EDAWebSocketClientFrame,\n EDAWebSocketServerFrameInput,\n} from \"effect-durable-agent/websocket\";\nimport type { SequenceNumber } from \"effect-durable-agent/types/core\";\n\n/** Stable non-empty identity persisted with an app WebSocket projection. */\nexport const EDAWebSocketProjectionId = Schema.NonEmptyString.pipe(\n Schema.brand(\"EDAWebSocketProjectionId\"),\n);\nexport type EDAWebSocketProjectionId = typeof EDAWebSocketProjectionId.Type;\n\n/** Initial state and cursor selected when an app-projected WebSocket is accepted. */\nexport interface EDAWebSocketProjectionInitial<State extends object> {\n readonly afterSeq: SequenceNumber;\n readonly state: State;\n}\n\n/** App projection decision for one EDA delivery frame. */\nexport type EDAWebSocketProjectionResult<State extends object> =\n | {\n readonly _tag: \"Send\";\n readonly frame: string;\n readonly state: State;\n }\n | {\n /** Suppress an internal-only events frame and advance its ACK in the host. */\n readonly _tag: \"SuppressAndAck\";\n readonly state: State;\n };\n\n/**\n * App-owned wire projection hosted directly by the EDA Durable Object.\n *\n * The host persists `State` beside EDA delivery state, so an app can retain a\n * stable public protocol without placing a resident WebSocket bridge in front\n * of the hibernating object.\n */\nexport interface EDAWebSocketProjection<State extends object> {\n /** Stable identifier persisted in WebSocket attachments. */\n readonly id: EDAWebSocketProjectionId;\n /** Decode one app-protocol client message into EDA's delivery ACK protocol. */\n readonly decodeClientMessage: (\n message: string,\n ) => Effect.Effect<EDAWebSocketClientFrame, unknown>;\n /** Restore app-owned connection state after isolate eviction. */\n readonly decodeState: (encoded: unknown) => Effect.Effect<State, unknown>;\n /** Encode app-owned connection state for Cloudflare's attachment boundary. */\n readonly encodeState: (state: State) => unknown;\n /** Project one EDA server frame while updating app-owned connection state. */\n readonly encodeServerFrame: (\n frame: EDAWebSocketServerFrameInput,\n state: State,\n ) => EDAWebSocketProjectionResult<State>;\n /** Seed the projection and select its default replay cursor from a durable snapshot. */\n readonly initialize: (input: {\n readonly requestedAfterSeq?: SequenceNumber;\n readonly snapshot: EDASessionSnapshot;\n }) => EDAWebSocketProjectionInitial<State>;\n}\n","import * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport { EDAWebSocketDeliveryCheckpoint } from \"effect-durable-agent/websocket\";\nimport { SubscriberId } from \"effect-durable-agent/websocket\";\nimport { SessionId } from \"effect-durable-agent/types/core\";\nimport { EDATraceMetadata } from \"effect-durable-agent/types/tracing\";\nimport { EDAWebSocketProjectionId } from \"./projection\";\n\n/** Versioned state required to resume strict delivery after Durable Object hibernation. */\nexport const EDAWebSocketAttachment = Schema.Struct({\n kind: Schema.Literal(\"eda-events-v2\"),\n sessionId: SessionId,\n subscriberId: SubscriberId,\n trace: EDATraceMetadata,\n delivery: EDAWebSocketDeliveryCheckpoint,\n projection: Schema.optionalKey(\n Schema.Struct({\n id: EDAWebSocketProjectionId,\n state: Schema.Unknown,\n }),\n ),\n});\nexport type EDAWebSocketAttachment = typeof EDAWebSocketAttachment.Type;\n\nexport type DecodedWebSocketAttachment =\n | { readonly _tag: \"Missing\" }\n | { readonly _tag: \"Malformed\" }\n | { readonly _tag: \"Decoded\"; readonly attachment: EDAWebSocketAttachment };\n\n/** Decode and classify an attachment read from Cloudflare's structured-clone boundary. */\nexport const decodeWebSocketAttachment = async (\n input: unknown,\n): Promise<DecodedWebSocketAttachment> => {\n if (input === null || input === undefined) return { _tag: \"Missing\" };\n try {\n return {\n _tag: \"Decoded\",\n attachment: await Effect.runPromise(\n Schema.decodeUnknownEffect(EDAWebSocketAttachment)(input),\n ),\n };\n } catch {\n return { _tag: \"Malformed\" };\n }\n};\n\n/** Encode before serialization so schema transformations cannot leak into attachments. */\nexport const encodeWebSocketAttachment = (attachment: EDAWebSocketAttachment): unknown =>\n Schema.encodeSync(EDAWebSocketAttachment)(attachment);\n","import * as Effect from \"effect/Effect\";\n\nimport { SessionEventObserver } from \"effect-durable-agent/services/session-event-observer\";\nimport type { EDASessionEventPage } from \"effect-durable-agent/services/session-query\";\nimport { SequenceNumber, type SessionId } from \"effect-durable-agent/types/core\";\nimport type { PositionedEvent } from \"effect-durable-agent/types/events\";\nimport type { EDATraceMetadata } from \"effect-durable-agent/types/tracing\";\nimport {\n EDA_WEB_SOCKET_PING_MESSAGE,\n EDA_WEB_SOCKET_PONG_MESSAGE,\n EDA_WS_CLOSE_PROTOCOL_ERROR,\n EDA_WS_CLOSE_SEND_FAILED,\n SubscriberId,\n checkpointWebSocketDeliveryState,\n decodeEDAWebSocketClientMessage,\n defaultEDAWebSocketFlowControl,\n deliveryHelloFrame,\n encodeEDAWebSocketServerFrame,\n makeWebSocketDeliveryState,\n onClientAck,\n onDurableEvents,\n onEphemeralEvent,\n onHostSuppressedFrame,\n restoreWebSocketDeliveryState,\n type EDAWebSocketDeliveryResult,\n type EDAWebSocketDeliveryAction,\n type EDAWebSocketDeliveryState,\n type EDAWebSocketClientFrame,\n type EDAWebSocketServerFrame,\n type EDAWebSocketServerFrameEncoder,\n} from \"effect-durable-agent/websocket\";\nimport {\n EDAWebSocketAttachment,\n decodeWebSocketAttachment,\n encodeWebSocketAttachment,\n} from \"./attachment\";\nimport type { EDAWebSocketProjection } from \"./projection\";\n\nexport interface EDAWebSocketConnectionManagerOptions<ProjectionState extends object = never> {\n readonly getWebSockets?: () => ReadonlyArray<WebSocket>;\n readonly isSessionReady: (sessionId: SessionId) => boolean;\n readonly prepareSession: (sessionId: SessionId) => Promise<void>;\n readonly readEventPage: (input: {\n readonly afterSeq: SequenceNumber;\n readonly limit: number;\n readonly sessionId: SessionId;\n readonly subscriberId: SubscriberId;\n readonly trace: EDATraceMetadata;\n }) => Promise<EDASessionEventPage>;\n readonly webSocketProjection?: EDAWebSocketProjection<ProjectionState>;\n readonly webSocketProtocol?: EDAWebSocketServerFrameEncoder;\n}\n\ninterface EventWebSocketState<ProjectionState extends object> {\n readonly sessionId: SessionId;\n readonly subscriberId: SubscriberId;\n readonly trace: EDATraceMetadata;\n delivery: EDAWebSocketDeliveryState;\n catchUpDeferred: boolean;\n head: SequenceNumber;\n queue: Promise<void>;\n projectionState?: ProjectionState;\n}\n\n/**\n * Owns Cloudflare WebSockets, hibernation attachments, and interpretation of\n * the platform-neutral delivery state machine.\n */\nexport class EDAWebSocketConnectionManager<ProjectionState extends object = never> {\n readonly observerLayer = SessionEventObserver.FromHandler((event) =>\n Effect.tryPromise(() => this.fanoutPublishedEvent(event)).pipe(\n Effect.catchCause((cause) =>\n Effect.logError(\"EDA WebSocket event observer recovered from a host failure\", { cause }),\n ),\n ),\n );\n\n private readonly sockets = new Map<WebSocket, EventWebSocketState<ProjectionState>>();\n\n constructor(private readonly options: EDAWebSocketConnectionManagerOptions<ProjectionState>) {}\n\n resolveProjection(id: string | undefined): EDAWebSocketProjection<ProjectionState> | undefined {\n if (id === undefined) return undefined;\n if (this.options.webSocketProjection?.id === id) return this.options.webSocketProjection;\n return undefined;\n }\n\n async accept(input: {\n readonly afterSeq: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n readonly webSocket: WebSocket;\n readonly projectionState?: ProjectionState;\n }): Promise<void> {\n const subscriberId = SubscriberId.make(crypto.randomUUID());\n const delivery = makeWebSocketDeliveryState({\n subscriberId,\n resumeSeq: input.afterSeq,\n policy: defaultEDAWebSocketFlowControl,\n });\n const state: EventWebSocketState<ProjectionState> = {\n sessionId: input.sessionId,\n subscriberId,\n trace: input.trace,\n delivery,\n catchUpDeferred: false,\n head: input.afterSeq,\n queue: Promise.resolve(),\n ...(input.projectionState === undefined ? {} : { projectionState: input.projectionState }),\n };\n this.sockets.set(input.webSocket, state);\n // The Durable Object calls this immediately after ctx.acceptWebSocket().\n // Register and attach synchronously before the first await so no platform\n // callback can observe an accepted socket without recovery state.\n if (!this.persist(input.webSocket, state)) return;\n if (!(await this.send(input.webSocket, state, [deliveryHelloFrame(delivery)]))) return;\n if (!(await this.prepare(input.webSocket, state))) return;\n await this.enqueue(input.webSocket, state, async () => {\n await this.readAndDeliver(input.webSocket, state, input.afterSeq);\n });\n }\n\n async message(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n if (typeof message !== \"string\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"binary\");\n return;\n }\n if (message === EDA_WEB_SOCKET_PING_MESSAGE) {\n // Cloudflare auto-response normally intercepts this without waking the\n // object. Keep the fallback independent of attachment recovery for\n // direct controller hosts and unit tests.\n try {\n webSocket.send(EDA_WEB_SOCKET_PONG_MESSAGE);\n } catch {\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"send-failed\");\n }\n return;\n }\n\n const state = await this.restore(webSocket);\n if (state === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return;\n }\n const frame = await Effect.runPromise(\n this.decodeClientMessage(message, state).pipe(Effect.option),\n );\n if (frame._tag === \"None\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return;\n }\n const clientFrame = frame.value;\n if (clientFrame._tag === \"ping\") return;\n\n if (!(await this.prepare(webSocket, state))) return;\n await this.enqueue(webSocket, state, async () => {\n await this.interpret(webSocket, state, onClientAck(state.delivery, clientFrame, Date.now()));\n });\n }\n\n closed(webSocket: WebSocket): void {\n this.sockets.delete(webSocket);\n }\n\n async flushDeferredCatchUp(sessionId: SessionId): Promise<void> {\n const deliveries: Promise<void>[] = [];\n for (const [webSocket, state] of this.sockets) {\n if (state.sessionId !== sessionId || !state.catchUpDeferred) continue;\n deliveries.push(\n this.enqueue(webSocket, state, async () => {\n if (!state.catchUpDeferred) return;\n state.catchUpDeferred = false;\n await this.readAndDeliver(webSocket, state, state.delivery.sentDurableThroughSeq);\n }),\n );\n }\n await Promise.all(deliveries);\n }\n\n private async fanoutPublishedEvent(event: PositionedEvent): Promise<void> {\n const webSockets = new Set([...(this.options.getWebSockets?.() ?? []), ...this.sockets.keys()]);\n const deliveries: Promise<void>[] = [];\n for (const webSocket of webSockets) {\n const state = await this.restore(webSocket);\n if (state === undefined) continue;\n deliveries.push(\n this.enqueue(webSocket, state, async () => {\n if (event.event.durability !== \"durable\") {\n await this.interpret(\n webSocket,\n state,\n onEphemeralEvent(state.delivery, event, Date.now()),\n );\n return;\n }\n state.head = SequenceNumber.make(Math.max(state.head, event.position.seq));\n if (event.position.seq <= state.delivery.sentDurableThroughSeq) return;\n if (event.position.seq === state.delivery.sentDurableThroughSeq + 1) {\n await this.interpret(\n webSocket,\n state,\n onDurableEvents(state.delivery, [event], state.head, Date.now()),\n );\n return;\n }\n if (!this.options.isSessionReady(state.sessionId)) {\n state.catchUpDeferred = true;\n return;\n }\n await this.readAndDeliver(webSocket, state, state.delivery.sentDurableThroughSeq);\n }),\n );\n }\n await Promise.all(deliveries);\n }\n\n private async restore(\n webSocket: WebSocket,\n ): Promise<EventWebSocketState<ProjectionState> | undefined> {\n const existing = this.sockets.get(webSocket);\n if (existing !== undefined) return existing;\n const decoded = await decodeWebSocketAttachment(webSocket.deserializeAttachment());\n if (decoded._tag !== \"Decoded\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return undefined;\n }\n const attachment = decoded.attachment;\n const projectionState =\n attachment.projection === undefined\n ? undefined\n : await this.decodeProjectionState(attachment.projection.id, attachment.projection.state);\n if (attachment.projection !== undefined && projectionState === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return undefined;\n }\n const state: EventWebSocketState<ProjectionState> = {\n sessionId: attachment.sessionId,\n subscriberId: attachment.subscriberId,\n trace: attachment.trace,\n delivery: restoreWebSocketDeliveryState({\n subscriberId: attachment.subscriberId,\n policy: defaultEDAWebSocketFlowControl,\n checkpoint: attachment.delivery,\n }),\n catchUpDeferred: false,\n head: attachment.delivery.sentDurableThroughSeq,\n queue: Promise.resolve(),\n ...(projectionState === undefined ? {} : { projectionState }),\n };\n this.sockets.set(webSocket, state);\n return state;\n }\n\n private async prepare(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n ): Promise<boolean> {\n try {\n await this.options.prepareSession(state.sessionId);\n return this.sockets.get(webSocket) === state;\n } catch (error) {\n await Effect.runPromise(\n Effect.logError(\"EDA WebSocket session preparation failed\", {\n error,\n subscriberId: state.subscriberId,\n }),\n );\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"subscriber-failed\");\n return false;\n }\n }\n\n private async interpret(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n result: EDAWebSocketDeliveryResult,\n ): Promise<boolean> {\n state.delivery = result.state;\n for (const action of result.actions) {\n switch (action._tag) {\n case \"Persist\":\n if (!this.persist(webSocket, state)) return false;\n break;\n case \"Send\":\n if (!(await this.send(webSocket, state, action.frames))) return false;\n break;\n case \"ReadEventPage\":\n if (!(await this.readAndDeliver(webSocket, state, action.afterSeq))) return false;\n break;\n case \"Close\":\n this.close(webSocket, action.code, action.reason);\n return false;\n }\n }\n return true;\n }\n\n private async readAndDeliver(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n afterSeq: SequenceNumber,\n ): Promise<boolean> {\n const page = await this.options.readEventPage({\n afterSeq,\n limit: state.delivery.policy.maxInFlightFrames * state.delivery.policy.maxFrameEvents,\n sessionId: state.sessionId,\n subscriberId: state.subscriberId,\n trace: state.trace,\n });\n state.head = SequenceNumber.make(Math.max(state.head, page.head));\n if (page.events.length === 0) return true;\n return await this.interpret(\n webSocket,\n state,\n onDurableEvents(state.delivery, page.events, state.head, Date.now()),\n );\n }\n\n private persist(webSocket: WebSocket, state: EventWebSocketState<ProjectionState>): boolean {\n try {\n const projection =\n state.projectionState === undefined ? undefined : this.options.webSocketProjection;\n if (state.projectionState !== undefined && projection === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return false;\n }\n const attachment = EDAWebSocketAttachment.make({\n kind: \"eda-events-v2\",\n sessionId: state.sessionId,\n subscriberId: state.subscriberId,\n trace: state.trace,\n delivery: checkpointWebSocketDeliveryState(state.delivery),\n ...(state.projectionState === undefined || projection === undefined\n ? {}\n : {\n projection: {\n id: projection.id,\n state: projection.encodeState(state.projectionState),\n },\n }),\n });\n webSocket.serializeAttachment(encodeWebSocketAttachment(attachment));\n return true;\n } catch {\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"attachment-failed\");\n return false;\n }\n }\n\n private send(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n frames: ReadonlyArray<EDAWebSocketServerFrame>,\n ): Promise<boolean> {\n return this.sendPrepared(webSocket, state, frames);\n }\n\n private async sendPrepared(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n frames: ReadonlyArray<EDAWebSocketServerFrame>,\n ): Promise<boolean> {\n try {\n const encodedFrames: string[] = [];\n const followUpActions: EDAWebSocketDeliveryAction[] = [];\n for (const frame of frames) {\n const projected =\n state.projectionState === undefined\n ? undefined\n : this.options.webSocketProjection?.encodeServerFrame(frame, state.projectionState);\n if (state.projectionState !== undefined && projected === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return false;\n }\n if (projected?._tag === \"SuppressAndAck\") {\n if (frame._tag !== \"events\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return false;\n }\n state.projectionState = projected.state;\n const acknowledged = onHostSuppressedFrame(\n state.delivery,\n {\n durableThroughSeq: frame.durableThroughSeq,\n frameId: frame.frameId,\n },\n Date.now(),\n );\n state.delivery = acknowledged.state;\n followUpActions.push(\n ...acknowledged.actions.filter((action) => action._tag !== \"Persist\"),\n );\n continue;\n }\n if (projected !== undefined) state.projectionState = projected.state;\n const encoded =\n projected?._tag === \"Send\"\n ? projected.frame\n : encodeEDAWebSocketServerFrame(frame, this.options.webSocketProtocol);\n if (new TextEncoder().encode(encoded).byteLength > state.delivery.policy.maxFrameBytes) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"frame-too-large\");\n return false;\n }\n encodedFrames.push(encoded);\n }\n // Projection encoders may update app-owned state. Persist that state\n // before publishing any frame so eviction cannot roll the projection\n // back behind the client-visible stream.\n if (state.projectionState !== undefined && !this.persist(webSocket, state)) return false;\n for (const encoded of encodedFrames) webSocket.send(encoded);\n if (followUpActions.length > 0) {\n return await this.interpret(webSocket, state, {\n state: state.delivery,\n actions: coalesceFollowUpActions(followUpActions),\n });\n }\n return true;\n } catch {\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"send-failed\");\n return false;\n }\n }\n\n private enqueue(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n operation: () => Promise<void>,\n ): Promise<void> {\n const run = async (): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n await Effect.runPromise(\n Effect.logError(\"EDA WebSocket operation failed\", {\n error,\n subscriberId: state.subscriberId,\n }),\n );\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"subscriber-failed\");\n }\n };\n const next = state.queue.then(run);\n state.queue = next;\n return next;\n }\n\n private close(webSocket: WebSocket, code: number, reason: string): void {\n this.sockets.delete(webSocket);\n try {\n webSocket.close(code, reason);\n } catch {\n // Closing and already-closed sockets can still be returned by getWebSockets().\n }\n }\n\n private decodeClientMessage(\n message: string,\n state: EventWebSocketState<ProjectionState>,\n ): Effect.Effect<EDAWebSocketClientFrame, unknown> {\n return state.projectionState === undefined\n ? decodeEDAWebSocketClientMessage(message)\n : (this.options.webSocketProjection?.decodeClientMessage(message) ?? Effect.fail(\"protocol\"));\n }\n\n private async decodeProjectionState(\n id: string,\n encoded: unknown,\n ): Promise<ProjectionState | undefined> {\n const projection = this.resolveProjection(id);\n if (projection === undefined) return undefined;\n const decoded = await Effect.runPromise(projection.decodeState(encoded).pipe(Effect.option));\n return decoded._tag === \"Some\" ? decoded.value : undefined;\n }\n}\n\nconst coalesceFollowUpActions = (\n actions: ReadonlyArray<EDAWebSocketDeliveryAction>,\n): ReadonlyArray<EDAWebSocketDeliveryAction> => {\n let readAfterSeq: SequenceNumber | undefined;\n const retained: EDAWebSocketDeliveryAction[] = [];\n for (const action of actions) {\n if (action._tag !== \"ReadEventPage\") {\n retained.push(action);\n continue;\n }\n readAfterSeq = SequenceNumber.make(Math.max(readAfterSeq ?? 0, action.afterSeq));\n }\n return readAfterSeq === undefined\n ? retained\n : [...retained, { _tag: \"ReadEventPage\", afterSeq: readAfterSeq }];\n};\n","import * as Effect from \"effect/Effect\";\nimport type * as Tracer from \"effect/Tracer\";\n\nimport type { DurableTranscriptMessage } from \"effect-durable-agent/domain/message-transcript\";\nimport type {\n CommittedCommandTerminalEvent,\n EDARuntimeShape,\n} from \"effect-durable-agent/services/runtime\";\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport type { CommittedDurableEvent } from \"effect-durable-agent/services/session-store\";\nimport type { EDASubmittable } from \"effect-durable-agent/services/session-state\";\nimport { compactSpanAttributes, toEdaExternalSpan } from \"effect-durable-agent/services/tracing\";\nimport type { EDACommand, GrantRunCommand } from \"effect-durable-agent/types/commands\";\nimport type { RunGrantResult, RunRequestOutcome } from \"effect-durable-agent/domain/run-scheduling\";\nimport {\n CommandId,\n SequenceNumber,\n SessionId,\n type RunRequestId,\n} from \"effect-durable-agent/types/core\";\nimport {\n makeRootEDATraceMetadata,\n type EDATraceMetadata,\n} from \"effect-durable-agent/types/tracing\";\nimport { EDASessionRuntime, type EDASessionRuntimeOptions } from \"./runtime/session-runtime\";\nimport type { EDASessionDurableObjectStorage } from \"./runtime/runtime-layer\";\nimport { EDAWebSocketConnectionManager } from \"./websocket/connection-manager\";\nimport type { EDAWebSocketServerFrameEncoder } from \"effect-durable-agent/websocket\";\nimport type { EDAWebSocketProjection } from \"./websocket/projection\";\n\n/** Composition options for the session use cases and Cloudflare adapters. */\nexport interface EDASessionControllerOptions<ProjectionState extends object = never> extends Omit<\n EDASessionRuntimeOptions,\n \"sessionEventObserverLayer\"\n> {\n readonly getWebSockets?: () => ReadonlyArray<WebSocket>;\n readonly webSocketProjection?: EDAWebSocketProjection<ProjectionState>;\n readonly webSocketProtocol?: EDAWebSocketServerFrameEncoder;\n}\n\nexport interface EDASessionSubmitInput {\n readonly command: EDACommand;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionSubmitBatchInput {\n readonly items: ReadonlyArray<EDASubmittable>;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionBlockOnCommandInput {\n readonly afterSeq?: SequenceNumber;\n readonly commandId: CommandId;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionScopedInput {\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionEventsInput {\n readonly afterSeq?: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\n/** Prepared acceptance state created before a Cloudflare socket is registered. */\nexport interface EDAPreparedEventWebSocket<ProjectionState extends object = never> {\n readonly afterSeq: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n readonly projectionState?: ProjectionState;\n}\n\n/**\n * Public application-facing use cases for one EDA session.\n *\n * Runtime lifecycle belongs to EDASessionRuntime; WebSocket transport belongs\n * to EDAWebSocketConnectionManager. This class only coordinates them.\n */\nexport class EDASessionController<ProjectionState extends object = never> {\n private readonly runtime: EDASessionRuntime;\n private readonly webSockets: EDAWebSocketConnectionManager<ProjectionState>;\n\n constructor(options: EDASessionControllerOptions<ProjectionState>) {\n this.webSockets = new EDAWebSocketConnectionManager({\n getWebSockets: options.getWebSockets,\n isSessionReady: (sessionId) => this.runtime.isReady(sessionId),\n prepareSession: (sessionId) => this.prepareSession(sessionId),\n readEventPage: async ({ afterSeq, limit, sessionId, subscriberId, trace }) =>\n await this.runtime.run(sessionId, (eda) =>\n eda.readEventPage(afterSeq, limit).pipe(\n Effect.withSpan(\n \"agent.events.page\",\n hostSpanOptions(trace, {\n \"eda.session.id\": sessionId,\n \"eda.subscriber.id\": subscriberId,\n \"eda.seq.after\": afterSeq,\n }),\n ),\n ),\n ),\n webSocketProjection: options.webSocketProjection,\n webSocketProtocol: options.webSocketProtocol,\n });\n this.runtime = new EDASessionRuntime({\n ...options,\n sessionEventObserverLayer: this.webSockets.observerLayer,\n });\n }\n\n static readonly migrate = EDASessionRuntime.migrate;\n\n /** Trusted reconciliation read; never submits or grants replacement work. */\n runRequestOutcome(\n input: EDASessionScopedInput & { readonly requestId: RunRequestId },\n ): Promise<RunRequestOutcome> {\n return this.run(input.sessionId, (eda) => eda.runRequestOutcome(input.requestId));\n }\n\n /** Trusted scheduler ingress. Hosts must authorize callers before invoking this method. */\n grantRun(\n input: EDASessionScopedInput & { readonly command: GrantRunCommand },\n ): Promise<RunGrantResult> {\n const parent = input.trace?.parent;\n return this.run(input.sessionId, (eda) => {\n const operation = eda.grantRun(input.command);\n return parent === undefined || parent === null\n ? operation\n : operation.pipe(Effect.withParentSpan(toEdaExternalSpan(parent)));\n });\n }\n\n submit(input: EDASessionSubmitInput): Promise<CommittedDurableEvent> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.submit(input.command).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 submitBatch(input: EDASessionSubmitBatchInput): Promise<ReadonlyArray<CommittedDurableEvent>> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.submit(input.items).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 }),\n ),\n ),\n );\n }\n\n submitAndBlock(input: EDASessionSubmitInput): Promise<CommittedCommandTerminalEvent> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.submitAndBlock(input.command).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 blockOnCommand(input: EDASessionBlockOnCommandInput): Promise<CommittedCommandTerminalEvent> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.blockOnCommand(input.commandId, input.afterSeq ?? SequenceNumber.make(0)).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 snapshot(input: EDASessionScopedInput): Promise<EDASessionSnapshot> {\n return this.query(input, (eda) => eda.snapshot(), \"agent.session.snapshot\");\n }\n\n messages(input: EDASessionScopedInput): Promise<ReadonlyArray<DurableTranscriptMessage>> {\n return this.query(input, (eda) => eda.messages(), \"agent.messages.list\");\n }\n\n acceptEventWebSocket(\n input: EDASessionEventsInput & {\n readonly projectionId?: string;\n readonly webSocket: WebSocket;\n },\n ): Promise<void> {\n return this.acceptEventWebSocketUnhosted(input);\n }\n\n private async acceptEventWebSocketUnhosted(\n input: EDASessionEventsInput & {\n readonly projectionId?: string;\n readonly webSocket: WebSocket;\n },\n ): Promise<void> {\n const prepared = await this.prepareEventWebSocket(input);\n await this.acceptPreparedEventWebSocket({ ...prepared, webSocket: input.webSocket });\n }\n\n async prepareEventWebSocket(\n input: EDASessionEventsInput & { readonly projectionId?: string },\n ): Promise<EDAPreparedEventWebSocket<ProjectionState>> {\n const projection = this.webSockets.resolveProjection(input.projectionId);\n if (input.projectionId !== undefined && projection === undefined) {\n throw new Error(`Unsupported EDA WebSocket projection: ${input.projectionId}`);\n }\n const initialized =\n projection === undefined\n ? undefined\n : projection.initialize({\n ...(input.afterSeq === undefined ? {} : { requestedAfterSeq: input.afterSeq }),\n snapshot: await this.snapshot({ sessionId: input.sessionId, trace: input.trace }),\n });\n return {\n afterSeq: initialized?.afterSeq ?? input.afterSeq ?? SequenceNumber.make(0),\n sessionId: input.sessionId,\n trace: input.trace ?? makeRootEDATraceMetadata(),\n ...(initialized === undefined ? {} : { projectionState: initialized.state }),\n };\n }\n\n acceptPreparedEventWebSocket(\n input: EDAPreparedEventWebSocket<ProjectionState> & { readonly webSocket: WebSocket },\n ): Promise<void> {\n return this.webSockets.accept(input);\n }\n\n webSocketMessage(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n return this.webSockets.message(webSocket, message);\n }\n\n webSocketClose(webSocket: WebSocket): void {\n this.webSockets.closed(webSocket);\n }\n\n webSocketError(webSocket: WebSocket): void {\n this.webSockets.closed(webSocket);\n }\n\n async destroy(_input: EDASessionScopedInput): Promise<void> {\n await this.runtime.destroy();\n }\n\n async alarm(input?: EDASessionScopedInput): Promise<void> {\n if (input !== undefined) await this.prepareSession(input.sessionId);\n await this.runtime.alarm(input?.sessionId);\n }\n\n dispose(): Promise<void> {\n return this.runtime.dispose();\n }\n\n private query<A>(\n input: EDASessionScopedInput,\n operation: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n spanName: string,\n ): Promise<A> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n operation(eda).pipe(\n Effect.withSpan(spanName, hostSpanOptions(trace, { \"eda.session.id\": input.sessionId })),\n ),\n );\n }\n\n private async prepareSession(sessionId: SessionId): Promise<void> {\n await this.runtime.prepare(sessionId);\n await this.webSockets.flushDeferredCatchUp(sessionId);\n }\n\n private async run<A>(\n sessionId: SessionId,\n operation: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n ): Promise<A> {\n await this.prepareSession(sessionId);\n return await this.runtime.run(sessionId, operation);\n }\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\nexport type { EDASessionDurableObjectStorage };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,IAAa,yBAAb,MAAoC;CAWf;CACA;CAXnB;CACA;CACA;CACA,eAAuB;CACvB,uBAA+B;CAC/B,aAAqB;CACrB,eAAsC,QAAQ,QAAQ;CACtD,oBAA4B;CAE5B,YACE,SACA,aAAyE,KAAA,GACzE,UAAyC,CAAC,GAC1C;EAHiB,KAAA,UAAA;EACA,KAAA,aAAA;EAGjB,KAAK,aAAa,QAAQ,cAAA;EAC1B,KAAK,MAAM,QAAQ,cAAc,KAAK,IAAI;EAC1C,KAAK,oBAAoB,QAAQ,4BAA4B,KAAA;CAC/D;;CAGA,IAAI,mBAA2B;EAC7B,OAAO,KAAK;CACd;;CAGA,wBAAwB,SAAiC;EACvD,KAAK,uBAAuB;EAC5B,OAAO,KAAK,WAAW;CACzB;;CAGA,UAAgD;EAC9C,IAAI,KAAK,mBACP,OAAO,QAAQ,uBAAO,IAAI,MAAM,qCAAqC,CAAC;EAExE,KAAK,gBAAgB;EACrB,MAAM,aAAa,KAAK;EACxB,IAAI,WAAW;EAEf,OAAO,KAAK,WAAW,CAAC,CAAC,YAChB,EACL,SAAS,YAAY;GACnB,IAAI,UACF;GAEF,WAAW;GACX,IAAI,eAAe,KAAK,YACtB;GAEF,KAAK,eAAe,KAAK,IAAI,GAAG,KAAK,eAAe,CAAC;GACrD,MAAM,KAAK,WAAW;EACxB,EACF,IACA,OAAO,UAAU;GACf,WAAW;GACX,IAAI,eAAe,KAAK,YACtB,MAAM;GAER,KAAK,eAAe,KAAK,IAAI,GAAG,KAAK,eAAe,CAAC;GACrD,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,KAAK,iBAAiB;GACpD,MAAM;EACR,CACF;CACF;;CAGA,MAAM,eAAkB,IAAkC;EACxD,MAAM,QAAQ,MAAM,KAAK,QAAQ;EACjC,IAAI;GACF,OAAO,MAAM,GAAG;EAClB,UAAU;GACR,MAAM,MAAM,QAAQ;EACtB;CACF;;;;;;;;CASA,MAAM,WAAiB,OAAgE;EACrF,MAAM,QAAQ,MAAM,KAAK,QAAQ;EACjC,MAAM,kBAAkB;GACtB,KAAK,UACH,MAAM,QAAQ,CAAC,CAAC,OAAO,UAAU;IAC/B,KAAK,kBAAkB,KAAK;GAC9B,CAAC,CACH;EACF,CAAC;EAED,IAAI,MAAM,WAAW,MAAM,KAAA,GACzB,MAAM,MAAM,QAAQ;EAGtB,OAAO;CACT;;;;;;;;CASA,MAAM,KAAW,QAAyD;EACxE,MAAM,QAAQ,OAAO,QAAQ,MAAM;EACnC,MAAM,KAAK,WAAW,KAAK;EAC3B,OAAO;CACT;;CAGA,QAAuB;EACrB,OAAO,KAAK,WAAW;CACzB;;CAGA,WAA0B;EACxB,KAAK,oBAAoB;EACzB,KAAK,cAAc;EACnB,KAAK,eAAe;EACpB,KAAK,uBAAuB;EAC5B,OAAO,KAAK,WAAW;CACzB;;CAGA,UAAgB;EACd,KAAK,oBAAoB;CAC3B;CAEA,UAAkB,SAAiC;EACjD,IAAI,KAAK,eAAe,KAAA,GAAW;GACjC,KAAK,WAAW,UAAU,OAAO;GACjC;EACF;CAEF;CAEA,aAAoC;EAClC,KAAK,eAAe,KAAK,aAAa,YAAY,KAAA,CAAS,CAAC,CAAC,WAAW,KAAK,UAAU,CAAC;EACxF,OAAO,KAAK;CACd;CAEA,MAAc,YAA2B;EACvC,IAAI,KAAK,qBAAsB,KAAK,iBAAiB,KAAK,CAAC,KAAK,sBAAuB;GACrF,MAAM,KAAK,QAAQ,YAAY;GAC/B;EACF;EAEA,MAAM,YAAY,KAAK,IAAI,IAAI,KAAK;EACpC,MAAM,YAAY,MAAM,KAAK,QAAQ,SAAS;EAC9C,IAAI,cAAc,QAAQ,YAAY,WACpC,MAAM,KAAK,QAAQ,SAAS,SAAS;CAEzC;AACF;;;;;;;;;ACvLA,IAAa,mCAAb,MAAa,iCAAiC;;CAE5C,OAAgB,WAAW,YACzB,2BAA2B,OAAO;;CAGpC,OAAgB,QACd,YAEA,qCAAqC,OAAO;CAE9C,OAAgB,SAAS,YACvB,MAAM,OAAO,qBAAqB,iCAAiC,KAAK,OAAO,CAAC;AACpF;;AAGA,MAAM,8BACJ,YAEA,OAAO,IAAI;CACT,WAAW;EACT,QAAQ,IAAI,KAAK;;;;;;OAMhB;CACH;CACA,QAAQ,UAAU,oBAAoB,iCAAiC,KAAK;AAC9E,CAAC;;AAGH,MAAM,wCACJ,YAEA,OAAO,IAAI,aAAa;CACtB,OAAO,iCAAiC,QAAQ,OAAO;CACvD,MAAM,EAAE,QAAQ;CAChB,OAAO;EACL,OAAO,aACL,OAAO,IAAI;GACT,WAAW;IAOT,MAAM,MANO,IACV,KACC,6EACA,QACF,CAAC,CACA,QACY,CAAC,CAAC;IACjB,OAAO,QAAQ,KAAA,IACX;KAAE,UAAU,eAAe,KAAK,CAAC;KAAG,SAAS,KAAA;IAAU,IACvD;KACE,UAAU,eAAe,KAAK,IAAI,SAAS;KAC3C,SAAS,KAAK,MAAM,IAAI,YAAY;IACtC;GACN;GACA,QAAQ,UAAU,oBAAoB,2BAA2B,KAAK;EACxE,CAAC;EACH,YAAY,UAAuB,YACjC,OAAO,IAAI;GACT,WAAW;IACT,IAAI,KACF;;;;;iBAMA,UACA,KAAK,UAAU,OAAO,CACxB;GACF;GACA,QAAQ,UAAU,oBAAoB,gCAAgC,KAAK;EAC7E,CAAC;EACH,SAAS,UAAuB,UAA0B,YACxD,OAAO,IAAI;GACT,WAAW;IACT,IAAI,KACF;;;;;;iBAOA,UACA,UACA,KAAK,UAAU,WAAW,EAAE,aAAa,KAAK,IAAI,EAAE,CAAC,CACvD;GACF;GACA,QAAQ,UAAU,oBAAoB,8BAA8B,KAAK;EAC3E,CAAC;CACL;AACF,CAAC;AAEH,MAAM,uBAAuB,WAAmB,UAC9C,IAAI,qBAAqB,EACvB,SACE,iBAAiB,QAAQ,GAAG,UAAU,IAAI,MAAM,YAAY,GAAG,UAAU,IAAI,OAAO,KAAK,IAC7F,CAAC;;;;;ACjEH,MAAa,0CAA0C;AAEvD,MAAM,oBAAoB,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AACrE,MAAM,4BAA4B,OAAO,OAAO;CAC9C,WAAW,OAAO;CAClB,gBAAgB,OAAO,YAAY,OAAO,OAAO;AACnD,CAAC;;AAoDD,MAAM,yCAAyC;AAC/C,MAAM,cAAc,IAAI,YAAY;;;;;;;;;AAUpC,MAAM,iCAAiC;;;;;;;;AASvC,IAAa,4BAAb,MAAa,0BAA0B;;CAErC,OAAgB,WAAW,YACzB,iCAAiC,OAAO;;CAG1C,OAAgB,QAAQ,EACtB,WACA,cAEA,OAAO,IAAI,aAAa;EACtB,OAAO,0BAA0B,QAAQ,OAAO;EAChD,OAAO,8BAA8B,WAAW,OAAO;CACzD,CAAC;;CAGH,OAAgB,SAAS,YACvB,MAAM,OAAO,iBAAiB,0BAA0B,KAAK,OAAO,CAAC;AACzE;;;;;;;AAQA,MAAM,oCAAoC,YACxC,OAAO,IAAI;CACT,WACE,QAAQ,sBAAsB;EAC5B,MAAM,EAAE,QAAQ;EAChB,IAAI,KAAK;;;;;SAKR;EASD,KANE,IACG,KACC,oEACF,CAAC,CACA,IAAI,CAAC,CAAC,WAAW,KAED,wCAAwC;GAC3D,IAAI,KAAK;;;;;;;;;;;WAWR;GACD,IAAI,KAAK;;;WAGR;GAED,IAAI,KAAK;;;;;;;;WAQR;GACD,IAAI,KAAK;;;;;;WAMR;GACD,IAAI,KAAK;;;WAGR;GACD,IAAI,KAAK;;;WAGR;GACD,IAAI,KAAK;;;;;;WAMR;GACD,IAAI,KAAK;;;WAGR;GACD,IAAI,KAAK;;;;;;WAMR;GACD,IAAI,KAAK;;;WAGR;GACD,IAAI,KAAK;;;;;;;;WAQR;GACD,IAAI,KAAK;;;;;;WAMR;GACD,IAAI,KACF,sDACA,sCACF;EACF;CACF,CAAC;CACH,QAAQ,UAAU,kBAAkB,uCAAuC,KAAK;AAClF,CAAC;;;;;;;AAQH,MAAM,iCACJ,WACA,YACyB;CACzB,MAAM,EAAE,QAAQ;CAChB,MAAM,iBAAiB,UAAgC;EACrD,IAAI,MAAM,cAAc,WACtB,MAAM,IAAI,MACR,kDAAkD,UAAU,aAAa,MAAM,WACjF;CAEJ;;;;;;;;CASA,MAAM,gBAAgB,UAAqD;EACzE,MAAM,EAAE,UAAU;EAClB,cAAc,KAAK;EACnB,MAAM,WAAW,+BAA+B,KAAK,WAAW,MAAM,OAAO;EAC7E,IAAI,aAAa,KAAA,GACf,OAAO;EAGT,MAAM,UAAU,kBAAkB,KAAK;EACvC,IAAI,KACF;;;;;;;;;;SAWA,QAAQ,SACR,QAAQ,WACR,QAAQ,MACR,QAAQ,eACR,QAAQ,aACR,QAAQ,WACR,QAAQ,QACV;EACA,MAAM,MAAM,yBAAyB,KAAK,MAAM,OAAO;EACvD,4BAA4B,KAAK,OAAO,eAAe,KAAK,IAAI,GAAG,GAAG,QAAQ,QAAQ;EACtF,OAAO,2BAA2B,KAAK,KAAK,SAAS;CACvD;;CAGA,MAAM,UAAU,UACd,OAAO,IAAI;EACT,WAAW,QAAQ,sBAAsB,MAAM,QAAQ,IAAI,YAAY,CAAC;EACxE,QAAQ,UAAU,kBAAkB,6CAA6C,KAAK;CACxF,CAAC,CAAC,CAAC,KAAK,OAAO,KAAK,cAAc,gBAAgB,yBAAyB,SAAS,CAAC,CAAC,CAAC;CAEzF,OAAO;EACL;EACA,cAAc,aAAa,yBAAyB,KAAK,WAAW,QAAQ;EAC5E,2BAA2B,SACzB,OAAO,IAAI;GACT,WACE,sBAAsB,IAAI,CAAC,CACxB,MAAM,MAAM,UAAU,OAAO,KAAK,CAAC,CACnC,KAAK,QAAQ,mBAAmB,KAAK,WAAW,GAAG,CAAC;GACzD,QAAQ,UACN,kBAAkB,mDAAmD,KAAK;EAC9E,CAAC;EACH,uBAAuB,UACrB,OAAO,IAAI;GACT,WAAW;IACT,MAAM,MAAM,wBAAwB,KAAK,MAAM,WAAW,MAAM,cAAc;IAC9E,OAAO,QAAQ,KAAA,IACX,KAAA,IACA,mBAAmB,KAAK,WAAW,IAAI,YAAY;GACzD;GACA,QAAQ,UAAU,kBAAkB,6BAA6B,KAAK;EACxE,CAAC;EACH,sBAAsB,cACpB,OAAO,IAAI;GACT,WAAW,2BAA2B,KAAK,SAAS;GACpD,QAAQ,UAAU,kBAAkB,6CAA6C,KAAK;EACxF,CAAC;EACH,wBAAwB,SACtB,OAAO,IAAI;GACT,WAAW,sBAAsB,KAAK,IAAI;GAC1C,QAAQ,UACN,kBAAkB,wDAAwD,QAAQ,KAAK;EAC3F,CAAC;EACH,wBAAwB,eACtB,OAAO,IAAI;GACT,WAAW,uBAAuB,KAAK,UAAU;GACjD,QAAQ,UACN,kBACE,uDAAuD,WAAW,QAClE,KACF;EACJ,CAAC;EACH,yBAAyB,gBACvB,OAAO,IAAI;GACT,WACE,QAAQ,sBACN,YAAY,SAAS,eAAe,uBAAuB,KAAK,UAAU,CAAC,CAC7E;GACF,QAAQ,UACN,kBAAkB,wDAAwD,KAAK;EACnF,CAAC;CACL;AACF;AAEA,MAAM,4BACJ,KACA,WACA,aAEA,OAAO,SACL,OAAO,WAAW;CAChB,IAAI,SAAuC;EAAE;EAAU,YAAY,KAAA;CAAU;CAC7E,IAAI,OAAO;CACX,OAAO,OAAO,IAAI,aAAa;EAC7B,IAAI,MACF,OAAO,OAAO,MAAM,KAAK;EAI3B,OAAO,OAAO;EACd,MAAM,OAAO,OAAO,uBAAuB,KAAK,WAAW,MAAM;EACjE,IAAI,KAAK,OAAO,WAAW,GAAG;GAC5B,OAAO;GACP,OAAO,OAAO,MAAM,KAAK;EAC3B;EACA,IAAI,OAAO,OAAO,KAAK,IAAI,GACzB,SAAS,KAAK,KAAK;OAEnB,OAAO;EAET,OAAO,KAAK;CACd,CAAC;AACH,CAAC,CACH;AAEF,MAAM,0BACJ,KACA,WACA,WAQA,OAAO,IAAI;CACT,WAAW;EACT,MAAM,aAAa,OAAO,cAAc,iBAAiB,GAAG;EAC5D,IAAI,OAAO,YAAY,YACrB,OAAO;GAAE,QAAQ,CAAC;GAAG,MAAM,OAAO,KAAK;EAAE;EAG3C,MAAM,SAAS,IACZ,KACC;;;;;;aAOA,OAAO,UACP,YACA,8BACF,CAAC,CACA,QAAQ,CAAC,CACT,KAAK,QAAQ,2BAA2B,KAAK,KAAK,SAAS,CAAC;EAC/D,MAAM,UAAU,OAAO,GAAG,EAAE,CAAC,EAAE,SAAS,OAAO,OAAO;EACtD,OAAO;GACL;GACA,MACE,UAAU,aACN,OAAO,KAAK;IAAE,UAAU;IAAS;GAAW,CAAwC,IACpF,OAAO,KAAK;EACpB;CACF;CACA,QAAQ,UAAU,kBAAkB,8CAA8C,KAAK;AACzF,CAAC;AAEH,MAAM,oBAAoB,QACxB,eAAe,KACb,IACG,KACC;;;SAIF,CAAC,CACA,IAAI,CAAC,CAAC,QAAQ,CACnB;AAEF,MAAM,yBAAyB,SAC7B,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,QAAQ,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,eAAe,KAAK,GAAG,CAAC;AAE3F,MAAM,4BACJ,KACA,YAEA,IACG,KACC;;;;SAKA,OACF,CAAC,CACA,IAAI;AAET,MAAM,kCACJ,KACA,WACA,YACsC;CACtC,MAAM,MAAM,IACT,KACC;;;;SAKA,OACF,CAAC,CACA,QAAQ,CAAC,CAAC;CACb,OAAO,QAAQ,KAAA,IAAY,KAAA,IAAY,2BAA2B,KAAK,KAAK,SAAS;AACvF;AAEA,MAAM,yBACJ,KACA,SACqC;CACrC,MAAM,MAAM,IACT,KACC;;;;SAKA,IACF,CAAC,CACA,QAAQ,CAAC,CAAC;CACb,OAAO,QAAQ,KAAA,IACX,KAAA,IACA;EACE,MAAM,IAAI;EACV,eAAe,IAAI;EACnB,YAAY,eAAe,KAAK,IAAI,WAAW;EAC/C,SAAS,KAAK,MAAM,IAAI,YAAY;EACpC,aAAa,IAAI;CACnB;AACN;AAEA,MAAM,0BACJ,KACA,eACS;CACT,IAAI,KACF;;;;;;;;;;;;;OAcA,WAAW,MACX,WAAW,eACX,WAAW,YACX,uBAAuB,WAAW,SAAS,uCAAuC,GAClF,WAAW,WACb;AACF;AAEA,MAAM,kCACJ,KACA,eACmC;CACnC,MAAM,UAAU,IACb,KACC;;;;SAKA,UACF,CAAC,CACA,QAAQ,CAAC,CAAC;CACb,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,0BAA0B,WAAW,oCAAoC;CAE3F,OAAO;AACT;AAEA,MAAM,sBACJ,KACA,WACA,QAC0B;CAC1B,MAAM,MAAM,IACT,KACC;;;;SAKA,GACF,CAAC,CACA,IAAI;CACP,OAAO,2BAA2B,KAAK,KAAK,SAAS;AACvD;AAEA,MAAM,8BACJ,KACA,KACA,eAC2B;CAC3B,UAAU,gBAAgB,eAAe,KAAK,IAAI,GAAG,CAAC;CACtD,OAAO,uBAAuB;EAC5B,WAAW,IAAI;EACf,MAAM,IAAI;EACV,eAAe,IAAI;EACnB,YAAY;EACZ,SAAS,IAAI;EACb;EACA,aAAa,IAAI;EACjB,OAAO,KAAK,MAAM,IAAI,UAAU;EAChC,SAAS,mBAAmB,KAAK,GAAG;CACtC,CAAC;AACH;AAYA,MAAM,qBAAqB,UAAoD;CAC7E,MAAM,UAAU,OAAO,WAAW,oBAAoB,CAAC,CAAC,KAAK;CAC7D,OAAO;EACL,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,MAAM,QAAQ;EACd,eAAe,QAAQ;EACvB,aAAa,QAAQ;EACrB,WAAW,uBAAuB,QAAQ,OAAO,2BAA2B;EAC5E,UAAU,uBACR,oBAAoB,QAAQ,WAAW,QAAQ,MAAM,QAAQ,OAAO,GACpE,0BACF;CACF;AACF;AAEA,MAAM,sBAAsB,KAA8B,QAAwC;CAChG,IAAI,IAAI,cAAc,6BACpB,OAAO,KAAK,MAAM,IAAI,SAAS;CAEjC,IAAI,IAAI,SAAS,0BAA0B;EACzC,MAAM,YAAY,sBAAsB,GAAG;EAE3C,OAAO,EAAE,SADO,wBAAwB,KAAK,SAC9B,EAAE;CACnB;CACA,IAAI,yBAAyB,IAAI,IAAI,IAAI,GACvC,OAAO,KAAK,MAAM,+BAA+B,KAAK,IAAI,GAAG,CAAC,CAAC,YAAY;CAE7E,IAAI,IAAI,SAAS,yBACf,OAAO;EACL,GAAI,KAAK,MAAM,IAAI,SAAS;EAC5B,SAAS,iCAAiC,KAAK,IAAI,GAAG;CACxD;CAEF,OAAO,KAAK,MAAM,IAAI,SAAS;AACjC;AAEA,MAAM,uBAAuB,WAAmB,MAAc,YAA8B;CAC1F,IACE,cAAc,+BACd,OAAO,YAAY,YACnB,YAAY,MAEZ,OAAO;CAGT,MAAM,SAAS,OAAO,kBAAkB,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO;CAC7F,QAAQ,MAAR;EACE,KAAK,0BACH,OAAO,EAAE,SAAS,YAAY,OAAO,OAAO,EAAE;EAChD,KAAK,iCACH,OAAO,KAAK,QAAQ,CAAC,WAAW,CAAC;EACnC,KAAK,+BACH,OAAO,KAAK,QAAQ,CAAC,aAAa,WAAW,CAAC;EAChD,KAAK,gCACH,OAAO,KAAK,QAAQ;GAAC;GAAa;GAAa;EAAO,CAAC;EACzD,KAAK;EACL,KAAK,mCACH,OAAO,KAAK,QAAQ;GAAC;GAAa;GAAS;GAAU;EAAa,CAAC;EACrE,KAAK,oCACH,OAAO,KAAK,QAAQ;GAAC;GAAa;GAAS;GAAU;GAAe;EAAQ,CAAC;EAC/E,KAAK,yBACH,OAAO,KAAK,QAAQ;GAAC;GAAgB;GAAa;GAAiB;EAAa,CAAC;EACnF,SACE,OAAO;CACX;AACF;AAEA,MAAM,eAAe,YAA8B;CACjD,IAAI,OAAO,YAAY,YAAY,YAAY,MAC7C,OAAO;CAET,MAAM,SAAS;CACf,OAAO,OAAO,SAAS,kBACnB,KAAK,QAAQ;EAAC;EAAQ;EAAa;EAAe;CAAgB,CAAC,IACnE;AACN;AAEA,MAAM,QACJ,QACA,SAC4B;CAC5B,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,OAAO,MAChB,IAAI,OAAO,SAAS,KAAA,GAClB,IAAI,OAAO,OAAO;CAGtB,OAAO;AACT;AAEA,MAAM,yBAAyB,QAAuC;CACpE,MAAM,EACJ,SAAS,EAAE,gBACT,OAAO,kBACT,OAAO,OAAO,EACZ,SAAS,OAAO,OAAO,EAAE,WAAW,OAAO,OAAO,CAAC,EACrD,CAAC,CACH,CAAC,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC;CAC3B,IAAI,OAAO,cAAc,UACvB,MAAM,IAAI,MAAM,+BAA+B,IAAI,IAAI,2BAA2B;CAEpF,OAAO;AACT;AAEA,MAAM,2BAA2B,KAA8B,cAA+B;CAC5F,MAAM,MAAM,IACT,KACC;;;;SAKA,SACF,CAAC,CACA,QAAQ,CAAC,CAAC;CACb,IAAI,QAAQ,KAAA,GACV,MAAM,IAAI,MAAM,iBAAiB,UAAU,kCAAkC;CAE/E,OAAO,KAAK,MAAM,IAAI,YAAY;AACpC;AAEA,MAAM,8BACJ,KACA,cAC0C;CAC1C,MAAM,MAAM,IACT,KACC;;;;SAKA,SACF,CAAC,CACA,QAAQ,CAAC,CAAC;CACb,OAAO,QAAQ,KAAA,IACX,KAAA,IACA,OAAO,kBAAkB,yBAAyB,CAAC,CAAC,KAAK,MAAM,IAAI,YAAY,CAAC;AACtF;AAEA,MAAM,oCACJ,KACA,eACY;CACZ,MAAM,MAAM,IACT,KACC;;;;SAKA,UACF,CAAC,CACA,QAAQ,CAAC,CAAC;CACb,IAAI,QAAQ,KAAA,GACV,MAAM,IAAI,MAAM,yBAAyB,WAAW,qCAAqC;CAE3F,OAAO,KAAK,MAAM,IAAI,YAAY;AACpC;;;;;;;;AASA,MAAM,+BACJ,KACA,OACA,KACA,aACS;CACT,MAAM,EAAE,UAAU;CAClB,IAAI,MAAM,cAAc,6BACtB;CAGF,uBAAuB,KAAK,OAAO,KAAK,QAAQ;CAChD,4BAA4B,KAAK,OAAO,GAAG;CAC3C,uBAAuB,KAAK,OAAO,GAAG;CACtC,uBAAuB,KAAK,OAAO,GAAG;CACtC,6BAA6B,KAAK,OAAO,GAAG;AAC9C;AAEA,MAAM,0BACJ,KACA,OACA,KACA,aACS;CACT,MAAM,UAAU,OAAO,kBAAkB,iBAAiB,CAAC,CAAC,MAAM,OAAO;CACzE,QAAQ,MAAM,MAAd;EACE,KAAK,0BAA0B;GAC7B,MAAM,UAAU,OAAO,kBAAkB,yBAAyB,CAAC,CAAC,QAAQ,OAAO;GACnF,MAAM,YAAY,QAAQ;GAC1B,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MAAM,2CAA2C;GAE7D,IAAI,KACF;;;;;;;;;;;;;WAcA,WACA,KACA,YACA,QAAQ,kBAAkB,MAC1B,QACF;GACA;EACF;EACA,KAAK;GACH,mBAAmB,KAAK,QAAQ,WAAW,KAAK,WAAW,QAAQ;GACnE;EACF,KAAK;GACH,mBAAmB,KAAK,QAAQ,WAAW,KAAK,aAAa,QAAQ;GACrE;EACF,KAAK;GACH,mBAAmB,KAAK,QAAQ,WAAW,KAAK,UAAU,QAAQ;GAClE;EACF,KAAK;GACH,mBAAmB,KAAK,QAAQ,WAAW,KAAK,aAAa,QAAQ;GACrE;EACF,SACE;CACJ;AACF;AAEA,MAAM,sBACJ,KACA,WACA,KACA,QACA,gBACS;CACT,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MAAM,GAAG,OAAO,iCAAiC;CAE7D,IAAI,KACF;;;;;;;;;;;OAYA,WACA,KACA,QACA,WACF;AACF;AAEA,MAAM,+BACJ,KACA,OACA,QACS;CACT,IAAI,MAAM,SAAS,0BACjB;CAEF,MAAM,UAAU,OAAO,WAAW,oBAAoB,CAAC,CAAC,KAAK;CAC7D,MAAM,EAAE,YAAY,OAAO,kBACzB,OAAO,OAAO,EAAE,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,EAAE,CAAC,CACzE,CAAC,CAAC,QAAQ,OAAO;CACjB,MAAM,YAAY,SAAS;CAC3B,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MAAM,2CAA2C;CAE7D,IAAI,KACF;;;;;;;;;OAUA,WACA,KACA,uBAAuB,SAAS,kCAAkC,CACpE;AACF;AAEA,MAAM,2CAA2B,IAAI,IAAY;CAC/C;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,MAAM,0BACJ,KACA,OACA,QACS;CACT,IAAI,CAAC,yBAAyB,IAAI,MAAM,IAAI,GAC1C;CAGF,MAAM,UAAU,OAAO,WAAW,oBAAoB,CAAC,CAAC,KAAK;CAC7D,MAAM,EAAE,cAAc,OAAO,kBAAkB,OAAO,OAAO,EAAE,WAAW,OAAO,QAAQ,CAAC,CAAC,CAAC,CAC1F,QAAQ,OACV;CACA,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MAAM,GAAG,MAAM,KAAK,mBAAmB;CAGnD,IAAI,KACF;;;;;;;;;OAUA,WACA,KACA,uBAAuB,QAAQ,SAAS,oCAAoC,CAC9E;AACF;;;;;;;AAQA,MAAM,0BACJ,KACA,OACA,QACS;CACT,IAAI,MAAM,SAAS,yBACjB;CAGF,MAAM,UAAU,OAAO,kBAAkB,qBAAqB,CAAC,CAAC,MAAM,OAAO;CAC7E,MAAM,YAAY,QAAQ;CAC1B,IAAI,cAAc,KAAA,GAChB,MAAM,IAAI,MAAM,kCAAkC;CAEpD,IAAI,QAAQ,YAAY,KAAA,GACtB,MAAM,IAAI,MAAM,yCAAyC;CAG3D,MAAM,UAAU,OAAO,kBAAkB,yBAAyB,CAAC,CAAC,QAAQ,OAAO;CACnF,IAAI,QAAQ,cAAc,WACxB,MAAM,IAAI,MAAM,yDAAyD;CAE3E,IAAI,QAAQ,iBAAiB,QAAQ,cACnC,MAAM,IAAI,MAAM,4DAA4D;CAG9E,IAAI,KACF;;;;;;;;;OAUA,WACA,KACA,uBAAuB,SAAS,qCAAqC,CACvE;AACF;;AAGA,MAAM,gCACJ,KACA,OACA,SACS;CACT,IAAI,MAAM,SAAS,yBACjB;CAGF,MAAM,UAAU,OAAO,kBAAkB,qBAAqB,CAAC,CAAC,MAAM,OAAO;CAC7E,IAAI,QAAQ,cAAc,KAAA,GACxB,MAAM,IAAI,MAAM,kCAAkC;CAEpD,MAAM,UAAU,2BAA2B,KAAK,UAAU,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC;CACzF,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,+CAA+C,OAAO,QAAQ,SAAS,GAAG;CAE5F,IAAI,QAAQ,iBAAiB,QAAQ,cACnC,MAAM,IAAI,MAAM,kEAAkE;CAEpF,IAAI,QAAQ,2BAA2B,QAAQ,wBAC7C,MAAM,IAAI,MAAM,+DAA+D;AAEnF;;;;;;;AAQA,MAAM,2BACJ,KACA,WACA,mBAC8C;CAC9C,IAAI,mBAAmB,KAAA,GAAW;EAChC,MAAM,MAAM,IACT,KACC;;;;WAKA,cACF,CAAC,CACA,QAAQ,CAAC,CAAC;EACb,IAAI,QAAQ,KAAA,GACV,OAAO;CAEX;CAEA,IAAI,cAAc,KAAA,GAChB;CAEF,OAAO,IACJ,KACC;;;;SAKA,SACF,CAAC,CACA,QAAQ,CAAC,CAAC;AACf;;AAGA,MAAM,0BAA0B,OAAgB,WAA2B;CACzE,MAAM,OAAO,KAAK,UAAU,KAAK;CACjC,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,GAAG,OAAO,gCAAgC;CAE5D,MAAM,QAAQ,YAAY,OAAO,IAAI,CAAC,CAAC;CACvC,IAAI,QAAA,MACF,MAAM,IAAI,MACR,GAAG,OAAO,sBAAsB,MAAM,sBAAsB,wCAAwC,OACtG;CAEF,OAAO;AACT;AAEA,MAAM,qBAAqB,WAAmB,UAC5C,IAAI,qBAAqB,EACvB,SACE,iBAAiB,QAAQ,GAAG,UAAU,IAAI,MAAM,YAAY,GAAG,UAAU,IAAI,OAAO,KAAK,IAC7F,CAAC;;;;AC1hCH,MAAa,oCAAoC,EAC/C,WACA,QACA,kBACA,yBACA,uBACA,WACA,oBACA,sBACA,UACA,mBACA,2BACA,WACA,OACA,SACA,SACA,cACA,aACgG;CAChG,MAAM,YAAY,aAAa,IAAI,uBAAuB,OAAO;CACjE,MAAM,iBAAiB,aAAa,kBAAkB,UAAU,QAAQ,CAAC;CACzE,OAAO,oBAAoB;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,0BAA0B,MAAM,QAAQ,qBAAqB,EAC3D,aAAa,YACX,OAAO,WAAW;GAChB,WAAW,UAAU,wBAAwB,OAAO;GACpD,QAAQ,UACN,IAAI,qBAAqB,EACvB,SAAS,qCAAqC,OAAO,KAAK,IAC5D,CAAC;EACL,CAAC,EACL,CAAC;EACD,sBAAsB,mBAAmB,KAAK,YAAY,CAAC,CAAC;EAC5D;EACA;EACA,mBAAmB,0BAA0B,MAAM;GAAE;GAAW;EAAQ,CAAC;EACzE,0BAA0B,iCAAiC,MAAM,OAAO;EACxE;EACA;EACA;EACA;CACF,CAAC;AACH;;;;ACxCA,IAAa,oBAAb,MAA+B;CAKA;CAJ7B;CACA;CACA;CAEA,YAAY,SAAoD;EAAnC,KAAA,UAAA;EAC3B,KAAK,YACH,QAAQ,aAAa,IAAI,uBAAuB,QAAQ,SAAS,QAAQ,UAAU;CACvF;CAEA,OAAgB,WACd,YAKA,OAAO,IAAI,aAAa;EACtB,OAAO,0BAA0B,QAAQ,OAAO;EAChD,OAAO,iCAAiC,QAAQ,OAAO;CACzD,CAAC;CAEH,QAAQ,WAA+B;EACrC,OAAO,KAAK,OAAO,cAAc;CACnC;CAEA,MAAM,QAAQ,WAAqC;EACjD,MAAM,KAAK,IAAI,SAAS;CAC1B;CAEA,MAAM,IACJ,WACA,WACY;EAEZ,OAAO,OAAM,MADO,KAAK,IAAI,SAAS,EAAA,CACnB,QAAQ,WACzB,OAAO,IAAI,aAAa;GACtB,OAAO,OAAO,UAAU,OAAO,UAAU;EAC3C,CAAC,CACH;CACF;CAEA,MAAM,MAAM,WAAsC;EAChD,MAAM,WAAW,aAAa,KAAK,OAAO;EAC1C,IAAI,aAAa,KAAA,GACf,MAAM,KAAK,IAAI,WAAW,YAAY,QAAQ,2BAA2B,CAAC;EAE5E,MAAM,KAAK,UAAU,MAAM;CAC7B;CAEA,MAAM,UAAyB;EAC7B,MAAM,KAAK,UAAU,SAAS;EAC9B,MAAM,KAAK,QAAQ;EACnB,KAAK,QAAQ,KAAA;EACb,KAAK,WAAW,KAAA;CAClB;CAEA,MAAM,UAAyB;EAC7B,MAAM,KAAK,OAAO,QAAQ,QAAQ;CACpC;CAEA,MAAc,IAAI,WAA6C;EAC7D,IAAI,KAAK,UAAU,KAAA,GAAW;GAC5B,IAAI,KAAK,MAAM,cAAc,WAC3B,MAAM,IAAI,MACR,4CAA4C,KAAK,MAAM,UAAU,aAAa,WAChF;GAEF,OAAO,KAAK;EACd;EAEA,KAAK,UAAU,QAAQ;EACvB,MAAM,WAAW,KAAK,YAAY,KAAK,MAAM,SAAS;EACtD,KAAK,WAAW;EAChB,IAAI;GACF,OAAO,MAAM;EACf,SAAS,OAAO;GACd,IAAI,KAAK,aAAa,UAAU,KAAK,WAAW,KAAA;GAChD,MAAM;EACR;CACF;CAEA,MAAc,MAAM,WAA6C;EAC/D,MAAM,UAAU,eAAe,KAC7B,iCAAiC;GAC/B,WAAW,KAAK,QAAQ;GACxB,QAAQ,KAAK,QAAQ;GACrB,kBAAkB,KAAK,QAAQ;GAC/B,yBAAyB,KAAK,QAAQ;GACtC,uBAAuB,KAAK,QAAQ;GACpC,WAAW,KAAK;GAChB,oBAAoB,KAAK,QAAQ;GACjC,sBAAsB,KAAK,QAAQ;GACnC,UAAU,KAAK,QAAQ;GACvB,mBAAmB,KAAK,QAAQ;GAChC,2BAA2B,KAAK,QAAQ;GACxC;GACA,OAAO,KAAK,QAAQ;GACpB,SAAS,KAAK,QAAQ;GACtB,SAAS,eAAe,KAAK,QAAQ,SAAS,SAAS;GACvD,cAAc,eAAe,KAAK,QAAQ,cAAc,SAAS;GACjE,QAAQ,eAAe,KAAK,QAAQ,QAAQ,SAAS;EACvD,CAAC,CACH;EACA,MAAM,QAAQ;GAAE;GAAS;EAAU;EACnC,IAAI;GACF,MAAM,QAAQ,QAAQ;GACtB,KAAK,QAAQ;GACb,OAAO;EACT,SAAS,OAAO;GACd,MAAM,QAAQ,QAAQ,CAAC,CAAC,YAAY,KAAA,CAAS;GAC7C,MAAM;EACR;CACF;AACF;AAEA,MAAM,kBACJ,OACA,cAEA,OAAO,UAAU,aACZ,MAA0D,EAAE,UAAU,CAAC,IACxE;;;;ACvLN,MAAa,2BAA2B,OAAO,eAAe,KAC5D,OAAO,MAAM,0BAA0B,CACzC;;;;ACHA,MAAa,yBAAyB,OAAO,OAAO;CAClD,MAAM,OAAO,QAAQ,eAAe;CACpC,WAAW;CACX,cAAc;CACd,OAAO;CACP,UAAU;CACV,YAAY,OAAO,YACjB,OAAO,OAAO;EACZ,IAAI;EACJ,OAAO,OAAO;CAChB,CAAC,CACH;AACF,CAAC;;AASD,MAAa,4BAA4B,OACvC,UACwC;CACxC,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO,EAAE,MAAM,UAAU;CACpE,IAAI;EACF,OAAO;GACL,MAAM;GACN,YAAY,MAAM,OAAO,WACvB,OAAO,oBAAoB,sBAAsB,CAAC,CAAC,KAAK,CAC1D;EACF;CACF,QAAQ;EACN,OAAO,EAAE,MAAM,YAAY;CAC7B;AACF;;AAGA,MAAa,6BAA6B,eACxC,OAAO,WAAW,sBAAsB,CAAC,CAAC,UAAU;;;;;;;ACmBtD,IAAa,gCAAb,MAAmF;CAWpD;CAV7B,gBAAyB,qBAAqB,aAAa,UACzD,OAAO,iBAAiB,KAAK,qBAAqB,KAAK,CAAC,CAAC,CAAC,KACxD,OAAO,YAAY,UACjB,OAAO,SAAS,8DAA8D,EAAE,MAAM,CAAC,CACzF,CACF,CACF;CAEA,0BAA2B,IAAI,IAAqD;CAEpF,YAAY,SAAiF;EAAhE,KAAA,UAAA;CAAiE;CAE9F,kBAAkB,IAA6E;EAC7F,IAAI,OAAO,KAAA,GAAW,OAAO,KAAA;EAC7B,IAAI,KAAK,QAAQ,qBAAqB,OAAO,IAAI,OAAO,KAAK,QAAQ;CAEvE;CAEA,MAAM,OAAO,OAMK;EAChB,MAAM,eAAe,aAAa,KAAK,OAAO,WAAW,CAAC;EAC1D,MAAM,WAAW,2BAA2B;GAC1C;GACA,WAAW,MAAM;GACjB,QAAQ;EACV,CAAC;EACD,MAAM,QAA8C;GAClD,WAAW,MAAM;GACjB;GACA,OAAO,MAAM;GACb;GACA,iBAAiB;GACjB,MAAM,MAAM;GACZ,OAAO,QAAQ,QAAQ;GACvB,GAAI,MAAM,oBAAoB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,MAAM,gBAAgB;EAC1F;EACA,KAAK,QAAQ,IAAI,MAAM,WAAW,KAAK;EAIvC,IAAI,CAAC,KAAK,QAAQ,MAAM,WAAW,KAAK,GAAG;EAC3C,IAAI,CAAE,MAAM,KAAK,KAAK,MAAM,WAAW,OAAO,CAAC,mBAAmB,QAAQ,CAAC,CAAC,GAAI;EAChF,IAAI,CAAE,MAAM,KAAK,QAAQ,MAAM,WAAW,KAAK,GAAI;EACnD,MAAM,KAAK,QAAQ,MAAM,WAAW,OAAO,YAAY;GACrD,MAAM,KAAK,eAAe,MAAM,WAAW,OAAO,MAAM,QAAQ;EAClE,CAAC;CACH;CAEA,MAAM,QAAQ,WAAsB,SAA8C;EAChF,IAAI,OAAO,YAAY,UAAU;GAC/B,KAAK,MAAM,WAAW,6BAA6B,QAAQ;GAC3D;EACF;EACA,IAAI,YAAY,6BAA6B;GAI3C,IAAI;IACF,UAAU,KAAK,2BAA2B;GAC5C,QAAQ;IACN,KAAK,MAAM,WAAW,0BAA0B,aAAa;GAC/D;GACA;EACF;EAEA,MAAM,QAAQ,MAAM,KAAK,QAAQ,SAAS;EAC1C,IAAI,UAAU,KAAA,GAAW;GACvB,KAAK,MAAM,WAAW,6BAA6B,UAAU;GAC7D;EACF;EACA,MAAM,QAAQ,MAAM,OAAO,WACzB,KAAK,oBAAoB,SAAS,KAAK,CAAC,CAAC,KAAK,OAAO,MAAM,CAC7D;EACA,IAAI,MAAM,SAAS,QAAQ;GACzB,KAAK,MAAM,WAAW,6BAA6B,UAAU;GAC7D;EACF;EACA,MAAM,cAAc,MAAM;EAC1B,IAAI,YAAY,SAAS,QAAQ;EAEjC,IAAI,CAAE,MAAM,KAAK,QAAQ,WAAW,KAAK,GAAI;EAC7C,MAAM,KAAK,QAAQ,WAAW,OAAO,YAAY;GAC/C,MAAM,KAAK,UAAU,WAAW,OAAO,YAAY,MAAM,UAAU,aAAa,KAAK,IAAI,CAAC,CAAC;EAC7F,CAAC;CACH;CAEA,OAAO,WAA4B;EACjC,KAAK,QAAQ,OAAO,SAAS;CAC/B;CAEA,MAAM,qBAAqB,WAAqC;EAC9D,MAAM,aAA8B,CAAC;EACrC,KAAK,MAAM,CAAC,WAAW,UAAU,KAAK,SAAS;GAC7C,IAAI,MAAM,cAAc,aAAa,CAAC,MAAM,iBAAiB;GAC7D,WAAW,KACT,KAAK,QAAQ,WAAW,OAAO,YAAY;IACzC,IAAI,CAAC,MAAM,iBAAiB;IAC5B,MAAM,kBAAkB;IACxB,MAAM,KAAK,eAAe,WAAW,OAAO,MAAM,SAAS,qBAAqB;GAClF,CAAC,CACH;EACF;EACA,MAAM,QAAQ,IAAI,UAAU;CAC9B;CAEA,MAAc,qBAAqB,OAAuC;EACxE,MAAM,6BAAa,IAAI,IAAI,CAAC,GAAI,KAAK,QAAQ,gBAAgB,KAAK,CAAC,GAAI,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;EAC9F,MAAM,aAA8B,CAAC;EACrC,KAAK,MAAM,aAAa,YAAY;GAClC,MAAM,QAAQ,MAAM,KAAK,QAAQ,SAAS;GAC1C,IAAI,UAAU,KAAA,GAAW;GACzB,WAAW,KACT,KAAK,QAAQ,WAAW,OAAO,YAAY;IACzC,IAAI,MAAM,MAAM,eAAe,WAAW;KACxC,MAAM,KAAK,UACT,WACA,OACA,iBAAiB,MAAM,UAAU,OAAO,KAAK,IAAI,CAAC,CACpD;KACA;IACF;IACA,MAAM,OAAO,eAAe,KAAK,KAAK,IAAI,MAAM,MAAM,MAAM,SAAS,GAAG,CAAC;IACzE,IAAI,MAAM,SAAS,OAAO,MAAM,SAAS,uBAAuB;IAChE,IAAI,MAAM,SAAS,QAAQ,MAAM,SAAS,wBAAwB,GAAG;KACnE,MAAM,KAAK,UACT,WACA,OACA,gBAAgB,MAAM,UAAU,CAAC,KAAK,GAAG,MAAM,MAAM,KAAK,IAAI,CAAC,CACjE;KACA;IACF;IACA,IAAI,CAAC,KAAK,QAAQ,eAAe,MAAM,SAAS,GAAG;KACjD,MAAM,kBAAkB;KACxB;IACF;IACA,MAAM,KAAK,eAAe,WAAW,OAAO,MAAM,SAAS,qBAAqB;GAClF,CAAC,CACH;EACF;EACA,MAAM,QAAQ,IAAI,UAAU;CAC9B;CAEA,MAAc,QACZ,WAC2D;EAC3D,MAAM,WAAW,KAAK,QAAQ,IAAI,SAAS;EAC3C,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,MAAM,UAAU,MAAM,0BAA0B,UAAU,sBAAsB,CAAC;EACjF,IAAI,QAAQ,SAAS,WAAW;GAC9B,KAAK,MAAM,WAAW,6BAA6B,UAAU;GAC7D;EACF;EACA,MAAM,aAAa,QAAQ;EAC3B,MAAM,kBACJ,WAAW,eAAe,KAAA,IACtB,KAAA,IACA,MAAM,KAAK,sBAAsB,WAAW,WAAW,IAAI,WAAW,WAAW,KAAK;EAC5F,IAAI,WAAW,eAAe,KAAA,KAAa,oBAAoB,KAAA,GAAW;GACxE,KAAK,MAAM,WAAW,6BAA6B,UAAU;GAC7D;EACF;EACA,MAAM,QAA8C;GAClD,WAAW,WAAW;GACtB,cAAc,WAAW;GACzB,OAAO,WAAW;GAClB,UAAU,8BAA8B;IACtC,cAAc,WAAW;IACzB,QAAQ;IACR,YAAY,WAAW;GACzB,CAAC;GACD,iBAAiB;GACjB,MAAM,WAAW,SAAS;GAC1B,OAAO,QAAQ,QAAQ;GACvB,GAAI,oBAAoB,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB;EAC7D;EACA,KAAK,QAAQ,IAAI,WAAW,KAAK;EACjC,OAAO;CACT;CAEA,MAAc,QACZ,WACA,OACkB;EAClB,IAAI;GACF,MAAM,KAAK,QAAQ,eAAe,MAAM,SAAS;GACjD,OAAO,KAAK,QAAQ,IAAI,SAAS,MAAM;EACzC,SAAS,OAAO;GACd,MAAM,OAAO,WACX,OAAO,SAAS,4CAA4C;IAC1D;IACA,cAAc,MAAM;GACtB,CAAC,CACH;GACA,KAAK,MAAM,WAAW,0BAA0B,mBAAmB;GACnE,OAAO;EACT;CACF;CAEA,MAAc,UACZ,WACA,OACA,QACkB;EAClB,MAAM,WAAW,OAAO;EACxB,KAAK,MAAM,UAAU,OAAO,SAC1B,QAAQ,OAAO,MAAf;GACE,KAAK;IACH,IAAI,CAAC,KAAK,QAAQ,WAAW,KAAK,GAAG,OAAO;IAC5C;GACF,KAAK;IACH,IAAI,CAAE,MAAM,KAAK,KAAK,WAAW,OAAO,OAAO,MAAM,GAAI,OAAO;IAChE;GACF,KAAK;IACH,IAAI,CAAE,MAAM,KAAK,eAAe,WAAW,OAAO,OAAO,QAAQ,GAAI,OAAO;IAC5E;GACF,KAAK;IACH,KAAK,MAAM,WAAW,OAAO,MAAM,OAAO,MAAM;IAChD,OAAO;EACX;EAEF,OAAO;CACT;CAEA,MAAc,eACZ,WACA,OACA,UACkB;EAClB,MAAM,OAAO,MAAM,KAAK,QAAQ,cAAc;GAC5C;GACA,OAAO,MAAM,SAAS,OAAO,oBAAoB,MAAM,SAAS,OAAO;GACvE,WAAW,MAAM;GACjB,cAAc,MAAM;GACpB,OAAO,MAAM;EACf,CAAC;EACD,MAAM,OAAO,eAAe,KAAK,KAAK,IAAI,MAAM,MAAM,KAAK,IAAI,CAAC;EAChE,IAAI,KAAK,OAAO,WAAW,GAAG,OAAO;EACrC,OAAO,MAAM,KAAK,UAChB,WACA,OACA,gBAAgB,MAAM,UAAU,KAAK,QAAQ,MAAM,MAAM,KAAK,IAAI,CAAC,CACrE;CACF;CAEA,QAAgB,WAAsB,OAAsD;EAC1F,IAAI;GACF,MAAM,aACJ,MAAM,oBAAoB,KAAA,IAAY,KAAA,IAAY,KAAK,QAAQ;GACjE,IAAI,MAAM,oBAAoB,KAAA,KAAa,eAAe,KAAA,GAAW;IACnE,KAAK,MAAM,WAAW,6BAA6B,UAAU;IAC7D,OAAO;GACT;GACA,MAAM,aAAa,uBAAuB,KAAK;IAC7C,MAAM;IACN,WAAW,MAAM;IACjB,cAAc,MAAM;IACpB,OAAO,MAAM;IACb,UAAU,iCAAiC,MAAM,QAAQ;IACzD,GAAI,MAAM,oBAAoB,KAAA,KAAa,eAAe,KAAA,IACtD,CAAC,IACD,EACE,YAAY;KACV,IAAI,WAAW;KACf,OAAO,WAAW,YAAY,MAAM,eAAe;IACrD,EACF;GACN,CAAC;GACD,UAAU,oBAAoB,0BAA0B,UAAU,CAAC;GACnE,OAAO;EACT,QAAQ;GACN,KAAK,MAAM,WAAW,0BAA0B,mBAAmB;GACnE,OAAO;EACT;CACF;CAEA,KACE,WACA,OACA,QACkB;EAClB,OAAO,KAAK,aAAa,WAAW,OAAO,MAAM;CACnD;CAEA,MAAc,aACZ,WACA,OACA,QACkB;EAClB,IAAI;GACF,MAAM,gBAA0B,CAAC;GACjC,MAAM,kBAAgD,CAAC;GACvD,KAAK,MAAM,SAAS,QAAQ;IAC1B,MAAM,YACJ,MAAM,oBAAoB,KAAA,IACtB,KAAA,IACA,KAAK,QAAQ,qBAAqB,kBAAkB,OAAO,MAAM,eAAe;IACtF,IAAI,MAAM,oBAAoB,KAAA,KAAa,cAAc,KAAA,GAAW;KAClE,KAAK,MAAM,WAAW,6BAA6B,UAAU;KAC7D,OAAO;IACT;IACA,IAAI,WAAW,SAAS,kBAAkB;KACxC,IAAI,MAAM,SAAS,UAAU;MAC3B,KAAK,MAAM,WAAW,6BAA6B,UAAU;MAC7D,OAAO;KACT;KACA,MAAM,kBAAkB,UAAU;KAClC,MAAM,eAAe,sBACnB,MAAM,UACN;MACE,mBAAmB,MAAM;MACzB,SAAS,MAAM;KACjB,GACA,KAAK,IAAI,CACX;KACA,MAAM,WAAW,aAAa;KAC9B,gBAAgB,KACd,GAAG,aAAa,QAAQ,QAAQ,WAAW,OAAO,SAAS,SAAS,CACtE;KACA;IACF;IACA,IAAI,cAAc,KAAA,GAAW,MAAM,kBAAkB,UAAU;IAC/D,MAAM,UACJ,WAAW,SAAS,SAChB,UAAU,QACV,8BAA8B,OAAO,KAAK,QAAQ,iBAAiB;IACzE,IAAI,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,aAAa,MAAM,SAAS,OAAO,eAAe;KACtF,KAAK,MAAM,WAAW,6BAA6B,iBAAiB;KACpE,OAAO;IACT;IACA,cAAc,KAAK,OAAO;GAC5B;GAIA,IAAI,MAAM,oBAAoB,KAAA,KAAa,CAAC,KAAK,QAAQ,WAAW,KAAK,GAAG,OAAO;GACnF,KAAK,MAAM,WAAW,eAAe,UAAU,KAAK,OAAO;GAC3D,IAAI,gBAAgB,SAAS,GAC3B,OAAO,MAAM,KAAK,UAAU,WAAW,OAAO;IAC5C,OAAO,MAAM;IACb,SAAS,wBAAwB,eAAe;GAClD,CAAC;GAEH,OAAO;EACT,QAAQ;GACN,KAAK,MAAM,WAAW,0BAA0B,aAAa;GAC7D,OAAO;EACT;CACF;CAEA,QACE,WACA,OACA,WACe;EACf,MAAM,MAAM,YAA2B;GACrC,IAAI;IACF,MAAM,UAAU;GAClB,SAAS,OAAO;IACd,MAAM,OAAO,WACX,OAAO,SAAS,kCAAkC;KAChD;KACA,cAAc,MAAM;IACtB,CAAC,CACH;IACA,KAAK,MAAM,WAAW,0BAA0B,mBAAmB;GACrE;EACF;EACA,MAAM,OAAO,MAAM,MAAM,KAAK,GAAG;EACjC,MAAM,QAAQ;EACd,OAAO;CACT;CAEA,MAAc,WAAsB,MAAc,QAAsB;EACtE,KAAK,QAAQ,OAAO,SAAS;EAC7B,IAAI;GACF,UAAU,MAAM,MAAM,MAAM;EAC9B,QAAQ,CAER;CACF;CAEA,oBACE,SACA,OACiD;EACjD,OAAO,MAAM,oBAAoB,KAAA,IAC7B,gCAAgC,OAAO,IACtC,KAAK,QAAQ,qBAAqB,oBAAoB,OAAO,KAAK,OAAO,KAAK,UAAU;CAC/F;CAEA,MAAc,sBACZ,IACA,SACsC;EACtC,MAAM,aAAa,KAAK,kBAAkB,EAAE;EAC5C,IAAI,eAAe,KAAA,GAAW,OAAO,KAAA;EACrC,MAAM,UAAU,MAAM,OAAO,WAAW,WAAW,YAAY,OAAO,CAAC,CAAC,KAAK,OAAO,MAAM,CAAC;EAC3F,OAAO,QAAQ,SAAS,SAAS,QAAQ,QAAQ,KAAA;CACnD;AACF;AAEA,MAAM,2BACJ,YAC8C;CAC9C,IAAI;CACJ,MAAM,WAAyC,CAAC;CAChD,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,SAAS,iBAAiB;GACnC,SAAS,KAAK,MAAM;GACpB;EACF;EACA,eAAe,eAAe,KAAK,KAAK,IAAI,gBAAgB,GAAG,OAAO,QAAQ,CAAC;CACjF;CACA,OAAO,iBAAiB,KAAA,IACpB,WACA,CAAC,GAAG,UAAU;EAAE,MAAM;EAAiB,UAAU;CAAa,CAAC;AACrE;;;;;;;;;ACtZA,IAAa,uBAAb,MAA0E;CACxE;CACA;CAEA,YAAY,SAAuD;EACjE,KAAK,aAAa,IAAI,8BAA8B;GAClD,eAAe,QAAQ;GACvB,iBAAiB,cAAc,KAAK,QAAQ,QAAQ,SAAS;GAC7D,iBAAiB,cAAc,KAAK,eAAe,SAAS;GAC5D,eAAe,OAAO,EAAE,UAAU,OAAO,WAAW,cAAc,YAChE,MAAM,KAAK,QAAQ,IAAI,YAAY,QACjC,IAAI,cAAc,UAAU,KAAK,CAAC,CAAC,KACjC,OAAO,SACL,qBACA,gBAAgB,OAAO;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,iBAAiB;GACnB,CAAC,CACH,CACF,CACF;GACF,qBAAqB,QAAQ;GAC7B,mBAAmB,QAAQ;EAC7B,CAAC;EACD,KAAK,UAAU,IAAI,kBAAkB;GACnC,GAAG;GACH,2BAA2B,KAAK,WAAW;EAC7C,CAAC;CACH;CAEA,OAAgB,UAAU,kBAAkB;;CAG5C,kBACE,OAC4B;EAC5B,OAAO,KAAK,IAAI,MAAM,YAAY,QAAQ,IAAI,kBAAkB,MAAM,SAAS,CAAC;CAClF;;CAGA,SACE,OACyB;EACzB,MAAM,SAAS,MAAM,OAAO;EAC5B,OAAO,KAAK,IAAI,MAAM,YAAY,QAAQ;GACxC,MAAM,YAAY,IAAI,SAAS,MAAM,OAAO;GAC5C,OAAO,WAAW,KAAA,KAAa,WAAW,OACtC,YACA,UAAU,KAAK,OAAO,eAAe,kBAAkB,MAAM,CAAC,CAAC;EACrE,CAAC;CACH;CAEA,OAAO,OAA8D;EACnE,MAAM,QAAQ,MAAM,SAAS,yBAAyB;EACtD,OAAO,KAAK,IAAI,MAAM,YAAY,QAChC,IAAI,OAAO,MAAM,OAAO,CAAC,CAAC,KACxB,OAAO,SACL,wBACA,gBAAgB,OAAO;GACrB,kBAAkB,MAAM;GACxB,oBAAoB,MAAM,QAAQ;GAClC,kBAAkB,MAAM,QAAQ;EAClC,CAAC,CACH,CACF,CACF;CACF;CAEA,YAAY,OAAkF;EAC5F,MAAM,QAAQ,MAAM,SAAS,yBAAyB;EACtD,OAAO,KAAK,IAAI,MAAM,YAAY,QAChC,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC,KACtB,OAAO,SACL,wBACA,gBAAgB,OAAO;GACrB,kBAAkB,MAAM;GACxB,iCAAiC,MAAM,MAAM;EAC/C,CAAC,CACH,CACF,CACF;CACF;CAEA,eAAe,OAAsE;EACnF,MAAM,QAAQ,MAAM,SAAS,yBAAyB;EACtD,OAAO,KAAK,IAAI,MAAM,YAAY,QAChC,IAAI,eAAe,MAAM,OAAO,CAAC,CAAC,KAChC,OAAO,SACL,6BACA,gBAAgB,OAAO;GACrB,kBAAkB,MAAM;GACxB,oBAAoB,MAAM,QAAQ;GAClC,kBAAkB,MAAM,QAAQ;EAClC,CAAC,CACH,CACF,CACF;CACF;CAEA,eAAe,OAA8E;EAC3F,MAAM,QAAQ,MAAM,SAAS,yBAAyB;EACtD,OAAO,KAAK,IAAI,MAAM,YAAY,QAChC,IAAI,eAAe,MAAM,WAAW,MAAM,YAAY,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,KAC5E,OAAO,SACL,sBACA,gBAAgB,OAAO;GACrB,kBAAkB,MAAM;GACxB,kBAAkB,MAAM;GACxB,iBAAiB,MAAM;EACzB,CAAC,CACH,CACF,CACF;CACF;CAEA,SAAS,OAA2D;EAClE,OAAO,KAAK,MAAM,QAAQ,QAAQ,IAAI,SAAS,GAAG,wBAAwB;CAC5E;CAEA,SAAS,OAAgF;EACvF,OAAO,KAAK,MAAM,QAAQ,QAAQ,IAAI,SAAS,GAAG,qBAAqB;CACzE;CAEA,qBACE,OAIe;EACf,OAAO,KAAK,6BAA6B,KAAK;CAChD;CAEA,MAAc,6BACZ,OAIe;EACf,MAAM,WAAW,MAAM,KAAK,sBAAsB,KAAK;EACvD,MAAM,KAAK,6BAA6B;GAAE,GAAG;GAAU,WAAW,MAAM;EAAU,CAAC;CACrF;CAEA,MAAM,sBACJ,OACqD;EACrD,MAAM,aAAa,KAAK,WAAW,kBAAkB,MAAM,YAAY;EACvE,IAAI,MAAM,iBAAiB,KAAA,KAAa,eAAe,KAAA,GACrD,MAAM,IAAI,MAAM,yCAAyC,MAAM,cAAc;EAE/E,MAAM,cACJ,eAAe,KAAA,IACX,KAAA,IACA,WAAW,WAAW;GACpB,GAAI,MAAM,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,mBAAmB,MAAM,SAAS;GAC5E,UAAU,MAAM,KAAK,SAAS;IAAE,WAAW,MAAM;IAAW,OAAO,MAAM;GAAM,CAAC;EAClF,CAAC;EACP,OAAO;GACL,UAAU,aAAa,YAAY,MAAM,YAAY,eAAe,KAAK,CAAC;GAC1E,WAAW,MAAM;GACjB,OAAO,MAAM,SAAS,yBAAyB;GAC/C,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,YAAY,MAAM;EAC5E;CACF;CAEA,6BACE,OACe;EACf,OAAO,KAAK,WAAW,OAAO,KAAK;CACrC;CAEA,iBAAiB,WAAsB,SAA8C;EACnF,OAAO,KAAK,WAAW,QAAQ,WAAW,OAAO;CACnD;CAEA,eAAe,WAA4B;EACzC,KAAK,WAAW,OAAO,SAAS;CAClC;CAEA,eAAe,WAA4B;EACzC,KAAK,WAAW,OAAO,SAAS;CAClC;CAEA,MAAM,QAAQ,QAA8C;EAC1D,MAAM,KAAK,QAAQ,QAAQ;CAC7B;CAEA,MAAM,MAAM,OAA8C;EACxD,IAAI,UAAU,KAAA,GAAW,MAAM,KAAK,eAAe,MAAM,SAAS;EAClE,MAAM,KAAK,QAAQ,MAAM,OAAO,SAAS;CAC3C;CAEA,UAAyB;EACvB,OAAO,KAAK,QAAQ,QAAQ;CAC9B;CAEA,MACE,OACA,WACA,UACY;EACZ,MAAM,QAAQ,MAAM,SAAS,yBAAyB;EACtD,OAAO,KAAK,IAAI,MAAM,YAAY,QAChC,UAAU,GAAG,CAAC,CAAC,KACb,OAAO,SAAS,UAAU,gBAAgB,OAAO,EAAE,kBAAkB,MAAM,UAAU,CAAC,CAAC,CACzF,CACF;CACF;CAEA,MAAc,eAAe,WAAqC;EAChE,MAAM,KAAK,QAAQ,QAAQ,SAAS;EACpC,MAAM,KAAK,WAAW,qBAAqB,SAAS;CACtD;CAEA,MAAc,IACZ,WACA,WACY;EACZ,MAAM,KAAK,eAAe,SAAS;EACnC,OAAO,MAAM,KAAK,QAAQ,IAAI,WAAW,SAAS;CACpD;AACF;AAEA,MAAM,mBACJ,OACA,gBAC+B;CAC/B,MAAM;CACN,YAAY,sBAAsB;EAAE,GAAG,MAAM;EAAY,GAAG;CAAW,CAAC;CACxE,OAAO,MAAM,MAAM,KAAK,UAAU;EAChC,MAAM,kBAAkB,KAAK,OAAO;EACpC,YAAY,KAAK;CACnB,EAAE;CACF,GAAI,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE,QAAQ,kBAAkB,MAAM,MAAM,EAAE;AAC7E"}
@@ -1,2 +1,2 @@
1
- import { a as EDASessionEventsInput, c as EDASessionSubmitInput, i as EDASessionControllerOptions, m as EDASessionDurableObjectStorage, n as EDASessionBlockOnCommandInput, o as EDASessionScopedInput, r as EDASessionController, s as EDASessionSubmitBatchInput, t as EDAPreparedEventWebSocket } from "./session-controller-BfA5NAuY.js";
1
+ import { a as EDASessionEventsInput, c as EDASessionSubmitInput, i as EDASessionControllerOptions, m as EDASessionDurableObjectStorage, n as EDASessionBlockOnCommandInput, o as EDASessionScopedInput, r as EDASessionController, s as EDASessionSubmitBatchInput, t as EDAPreparedEventWebSocket } from "./session-controller-DCvQY3nj.js";
2
2
  export { EDAPreparedEventWebSocket, EDASessionBlockOnCommandInput, EDASessionController, EDASessionControllerOptions, type EDASessionDurableObjectStorage, EDASessionEventsInput, EDASessionScopedInput, EDASessionSubmitBatchInput, EDASessionSubmitInput };
@@ -1,2 +1,2 @@
1
- import { t as EDASessionController } from "./session-controller-IrTPwdRt.js";
1
+ import { t as EDASessionController } from "./session-controller-zTTLb7tt.js";
2
2
  export { EDASessionController };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-durable-agent-cloudflare",
3
- "version": "0.1.0-alpha.19",
3
+ "version": "0.1.0-alpha.20",
4
4
  "description": "Cloudflare Durable Objects host for effect-durable-agent.",
5
5
  "keywords": [
6
6
  "agents",
@@ -61,18 +61,18 @@
61
61
  "tag": "alpha"
62
62
  },
63
63
  "dependencies": {
64
- "effect-durable-agent": "0.1.0-alpha.19"
64
+ "effect-durable-agent": "0.1.0-alpha.20"
65
65
  },
66
66
  "peerDependencies": {
67
- "@effect/ai-openai": "4.0.0-beta.102",
68
- "effect": "4.0.0-beta.102"
67
+ "@effect/ai-openai": "4.0.3",
68
+ "effect": "4.0.3"
69
69
  },
70
70
  "devDependencies": {
71
71
  "@cloudflare/vitest-pool-workers": "0.18.8",
72
72
  "@cloudflare/workers-types": "5.20260813.1",
73
- "@effect/ai-openai": "4.0.0-beta.102",
74
- "@effect/vitest": "4.0.0-beta.102",
75
- "effect": "4.0.0-beta.102",
73
+ "@effect/ai-openai": "4.0.3",
74
+ "@effect/vitest": "4.0.3",
75
+ "effect": "4.0.3",
76
76
  "vite-plus": "0.3.0",
77
77
  "vitest": "^4.1.8"
78
78
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-controller-IrTPwdRt.js","names":[],"sources":["../src/durable-object-keepalive.ts","../src/durable-object-sink-checkpoints.ts","../src/durable-object-store.ts","../src/runtime/runtime-layer.ts","../src/runtime/session-runtime.ts","../src/websocket/projection.ts","../src/websocket/attachment.ts","../src/websocket/connection-manager.ts","../src/session-controller.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/**\n * Optional host hook for background alarm writes started from synchronous observers.\n * Durable Objects already track their own async work; this hook does not keep an\n * accepted WebSocket active or prevent WebSocket hibernation.\n */\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 runSchedulingPending = false;\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 /** Durable delivery work survives the release of every in-memory active lease. */\n setRunSchedulingPending(pending: boolean): Promise<void> {\n this.runSchedulingPending = pending;\n return this.reschedule();\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 this.runSchedulingPending = false;\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 && !this.runSchedulingPending)) {\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 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 * 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 SummaryCreatedPayload,\n ContextRebasedPayload,\n DurableEventEnvelope,\n assistantMessageCommittedEventType,\n assistantMessageImportedEventType,\n assistantPartialCommittedEventType,\n commandAdmittedEventType,\n commandCancelledEventType,\n commandCompletedEventType,\n commandFailedEventType,\n commandStartedEventType,\n contextRebasedEventType,\n decodeDurableEventSync,\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 position: durablePosition(SequenceNumber.make(row.seq)),\n event: decodeDurableEventSync({\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\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 = Schema.decodeUnknownSync(Schema.Record(Schema.String, Schema.Unknown))(payload);\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 {\n command: { commandId },\n } = Schema.decodeUnknownSync(\n Schema.Struct({\n command: Schema.Struct({ commandId: Schema.String }),\n }),\n )(JSON.parse(row.fact_json));\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 } = Schema.decodeUnknownSync(\n Schema.Struct({ command: Schema.Record(Schema.String, Schema.Unknown) }),\n )(encoded.payload);\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 } = Schema.decodeUnknownSync(Schema.Struct({ messageId: Schema.Unknown }))(\n encoded.payload,\n );\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 = Schema.decodeUnknownSync(SummaryCreatedPayload)(event.payload);\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 = Schema.decodeUnknownSync(ContextRebasedPayload)(event.payload);\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 type { EDAAppEvents } from \"effect-durable-agent/services/session-store\";\nimport type { RunScheduler } from \"effect-durable-agent/services/run-scheduler\";\nimport { RunSchedulingWakeup } from \"effect-durable-agent/services/run-scheduling-wakeup\";\nimport { EDASessionStoreError } from \"effect-durable-agent/services/session-store\";\nimport * as Effect from \"effect/Effect\";\nimport type { ModelResolver } from \"effect-durable-agent/services/model-resolver\";\nimport * as Layer from \"effect/Layer\";\nimport type * as Tracer from \"effect/Tracer\";\n\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 { SessionEventObserver } from \"effect-durable-agent/services/session-event-observer\";\nimport type { SessionCommandAdmissionError } from \"effect-durable-agent/services/session-state\";\nimport type { EDASink } from \"effect-durable-agent/services/sink-registry\";\nimport type {\n EDAModelToolkit,\n EDAToolRegistryShape,\n} from \"effect-durable-agent/services/tool-registry\";\nimport type { SessionId } from \"effect-durable-agent/types/core\";\nimport {\n DurableObjectKeepAlive,\n type DurableObjectAlarmStorage,\n} from \"../durable-object-keepalive\";\nimport { DurableObjectSinkCheckpointStore } from \"../durable-object-sink-checkpoints\";\nimport type { DurableObjectSessionStorage } from \"../durable-object-storage\";\nimport { DurableObjectSessionStore } from \"../durable-object-store\";\n\n/** Storage capabilities used by one EDA session Durable Object. */\nexport type EDASessionDurableObjectStorage = DurableObjectSessionStorage &\n DurableObjectAlarmStorage;\n\n/** Host adapters and application policy needed to build one session runtime. */\nexport interface EDADurableObjectRuntimeLayerOptions {\n readonly appEvents?: EDAAppEvents;\n readonly config: EDARuntimeConfig;\n readonly compactionExecutorLayer?: Layer.Layer<CompactionExecutor>;\n readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;\n readonly keepAlive?: DurableObjectKeepAlive;\n readonly modelResolverLayer: Layer.Layer<ModelResolver>;\n readonly promptProjectorLayer?: Layer.Layer<EDAPromptProjector>;\n readonly runSchedulerLayer?: Layer.Layer<RunScheduler>;\n readonly reducers?: ReadonlyArray<EDAReducer>;\n readonly sessionEventObserverLayer?: Layer.Layer<SessionEventObserver>;\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/** Compose the platform-neutral runtime with Cloudflare persistence and lifecycle adapters. */\nexport const makeEDADurableObjectRuntimeLayer = ({\n appEvents,\n config,\n compactionExecutorLayer,\n compactionPolicyLayer,\n keepAlive,\n modelResolverLayer,\n promptProjectorLayer,\n reducers,\n runSchedulerLayer,\n sessionEventObserverLayer,\n sessionId,\n sinks,\n storage,\n toolkit,\n toolRegistry,\n tracer,\n}: EDADurableObjectRuntimeLayerOptions): Layer.Layer<EDARuntime, SessionCommandAdmissionError> => {\n const lifecycle = keepAlive ?? new DurableObjectKeepAlive(storage);\n const keepAliveLayer = EDAKeepAlive.FromAcquire(() => lifecycle.acquire());\n return makeEDARuntimeLayer({\n appEvents,\n config,\n compactionExecutorLayer,\n compactionPolicyLayer,\n keepAliveLayer,\n modelResolverLayer,\n promptProjectorLayer,\n runSchedulerLayer,\n runSchedulingWakeupLayer: Layer.succeed(RunSchedulingWakeup, {\n setPending: (pending) =>\n Effect.tryPromise({\n try: () => lifecycle.setRunSchedulingPending(pending),\n catch: (error) =>\n new EDASessionStoreError({\n message: `Persisting run scheduling wakeup: ${String(error)}`,\n }),\n }),\n }),\n reducerRegistryLayer: EDAReducerRegistry.Live(reducers ?? []),\n sessionEventObserverLayer,\n sessionId,\n sessionStoreLayer: DurableObjectSessionStore.layer({ sessionId, storage }),\n sinkCheckpointStoreLayer: DurableObjectSinkCheckpointStore.layer(storage),\n sinks,\n toolkit,\n toolRegistry,\n tracer,\n });\n};\n","import type { EDAAppEvents } from \"effect-durable-agent/services/session-store\";\nimport type { RunScheduler } from \"effect-durable-agent/services/run-scheduler\";\nimport type { ModelResolver } from \"effect-durable-agent/services/model-resolver\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as ManagedRuntime from \"effect/ManagedRuntime\";\nimport type * as Tracer from \"effect/Tracer\";\n\nimport type {\n CompactionExecutor,\n CompactionPolicy,\n} from \"effect-durable-agent/services/compaction\";\nimport {\n EDARuntime,\n type EDARuntimeConfig,\n type EDARuntimeShape,\n} from \"effect-durable-agent/services/runtime\";\nimport type { EDAPromptProjector } from \"effect-durable-agent/services/prompt-projector\";\nimport type { EDAReducer } from \"effect-durable-agent/services/reducer-registry\";\nimport type { SessionEventObserver } from \"effect-durable-agent/services/session-event-observer\";\nimport type { SessionCommandAdmissionError } from \"effect-durable-agent/services/session-state\";\nimport type { EDASink } from \"effect-durable-agent/services/sink-registry\";\nimport type {\n EDAModelToolkit,\n EDAToolRegistryShape,\n} from \"effect-durable-agent/services/tool-registry\";\nimport type { SessionId } from \"effect-durable-agent/types/core\";\nimport {\n DurableObjectKeepAlive,\n type DurableObjectBackgroundWaiter,\n} from \"../durable-object-keepalive\";\nimport { DurableObjectSinkCheckpointStore } from \"../durable-object-sink-checkpoints\";\nimport { DurableObjectSessionStore } from \"../durable-object-store\";\nimport {\n makeEDADurableObjectRuntimeLayer,\n type EDASessionDurableObjectStorage,\n} from \"./runtime-layer\";\n\nexport type EDAToolkitFactory = (input: { readonly sessionId: SessionId }) => EDAModelToolkit;\nexport type EDAToolRegistryFactory = (input: {\n readonly sessionId: SessionId;\n}) => EDAToolRegistryShape;\nexport type EDATracerFactory = (input: { readonly sessionId: SessionId }) => Tracer.Tracer;\n\n/** Configuration owned by the lazy per-isolate Effect runtime. */\nexport interface EDASessionRuntimeOptions {\n readonly background?: DurableObjectBackgroundWaiter;\n readonly appEvents?: EDAAppEvents;\n readonly config: EDARuntimeConfig;\n readonly compactionExecutorLayer?: Layer.Layer<CompactionExecutor>;\n readonly compactionPolicyLayer?: Layer.Layer<CompactionPolicy>;\n readonly keepAlive?: DurableObjectKeepAlive;\n readonly modelResolverLayer: Layer.Layer<ModelResolver>;\n readonly promptProjectorLayer?: Layer.Layer<EDAPromptProjector>;\n readonly runSchedulerLayer?: Layer.Layer<RunScheduler>;\n readonly reducers?: ReadonlyArray<EDAReducer>;\n readonly sessionEventObserverLayer: Layer.Layer<SessionEventObserver>;\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}\n\ninterface RuntimeState {\n readonly runtime: ManagedRuntime.ManagedRuntime<EDARuntime, SessionCommandAdmissionError>;\n readonly sessionId: SessionId;\n}\n\n/** Owns the disposable ManagedRuntime and nothing about WebSocket transport. */\nexport class EDASessionRuntime {\n readonly keepAlive: DurableObjectKeepAlive;\n private state: RuntimeState | undefined;\n private building: Promise<RuntimeState> | undefined;\n\n constructor(private readonly options: EDASessionRuntimeOptions) {\n this.keepAlive =\n options.keepAlive ?? new DurableObjectKeepAlive(options.storage, options.background);\n }\n\n static readonly migrate = (\n storage: EDASessionDurableObjectStorage,\n ): Effect.Effect<\n void,\n import(\"effect-durable-agent/services/session-store\").EDASessionStoreError\n > =>\n Effect.gen(function* () {\n yield* DurableObjectSessionStore.migrate(storage);\n yield* DurableObjectSinkCheckpointStore.migrate(storage);\n });\n\n isReady(sessionId: SessionId): boolean {\n return this.state?.sessionId === sessionId;\n }\n\n async prepare(sessionId: SessionId): Promise<void> {\n await this.get(sessionId);\n }\n\n async run<A>(\n sessionId: SessionId,\n operation: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n ): Promise<A> {\n const state = await this.get(sessionId);\n return await state.runtime.runPromise(\n Effect.gen(function* () {\n return yield* operation(yield* EDARuntime);\n }),\n );\n }\n\n async alarm(sessionId?: SessionId): Promise<void> {\n const resolved = sessionId ?? this.state?.sessionId;\n if (resolved !== undefined) {\n await this.run(resolved, (runtime) => runtime.retryRunSchedulingDelivery());\n }\n await this.keepAlive.alarm();\n }\n\n async destroy(): Promise<void> {\n await this.keepAlive.shutdown();\n await this.dispose();\n this.state = undefined;\n this.building = undefined;\n }\n\n async dispose(): Promise<void> {\n await this.state?.runtime.dispose();\n }\n\n private async get(sessionId: SessionId): Promise<RuntimeState> {\n if (this.state !== undefined) {\n if (this.state.sessionId !== sessionId) {\n throw new Error(\n `EDA session runtime is scoped to session ${this.state.sessionId}; received ${sessionId}`,\n );\n }\n return this.state;\n }\n\n this.keepAlive.restart();\n const building = this.building ?? this.build(sessionId);\n this.building = building;\n try {\n return await building;\n } catch (error) {\n if (this.building === building) this.building = undefined;\n throw error;\n }\n }\n\n private async build(sessionId: SessionId): Promise<RuntimeState> {\n const runtime = ManagedRuntime.make(\n makeEDADurableObjectRuntimeLayer({\n appEvents: this.options.appEvents,\n config: this.options.config,\n compactionExecutorLayer: this.options.compactionExecutorLayer,\n compactionPolicyLayer: this.options.compactionPolicyLayer,\n keepAlive: this.keepAlive,\n modelResolverLayer: this.options.modelResolverLayer,\n promptProjectorLayer: this.options.promptProjectorLayer,\n reducers: this.options.reducers,\n runSchedulerLayer: this.options.runSchedulerLayer,\n sessionEventObserverLayer: this.options.sessionEventObserverLayer,\n sessionId,\n sinks: this.options.sinks,\n storage: this.options.storage,\n toolkit: resolveFactory(this.options.toolkit, sessionId),\n toolRegistry: resolveFactory(this.options.toolRegistry, sessionId),\n tracer: resolveFactory(this.options.tracer, sessionId),\n }),\n );\n const state = { runtime, sessionId } satisfies RuntimeState;\n try {\n await runtime.context();\n this.state = state;\n return state;\n } catch (error) {\n await runtime.dispose().catch(() => undefined);\n throw error;\n }\n }\n}\n\nconst resolveFactory = <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","import type * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport type {\n EDAWebSocketClientFrame,\n EDAWebSocketServerFrameInput,\n} from \"effect-durable-agent/websocket\";\nimport type { SequenceNumber } from \"effect-durable-agent/types/core\";\n\n/** Stable non-empty identity persisted with an app WebSocket projection. */\nexport const EDAWebSocketProjectionId = Schema.NonEmptyString.pipe(\n Schema.brand(\"EDAWebSocketProjectionId\"),\n);\nexport type EDAWebSocketProjectionId = typeof EDAWebSocketProjectionId.Type;\n\n/** Initial state and cursor selected when an app-projected WebSocket is accepted. */\nexport interface EDAWebSocketProjectionInitial<State extends object> {\n readonly afterSeq: SequenceNumber;\n readonly state: State;\n}\n\n/** App projection decision for one EDA delivery frame. */\nexport type EDAWebSocketProjectionResult<State extends object> =\n | {\n readonly _tag: \"Send\";\n readonly frame: string;\n readonly state: State;\n }\n | {\n /** Suppress an internal-only events frame and advance its ACK in the host. */\n readonly _tag: \"SuppressAndAck\";\n readonly state: State;\n };\n\n/**\n * App-owned wire projection hosted directly by the EDA Durable Object.\n *\n * The host persists `State` beside EDA delivery state, so an app can retain a\n * stable public protocol without placing a resident WebSocket bridge in front\n * of the hibernating object.\n */\nexport interface EDAWebSocketProjection<State extends object> {\n /** Stable identifier persisted in WebSocket attachments. */\n readonly id: EDAWebSocketProjectionId;\n /** Decode one app-protocol client message into EDA's delivery ACK protocol. */\n readonly decodeClientMessage: (\n message: string,\n ) => Effect.Effect<EDAWebSocketClientFrame, unknown>;\n /** Restore app-owned connection state after isolate eviction. */\n readonly decodeState: (encoded: unknown) => Effect.Effect<State, unknown>;\n /** Encode app-owned connection state for Cloudflare's attachment boundary. */\n readonly encodeState: (state: State) => unknown;\n /** Project one EDA server frame while updating app-owned connection state. */\n readonly encodeServerFrame: (\n frame: EDAWebSocketServerFrameInput,\n state: State,\n ) => EDAWebSocketProjectionResult<State>;\n /** Seed the projection and select its default replay cursor from a durable snapshot. */\n readonly initialize: (input: {\n readonly requestedAfterSeq?: SequenceNumber;\n readonly snapshot: EDASessionSnapshot;\n }) => EDAWebSocketProjectionInitial<State>;\n}\n","import * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport { EDAWebSocketDeliveryCheckpoint } from \"effect-durable-agent/websocket\";\nimport { SubscriberId } from \"effect-durable-agent/websocket\";\nimport { SessionId } from \"effect-durable-agent/types/core\";\nimport { EDATraceMetadata } from \"effect-durable-agent/types/tracing\";\nimport { EDAWebSocketProjectionId } from \"./projection\";\n\n/** Versioned state required to resume strict delivery after Durable Object hibernation. */\nexport const EDAWebSocketAttachment = Schema.Struct({\n kind: Schema.Literal(\"eda-events-v2\"),\n sessionId: SessionId,\n subscriberId: SubscriberId,\n trace: EDATraceMetadata,\n delivery: EDAWebSocketDeliveryCheckpoint,\n projection: Schema.optionalKey(\n Schema.Struct({\n id: EDAWebSocketProjectionId,\n state: Schema.Unknown,\n }),\n ),\n});\nexport type EDAWebSocketAttachment = typeof EDAWebSocketAttachment.Type;\n\nexport type DecodedWebSocketAttachment =\n | { readonly _tag: \"Missing\" }\n | { readonly _tag: \"Malformed\" }\n | { readonly _tag: \"Decoded\"; readonly attachment: EDAWebSocketAttachment };\n\n/** Decode and classify an attachment read from Cloudflare's structured-clone boundary. */\nexport const decodeWebSocketAttachment = async (\n input: unknown,\n): Promise<DecodedWebSocketAttachment> => {\n if (input === null || input === undefined) return { _tag: \"Missing\" };\n try {\n return {\n _tag: \"Decoded\",\n attachment: await Effect.runPromise(\n Schema.decodeUnknownEffect(EDAWebSocketAttachment)(input),\n ),\n };\n } catch {\n return { _tag: \"Malformed\" };\n }\n};\n\n/** Encode before serialization so schema transformations cannot leak into attachments. */\nexport const encodeWebSocketAttachment = (attachment: EDAWebSocketAttachment): unknown =>\n Schema.encodeSync(EDAWebSocketAttachment)(attachment);\n","import * as Effect from \"effect/Effect\";\n\nimport { SessionEventObserver } from \"effect-durable-agent/services/session-event-observer\";\nimport type { EDASessionEventPage } from \"effect-durable-agent/services/session-query\";\nimport { SequenceNumber, type SessionId } from \"effect-durable-agent/types/core\";\nimport type { PositionedEvent } from \"effect-durable-agent/types/events\";\nimport type { EDATraceMetadata } from \"effect-durable-agent/types/tracing\";\nimport {\n EDA_WEB_SOCKET_PING_MESSAGE,\n EDA_WEB_SOCKET_PONG_MESSAGE,\n EDA_WS_CLOSE_PROTOCOL_ERROR,\n EDA_WS_CLOSE_SEND_FAILED,\n SubscriberId,\n checkpointWebSocketDeliveryState,\n decodeEDAWebSocketClientMessage,\n defaultEDAWebSocketFlowControl,\n deliveryHelloFrame,\n encodeEDAWebSocketServerFrame,\n makeWebSocketDeliveryState,\n onClientAck,\n onDurableEvents,\n onEphemeralEvent,\n onHostSuppressedFrame,\n restoreWebSocketDeliveryState,\n type EDAWebSocketDeliveryResult,\n type EDAWebSocketDeliveryAction,\n type EDAWebSocketDeliveryState,\n type EDAWebSocketClientFrame,\n type EDAWebSocketServerFrame,\n type EDAWebSocketServerFrameEncoder,\n} from \"effect-durable-agent/websocket\";\nimport {\n EDAWebSocketAttachment,\n decodeWebSocketAttachment,\n encodeWebSocketAttachment,\n} from \"./attachment\";\nimport type { EDAWebSocketProjection } from \"./projection\";\n\nexport interface EDAWebSocketConnectionManagerOptions<ProjectionState extends object = never> {\n readonly getWebSockets?: () => ReadonlyArray<WebSocket>;\n readonly isSessionReady: (sessionId: SessionId) => boolean;\n readonly prepareSession: (sessionId: SessionId) => Promise<void>;\n readonly readEventPage: (input: {\n readonly afterSeq: SequenceNumber;\n readonly limit: number;\n readonly sessionId: SessionId;\n readonly subscriberId: SubscriberId;\n readonly trace: EDATraceMetadata;\n }) => Promise<EDASessionEventPage>;\n readonly webSocketProjection?: EDAWebSocketProjection<ProjectionState>;\n readonly webSocketProtocol?: EDAWebSocketServerFrameEncoder;\n}\n\ninterface EventWebSocketState<ProjectionState extends object> {\n readonly sessionId: SessionId;\n readonly subscriberId: SubscriberId;\n readonly trace: EDATraceMetadata;\n delivery: EDAWebSocketDeliveryState;\n catchUpDeferred: boolean;\n head: SequenceNumber;\n queue: Promise<void>;\n projectionState?: ProjectionState;\n}\n\n/**\n * Owns Cloudflare WebSockets, hibernation attachments, and interpretation of\n * the platform-neutral delivery state machine.\n */\nexport class EDAWebSocketConnectionManager<ProjectionState extends object = never> {\n readonly observerLayer = SessionEventObserver.FromHandler((event) =>\n Effect.tryPromise(() => this.fanoutPublishedEvent(event)).pipe(\n Effect.catchCause((cause) =>\n Effect.logError(\"EDA WebSocket event observer recovered from a host failure\", { cause }),\n ),\n ),\n );\n\n private readonly sockets = new Map<WebSocket, EventWebSocketState<ProjectionState>>();\n\n constructor(private readonly options: EDAWebSocketConnectionManagerOptions<ProjectionState>) {}\n\n resolveProjection(id: string | undefined): EDAWebSocketProjection<ProjectionState> | undefined {\n if (id === undefined) return undefined;\n if (this.options.webSocketProjection?.id === id) return this.options.webSocketProjection;\n return undefined;\n }\n\n async accept(input: {\n readonly afterSeq: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n readonly webSocket: WebSocket;\n readonly projectionState?: ProjectionState;\n }): Promise<void> {\n const subscriberId = SubscriberId.make(crypto.randomUUID());\n const delivery = makeWebSocketDeliveryState({\n subscriberId,\n resumeSeq: input.afterSeq,\n policy: defaultEDAWebSocketFlowControl,\n });\n const state: EventWebSocketState<ProjectionState> = {\n sessionId: input.sessionId,\n subscriberId,\n trace: input.trace,\n delivery,\n catchUpDeferred: false,\n head: input.afterSeq,\n queue: Promise.resolve(),\n ...(input.projectionState === undefined ? {} : { projectionState: input.projectionState }),\n };\n this.sockets.set(input.webSocket, state);\n // The Durable Object calls this immediately after ctx.acceptWebSocket().\n // Register and attach synchronously before the first await so no platform\n // callback can observe an accepted socket without recovery state.\n if (!this.persist(input.webSocket, state)) return;\n if (!(await this.send(input.webSocket, state, [deliveryHelloFrame(delivery)]))) return;\n if (!(await this.prepare(input.webSocket, state))) return;\n await this.enqueue(input.webSocket, state, async () => {\n await this.readAndDeliver(input.webSocket, state, input.afterSeq);\n });\n }\n\n async message(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n if (typeof message !== \"string\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"binary\");\n return;\n }\n if (message === EDA_WEB_SOCKET_PING_MESSAGE) {\n // Cloudflare auto-response normally intercepts this without waking the\n // object. Keep the fallback independent of attachment recovery for\n // direct controller hosts and unit tests.\n try {\n webSocket.send(EDA_WEB_SOCKET_PONG_MESSAGE);\n } catch {\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"send-failed\");\n }\n return;\n }\n\n const state = await this.restore(webSocket);\n if (state === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return;\n }\n const frame = await Effect.runPromise(\n this.decodeClientMessage(message, state).pipe(Effect.option),\n );\n if (frame._tag === \"None\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return;\n }\n const clientFrame = frame.value;\n if (clientFrame._tag === \"ping\") return;\n\n if (!(await this.prepare(webSocket, state))) return;\n await this.enqueue(webSocket, state, async () => {\n await this.interpret(webSocket, state, onClientAck(state.delivery, clientFrame, Date.now()));\n });\n }\n\n closed(webSocket: WebSocket): void {\n this.sockets.delete(webSocket);\n }\n\n async flushDeferredCatchUp(sessionId: SessionId): Promise<void> {\n const deliveries: Promise<void>[] = [];\n for (const [webSocket, state] of this.sockets) {\n if (state.sessionId !== sessionId || !state.catchUpDeferred) continue;\n deliveries.push(\n this.enqueue(webSocket, state, async () => {\n if (!state.catchUpDeferred) return;\n state.catchUpDeferred = false;\n await this.readAndDeliver(webSocket, state, state.delivery.sentDurableThroughSeq);\n }),\n );\n }\n await Promise.all(deliveries);\n }\n\n private async fanoutPublishedEvent(event: PositionedEvent): Promise<void> {\n const webSockets = new Set([...(this.options.getWebSockets?.() ?? []), ...this.sockets.keys()]);\n const deliveries: Promise<void>[] = [];\n for (const webSocket of webSockets) {\n const state = await this.restore(webSocket);\n if (state === undefined) continue;\n deliveries.push(\n this.enqueue(webSocket, state, async () => {\n if (event.event.durability !== \"durable\") {\n await this.interpret(\n webSocket,\n state,\n onEphemeralEvent(state.delivery, event, Date.now()),\n );\n return;\n }\n state.head = SequenceNumber.make(Math.max(state.head, event.position.seq));\n if (event.position.seq <= state.delivery.sentDurableThroughSeq) return;\n if (event.position.seq === state.delivery.sentDurableThroughSeq + 1) {\n await this.interpret(\n webSocket,\n state,\n onDurableEvents(state.delivery, [event], state.head, Date.now()),\n );\n return;\n }\n if (!this.options.isSessionReady(state.sessionId)) {\n state.catchUpDeferred = true;\n return;\n }\n await this.readAndDeliver(webSocket, state, state.delivery.sentDurableThroughSeq);\n }),\n );\n }\n await Promise.all(deliveries);\n }\n\n private async restore(\n webSocket: WebSocket,\n ): Promise<EventWebSocketState<ProjectionState> | undefined> {\n const existing = this.sockets.get(webSocket);\n if (existing !== undefined) return existing;\n const decoded = await decodeWebSocketAttachment(webSocket.deserializeAttachment());\n if (decoded._tag !== \"Decoded\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return undefined;\n }\n const attachment = decoded.attachment;\n const projectionState =\n attachment.projection === undefined\n ? undefined\n : await this.decodeProjectionState(attachment.projection.id, attachment.projection.state);\n if (attachment.projection !== undefined && projectionState === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return undefined;\n }\n const state: EventWebSocketState<ProjectionState> = {\n sessionId: attachment.sessionId,\n subscriberId: attachment.subscriberId,\n trace: attachment.trace,\n delivery: restoreWebSocketDeliveryState({\n subscriberId: attachment.subscriberId,\n policy: defaultEDAWebSocketFlowControl,\n checkpoint: attachment.delivery,\n }),\n catchUpDeferred: false,\n head: attachment.delivery.sentDurableThroughSeq,\n queue: Promise.resolve(),\n ...(projectionState === undefined ? {} : { projectionState }),\n };\n this.sockets.set(webSocket, state);\n return state;\n }\n\n private async prepare(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n ): Promise<boolean> {\n try {\n await this.options.prepareSession(state.sessionId);\n return this.sockets.get(webSocket) === state;\n } catch (error) {\n await Effect.runPromise(\n Effect.logError(\"EDA WebSocket session preparation failed\", {\n error,\n subscriberId: state.subscriberId,\n }),\n );\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"subscriber-failed\");\n return false;\n }\n }\n\n private async interpret(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n result: EDAWebSocketDeliveryResult,\n ): Promise<boolean> {\n state.delivery = result.state;\n for (const action of result.actions) {\n switch (action._tag) {\n case \"Persist\":\n if (!this.persist(webSocket, state)) return false;\n break;\n case \"Send\":\n if (!(await this.send(webSocket, state, action.frames))) return false;\n break;\n case \"ReadEventPage\":\n if (!(await this.readAndDeliver(webSocket, state, action.afterSeq))) return false;\n break;\n case \"Close\":\n this.close(webSocket, action.code, action.reason);\n return false;\n }\n }\n return true;\n }\n\n private async readAndDeliver(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n afterSeq: SequenceNumber,\n ): Promise<boolean> {\n const page = await this.options.readEventPage({\n afterSeq,\n limit: state.delivery.policy.maxInFlightFrames * state.delivery.policy.maxFrameEvents,\n sessionId: state.sessionId,\n subscriberId: state.subscriberId,\n trace: state.trace,\n });\n state.head = SequenceNumber.make(Math.max(state.head, page.head));\n if (page.events.length === 0) return true;\n return await this.interpret(\n webSocket,\n state,\n onDurableEvents(state.delivery, page.events, state.head, Date.now()),\n );\n }\n\n private persist(webSocket: WebSocket, state: EventWebSocketState<ProjectionState>): boolean {\n try {\n const projection =\n state.projectionState === undefined ? undefined : this.options.webSocketProjection;\n if (state.projectionState !== undefined && projection === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return false;\n }\n const attachment = EDAWebSocketAttachment.make({\n kind: \"eda-events-v2\",\n sessionId: state.sessionId,\n subscriberId: state.subscriberId,\n trace: state.trace,\n delivery: checkpointWebSocketDeliveryState(state.delivery),\n ...(state.projectionState === undefined || projection === undefined\n ? {}\n : {\n projection: {\n id: projection.id,\n state: projection.encodeState(state.projectionState),\n },\n }),\n });\n webSocket.serializeAttachment(encodeWebSocketAttachment(attachment));\n return true;\n } catch {\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"attachment-failed\");\n return false;\n }\n }\n\n private send(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n frames: ReadonlyArray<EDAWebSocketServerFrame>,\n ): Promise<boolean> {\n return this.sendPrepared(webSocket, state, frames);\n }\n\n private async sendPrepared(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n frames: ReadonlyArray<EDAWebSocketServerFrame>,\n ): Promise<boolean> {\n try {\n const encodedFrames: string[] = [];\n const followUpActions: EDAWebSocketDeliveryAction[] = [];\n for (const frame of frames) {\n const projected =\n state.projectionState === undefined\n ? undefined\n : this.options.webSocketProjection?.encodeServerFrame(frame, state.projectionState);\n if (state.projectionState !== undefined && projected === undefined) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return false;\n }\n if (projected?._tag === \"SuppressAndAck\") {\n if (frame._tag !== \"events\") {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"protocol\");\n return false;\n }\n state.projectionState = projected.state;\n const acknowledged = onHostSuppressedFrame(\n state.delivery,\n {\n durableThroughSeq: frame.durableThroughSeq,\n frameId: frame.frameId,\n },\n Date.now(),\n );\n state.delivery = acknowledged.state;\n followUpActions.push(\n ...acknowledged.actions.filter((action) => action._tag !== \"Persist\"),\n );\n continue;\n }\n if (projected !== undefined) state.projectionState = projected.state;\n const encoded =\n projected?._tag === \"Send\"\n ? projected.frame\n : encodeEDAWebSocketServerFrame(frame, this.options.webSocketProtocol);\n if (new TextEncoder().encode(encoded).byteLength > state.delivery.policy.maxFrameBytes) {\n this.close(webSocket, EDA_WS_CLOSE_PROTOCOL_ERROR, \"frame-too-large\");\n return false;\n }\n encodedFrames.push(encoded);\n }\n // Projection encoders may update app-owned state. Persist that state\n // before publishing any frame so eviction cannot roll the projection\n // back behind the client-visible stream.\n if (state.projectionState !== undefined && !this.persist(webSocket, state)) return false;\n for (const encoded of encodedFrames) webSocket.send(encoded);\n if (followUpActions.length > 0) {\n return await this.interpret(webSocket, state, {\n state: state.delivery,\n actions: coalesceFollowUpActions(followUpActions),\n });\n }\n return true;\n } catch {\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"send-failed\");\n return false;\n }\n }\n\n private enqueue(\n webSocket: WebSocket,\n state: EventWebSocketState<ProjectionState>,\n operation: () => Promise<void>,\n ): Promise<void> {\n const run = async (): Promise<void> => {\n try {\n await operation();\n } catch (error) {\n await Effect.runPromise(\n Effect.logError(\"EDA WebSocket operation failed\", {\n error,\n subscriberId: state.subscriberId,\n }),\n );\n this.close(webSocket, EDA_WS_CLOSE_SEND_FAILED, \"subscriber-failed\");\n }\n };\n const next = state.queue.then(run);\n state.queue = next;\n return next;\n }\n\n private close(webSocket: WebSocket, code: number, reason: string): void {\n this.sockets.delete(webSocket);\n try {\n webSocket.close(code, reason);\n } catch {\n // Closing and already-closed sockets can still be returned by getWebSockets().\n }\n }\n\n private decodeClientMessage(\n message: string,\n state: EventWebSocketState<ProjectionState>,\n ): Effect.Effect<EDAWebSocketClientFrame, unknown> {\n return state.projectionState === undefined\n ? decodeEDAWebSocketClientMessage(message)\n : (this.options.webSocketProjection?.decodeClientMessage(message) ?? Effect.fail(\"protocol\"));\n }\n\n private async decodeProjectionState(\n id: string,\n encoded: unknown,\n ): Promise<ProjectionState | undefined> {\n const projection = this.resolveProjection(id);\n if (projection === undefined) return undefined;\n const decoded = await Effect.runPromise(projection.decodeState(encoded).pipe(Effect.option));\n return decoded._tag === \"Some\" ? decoded.value : undefined;\n }\n}\n\nconst coalesceFollowUpActions = (\n actions: ReadonlyArray<EDAWebSocketDeliveryAction>,\n): ReadonlyArray<EDAWebSocketDeliveryAction> => {\n let readAfterSeq: SequenceNumber | undefined;\n const retained: EDAWebSocketDeliveryAction[] = [];\n for (const action of actions) {\n if (action._tag !== \"ReadEventPage\") {\n retained.push(action);\n continue;\n }\n readAfterSeq = SequenceNumber.make(Math.max(readAfterSeq ?? 0, action.afterSeq));\n }\n return readAfterSeq === undefined\n ? retained\n : [...retained, { _tag: \"ReadEventPage\", afterSeq: readAfterSeq }];\n};\n","import * as Effect from \"effect/Effect\";\nimport type * as Tracer from \"effect/Tracer\";\n\nimport type { DurableTranscriptMessage } from \"effect-durable-agent/domain/message-transcript\";\nimport type {\n CommittedCommandTerminalEvent,\n EDARuntimeShape,\n} from \"effect-durable-agent/services/runtime\";\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport type { CommittedDurableEvent } from \"effect-durable-agent/services/session-store\";\nimport type { EDASubmittable } from \"effect-durable-agent/services/session-state\";\nimport { compactSpanAttributes, toEdaExternalSpan } from \"effect-durable-agent/services/tracing\";\nimport type { EDACommand, GrantRunCommand } from \"effect-durable-agent/types/commands\";\nimport type { RunGrantResult, RunRequestOutcome } from \"effect-durable-agent/domain/run-scheduling\";\nimport {\n CommandId,\n SequenceNumber,\n SessionId,\n type RunRequestId,\n} from \"effect-durable-agent/types/core\";\nimport {\n makeRootEDATraceMetadata,\n type EDATraceMetadata,\n} from \"effect-durable-agent/types/tracing\";\nimport { EDASessionRuntime, type EDASessionRuntimeOptions } from \"./runtime/session-runtime\";\nimport type { EDASessionDurableObjectStorage } from \"./runtime/runtime-layer\";\nimport { EDAWebSocketConnectionManager } from \"./websocket/connection-manager\";\nimport type { EDAWebSocketServerFrameEncoder } from \"effect-durable-agent/websocket\";\nimport type { EDAWebSocketProjection } from \"./websocket/projection\";\n\n/** Composition options for the session use cases and Cloudflare adapters. */\nexport interface EDASessionControllerOptions<ProjectionState extends object = never> extends Omit<\n EDASessionRuntimeOptions,\n \"sessionEventObserverLayer\"\n> {\n readonly getWebSockets?: () => ReadonlyArray<WebSocket>;\n readonly webSocketProjection?: EDAWebSocketProjection<ProjectionState>;\n readonly webSocketProtocol?: EDAWebSocketServerFrameEncoder;\n}\n\nexport interface EDASessionSubmitInput {\n readonly command: EDACommand;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionSubmitBatchInput {\n readonly items: ReadonlyArray<EDASubmittable>;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionBlockOnCommandInput {\n readonly afterSeq?: SequenceNumber;\n readonly commandId: CommandId;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionScopedInput {\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\nexport interface EDASessionEventsInput {\n readonly afterSeq?: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace?: EDATraceMetadata;\n}\n\n/** Prepared acceptance state created before a Cloudflare socket is registered. */\nexport interface EDAPreparedEventWebSocket<ProjectionState extends object = never> {\n readonly afterSeq: SequenceNumber;\n readonly sessionId: SessionId;\n readonly trace: EDATraceMetadata;\n readonly projectionState?: ProjectionState;\n}\n\n/**\n * Public application-facing use cases for one EDA session.\n *\n * Runtime lifecycle belongs to EDASessionRuntime; WebSocket transport belongs\n * to EDAWebSocketConnectionManager. This class only coordinates them.\n */\nexport class EDASessionController<ProjectionState extends object = never> {\n private readonly runtime: EDASessionRuntime;\n private readonly webSockets: EDAWebSocketConnectionManager<ProjectionState>;\n\n constructor(options: EDASessionControllerOptions<ProjectionState>) {\n this.webSockets = new EDAWebSocketConnectionManager({\n getWebSockets: options.getWebSockets,\n isSessionReady: (sessionId) => this.runtime.isReady(sessionId),\n prepareSession: (sessionId) => this.prepareSession(sessionId),\n readEventPage: async ({ afterSeq, limit, sessionId, subscriberId, trace }) =>\n await this.runtime.run(sessionId, (eda) =>\n eda.readEventPage(afterSeq, limit).pipe(\n Effect.withSpan(\n \"agent.events.page\",\n hostSpanOptions(trace, {\n \"eda.session.id\": sessionId,\n \"eda.subscriber.id\": subscriberId,\n \"eda.seq.after\": afterSeq,\n }),\n ),\n ),\n ),\n webSocketProjection: options.webSocketProjection,\n webSocketProtocol: options.webSocketProtocol,\n });\n this.runtime = new EDASessionRuntime({\n ...options,\n sessionEventObserverLayer: this.webSockets.observerLayer,\n });\n }\n\n static readonly migrate = EDASessionRuntime.migrate;\n\n /** Trusted reconciliation read; never submits or grants replacement work. */\n runRequestOutcome(\n input: EDASessionScopedInput & { readonly requestId: RunRequestId },\n ): Promise<RunRequestOutcome> {\n return this.run(input.sessionId, (eda) => eda.runRequestOutcome(input.requestId));\n }\n\n /** Trusted scheduler ingress. Hosts must authorize callers before invoking this method. */\n grantRun(\n input: EDASessionScopedInput & { readonly command: GrantRunCommand },\n ): Promise<RunGrantResult> {\n const parent = input.trace?.parent;\n return this.run(input.sessionId, (eda) => {\n const operation = eda.grantRun(input.command);\n return parent === undefined || parent === null\n ? operation\n : operation.pipe(Effect.withParentSpan(toEdaExternalSpan(parent)));\n });\n }\n\n submit(input: EDASessionSubmitInput): Promise<CommittedDurableEvent> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.submit(input.command).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 submitBatch(input: EDASessionSubmitBatchInput): Promise<ReadonlyArray<CommittedDurableEvent>> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.submit(input.items).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 }),\n ),\n ),\n );\n }\n\n submitAndBlock(input: EDASessionSubmitInput): Promise<CommittedCommandTerminalEvent> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.submitAndBlock(input.command).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 blockOnCommand(input: EDASessionBlockOnCommandInput): Promise<CommittedCommandTerminalEvent> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n eda.blockOnCommand(input.commandId, input.afterSeq ?? SequenceNumber.make(0)).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 snapshot(input: EDASessionScopedInput): Promise<EDASessionSnapshot> {\n return this.query(input, (eda) => eda.snapshot(), \"agent.session.snapshot\");\n }\n\n messages(input: EDASessionScopedInput): Promise<ReadonlyArray<DurableTranscriptMessage>> {\n return this.query(input, (eda) => eda.messages(), \"agent.messages.list\");\n }\n\n acceptEventWebSocket(\n input: EDASessionEventsInput & {\n readonly projectionId?: string;\n readonly webSocket: WebSocket;\n },\n ): Promise<void> {\n return this.acceptEventWebSocketUnhosted(input);\n }\n\n private async acceptEventWebSocketUnhosted(\n input: EDASessionEventsInput & {\n readonly projectionId?: string;\n readonly webSocket: WebSocket;\n },\n ): Promise<void> {\n const prepared = await this.prepareEventWebSocket(input);\n await this.acceptPreparedEventWebSocket({ ...prepared, webSocket: input.webSocket });\n }\n\n async prepareEventWebSocket(\n input: EDASessionEventsInput & { readonly projectionId?: string },\n ): Promise<EDAPreparedEventWebSocket<ProjectionState>> {\n const projection = this.webSockets.resolveProjection(input.projectionId);\n if (input.projectionId !== undefined && projection === undefined) {\n throw new Error(`Unsupported EDA WebSocket projection: ${input.projectionId}`);\n }\n const initialized =\n projection === undefined\n ? undefined\n : projection.initialize({\n ...(input.afterSeq === undefined ? {} : { requestedAfterSeq: input.afterSeq }),\n snapshot: await this.snapshot({ sessionId: input.sessionId, trace: input.trace }),\n });\n return {\n afterSeq: initialized?.afterSeq ?? input.afterSeq ?? SequenceNumber.make(0),\n sessionId: input.sessionId,\n trace: input.trace ?? makeRootEDATraceMetadata(),\n ...(initialized === undefined ? {} : { projectionState: initialized.state }),\n };\n }\n\n acceptPreparedEventWebSocket(\n input: EDAPreparedEventWebSocket<ProjectionState> & { readonly webSocket: WebSocket },\n ): Promise<void> {\n return this.webSockets.accept(input);\n }\n\n webSocketMessage(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n return this.webSockets.message(webSocket, message);\n }\n\n webSocketClose(webSocket: WebSocket): void {\n this.webSockets.closed(webSocket);\n }\n\n webSocketError(webSocket: WebSocket): void {\n this.webSockets.closed(webSocket);\n }\n\n async destroy(_input: EDASessionScopedInput): Promise<void> {\n await this.runtime.destroy();\n }\n\n async alarm(input?: EDASessionScopedInput): Promise<void> {\n if (input !== undefined) await this.prepareSession(input.sessionId);\n await this.runtime.alarm(input?.sessionId);\n }\n\n dispose(): Promise<void> {\n return this.runtime.dispose();\n }\n\n private query<A>(\n input: EDASessionScopedInput,\n operation: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n spanName: string,\n ): Promise<A> {\n const trace = input.trace ?? makeRootEDATraceMetadata();\n return this.run(input.sessionId, (eda) =>\n operation(eda).pipe(\n Effect.withSpan(spanName, hostSpanOptions(trace, { \"eda.session.id\": input.sessionId })),\n ),\n );\n }\n\n private async prepareSession(sessionId: SessionId): Promise<void> {\n await this.runtime.prepare(sessionId);\n await this.webSockets.flushDeferredCatchUp(sessionId);\n }\n\n private async run<A>(\n sessionId: SessionId,\n operation: (runtime: EDARuntimeShape) => Effect.Effect<A, unknown>,\n ): Promise<A> {\n await this.prepareSession(sessionId);\n return await this.runtime.run(sessionId, operation);\n }\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\nexport type { EDASessionDurableObjectStorage };\n"],"mappings":"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"}