effect-durable-agent-cloudflare 0.1.0-alpha.16 → 0.1.0-alpha.18

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,11 +1,11 @@
1
- import { decodeEdaRpcCommand, decodeEdaRpcSubmittables, encodeEdaRpcDurableEvent } from "./rpc.js";
2
- import { t as EDASessionController } from "./session-controller-C31DhUNp.js";
3
- import { DurableObject } from "cloudflare:workers";
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-tQLRNg45.js";
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";
6
- import { EDACommand, GrantRunCommand } from "effect-durable-agent/types/commands";
7
6
  import { CommandId, RunRequestId, SequenceNumber, SessionId } from "effect-durable-agent/types/core";
8
7
  import { EDATraceMetadata, makeEDATraceMetadataFromParent, makeRootEDATraceMetadata, parseEDATraceparent } from "effect-durable-agent/types/tracing";
8
+ import { DurableObject } from "cloudflare:workers";
9
9
  import { EDA_WEB_SOCKET_PING_MESSAGE, EDA_WEB_SOCKET_PONG_MESSAGE } from "effect-durable-agent/websocket";
10
10
  //#region src/durable-object.ts
11
11
  /** Internal Worker-to-object header selecting an app-owned WebSocket projection. */
@@ -69,63 +69,77 @@ var EDASessionDurableObject = class extends DurableObject {
69
69
  webSocket: client
70
70
  });
71
71
  }
72
- async submit(input) {
72
+ async submit(raw) {
73
+ const input = Schema.decodeUnknownSync(SessionCommandInput)(raw);
73
74
  return encodeEdaRpcCommittedDurableEvent(await this.#controller.submit({
74
- command: await decodeCommand(input.command),
75
+ command: input.command,
75
76
  sessionId: this.parseSessionId(input.sessionId),
76
77
  trace: decodeTraceMetadata(input.trace)
77
78
  }));
78
79
  }
79
80
  /** Reconcile lost grant replies from durable request and run facts. */
80
- async runRequestOutcome(input) {
81
- return await this.#controller.runRequestOutcome({
81
+ async runRequestOutcome(raw) {
82
+ const input = Schema.decodeUnknownSync(SessionOutcomeInput)(raw);
83
+ const result = await this.#controller.runRequestOutcome({
82
84
  requestId: Schema.decodeUnknownSync(RunRequestId)(input.requestId),
83
85
  sessionId: this.parseSessionId(input.sessionId),
84
86
  trace: decodeTraceMetadata(input.trace)
85
87
  });
88
+ return Schema.encodeSync(edaSessionRpc.runRequestOutcome.output)(result);
86
89
  }
87
90
  /** Trusted RPC only: the calling Worker owns scheduler authentication and authorization. */
88
- async grantRun(input) {
89
- const command = Schema.decodeUnknownSync(GrantRunCommand)(input.command);
90
- return await this.#controller.grantRun({
91
+ async grantRun(raw) {
92
+ const input = Schema.decodeUnknownSync(SessionGrantRunInput)(raw);
93
+ const command = input.command;
94
+ const result = await this.#controller.grantRun({
91
95
  command,
92
96
  sessionId: this.parseSessionId(input.sessionId),
93
97
  trace: decodeTraceMetadata(input.trace)
94
98
  });
99
+ return Schema.encodeSync(edaSessionRpc.grantRun.output)(result);
95
100
  }
96
- async submitBatch(input) {
101
+ async submitBatch(raw) {
102
+ const input = Schema.decodeUnknownSync(SessionBatchInput)(raw);
97
103
  return (await this.#controller.submitBatch({
98
- items: await decodeSubmittables(input.items),
104
+ items: input.items,
99
105
  sessionId: this.parseSessionId(input.sessionId),
100
106
  trace: decodeTraceMetadata(input.trace)
101
107
  })).map(encodeEdaRpcCommittedDurableEvent);
102
108
  }
103
- async submitAndBlock(input) {
104
- return encodeEdaRpcCommittedDurableEvent(await this.#controller.submitAndBlock({
105
- command: await decodeCommand(input.command),
109
+ async submitAndBlock(raw) {
110
+ const input = Schema.decodeUnknownSync(SessionCommandInput)(raw);
111
+ const committed = await this.#controller.submitAndBlock({
112
+ command: input.command,
106
113
  sessionId: this.parseSessionId(input.sessionId),
107
114
  trace: decodeTraceMetadata(input.trace)
108
- }));
115
+ });
116
+ return Schema.encodeSync(edaSessionRpc.submitAndBlock.output)(committed);
109
117
  }
110
- async blockOnCommand(input) {
111
- return encodeEdaRpcCommittedDurableEvent(await this.#controller.blockOnCommand({
118
+ async blockOnCommand(raw) {
119
+ const input = Schema.decodeUnknownSync(SessionBlockInput)(raw);
120
+ const committed = await this.#controller.blockOnCommand({
112
121
  ...input.afterSeq === void 0 ? {} : { afterSeq: SequenceNumber.make(input.afterSeq) },
113
122
  commandId: CommandId.make(input.commandId),
114
123
  sessionId: this.parseSessionId(input.sessionId),
115
124
  trace: decodeTraceMetadata(input.trace)
116
- }));
125
+ });
126
+ return Schema.encodeSync(edaSessionRpc.blockOnCommand.output)(committed);
117
127
  }
118
- async snapshot(input) {
119
- return encodeEdaRpcSessionSnapshot(await this.#controller.snapshot({
128
+ async snapshot(raw) {
129
+ const input = Schema.decodeUnknownSync(SessionScopedInput)(raw);
130
+ const snapshot = await this.#controller.snapshot({
120
131
  sessionId: this.parseSessionId(input.sessionId),
121
132
  trace: decodeTraceMetadata(input.trace)
122
- }));
133
+ });
134
+ return Schema.encodeSync(edaSessionRpc.snapshot.output)(snapshot);
123
135
  }
124
- async messages(input) {
125
- return await this.#controller.messages({
136
+ async messages(raw) {
137
+ const input = Schema.decodeUnknownSync(SessionScopedInput)(raw);
138
+ const result = await this.#controller.messages({
126
139
  sessionId: this.parseSessionId(input.sessionId),
127
140
  trace: decodeTraceMetadata(input.trace)
128
141
  });
142
+ return Schema.encodeSync(edaSessionRpc.messages.output)(result);
129
143
  }
130
144
  async webSocketMessage(webSocket, message) {
131
145
  await this.#controller.webSocketMessage(webSocket, message);
@@ -136,7 +150,8 @@ var EDASessionDurableObject = class extends DurableObject {
136
150
  async webSocketError(webSocket, _error) {
137
151
  this.#controller.webSocketError(webSocket);
138
152
  }
139
- async destroySession(input) {
153
+ async destroySession(raw) {
154
+ const input = Schema.decodeUnknownSync(SessionScopedInput)(raw);
140
155
  await this.#controller.destroy({
141
156
  sessionId: this.parseSessionId(input.sessionId),
142
157
  trace: decodeTraceMetadata(input.trace)
@@ -178,32 +193,13 @@ const edaRuntimeConfig = (input) => ({
178
193
  ...input.maxToolCallsPerRun === void 0 ? {} : { maxToolCallsPerRun: input.maxToolCallsPerRun },
179
194
  ...input.systemPrompt === void 0 ? {} : { systemPrompt: input.systemPrompt }
180
195
  });
181
- /** Encode committed events into structured-clone-safe Durable Object RPC payloads. */
182
- const encodeEdaRpcCommittedDurableEvent = (event) => ({
183
- position: event.position,
184
- event: encodeEdaRpcDurableEvent(event.event)
196
+ /** Encode committed events into the existing structured-clone envelope. */
197
+ const encodeEdaRpcCommittedDurableEvent = (entry) => ({
198
+ position: entry.position,
199
+ event: encodeEdaRpcDurableEvent(durableEventEnvelope(entry.event))
185
200
  });
186
- /** Encode runtime snapshots into structured-clone-safe Durable Object RPC payloads. */
187
- const encodeEdaRpcSessionSnapshot = (snapshot) => ({
188
- ...snapshot,
189
- reducerStates: new Map(snapshot.reducerStates),
190
- state: {
191
- ...snapshot.state,
192
- commands: new Map(Array.from(snapshot.state.commands, ([commandId, record]) => [commandId, encodeCommandCarrierForRpc(record)])),
193
- commandQueues: {
194
- ...snapshot.state.commandQueues,
195
- activeControlCommands: snapshot.state.commandQueues.activeControlCommands.map(encodeCommandCarrierForRpc),
196
- pendingCommands: snapshot.state.commandQueues.pendingCommands.map(encodeCommandCarrierForRpc),
197
- queuedCommands: snapshot.state.commandQueues.queuedCommands.map(encodeCommandCarrierForRpc)
198
- }
199
- }
200
- });
201
- const encodeCommandCarrierForRpc = (value) => value.command === void 0 ? value : {
202
- ...value,
203
- command: Schema.encodeSync(EDACommand)(value.command)
204
- };
205
- const decodeCommand = (input) => Effect.runPromise(decodeEdaRpcCommand(input));
206
- const decodeSubmittables = (input) => Effect.runPromise(decodeEdaRpcSubmittables(input));
201
+ /** Encode query snapshots without asserting that encoded command values are decoded classes. */
202
+ const encodeEdaRpcSessionSnapshot = Schema.encodeSync(edaSessionRpc.snapshot.output);
207
203
  //#endregion
208
204
  export { EDASessionDurableObject, EDA_WEB_SOCKET_PROJECTION_HEADER, edaRuntimeConfig, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcSessionSnapshot, getEDASessionDurableObjectByName };
209
205
 
@@ -1 +1 @@
1
- {"version":3,"file":"durable-object.js","names":["#controller","#webSocketProjectionId"],"sources":["../src/durable-object.ts"],"sourcesContent":["import { DurableObject } from \"cloudflare:workers\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport type { DurableTranscriptMessage } from \"effect-durable-agent/domain/message-transcript\";\nimport {\n decodeEdaRpcCommand,\n decodeEdaRpcSubmittables,\n encodeEdaRpcDurableEvent,\n} from \"./rpc-codec\";\nimport type { EDASessionSnapshot } from \"effect-durable-agent/services/session-query\";\nimport type { CommittedDurableEvent as CommittedDurableEventValue } from \"effect-durable-agent/services/session-store\";\nimport type {\n CommittedCommandTerminalEvent,\n EDARuntimeConfig,\n} from \"effect-durable-agent/services/runtime\";\nimport {\n EDACommand,\n GrantRunCommand,\n type EDACommand as EDACommandValue,\n} from \"effect-durable-agent/types/commands\";\nimport type { RunGrantResult, RunRequestOutcome } from \"effect-durable-agent/domain/run-scheduling\";\nimport type { EDASubmittable } from \"effect-durable-agent/services/session-state\";\nimport {\n CommandId,\n RunRequestId,\n SequenceNumber,\n SessionId,\n} from \"effect-durable-agent/types/core\";\nimport {\n EDATraceMetadata,\n makeEDATraceMetadataFromParent,\n makeRootEDATraceMetadata,\n parseEDATraceparent,\n} from \"effect-durable-agent/types/tracing\";\nimport {\n EDASessionController,\n type EDASessionControllerOptions,\n type EDASessionDurableObjectStorage,\n} from \"./session-controller\";\nimport {\n EDA_WEB_SOCKET_PING_MESSAGE,\n EDA_WEB_SOCKET_PONG_MESSAGE,\n} from \"effect-durable-agent/websocket\";\nexport type { EDAWebSocketProjection } from \"./websocket/projection\";\n/** Internal Worker-to-object header selecting an app-owned WebSocket projection. */\nexport const EDA_WEB_SOCKET_PROJECTION_HEADER = \"x-eda-websocket-projection\";\n\n/** Raw RPC shape decoded before admitting one session command. */\nexport interface EDASessionCommandRpcInput {\n readonly command: unknown;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Trusted Worker-to-object scheduler callback; never exposed as ordinary user ingress. */\nexport interface EDASessionGrantRunRpcInput {\n readonly command: unknown;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape decoded before admitting a durable command/app-event batch. */\nexport interface EDASessionSubmitBatchRpcInput {\n readonly items: ReadonlyArray<unknown>;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape for read/destroy operations that only need a session id. */\nexport interface EDASessionScopedRpcInput {\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape for WebSocket event-stream upgrades with a resume cursor. */\nexport interface EDASessionEventsRpcInput {\n readonly afterSeq?: number;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw RPC shape decoded before blocking on one command terminal event. */\nexport interface EDASessionBlockOnCommandRpcInput {\n readonly afterSeq?: number;\n readonly commandId: string;\n readonly sessionId: string;\n readonly trace: unknown;\n}\n\n/** Raw identity decoded at the trusted reconciliation RPC boundary. */\nexport interface EDASessionRunRequestOutcomeRpcInput extends EDASessionScopedRpcInput {\n readonly requestId: string;\n}\n\n/** EDA RPC methods required by the session namespace helper. */\nexport interface EDASessionRpcSurface {\n readonly runRequestOutcome: (\n input: EDASessionRunRequestOutcomeRpcInput,\n ) => Promise<RunRequestOutcome>;\n readonly grantRun: (input: EDASessionGrantRunRpcInput) => Promise<RunGrantResult>;\n readonly submit: (input: EDASessionCommandRpcInput) => Promise<CommittedDurableEventValue>;\n readonly submitBatch: (\n input: EDASessionSubmitBatchRpcInput,\n ) => Promise<ReadonlyArray<CommittedDurableEventValue>>;\n readonly submitAndBlock: (\n input: EDASessionCommandRpcInput,\n ) => Promise<CommittedCommandTerminalEvent>;\n readonly blockOnCommand: (\n input: EDASessionBlockOnCommandRpcInput,\n ) => Promise<CommittedCommandTerminalEvent>;\n readonly snapshot: (input: EDASessionScopedRpcInput) => Promise<EDASessionSnapshot>;\n readonly messages: (\n input: EDASessionScopedRpcInput,\n ) => Promise<ReadonlyArray<DurableTranscriptMessage>>;\n readonly destroySession: (input: EDASessionScopedRpcInput) => Promise<void>;\n}\n\n/** Constructor options for concrete app subclasses of the EDA Durable Object base. */\nexport type EDASessionDurableObjectOptions<ProjectionState extends object = never> = Omit<\n EDASessionControllerOptions<ProjectionState>,\n \"background\" | \"getWebSockets\" | \"storage\"\n>;\n\n/** Resolve a concrete EDA session Durable Object binding by domain session id. */\nexport const getEDASessionDurableObjectByName = <\n T extends Rpc.DurableObjectBranded & EDASessionRpcSurface,\n>(\n namespace: DurableObjectNamespace<T>,\n sessionId: string,\n): DurableObjectStub<T> => namespace.getByName(sessionId);\n\n/**\n * Base class for raw Cloudflare Durable Object hosts of one EDA session.\n *\n * Concrete products should extend this class, pass provider/tool layers from\n * their own constructor, and register only that subclass in Wrangler. The base\n * class is deliberately not exported from `workers/app.ts` and owns no binding\n * name or routing convention.\n */\nexport abstract class EDASessionDurableObject<\n EnvType extends object = object,\n ProjectionState extends object = never,\n> extends DurableObject<EnvType> {\n readonly #controller: EDASessionController<ProjectionState>;\n readonly #webSocketProjectionId: string | undefined;\n\n protected constructor(\n ctx: DurableObjectState,\n env: EnvType,\n options: EDASessionDurableObjectOptions<ProjectionState>,\n ) {\n super(ctx, env);\n this.#webSocketProjectionId = options.webSocketProjection?.id;\n const storage = toEDASessionStorage(this.ctx.storage);\n this.#controller = new EDASessionController({\n ...options,\n background: this.ctx,\n getWebSockets: () => this.ctx.getWebSockets(),\n storage,\n });\n\n // Answer client liveness pings at the runtime layer so idle sockets never\n // wake a hibernated object.\n this.ctx.setWebSocketAutoResponse(\n new WebSocketRequestResponsePair(EDA_WEB_SOCKET_PING_MESSAGE, EDA_WEB_SOCKET_PONG_MESSAGE),\n );\n\n this.ctx.blockConcurrencyWhile(async () => {\n await Effect.runPromise(EDASessionController.migrate(storage));\n });\n }\n\n async fetch(request: Request): Promise<Response> {\n const upgrade = request.headers.get(\"Upgrade\");\n if (upgrade?.toLowerCase() !== \"websocket\") {\n return new Response(\"Expected WebSocket upgrade.\", { status: 426 });\n }\n\n const url = new URL(request.url);\n const sessionIdRaw = url.searchParams.get(\"sessionId\");\n if (sessionIdRaw === null) {\n return new Response(\"Missing sessionId.\", { status: 400 });\n }\n const afterSeqRaw = url.searchParams.get(\"afterSeq\");\n const afterSeq = afterSeqRaw === null ? undefined : Number(afterSeqRaw);\n if (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {\n return new Response(\"Invalid afterSeq.\", { status: 400 });\n }\n const projectionId = request.headers.get(EDA_WEB_SOCKET_PROJECTION_HEADER) ?? undefined;\n if (projectionId !== undefined && projectionId !== this.#webSocketProjectionId) {\n return new Response(\"Unsupported WebSocket projection.\", { status: 400 });\n }\n\n const sessionId = this.parseSessionId(sessionIdRaw);\n const trace = traceMetadataFromRequest(request);\n const prepared = await this.#controller.prepareEventWebSocket({\n ...(afterSeq === undefined ? {} : { afterSeq: SequenceNumber.make(afterSeq) }),\n sessionId,\n trace,\n ...(projectionId === undefined ? {} : { projectionId }),\n });\n\n const pair = new WebSocketPair();\n const client = pair[0];\n const server = pair[1];\n this.ctx.acceptWebSocket(server);\n await this.#controller.acceptPreparedEventWebSocket({\n ...prepared,\n webSocket: server,\n });\n return new Response(null, { status: 101, webSocket: client });\n }\n\n async submit(input: EDASessionCommandRpcInput): Promise<CommittedDurableEventValue> {\n const committed = await this.#controller.submit({\n command: await decodeCommand(input.command),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed);\n }\n\n /** Reconcile lost grant replies from durable request and run facts. */\n async runRequestOutcome(input: EDASessionRunRequestOutcomeRpcInput): Promise<RunRequestOutcome> {\n return await this.#controller.runRequestOutcome({\n requestId: Schema.decodeUnknownSync(RunRequestId)(input.requestId),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n }\n\n /** Trusted RPC only: the calling Worker owns scheduler authentication and authorization. */\n async grantRun(input: EDASessionGrantRunRpcInput): Promise<RunGrantResult> {\n const command = Schema.decodeUnknownSync(GrantRunCommand)(input.command);\n const result = await this.#controller.grantRun({\n command,\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return result;\n }\n\n async submitBatch(\n input: EDASessionSubmitBatchRpcInput,\n ): Promise<ReadonlyArray<CommittedDurableEventValue>> {\n const committed = await this.#controller.submitBatch({\n items: await decodeSubmittables(input.items),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return committed.map(encodeEdaRpcCommittedDurableEvent);\n }\n\n async submitAndBlock(input: EDASessionCommandRpcInput): Promise<CommittedCommandTerminalEvent> {\n const committed = await this.#controller.submitAndBlock({\n command: await decodeCommand(input.command),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed) as CommittedCommandTerminalEvent;\n }\n\n async blockOnCommand(\n input: EDASessionBlockOnCommandRpcInput,\n ): Promise<CommittedCommandTerminalEvent> {\n const committed = await this.#controller.blockOnCommand({\n ...(input.afterSeq === undefined ? {} : { afterSeq: SequenceNumber.make(input.afterSeq) }),\n commandId: CommandId.make(input.commandId),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed) as CommittedCommandTerminalEvent;\n }\n\n async snapshot(input: EDASessionScopedRpcInput): Promise<EDASessionSnapshot> {\n const snapshot = await this.#controller.snapshot({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcSessionSnapshot(snapshot);\n }\n\n async messages(\n input: EDASessionScopedRpcInput,\n ): Promise<ReadonlyArray<DurableTranscriptMessage>> {\n return await this.#controller.messages({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n }\n\n async webSocketMessage(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n await this.#controller.webSocketMessage(webSocket, message);\n }\n\n async webSocketClose(\n webSocket: WebSocket,\n _code: number,\n _reason: string,\n _wasClean: boolean,\n ): Promise<void> {\n this.#controller.webSocketClose(webSocket);\n }\n\n async webSocketError(webSocket: WebSocket, _error: unknown): Promise<void> {\n this.#controller.webSocketError(webSocket);\n }\n\n async destroySession(input: EDASessionScopedRpcInput): Promise<void> {\n await this.#controller.destroy({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n await this.ctx.storage.deleteAlarm();\n await this.ctx.storage.deleteAll();\n }\n\n async alarm(): Promise<void> {\n const sessionId = this.sessionIdFromObjectName();\n await this.#controller.alarm(\n sessionId === undefined ? undefined : { sessionId, trace: makeRootEDATraceMetadata() },\n );\n }\n\n private parseSessionId(input: string): SessionId {\n const sessionId = SessionId.make(input);\n const objectName = this.ctx.id.name;\n if (objectName !== undefined && objectName !== sessionId) {\n throw new Error(`EDA Durable Object name ${objectName} cannot serve session ${sessionId}`);\n }\n return sessionId;\n }\n\n private sessionIdFromObjectName(): SessionId | undefined {\n return this.ctx.id.name === undefined ? undefined : SessionId.make(this.ctx.id.name);\n }\n}\n\nconst toEDASessionStorage = (storage: DurableObjectStorage): EDASessionDurableObjectStorage => {\n // SAFETY: the adapter interface is the exact SQL, transaction, and alarm subset\n // of DurableObjectStorage; its looser row generic also supports test implementations.\n return storage as EDASessionDurableObjectStorage;\n};\n\nconst decodeTraceMetadata = (input: unknown): EDATraceMetadata =>\n Schema.decodeUnknownSync(EDATraceMetadata)(input);\n\nconst traceMetadataFromRequest = (request: Request): EDATraceMetadata => {\n const parent = parseEDATraceparent(\n request.headers.get(\"traceparent\"),\n request.headers.get(\"tracestate\"),\n );\n return parent === null ? makeRootEDATraceMetadata() : makeEDATraceMetadataFromParent(parent);\n};\n\n/** Convenience config constructor for subclasses that need only provider/model ids. */\nexport const edaRuntimeConfig = (input: {\n readonly maxToolCallsPerRun?: number;\n readonly modelId: string;\n readonly provider: string;\n readonly systemPrompt?: string;\n}): EDARuntimeConfig => ({\n modelSelection: { modelId: input.modelId, provider: input.provider },\n ...(input.maxToolCallsPerRun === undefined\n ? {}\n : { maxToolCallsPerRun: input.maxToolCallsPerRun }),\n ...(input.systemPrompt === undefined ? {} : { systemPrompt: input.systemPrompt }),\n});\n\n/** Encode committed events into structured-clone-safe Durable Object RPC payloads. */\nexport const encodeEdaRpcCommittedDurableEvent = (\n event: CommittedDurableEventValue,\n): CommittedDurableEventValue => ({\n position: event.position,\n event: encodeEdaRpcDurableEvent(event.event),\n});\n\n/** Encode runtime snapshots into structured-clone-safe Durable Object RPC payloads. */\nexport const encodeEdaRpcSessionSnapshot = (snapshot: EDASessionSnapshot): EDASessionSnapshot => ({\n ...snapshot,\n reducerStates: new Map(snapshot.reducerStates),\n state: {\n ...snapshot.state,\n commands: new Map(\n Array.from(snapshot.state.commands, ([commandId, record]) => [\n commandId,\n encodeCommandCarrierForRpc(record),\n ]),\n ),\n commandQueues: {\n ...snapshot.state.commandQueues,\n activeControlCommands: snapshot.state.commandQueues.activeControlCommands.map(\n encodeCommandCarrierForRpc,\n ),\n pendingCommands: snapshot.state.commandQueues.pendingCommands.map(encodeCommandCarrierForRpc),\n queuedCommands: snapshot.state.commandQueues.queuedCommands.map(encodeCommandCarrierForRpc),\n },\n },\n});\n\nconst encodeCommandCarrierForRpc = <A extends { readonly command?: EDACommandValue }>(\n value: A,\n): A =>\n value.command === undefined\n ? value\n : {\n ...value,\n command: Schema.encodeSync(EDACommand)(value.command) as EDACommandValue,\n };\n\nconst decodeCommand = (input: unknown): Promise<EDACommandValue> =>\n Effect.runPromise(decodeEdaRpcCommand(input));\n\nconst decodeSubmittables = (\n input: ReadonlyArray<unknown>,\n): Promise<ReadonlyArray<EDASubmittable>> => Effect.runPromise(decodeEdaRpcSubmittables(input));\n"],"mappings":"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"}
1
+ {"version":3,"file":"durable-object.js","names":["#controller","#webSocketProjectionId"],"sources":["../src/durable-object.ts"],"sourcesContent":["import type { CommittedDurableEvent } from \"effect-durable-agent/services/session-store\";\nimport { durableEventEnvelope } from \"effect-durable-agent/types/events/durable\";\nimport { encodeEdaRpcDurableEvent } from \"./rpc-codec\";\nimport {\n SessionScopedInput,\n SessionCommandInput,\n SessionGrantRunInput,\n SessionBatchInput,\n SessionBlockInput,\n SessionOutcomeInput,\n edaSessionRpc,\n} from \"./rpc-spec\";\nimport { DurableObject } from \"cloudflare:workers\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport type { EDARuntimeConfig } from \"effect-durable-agent/services/runtime\";\nimport {\n CommandId,\n RunRequestId,\n SequenceNumber,\n SessionId,\n} from \"effect-durable-agent/types/core\";\nimport {\n EDATraceMetadata,\n makeEDATraceMetadataFromParent,\n makeRootEDATraceMetadata,\n parseEDATraceparent,\n} from \"effect-durable-agent/types/tracing\";\nimport {\n EDASessionController,\n type EDASessionControllerOptions,\n type EDASessionDurableObjectStorage,\n} from \"./session-controller\";\nimport {\n EDA_WEB_SOCKET_PING_MESSAGE,\n EDA_WEB_SOCKET_PONG_MESSAGE,\n} from \"effect-durable-agent/websocket\";\n\nexport type { EDAWebSocketProjection } from \"./websocket/projection\";\n/** Internal Worker-to-object header selecting an app-owned WebSocket projection. */\nexport const EDA_WEB_SOCKET_PROJECTION_HEADER = \"x-eda-websocket-projection\";\n\n/** Encoded session RPC inputs, decoded before invoking the controller. */\nexport type EDASessionCommandRpcInput = typeof SessionCommandInput.Encoded;\nexport type EDASessionGrantRunRpcInput = typeof SessionGrantRunInput.Encoded;\nexport type EDASessionSubmitBatchRpcInput = typeof SessionBatchInput.Encoded;\nexport type EDASessionScopedRpcInput = typeof SessionScopedInput.Encoded;\nexport type EDASessionEventsRpcInput = EDASessionScopedRpcInput & { readonly afterSeq?: number };\nexport type EDASessionBlockOnCommandRpcInput = typeof SessionBlockInput.Encoded;\nexport type EDASessionRunRequestOutcomeRpcInput = typeof SessionOutcomeInput.Encoded;\n\n/** EDA RPC methods required by the session namespace helper. */\nexport interface EDASessionRpcSurface {\n readonly runRequestOutcome: (\n input: EDASessionRunRequestOutcomeRpcInput,\n ) => Promise<typeof edaSessionRpc.runRequestOutcome.output.Encoded>;\n readonly grantRun: (\n input: EDASessionGrantRunRpcInput,\n ) => Promise<typeof edaSessionRpc.grantRun.output.Encoded>;\n readonly submit: (\n input: EDASessionCommandRpcInput,\n ) => Promise<typeof edaSessionRpc.submit.output.Encoded>;\n readonly submitBatch: (\n input: EDASessionSubmitBatchRpcInput,\n ) => Promise<typeof edaSessionRpc.submitBatch.output.Encoded>;\n readonly submitAndBlock: (\n input: EDASessionCommandRpcInput,\n ) => Promise<typeof edaSessionRpc.submitAndBlock.output.Encoded>;\n readonly blockOnCommand: (\n input: EDASessionBlockOnCommandRpcInput,\n ) => Promise<typeof edaSessionRpc.blockOnCommand.output.Encoded>;\n readonly snapshot: (\n input: EDASessionScopedRpcInput,\n ) => Promise<typeof edaSessionRpc.snapshot.output.Encoded>;\n readonly messages: (\n input: EDASessionScopedRpcInput,\n ) => Promise<typeof edaSessionRpc.messages.output.Encoded>;\n readonly destroySession: (\n input: EDASessionScopedRpcInput,\n ) => Promise<typeof edaSessionRpc.destroySession.output.Encoded>;\n}\n\n/** Constructor options for concrete app subclasses of the EDA Durable Object base. */\nexport type EDASessionDurableObjectOptions<ProjectionState extends object = never> = Omit<\n EDASessionControllerOptions<ProjectionState>,\n \"background\" | \"getWebSockets\" | \"storage\"\n>;\n\n/** Resolve a concrete EDA session Durable Object binding by domain session id. */\nexport const getEDASessionDurableObjectByName = <\n T extends Rpc.DurableObjectBranded & EDASessionRpcSurface,\n>(\n namespace: DurableObjectNamespace<T>,\n sessionId: string,\n): DurableObjectStub<T> => namespace.getByName(sessionId);\n\n/**\n * Base class for raw Cloudflare Durable Object hosts of one EDA session.\n *\n * Concrete products should extend this class, pass provider/tool layers from\n * their own constructor, and register only that subclass in Wrangler. The base\n * class is deliberately not exported from `workers/app.ts` and owns no binding\n * name or routing convention.\n */\nexport abstract class EDASessionDurableObject<\n EnvType extends object = object,\n ProjectionState extends object = never,\n> extends DurableObject<EnvType> {\n readonly #controller: EDASessionController<ProjectionState>;\n readonly #webSocketProjectionId: string | undefined;\n\n protected constructor(\n ctx: DurableObjectState,\n env: EnvType,\n options: EDASessionDurableObjectOptions<ProjectionState>,\n ) {\n super(ctx, env);\n this.#webSocketProjectionId = options.webSocketProjection?.id;\n const storage = toEDASessionStorage(this.ctx.storage);\n this.#controller = new EDASessionController({\n ...options,\n background: this.ctx,\n getWebSockets: () => this.ctx.getWebSockets(),\n storage,\n });\n\n // Answer client liveness pings at the runtime layer so idle sockets never\n // wake a hibernated object.\n this.ctx.setWebSocketAutoResponse(\n new WebSocketRequestResponsePair(EDA_WEB_SOCKET_PING_MESSAGE, EDA_WEB_SOCKET_PONG_MESSAGE),\n );\n\n this.ctx.blockConcurrencyWhile(async () => {\n await Effect.runPromise(EDASessionController.migrate(storage));\n });\n }\n\n async fetch(request: Request): Promise<Response> {\n const upgrade = request.headers.get(\"Upgrade\");\n if (upgrade?.toLowerCase() !== \"websocket\") {\n return new Response(\"Expected WebSocket upgrade.\", { status: 426 });\n }\n\n const url = new URL(request.url);\n const sessionIdRaw = url.searchParams.get(\"sessionId\");\n if (sessionIdRaw === null) {\n return new Response(\"Missing sessionId.\", { status: 400 });\n }\n const afterSeqRaw = url.searchParams.get(\"afterSeq\");\n const afterSeq = afterSeqRaw === null ? undefined : Number(afterSeqRaw);\n if (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {\n return new Response(\"Invalid afterSeq.\", { status: 400 });\n }\n const projectionId = request.headers.get(EDA_WEB_SOCKET_PROJECTION_HEADER) ?? undefined;\n if (projectionId !== undefined && projectionId !== this.#webSocketProjectionId) {\n return new Response(\"Unsupported WebSocket projection.\", { status: 400 });\n }\n\n const sessionId = this.parseSessionId(sessionIdRaw);\n const trace = traceMetadataFromRequest(request);\n const prepared = await this.#controller.prepareEventWebSocket({\n ...(afterSeq === undefined ? {} : { afterSeq: SequenceNumber.make(afterSeq) }),\n sessionId,\n trace,\n ...(projectionId === undefined ? {} : { projectionId }),\n });\n\n const pair = new WebSocketPair();\n const client = pair[0];\n const server = pair[1];\n this.ctx.acceptWebSocket(server);\n await this.#controller.acceptPreparedEventWebSocket({\n ...prepared,\n webSocket: server,\n });\n return new Response(null, { status: 101, webSocket: client });\n }\n\n async submit(\n raw: typeof SessionCommandInput.Encoded,\n ): Promise<typeof edaSessionRpc.submit.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionCommandInput)(raw);\n const committed = await this.#controller.submit({\n command: input.command,\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return encodeEdaRpcCommittedDurableEvent(committed);\n }\n\n /** Reconcile lost grant replies from durable request and run facts. */\n async runRequestOutcome(\n raw: typeof SessionOutcomeInput.Encoded,\n ): Promise<typeof edaSessionRpc.runRequestOutcome.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionOutcomeInput)(raw);\n const result = await this.#controller.runRequestOutcome({\n requestId: Schema.decodeUnknownSync(RunRequestId)(input.requestId),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return Schema.encodeSync(edaSessionRpc.runRequestOutcome.output)(result);\n }\n\n /** Trusted RPC only: the calling Worker owns scheduler authentication and authorization. */\n async grantRun(\n raw: typeof SessionGrantRunInput.Encoded,\n ): Promise<typeof edaSessionRpc.grantRun.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionGrantRunInput)(raw);\n const command = input.command;\n const result = await this.#controller.grantRun({\n command,\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return Schema.encodeSync(edaSessionRpc.grantRun.output)(result);\n }\n\n async submitBatch(\n raw: typeof SessionBatchInput.Encoded,\n ): Promise<typeof edaSessionRpc.submitBatch.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionBatchInput)(raw);\n const committed = await this.#controller.submitBatch({\n items: input.items,\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return committed.map(encodeEdaRpcCommittedDurableEvent);\n }\n\n async submitAndBlock(\n raw: typeof SessionCommandInput.Encoded,\n ): Promise<typeof edaSessionRpc.submitAndBlock.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionCommandInput)(raw);\n const committed = await this.#controller.submitAndBlock({\n command: input.command,\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return Schema.encodeSync(edaSessionRpc.submitAndBlock.output)(committed);\n }\n\n async blockOnCommand(\n raw: typeof SessionBlockInput.Encoded,\n ): Promise<typeof edaSessionRpc.blockOnCommand.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionBlockInput)(raw);\n const committed = await this.#controller.blockOnCommand({\n ...(input.afterSeq === undefined ? {} : { afterSeq: SequenceNumber.make(input.afterSeq) }),\n commandId: CommandId.make(input.commandId),\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return Schema.encodeSync(edaSessionRpc.blockOnCommand.output)(committed);\n }\n\n async snapshot(\n raw: typeof SessionScopedInput.Encoded,\n ): Promise<typeof edaSessionRpc.snapshot.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionScopedInput)(raw);\n const snapshot = await this.#controller.snapshot({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return Schema.encodeSync(edaSessionRpc.snapshot.output)(snapshot);\n }\n\n async messages(\n raw: typeof SessionScopedInput.Encoded,\n ): Promise<typeof edaSessionRpc.messages.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionScopedInput)(raw);\n const result = await this.#controller.messages({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n return Schema.encodeSync(edaSessionRpc.messages.output)(result);\n }\n\n async webSocketMessage(webSocket: WebSocket, message: string | ArrayBuffer): Promise<void> {\n await this.#controller.webSocketMessage(webSocket, message);\n }\n\n async webSocketClose(\n webSocket: WebSocket,\n _code: number,\n _reason: string,\n _wasClean: boolean,\n ): Promise<void> {\n this.#controller.webSocketClose(webSocket);\n }\n\n async webSocketError(webSocket: WebSocket, _error: unknown): Promise<void> {\n this.#controller.webSocketError(webSocket);\n }\n\n async destroySession(\n raw: typeof SessionScopedInput.Encoded,\n ): Promise<typeof edaSessionRpc.destroySession.output.Encoded> {\n const input = Schema.decodeUnknownSync(SessionScopedInput)(raw);\n await this.#controller.destroy({\n sessionId: this.parseSessionId(input.sessionId),\n trace: decodeTraceMetadata(input.trace),\n });\n await this.ctx.storage.deleteAlarm();\n await this.ctx.storage.deleteAll();\n }\n\n async alarm(): Promise<void> {\n const sessionId = this.sessionIdFromObjectName();\n await this.#controller.alarm(\n sessionId === undefined ? undefined : { sessionId, trace: makeRootEDATraceMetadata() },\n );\n }\n\n private parseSessionId(input: string): SessionId {\n const sessionId = SessionId.make(input);\n const objectName = this.ctx.id.name;\n if (objectName !== undefined && objectName !== sessionId) {\n throw new Error(`EDA Durable Object name ${objectName} cannot serve session ${sessionId}`);\n }\n return sessionId;\n }\n\n private sessionIdFromObjectName(): SessionId | undefined {\n return this.ctx.id.name === undefined ? undefined : SessionId.make(this.ctx.id.name);\n }\n}\n\nconst toEDASessionStorage = (storage: DurableObjectStorage): EDASessionDurableObjectStorage => {\n // SAFETY: the adapter interface is the exact SQL, transaction, and alarm subset\n // of DurableObjectStorage; its looser row generic also supports test implementations.\n return storage as EDASessionDurableObjectStorage;\n};\n\nconst decodeTraceMetadata = (input: unknown): EDATraceMetadata =>\n Schema.decodeUnknownSync(EDATraceMetadata)(input);\n\nconst traceMetadataFromRequest = (request: Request): EDATraceMetadata => {\n const parent = parseEDATraceparent(\n request.headers.get(\"traceparent\"),\n request.headers.get(\"tracestate\"),\n );\n return parent === null ? makeRootEDATraceMetadata() : makeEDATraceMetadataFromParent(parent);\n};\n\n/** Convenience config constructor for subclasses that need only provider/model ids. */\nexport const edaRuntimeConfig = (input: {\n readonly maxToolCallsPerRun?: number;\n readonly modelId: string;\n readonly provider: string;\n readonly systemPrompt?: string;\n}): EDARuntimeConfig => ({\n modelSelection: { modelId: input.modelId, provider: input.provider },\n ...(input.maxToolCallsPerRun === undefined\n ? {}\n : { maxToolCallsPerRun: input.maxToolCallsPerRun }),\n ...(input.systemPrompt === undefined ? {} : { systemPrompt: input.systemPrompt }),\n});\n\n/** Encode committed events into the existing structured-clone envelope. */\nexport const encodeEdaRpcCommittedDurableEvent = (\n entry: CommittedDurableEvent,\n): typeof edaSessionRpc.submit.output.Encoded => ({\n position: entry.position,\n event: encodeEdaRpcDurableEvent(durableEventEnvelope(entry.event)),\n});\n/** Encode query snapshots without asserting that encoded command values are decoded classes. */\nexport const encodeEdaRpcSessionSnapshot = Schema.encodeSync(edaSessionRpc.snapshot.output);\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { i as DurableObjectSqlStorage, n as DurableObjectSessionStoreOptions, r as DurableObjectSqlCursor, t as DurableObjectSessionStorage } from "./durable-object-storage-DCL2IyUe.js";
2
- 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-DibIX-C0.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-DZjBBd0T.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-xdQPy0NX.js";
3
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";
4
5
  import { EDAOpenAiModelConfig, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer } from "./openai.js";
5
- import { decodeEdaRpcCommand, decodeEdaRpcSubmittables, encodeEdaRpcCommand, encodeEdaRpcDurableEvent, encodeEdaRpcSubmittables } from "./rpc.js";
6
- export { DurableObjectSessionStorage, DurableObjectSessionStoreOptions, DurableObjectSqlCursor, DurableObjectSqlStorage, EDADurableObjectRuntimeLayerOptions, EDAOpenAiModelConfig, EDAPreparedEventWebSocket, EDASessionBlockOnCommandInput, EDASessionBlockOnCommandRpcInput, EDASessionCommandRpcInput, EDASessionController, EDASessionControllerOptions, EDASessionDurableObject, EDASessionDurableObjectOptions, EDASessionDurableObjectStorage, EDASessionEventsInput, EDASessionEventsRpcInput, EDASessionGrantRunRpcInput, EDASessionRpcSurface, EDASessionRunRequestOutcomeRpcInput, EDASessionScopedInput, EDASessionScopedRpcInput, EDASessionSubmitBatchInput, EDASessionSubmitBatchRpcInput, EDASessionSubmitInput, EDAWebSocketProjection, EDAWebSocketProjectionId, EDAWebSocketProjectionInitial, EDAWebSocketProjectionResult, EDA_WEB_SOCKET_PROJECTION_HEADER, decodeEdaRpcCommand, decodeEdaRpcSubmittables, edaRuntimeConfig, encodeEdaRpcCommand, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcDurableEvent, encodeEdaRpcSessionSnapshot, encodeEdaRpcSubmittables, getEDASessionDurableObjectByName, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer, makeEDADurableObjectRuntimeLayer };
6
+ import { a as encodeEdaRpcDurableEvent, i as encodeEdaRpcCommand, n as decodeEdaRpcCommand, o as encodeEdaRpcSubmittables, r as decodeEdaRpcSubmittables, t as EDARpcSubmittable } from "./rpc-codec-CmHoMpaA.js";
7
+ export { DurableObjectSessionStorage, DurableObjectSessionStoreOptions, DurableObjectSqlCursor, DurableObjectSqlStorage, EDADurableObjectRuntimeLayerOptions, EDAOpenAiModelConfig, EDAPreparedEventWebSocket, EDARpcSubmittable, EDASessionBlockOnCommandInput, EDASessionBlockOnCommandRpcInput, EDASessionCommandRpcInput, EDASessionController, EDASessionControllerOptions, EDASessionDurableObject, EDASessionDurableObjectOptions, EDASessionDurableObjectStorage, EDASessionEventsInput, EDASessionEventsRpcInput, EDASessionGrantRunRpcInput, EDASessionRpcSurface, EDASessionRunRequestOutcomeRpcInput, EDASessionScopedInput, EDASessionScopedRpcInput, EDASessionSubmitBatchInput, EDASessionSubmitBatchRpcInput, EDASessionSubmitInput, EDAWebSocketProjection, EDAWebSocketProjectionId, EDAWebSocketProjectionInitial, EDAWebSocketProjectionResult, EDA_WEB_SOCKET_PROJECTION_HEADER, SessionBatchInput, SessionBlockInput, SessionCommandInput, SessionGrantRunInput, SessionOutcomeInput, SessionScopedInput, decodeEdaRpcCommand, decodeEdaRpcSubmittables, edaRuntimeConfig, edaSessionRpc, encodeEdaRpcCommand, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcDurableEvent, encodeEdaRpcSessionSnapshot, encodeEdaRpcSubmittables, getEDASessionDurableObjectByName, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer, makeEDADurableObjectRuntimeLayer };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { decodeEdaRpcCommand, decodeEdaRpcSubmittables, encodeEdaRpcCommand, encodeEdaRpcDurableEvent, encodeEdaRpcSubmittables } from "./rpc.js";
2
- import { n as EDAWebSocketProjectionId, r as makeEDADurableObjectRuntimeLayer, t as EDASessionController } from "./session-controller-C31DhUNp.js";
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-tQLRNg45.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";
6
- export { EDASessionController, EDASessionDurableObject, EDAWebSocketProjectionId, EDA_WEB_SOCKET_PROJECTION_HEADER, decodeEdaRpcCommand, decodeEdaRpcSubmittables, edaRuntimeConfig, encodeEdaRpcCommand, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcDurableEvent, encodeEdaRpcSessionSnapshot, encodeEdaRpcSubmittables, getEDASessionDurableObjectByName, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer, makeEDADurableObjectRuntimeLayer };
6
+ export { EDARpcSubmittable, EDASessionController, EDASessionDurableObject, EDAWebSocketProjectionId, EDA_WEB_SOCKET_PROJECTION_HEADER, SessionBatchInput, SessionBlockInput, SessionCommandInput, SessionGrantRunInput, SessionOutcomeInput, SessionScopedInput, decodeEdaRpcCommand, decodeEdaRpcSubmittables, edaRuntimeConfig, edaSessionRpc, encodeEdaRpcCommand, encodeEdaRpcCommittedDurableEvent, encodeEdaRpcDurableEvent, encodeEdaRpcSessionSnapshot, encodeEdaRpcSubmittables, getEDASessionDurableObjectByName, makeEDADurableObjectOpenAiModelLayer, makeEDADurableObjectOpenAiModelResolverLayer, makeEDADurableObjectRuntimeLayer };
@@ -0,0 +1,45 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { EDACommand } from "effect-durable-agent/types/commands";
4
+ import { DurableEventEnvelope } from "effect-durable-agent/types/events";
5
+ import { EDASubmittable } from "effect-durable-agent/services/session-state";
6
+
7
+ //#region src/rpc-codec.d.ts
8
+ /** Encode one durable event into a structured-clone-safe Durable Object RPC value. */
9
+ declare const encodeEdaRpcDurableEvent: (event: DurableEventEnvelope) => DurableEventEnvelope;
10
+ /** Command/application-event RPC admission union; controller validation owns admission authorization. */
11
+ declare const EDARpcSubmittable: Schema.Union<readonly [Schema.Union<readonly [typeof import("effect-durable-agent/types/commands").SubmitMessageCommand, typeof import("effect-durable-agent/types/commands").StopTurnCommand, typeof import("effect-durable-agent/types/commands").CancelPendingMessageCommand, typeof import("effect-durable-agent/types/commands").PromotePendingMessageCommand, typeof import("effect-durable-agent/types/commands").ResumePendingMessagesCommand]>, Schema.Struct<{
12
+ readonly durability: Schema.Literal<"durable">;
13
+ readonly namespace: Schema.NonEmptyString;
14
+ readonly type: Schema.NonEmptyString;
15
+ readonly schemaVersion: Schema.Int;
16
+ readonly eventId: Schema.brand<Schema.String, "EventId">;
17
+ readonly sessionId: Schema.brand<Schema.String, "SessionId">;
18
+ readonly correlationId: Schema.optionalKey<Schema.brand<Schema.String, "CorrelationId">>;
19
+ readonly createdAtMs: Schema.brand<Schema.Int, "UnixEpochMillis">;
20
+ readonly trace: Schema.withConstructorDefault<Schema.Struct<{
21
+ readonly span: Schema.Struct<{
22
+ readonly traceId: Schema.brand<Schema.String, "EDATraceId">;
23
+ readonly spanId: Schema.brand<Schema.String, "EDASpanId">;
24
+ readonly sampled: Schema.Boolean;
25
+ readonly tracestate: Schema.NullOr<Schema.String>;
26
+ }>;
27
+ readonly links: Schema.$Array<Schema.Struct<{
28
+ readonly context: Schema.Struct<{
29
+ readonly traceId: Schema.brand<Schema.String, "EDATraceId">;
30
+ readonly spanId: Schema.brand<Schema.String, "EDASpanId">;
31
+ readonly sampled: Schema.Boolean;
32
+ readonly tracestate: Schema.NullOr<Schema.String>;
33
+ }>;
34
+ readonly attributes: Schema.$Record<Schema.String, Schema.Union<readonly [Schema.String, Schema.Number, Schema.Boolean]>>;
35
+ }>>;
36
+ }>>;
37
+ readonly payload: Schema.Unknown;
38
+ }>]>;
39
+ declare const encodeEdaRpcCommand: (input: EDACommand) => typeof EDACommand.Encoded;
40
+ declare const encodeEdaRpcSubmittables: (input: ReadonlyArray<EDASubmittable>) => ReadonlyArray<typeof EDARpcSubmittable.Encoded>;
41
+ declare const decodeEdaRpcCommand: (input: unknown) => Effect.Effect<EDACommand, Schema.SchemaError>;
42
+ declare const decodeEdaRpcSubmittables: (input: ReadonlyArray<unknown>) => Effect.Effect<ReadonlyArray<EDASubmittable>, Schema.SchemaError>;
43
+ //#endregion
44
+ export { encodeEdaRpcDurableEvent as a, encodeEdaRpcCommand as i, decodeEdaRpcCommand as n, encodeEdaRpcSubmittables as o, decodeEdaRpcSubmittables as r, EDARpcSubmittable as t };
45
+ //# sourceMappingURL=rpc-codec-CmHoMpaA.d.ts.map
@@ -0,0 +1,105 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Exit from "effect/Exit";
3
+ import * as Schema from "effect/Schema";
4
+ import { EDACommand, GrantRunCommand } from "effect-durable-agent/types/commands";
5
+ import { DurableEventEnvelope, EDADurableEvent, effectDurableAgentNamespace } from "effect-durable-agent/types/events";
6
+ import { CommandId, RunRequestId, SequenceNumber, SessionId } from "effect-durable-agent/types/core";
7
+ import { EDATraceMetadata } from "effect-durable-agent/types/tracing";
8
+ import { CommittedDurableEvent } from "effect-durable-agent/services/session-store";
9
+ import { CommittedCommandTerminalEvent } from "effect-durable-agent/services/runtime";
10
+ import { DurableTranscriptMessages, EDASessionSnapshot } from "effect-durable-agent/services/session-query";
11
+ import { RunGrantResult, RunRequestOutcome } from "effect-durable-agent/domain/run-scheduling";
12
+ //#region src/rpc-codec.ts
13
+ /** Encode one durable event into a structured-clone-safe Durable Object RPC value. */
14
+ const encodeEdaRpcDurableEvent = (event) => {
15
+ const encoded = event.namespace === effectDurableAgentNamespace ? Schema.encodeSync(EDADurableEvent)(Schema.decodeUnknownSync(EDADurableEvent)(event)) : Schema.encodeSync(DurableEventEnvelope)(event);
16
+ return Schema.decodeUnknownSync(DurableEventEnvelope)(encoded);
17
+ };
18
+ /** Command/application-event RPC admission union; controller validation owns admission authorization. */
19
+ const EDARpcSubmittable = Schema.Union([EDACommand, DurableEventEnvelope]);
20
+ const encodeEdaRpcCommand = (input) => Schema.encodeSync(EDACommand)(input);
21
+ const encodeEdaRpcSubmittables = (input) => input.map((item) => Schema.encodeSync(EDARpcSubmittable)(item));
22
+ const decodeEdaRpcCommand = (input) => Schema.decodeUnknownExit(EDACommand)(input).pipe(Exit.match({
23
+ onFailure: Effect.failCause,
24
+ onSuccess: Effect.succeed
25
+ }));
26
+ const decodeEdaRpcSubmittables = (input) => Effect.forEach(input, (item) => Schema.decodeUnknownExit(EDARpcSubmittable)(item).pipe(Exit.match({
27
+ onFailure: Effect.failCause,
28
+ onSuccess: Effect.succeed
29
+ })));
30
+ //#endregion
31
+ //#region src/rpc-spec.ts
32
+ /** Names the session isolation boundary and carries caller trace metadata. */
33
+ const SessionScopedInput = Schema.Struct({
34
+ sessionId: SessionId,
35
+ trace: EDATraceMetadata
36
+ });
37
+ /** Ordinary command admission; controller validation excludes trusted scheduler grants. */
38
+ const SessionCommandInput = Schema.Struct({
39
+ ...SessionScopedInput.fields,
40
+ command: EDACommand
41
+ });
42
+ /** Trusted scheduler permission for a reserved run; ordinary command ingress cannot grant it. */
43
+ const SessionGrantRunInput = Schema.Struct({
44
+ ...SessionScopedInput.fields,
45
+ command: GrantRunCommand
46
+ });
47
+ /** Atomic ordered admission of ordinary commands and application events for one session. */
48
+ const SessionBatchInput = Schema.Struct({
49
+ ...SessionScopedInput.fields,
50
+ items: Schema.Array(EDARpcSubmittable)
51
+ });
52
+ /** Waits for one command terminal after an optional durable replay position. */
53
+ const SessionBlockInput = Schema.Struct({
54
+ ...SessionScopedInput.fields,
55
+ afterSeq: Schema.optionalKey(SequenceNumber),
56
+ commandId: CommandId
57
+ });
58
+ /** Reconciles a scheduler request against the named session’s authoritative state. */
59
+ const SessionOutcomeInput = Schema.Struct({
60
+ ...SessionScopedInput.fields,
61
+ requestId: RunRequestId
62
+ });
63
+ /** Private session RPC contracts retain the deployed structured-clone shapes, including snapshot Maps. */
64
+ const edaSessionRpc = {
65
+ submit: {
66
+ input: SessionCommandInput,
67
+ output: CommittedDurableEvent
68
+ },
69
+ submitBatch: {
70
+ input: SessionBatchInput,
71
+ output: Schema.Array(CommittedDurableEvent)
72
+ },
73
+ submitAndBlock: {
74
+ input: SessionCommandInput,
75
+ output: CommittedCommandTerminalEvent
76
+ },
77
+ blockOnCommand: {
78
+ input: SessionBlockInput,
79
+ output: CommittedCommandTerminalEvent
80
+ },
81
+ grantRun: {
82
+ input: SessionGrantRunInput,
83
+ output: RunGrantResult
84
+ },
85
+ runRequestOutcome: {
86
+ input: SessionOutcomeInput,
87
+ output: RunRequestOutcome
88
+ },
89
+ snapshot: {
90
+ input: SessionScopedInput,
91
+ output: EDASessionSnapshot
92
+ },
93
+ messages: {
94
+ input: SessionScopedInput,
95
+ output: DurableTranscriptMessages
96
+ },
97
+ destroySession: {
98
+ input: SessionScopedInput,
99
+ output: Schema.Void
100
+ }
101
+ };
102
+ //#endregion
103
+ export { SessionOutcomeInput as a, EDARpcSubmittable as c, encodeEdaRpcCommand as d, encodeEdaRpcDurableEvent as f, SessionGrantRunInput as i, decodeEdaRpcCommand as l, SessionBlockInput as n, SessionScopedInput as o, encodeEdaRpcSubmittables as p, SessionCommandInput as r, edaSessionRpc as s, SessionBatchInput as t, decodeEdaRpcSubmittables as u };
104
+
105
+ //# sourceMappingURL=rpc-spec-CkWEeWJG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-spec-CkWEeWJG.js","names":[],"sources":["../src/rpc-codec.ts","../src/rpc-spec.ts"],"sourcesContent":["import * as Effect from \"effect/Effect\";\nimport * as Exit from \"effect/Exit\";\nimport * as Schema from \"effect/Schema\";\n\nimport { EDACommand } from \"effect-durable-agent/types/commands\";\nimport type { EDASubmittable } from \"effect-durable-agent/services/session-state\";\nimport {\n DurableEventEnvelope,\n EDADurableEvent,\n effectDurableAgentNamespace,\n} from \"effect-durable-agent/types/events\";\n\n/** Encode one durable event into a structured-clone-safe Durable Object RPC value. */\nexport const encodeEdaRpcDurableEvent = (event: DurableEventEnvelope): DurableEventEnvelope => {\n const encoded =\n event.namespace === effectDurableAgentNamespace\n ? Schema.encodeSync(EDADurableEvent)(Schema.decodeUnknownSync(EDADurableEvent)(event))\n : Schema.encodeSync(DurableEventEnvelope)(event);\n return Schema.decodeUnknownSync(DurableEventEnvelope)(encoded);\n};\n\n/** Command/application-event RPC admission union; controller validation owns admission authorization. */\nexport const EDARpcSubmittable = Schema.Union([EDACommand, DurableEventEnvelope]);\n\nexport const encodeEdaRpcCommand = (input: EDACommand): typeof EDACommand.Encoded =>\n Schema.encodeSync(EDACommand)(input);\n\nexport const encodeEdaRpcSubmittables = (\n input: ReadonlyArray<EDASubmittable>,\n): ReadonlyArray<typeof EDARpcSubmittable.Encoded> =>\n input.map((item) => Schema.encodeSync(EDARpcSubmittable)(item));\n\nexport const decodeEdaRpcCommand = (\n input: unknown,\n): Effect.Effect<EDACommand, Schema.SchemaError> =>\n Schema.decodeUnknownExit(EDACommand)(input).pipe(\n Exit.match({ onFailure: Effect.failCause, onSuccess: Effect.succeed }),\n );\n\nexport const decodeEdaRpcSubmittables = (\n input: ReadonlyArray<unknown>,\n): Effect.Effect<ReadonlyArray<EDASubmittable>, Schema.SchemaError> =>\n Effect.forEach(input, (item) =>\n Schema.decodeUnknownExit(EDARpcSubmittable)(item).pipe(\n Exit.match({ onFailure: Effect.failCause, onSuccess: Effect.succeed }),\n ),\n );\n","import * as Schema from \"effect/Schema\";\nimport { EDACommand, GrantRunCommand } from \"effect-durable-agent/types/commands\";\nimport {\n CommandId,\n RunRequestId,\n SequenceNumber,\n SessionId,\n} from \"effect-durable-agent/types/core\";\nimport { EDATraceMetadata } from \"effect-durable-agent/types/tracing\";\nimport { CommittedDurableEvent } from \"effect-durable-agent/services/session-store\";\nimport { CommittedCommandTerminalEvent } from \"effect-durable-agent/services/runtime\";\nimport {\n EDASessionSnapshot,\n DurableTranscriptMessages,\n} from \"effect-durable-agent/services/session-query\";\nimport { RunGrantResult, RunRequestOutcome } from \"effect-durable-agent/domain/run-scheduling\";\nimport { EDARpcSubmittable } from \"./rpc-codec\";\n\n/** Names the session isolation boundary and carries caller trace metadata. */\nexport const SessionScopedInput = Schema.Struct({ sessionId: SessionId, trace: EDATraceMetadata });\n/** Ordinary command admission; controller validation excludes trusted scheduler grants. */\nexport const SessionCommandInput = Schema.Struct({\n ...SessionScopedInput.fields,\n command: EDACommand,\n});\n/** Trusted scheduler permission for a reserved run; ordinary command ingress cannot grant it. */\nexport const SessionGrantRunInput = Schema.Struct({\n ...SessionScopedInput.fields,\n command: GrantRunCommand,\n});\n/** Atomic ordered admission of ordinary commands and application events for one session. */\nexport const SessionBatchInput = Schema.Struct({\n ...SessionScopedInput.fields,\n items: Schema.Array(EDARpcSubmittable),\n});\n/** Waits for one command terminal after an optional durable replay position. */\nexport const SessionBlockInput = Schema.Struct({\n ...SessionScopedInput.fields,\n afterSeq: Schema.optionalKey(SequenceNumber),\n commandId: CommandId,\n});\n/** Reconciles a scheduler request against the named session’s authoritative state. */\nexport const SessionOutcomeInput = Schema.Struct({\n ...SessionScopedInput.fields,\n requestId: RunRequestId,\n});\n/** Private session RPC contracts retain the deployed structured-clone shapes, including snapshot Maps. */\nexport const edaSessionRpc = {\n submit: { input: SessionCommandInput, output: CommittedDurableEvent },\n submitBatch: { input: SessionBatchInput, output: Schema.Array(CommittedDurableEvent) },\n submitAndBlock: { input: SessionCommandInput, output: CommittedCommandTerminalEvent },\n blockOnCommand: { input: SessionBlockInput, output: CommittedCommandTerminalEvent },\n grantRun: { input: SessionGrantRunInput, output: RunGrantResult },\n runRequestOutcome: { input: SessionOutcomeInput, output: RunRequestOutcome },\n snapshot: { input: SessionScopedInput, output: EDASessionSnapshot },\n messages: { input: SessionScopedInput, output: DurableTranscriptMessages },\n destroySession: { input: SessionScopedInput, output: Schema.Void },\n};\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAa,4BAA4B,UAAsD;CAC7F,MAAM,UACJ,MAAM,cAAc,8BAChB,OAAO,WAAW,eAAe,EAAE,OAAO,kBAAkB,eAAe,EAAE,KAAK,CAAC,IACnF,OAAO,WAAW,oBAAoB,EAAE,KAAK;CACnD,OAAO,OAAO,kBAAkB,oBAAoB,EAAE,OAAO;AAC/D;;AAGA,MAAa,oBAAoB,OAAO,MAAM,CAAC,YAAY,oBAAoB,CAAC;AAEhF,MAAa,uBAAuB,UAClC,OAAO,WAAW,UAAU,EAAE,KAAK;AAErC,MAAa,4BACX,UAEA,MAAM,KAAK,SAAS,OAAO,WAAW,iBAAiB,EAAE,IAAI,CAAC;AAEhE,MAAa,uBACX,UAEA,OAAO,kBAAkB,UAAU,EAAE,KAAK,EAAE,KAC1C,KAAK,MAAM;CAAE,WAAW,OAAO;CAAW,WAAW,OAAO;AAAQ,CAAC,CACvE;AAEF,MAAa,4BACX,UAEA,OAAO,QAAQ,QAAQ,SACrB,OAAO,kBAAkB,iBAAiB,EAAE,IAAI,EAAE,KAChD,KAAK,MAAM;CAAE,WAAW,OAAO;CAAW,WAAW,OAAO;AAAQ,CAAC,CACvE,CACF;;;;AC3BF,MAAa,qBAAqB,OAAO,OAAO;CAAE,WAAW;CAAW,OAAO;AAAiB,CAAC;;AAEjG,MAAa,sBAAsB,OAAO,OAAO;CAC/C,GAAG,mBAAmB;CACtB,SAAS;AACX,CAAC;;AAED,MAAa,uBAAuB,OAAO,OAAO;CAChD,GAAG,mBAAmB;CACtB,SAAS;AACX,CAAC;;AAED,MAAa,oBAAoB,OAAO,OAAO;CAC7C,GAAG,mBAAmB;CACtB,OAAO,OAAO,MAAM,iBAAiB;AACvC,CAAC;;AAED,MAAa,oBAAoB,OAAO,OAAO;CAC7C,GAAG,mBAAmB;CACtB,UAAU,OAAO,YAAY,cAAc;CAC3C,WAAW;AACb,CAAC;;AAED,MAAa,sBAAsB,OAAO,OAAO;CAC/C,GAAG,mBAAmB;CACtB,WAAW;AACb,CAAC;;AAED,MAAa,gBAAgB;CAC3B,QAAQ;EAAE,OAAO;EAAqB,QAAQ;CAAsB;CACpE,aAAa;EAAE,OAAO;EAAmB,QAAQ,OAAO,MAAM,qBAAqB;CAAE;CACrF,gBAAgB;EAAE,OAAO;EAAqB,QAAQ;CAA8B;CACpF,gBAAgB;EAAE,OAAO;EAAmB,QAAQ;CAA8B;CAClF,UAAU;EAAE,OAAO;EAAsB,QAAQ;CAAe;CAChE,mBAAmB;EAAE,OAAO;EAAqB,QAAQ;CAAkB;CAC3E,UAAU;EAAE,OAAO;EAAoB,QAAQ;CAAmB;CAClE,UAAU;EAAE,OAAO;EAAoB,QAAQ;CAA0B;CACzE,gBAAgB;EAAE,OAAO;EAAoB,QAAQ,OAAO;CAAK;AACnE"}