@anvia/client 1.3.5 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -59,7 +59,11 @@ readers are also available from `@anvia/client/transport` for other event contra
59
59
 
60
60
  The optional `@anvia/client/durable` entrypoint exports `DurableClient` and
61
61
  `DurableHttpError`. Install `@anvia/durable` to use it. It supports submit, list, snapshot,
62
- SSE observation, approval responses, retry, cancellation, and tool reconciliation.
62
+ SSE observation, queued steering, approval responses, retry, cancellation, and tool reconciliation.
63
+ Use `client.steer(runId, { prompt: "Focus on recovery" }, { requestId: "correction-123" })`
64
+ to receive a persisted receipt. Reuse the optional request ID to deduplicate delivery;
65
+ observe `steering_applied` to confirm the input entered the conversation. Steering requires
66
+ the matching durable release (0.8 or newer within the supported peer range).
63
67
 
64
68
  Construct it with an absolute `endpoint`, optional `fetch`, `credentials`, and static or
65
69
  per-request `headers`. Restore UI state from `snapshot(runId)`, then observe
package/dist/durable.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { TaskSubmission, TaskSnapshot, TaskGraphSnapshot, TaskListOptions, TaskPage, TaskEvent, DurableGraphSubmission, DurableGraphSnapshot, DurableGraphListOptions, DurableGraphPage, DurableGraphEvent, DurableSubmission, DurableSubmitOptions, DurableSnapshot, DurableListOptions, DurableRunPage, DurableEvent } from '@anvia/durable/protocol';
1
+ import { TaskSubmission, TaskSnapshot, TaskGraphSnapshot, TaskListOptions, TaskPage, TaskEvent, DurableGraphSubmission, DurableGraphSnapshot, DurableGraphListOptions, DurableGraphPage, DurableGraphEvent, DurableSubmission, DurableSubmitOptions, DurableSnapshot, DurableListOptions, DurableRunPage, DurableEvent, DurableSteerOptions } from '@anvia/durable/protocol';
2
+ import { AgentSteerInput, AgentSteerReceipt } from '@anvia/core/agent';
2
3
  import { AgentInteractionResponse } from '@anvia/core/agent/interactions';
3
4
  import { JsonValue, ToolResultOutput } from '@anvia/core/completion';
4
5
 
@@ -52,6 +53,7 @@ declare class DurableClient {
52
53
  stream(runId: string, options?: DurableRequestOptions & {
53
54
  after?: number;
54
55
  }): AsyncIterable<DurableEvent>;
56
+ steer(runId: string, input: AgentSteerInput, options?: DurableSteerOptions & DurableRequestOptions): Promise<AgentSteerReceipt>;
55
57
  respond(runId: string, interactionId: string, response: AgentInteractionResponse, options?: DurableRequestOptions): Promise<void>;
56
58
  resolveTool(runId: string, operationId: string, output: ToolResultOutput, options?: DurableRequestOptions): Promise<void>;
57
59
  retry(runId: string, options?: DurableRequestOptions): Promise<void>;
package/dist/durable.js CHANGED
@@ -11,6 +11,7 @@ import {
11
11
  } from "@anvia/durable/protocol";
12
12
  import {
13
13
  parseDurableEvent,
14
+ parseDurableSteerReceipt,
14
15
  parseDurableGraphSnapshot,
15
16
  parseDurableGraphEvent,
16
17
  parseDurableGraphPage,
@@ -190,6 +191,16 @@ var DurableClient = class {
190
191
  yield event;
191
192
  }
192
193
  }
194
+ async steer(runId, input, options = {}) {
195
+ return parseDurableSteerReceipt(
196
+ await (await this.request(
197
+ `${this.path(runId)}/steer`,
198
+ "POST",
199
+ { input, ...options.requestId === void 0 ? {} : { requestId: options.requestId } },
200
+ options
201
+ )).json()
202
+ );
203
+ }
193
204
  async respond(runId, interactionId, response, options = {}) {
194
205
  await this.request(`${this.path(runId)}/respond`, "POST", { interactionId, response }, options);
195
206
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/durable.ts"],"sourcesContent":["import {\n parseTaskSnapshot,\n parseTaskGraph,\n parseTaskPage,\n parseTaskEvent,\n type TaskSubmission,\n type TaskSnapshot,\n type TaskGraphSnapshot,\n type TaskPage,\n type TaskListOptions,\n type TaskEvent,\n} from \"@anvia/durable/protocol\";\nimport type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport type { JsonValue, ToolResultOutput } from \"@anvia/core/completion\";\nimport {\n parseDurableEvent,\n parseDurableGraphSnapshot,\n parseDurableGraphEvent,\n parseDurableGraphPage,\n type DurableGraphSubmission,\n type DurableGraphSnapshot,\n type DurableGraphListOptions,\n type DurableGraphPage,\n type DurableGraphEvent,\n parseDurableRunPage,\n parseDurableSnapshot,\n type DurableEvent,\n type DurableListOptions,\n type DurableRunPage,\n type DurableSnapshot,\n type DurableSubmission,\n type DurableSubmitOptions,\n} from \"@anvia/durable/protocol\";\nimport { readSseStream } from \"./transport/streams\";\n\nexport type DurableRequestOptions = { abortSignal?: AbortSignal };\nexport type DurableClientOptions = {\n /** Absolute HTTP(S) URL matching the server handler's basePath. */\n endpoint: string;\n fetch?: typeof fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n credentials?: RequestCredentials;\n};\nexport class DurableHttpError extends Error {\n constructor(readonly status: number) {\n super(`Durable request failed with HTTP ${status}.`);\n this.name = \"DurableHttpError\";\n }\n}\n\n/** Browser-safe HTTP client. Reconnect explicitly using a snapshot or last applied event cursor. */\nexport class DurableClient {\n private readonly endpoint: string;\n constructor(private readonly options: DurableClientOptions) {\n const endpoint = new URL(options.endpoint);\n if (\n ![\"http:\", \"https:\"].includes(endpoint.protocol) ||\n endpoint.search ||\n endpoint.hash ||\n endpoint.username ||\n endpoint.password\n )\n throw new TypeError(\n \"endpoint must be an HTTP(S) base URL without credentials, query, or fragment.\",\n );\n this.endpoint = endpoint.href.replace(/\\/$/, \"\");\n }\n\n async submitTask(\n submission: TaskSubmission,\n options: DurableRequestOptions = {},\n ): Promise<TaskSnapshot> {\n return parseTaskSnapshot(\n await (await this.request(\"/tasks\", \"POST\", submission, options)).json(),\n );\n }\n async taskSnapshot(id: string, options: DurableRequestOptions = {}): Promise<TaskSnapshot> {\n const snapshot = parseTaskSnapshot(\n await (await this.request(this.taskPath(id), \"GET\", undefined, options)).json(),\n );\n if (snapshot.task.id !== id) throw new TypeError(\"Snapshot belongs to another task.\");\n return snapshot;\n }\n async taskGraph(id: string, options: DurableRequestOptions = {}): Promise<TaskGraphSnapshot> {\n const graph = parseTaskGraph(\n await (await this.request(`${this.taskPath(id)}/graph`, \"GET\", undefined, options)).json(),\n );\n if (!graph.nodes.some((task) => task.id === id))\n throw new TypeError(\"Graph belongs to another task.\");\n return graph;\n }\n async listTasks(\n filter: TaskListOptions & { sessionId: string },\n options: DurableRequestOptions = {},\n ): Promise<TaskPage> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter))\n if (value !== undefined) query.set(key, String(value));\n return parseTaskPage(\n await (await this.request(`/tasks?${query}`, \"GET\", undefined, options)).json(),\n );\n }\n async signalTask(\n id: string,\n name: string,\n requestId: string,\n value: JsonValue,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(`${this.taskPath(id)}/signal`, \"POST\", { name, requestId, value }, options);\n }\n async resolveEffect(\n id: string,\n key: string,\n value: JsonValue,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(`${this.taskPath(id)}/resolve-effect`, \"POST\", { key, value }, options);\n }\n async retryTask(id: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.taskPath(id)}/retry`, \"POST\", undefined, options);\n }\n async cancelTask(id: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.taskPath(id)}/cancel`, \"POST\", undefined, options);\n }\n async *streamTask(\n id: string,\n options: DurableRequestOptions & { after?: number } = {},\n ): AsyncIterable<TaskEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid task cursor.\");\n const snapshot = await this.taskSnapshot(id, options);\n const response = await this.request(\n `${this.taskPath(id)}/events?after=${cursor}`,\n \"GET\",\n undefined,\n options,\n );\n if (\n !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\") ||\n response.body === null\n )\n throw new TypeError(\"Expected a task SSE response.\");\n for await (const value of readSseStream<unknown>(response.body)) {\n options.abortSignal?.throwIfAborted();\n const event = parseTaskEvent(value);\n if (event.rootId !== snapshot.task.rootId || event.sequence <= cursor)\n throw new TypeError(\"Invalid task event order or root ID.\");\n cursor = event.sequence;\n yield event;\n }\n }\n private taskPath(id: string): string {\n if (id.trim().length === 0 || id === \".\" || id === \"..\") throw new TypeError(\"Invalid taskId.\");\n return `/tasks/${encodeURIComponent(id)}`;\n }\n\n async submitGraph(\n submission: DurableGraphSubmission,\n options: DurableRequestOptions = {},\n ): Promise<DurableGraphSnapshot> {\n return parseDurableGraphSnapshot(\n await (await this.request(\"/graphs\", \"POST\", submission, options)).json(),\n );\n }\n async graphSnapshot(\n graphId: string,\n options: DurableRequestOptions = {},\n ): Promise<DurableGraphSnapshot> {\n const snapshot = parseDurableGraphSnapshot(\n await (await this.request(this.graphPath(graphId), \"GET\", undefined, options)).json(),\n );\n if (snapshot.id !== graphId) throw new TypeError(\"Snapshot belongs to another graph.\");\n return snapshot;\n }\n async listGraphs(\n filter: DurableGraphListOptions & { sessionId: string },\n options: DurableRequestOptions = {},\n ): Promise<DurableGraphPage> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter))\n if (value !== undefined) query.set(key, String(value));\n return parseDurableGraphPage(\n await (await this.request(`/graphs?${query}`, \"GET\", undefined, options)).json(),\n );\n }\n async cancelGraph(graphId: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.graphPath(graphId)}/cancel`, \"POST\", undefined, options);\n }\n async *streamGraph(\n graphId: string,\n options: DurableRequestOptions & { after?: number } = {},\n ): AsyncIterable<DurableGraphEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid graph cursor.\");\n const response = await this.request(\n `${this.graphPath(graphId)}/events?after=${cursor}`,\n \"GET\",\n undefined,\n options,\n );\n if (\n !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\") ||\n response.body === null\n )\n throw new TypeError(\"Expected a graph SSE response.\");\n for await (const value of readSseStream<unknown>(response.body)) {\n options.abortSignal?.throwIfAborted();\n const event = parseDurableGraphEvent(value);\n if (event.graphId !== graphId || event.sequence <= cursor)\n throw new TypeError(\"Invalid graph event order or ID.\");\n cursor = event.sequence;\n yield event;\n }\n }\n\n async submit(\n submission: DurableSubmission,\n options: DurableSubmitOptions & DurableRequestOptions = {},\n ): Promise<DurableSnapshot> {\n return parseDurableSnapshot(\n await (\n await this.request(\n \"/runs\",\n \"POST\",\n { ...submission, ...(options.enqueue === undefined ? {} : { enqueue: options.enqueue }) },\n options,\n )\n ).json(),\n );\n }\n async listRuns(\n filter: DurableListOptions & { sessionId: string },\n options: DurableRequestOptions = {},\n ): Promise<DurableRunPage> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter))\n if (value !== undefined) query.set(key, String(value));\n return parseDurableRunPage(\n await (await this.request(`/runs?${query}`, \"GET\", undefined, options)).json(),\n );\n }\n async snapshot(runId: string, options: DurableRequestOptions = {}): Promise<DurableSnapshot> {\n const snapshot = parseDurableSnapshot(\n await (await this.request(this.path(runId), \"GET\", undefined, options)).json(),\n );\n if (snapshot.run.id !== runId) throw new TypeError(\"Durable snapshot belongs to another run.\");\n return snapshot;\n }\n async *stream(\n runId: string,\n options: DurableRequestOptions & { after?: number } = {},\n ): AsyncIterable<DurableEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid event cursor.\");\n const response = await this.request(\n `${this.path(runId)}/events?after=${cursor}`,\n \"GET\",\n undefined,\n options,\n );\n if (\n !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\") ||\n response.body === null\n )\n throw new TypeError(\"Expected a durable SSE response.\");\n for await (const value of readSseStream<unknown>(response.body)) {\n options.abortSignal?.throwIfAborted();\n const event = parseDurableEvent(value);\n if (event.runId !== runId || event.sequence <= cursor)\n throw new TypeError(\"Invalid durable event order or run ID.\");\n cursor = event.sequence;\n yield event;\n }\n }\n async respond(\n runId: string,\n interactionId: string,\n response: AgentInteractionResponse,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(`${this.path(runId)}/respond`, \"POST\", { interactionId, response }, options);\n }\n async resolveTool(\n runId: string,\n operationId: string,\n output: ToolResultOutput,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(\n `${this.path(runId)}/resolve-tool`,\n \"POST\",\n { operationId, output },\n options,\n );\n }\n async retry(runId: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.path(runId)}/retry`, \"POST\", undefined, options);\n }\n async cancel(runId: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.path(runId)}/cancel`, \"POST\", undefined, options);\n }\n\n private graphPath(id: string): string {\n if (id.trim().length === 0 || id === \".\" || id === \"..\")\n throw new TypeError(\"Invalid graphId.\");\n return `/graphs/${encodeURIComponent(id)}`;\n }\n private path(id: string): string {\n if (id.trim().length === 0) throw new TypeError(\"runId must not be empty.\");\n return `/runs/${encodeURIComponent(id)}`;\n }\n private async request(\n path: string,\n method: string,\n body: unknown,\n options: DurableRequestOptions,\n ): Promise<Response> {\n options.abortSignal?.throwIfAborted();\n const supplied =\n typeof this.options.headers === \"function\"\n ? await this.options.headers()\n : this.options.headers;\n const headers = new Headers(supplied);\n if (body !== undefined) headers.set(\"content-type\", \"application/json\");\n const response = await (this.options.fetch ?? globalThis.fetch)(`${this.endpoint}${path}`, {\n method,\n headers,\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n ...(options.abortSignal === undefined ? {} : { signal: options.abortSignal }),\n ...(this.options.credentials === undefined ? {} : { credentials: this.options.credentials }),\n });\n if (!response.ok) {\n await response.body?.cancel();\n throw new DurableHttpError(response.status);\n }\n return response;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/durable.ts"],"sourcesContent":["import {\n parseTaskSnapshot,\n parseTaskGraph,\n parseTaskPage,\n parseTaskEvent,\n type TaskSubmission,\n type TaskSnapshot,\n type TaskGraphSnapshot,\n type TaskPage,\n type TaskListOptions,\n type TaskEvent,\n} from \"@anvia/durable/protocol\";\nimport type { AgentSteerInput, AgentSteerReceipt } from \"@anvia/core/agent\";\nimport type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport type { JsonValue, ToolResultOutput } from \"@anvia/core/completion\";\nimport {\n parseDurableEvent,\n parseDurableSteerReceipt,\n type DurableSteerOptions,\n parseDurableGraphSnapshot,\n parseDurableGraphEvent,\n parseDurableGraphPage,\n type DurableGraphSubmission,\n type DurableGraphSnapshot,\n type DurableGraphListOptions,\n type DurableGraphPage,\n type DurableGraphEvent,\n parseDurableRunPage,\n parseDurableSnapshot,\n type DurableEvent,\n type DurableListOptions,\n type DurableRunPage,\n type DurableSnapshot,\n type DurableSubmission,\n type DurableSubmitOptions,\n} from \"@anvia/durable/protocol\";\nimport { readSseStream } from \"./transport/streams\";\n\nexport type DurableRequestOptions = { abortSignal?: AbortSignal };\nexport type DurableClientOptions = {\n /** Absolute HTTP(S) URL matching the server handler's basePath. */\n endpoint: string;\n fetch?: typeof fetch;\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);\n credentials?: RequestCredentials;\n};\nexport class DurableHttpError extends Error {\n constructor(readonly status: number) {\n super(`Durable request failed with HTTP ${status}.`);\n this.name = \"DurableHttpError\";\n }\n}\n\n/** Browser-safe HTTP client. Reconnect explicitly using a snapshot or last applied event cursor. */\nexport class DurableClient {\n private readonly endpoint: string;\n constructor(private readonly options: DurableClientOptions) {\n const endpoint = new URL(options.endpoint);\n if (\n ![\"http:\", \"https:\"].includes(endpoint.protocol) ||\n endpoint.search ||\n endpoint.hash ||\n endpoint.username ||\n endpoint.password\n )\n throw new TypeError(\n \"endpoint must be an HTTP(S) base URL without credentials, query, or fragment.\",\n );\n this.endpoint = endpoint.href.replace(/\\/$/, \"\");\n }\n\n async submitTask(\n submission: TaskSubmission,\n options: DurableRequestOptions = {},\n ): Promise<TaskSnapshot> {\n return parseTaskSnapshot(\n await (await this.request(\"/tasks\", \"POST\", submission, options)).json(),\n );\n }\n async taskSnapshot(id: string, options: DurableRequestOptions = {}): Promise<TaskSnapshot> {\n const snapshot = parseTaskSnapshot(\n await (await this.request(this.taskPath(id), \"GET\", undefined, options)).json(),\n );\n if (snapshot.task.id !== id) throw new TypeError(\"Snapshot belongs to another task.\");\n return snapshot;\n }\n async taskGraph(id: string, options: DurableRequestOptions = {}): Promise<TaskGraphSnapshot> {\n const graph = parseTaskGraph(\n await (await this.request(`${this.taskPath(id)}/graph`, \"GET\", undefined, options)).json(),\n );\n if (!graph.nodes.some((task) => task.id === id))\n throw new TypeError(\"Graph belongs to another task.\");\n return graph;\n }\n async listTasks(\n filter: TaskListOptions & { sessionId: string },\n options: DurableRequestOptions = {},\n ): Promise<TaskPage> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter))\n if (value !== undefined) query.set(key, String(value));\n return parseTaskPage(\n await (await this.request(`/tasks?${query}`, \"GET\", undefined, options)).json(),\n );\n }\n async signalTask(\n id: string,\n name: string,\n requestId: string,\n value: JsonValue,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(`${this.taskPath(id)}/signal`, \"POST\", { name, requestId, value }, options);\n }\n async resolveEffect(\n id: string,\n key: string,\n value: JsonValue,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(`${this.taskPath(id)}/resolve-effect`, \"POST\", { key, value }, options);\n }\n async retryTask(id: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.taskPath(id)}/retry`, \"POST\", undefined, options);\n }\n async cancelTask(id: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.taskPath(id)}/cancel`, \"POST\", undefined, options);\n }\n async *streamTask(\n id: string,\n options: DurableRequestOptions & { after?: number } = {},\n ): AsyncIterable<TaskEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid task cursor.\");\n const snapshot = await this.taskSnapshot(id, options);\n const response = await this.request(\n `${this.taskPath(id)}/events?after=${cursor}`,\n \"GET\",\n undefined,\n options,\n );\n if (\n !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\") ||\n response.body === null\n )\n throw new TypeError(\"Expected a task SSE response.\");\n for await (const value of readSseStream<unknown>(response.body)) {\n options.abortSignal?.throwIfAborted();\n const event = parseTaskEvent(value);\n if (event.rootId !== snapshot.task.rootId || event.sequence <= cursor)\n throw new TypeError(\"Invalid task event order or root ID.\");\n cursor = event.sequence;\n yield event;\n }\n }\n private taskPath(id: string): string {\n if (id.trim().length === 0 || id === \".\" || id === \"..\") throw new TypeError(\"Invalid taskId.\");\n return `/tasks/${encodeURIComponent(id)}`;\n }\n\n async submitGraph(\n submission: DurableGraphSubmission,\n options: DurableRequestOptions = {},\n ): Promise<DurableGraphSnapshot> {\n return parseDurableGraphSnapshot(\n await (await this.request(\"/graphs\", \"POST\", submission, options)).json(),\n );\n }\n async graphSnapshot(\n graphId: string,\n options: DurableRequestOptions = {},\n ): Promise<DurableGraphSnapshot> {\n const snapshot = parseDurableGraphSnapshot(\n await (await this.request(this.graphPath(graphId), \"GET\", undefined, options)).json(),\n );\n if (snapshot.id !== graphId) throw new TypeError(\"Snapshot belongs to another graph.\");\n return snapshot;\n }\n async listGraphs(\n filter: DurableGraphListOptions & { sessionId: string },\n options: DurableRequestOptions = {},\n ): Promise<DurableGraphPage> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter))\n if (value !== undefined) query.set(key, String(value));\n return parseDurableGraphPage(\n await (await this.request(`/graphs?${query}`, \"GET\", undefined, options)).json(),\n );\n }\n async cancelGraph(graphId: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.graphPath(graphId)}/cancel`, \"POST\", undefined, options);\n }\n async *streamGraph(\n graphId: string,\n options: DurableRequestOptions & { after?: number } = {},\n ): AsyncIterable<DurableGraphEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid graph cursor.\");\n const response = await this.request(\n `${this.graphPath(graphId)}/events?after=${cursor}`,\n \"GET\",\n undefined,\n options,\n );\n if (\n !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\") ||\n response.body === null\n )\n throw new TypeError(\"Expected a graph SSE response.\");\n for await (const value of readSseStream<unknown>(response.body)) {\n options.abortSignal?.throwIfAborted();\n const event = parseDurableGraphEvent(value);\n if (event.graphId !== graphId || event.sequence <= cursor)\n throw new TypeError(\"Invalid graph event order or ID.\");\n cursor = event.sequence;\n yield event;\n }\n }\n\n async submit(\n submission: DurableSubmission,\n options: DurableSubmitOptions & DurableRequestOptions = {},\n ): Promise<DurableSnapshot> {\n return parseDurableSnapshot(\n await (\n await this.request(\n \"/runs\",\n \"POST\",\n { ...submission, ...(options.enqueue === undefined ? {} : { enqueue: options.enqueue }) },\n options,\n )\n ).json(),\n );\n }\n async listRuns(\n filter: DurableListOptions & { sessionId: string },\n options: DurableRequestOptions = {},\n ): Promise<DurableRunPage> {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(filter))\n if (value !== undefined) query.set(key, String(value));\n return parseDurableRunPage(\n await (await this.request(`/runs?${query}`, \"GET\", undefined, options)).json(),\n );\n }\n async snapshot(runId: string, options: DurableRequestOptions = {}): Promise<DurableSnapshot> {\n const snapshot = parseDurableSnapshot(\n await (await this.request(this.path(runId), \"GET\", undefined, options)).json(),\n );\n if (snapshot.run.id !== runId) throw new TypeError(\"Durable snapshot belongs to another run.\");\n return snapshot;\n }\n async *stream(\n runId: string,\n options: DurableRequestOptions & { after?: number } = {},\n ): AsyncIterable<DurableEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid event cursor.\");\n const response = await this.request(\n `${this.path(runId)}/events?after=${cursor}`,\n \"GET\",\n undefined,\n options,\n );\n if (\n !response.headers.get(\"content-type\")?.startsWith(\"text/event-stream\") ||\n response.body === null\n )\n throw new TypeError(\"Expected a durable SSE response.\");\n for await (const value of readSseStream<unknown>(response.body)) {\n options.abortSignal?.throwIfAborted();\n const event = parseDurableEvent(value);\n if (event.runId !== runId || event.sequence <= cursor)\n throw new TypeError(\"Invalid durable event order or run ID.\");\n cursor = event.sequence;\n yield event;\n }\n }\n async steer(\n runId: string,\n input: AgentSteerInput,\n options: DurableSteerOptions & DurableRequestOptions = {},\n ): Promise<AgentSteerReceipt> {\n return parseDurableSteerReceipt(\n await (\n await this.request(\n `${this.path(runId)}/steer`,\n \"POST\",\n { input, ...(options.requestId === undefined ? {} : { requestId: options.requestId }) },\n options,\n )\n ).json(),\n );\n }\n async respond(\n runId: string,\n interactionId: string,\n response: AgentInteractionResponse,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(`${this.path(runId)}/respond`, \"POST\", { interactionId, response }, options);\n }\n async resolveTool(\n runId: string,\n operationId: string,\n output: ToolResultOutput,\n options: DurableRequestOptions = {},\n ): Promise<void> {\n await this.request(\n `${this.path(runId)}/resolve-tool`,\n \"POST\",\n { operationId, output },\n options,\n );\n }\n async retry(runId: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.path(runId)}/retry`, \"POST\", undefined, options);\n }\n async cancel(runId: string, options: DurableRequestOptions = {}): Promise<void> {\n await this.request(`${this.path(runId)}/cancel`, \"POST\", undefined, options);\n }\n\n private graphPath(id: string): string {\n if (id.trim().length === 0 || id === \".\" || id === \"..\")\n throw new TypeError(\"Invalid graphId.\");\n return `/graphs/${encodeURIComponent(id)}`;\n }\n private path(id: string): string {\n if (id.trim().length === 0) throw new TypeError(\"runId must not be empty.\");\n return `/runs/${encodeURIComponent(id)}`;\n }\n private async request(\n path: string,\n method: string,\n body: unknown,\n options: DurableRequestOptions,\n ): Promise<Response> {\n options.abortSignal?.throwIfAborted();\n const supplied =\n typeof this.options.headers === \"function\"\n ? await this.options.headers()\n : this.options.headers;\n const headers = new Headers(supplied);\n if (body !== undefined) headers.set(\"content-type\", \"application/json\");\n const response = await (this.options.fetch ?? globalThis.fetch)(`${this.endpoint}${path}`, {\n method,\n headers,\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n ...(options.abortSignal === undefined ? {} : { signal: options.abortSignal }),\n ...(this.options.credentials === undefined ? {} : { credentials: this.options.credentials }),\n });\n if (!response.ok) {\n await response.body?.cancel();\n throw new DurableHttpError(response.status);\n }\n return response;\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/client",
3
- "version": "1.3.5",
3
+ "version": "1.4.0",
4
4
  "description": "Framework-neutral client protocol, transports, and UI message state for Anvia.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -37,12 +37,12 @@
37
37
  "tsup": "^8.5.0",
38
38
  "typescript": "^5.9.3",
39
39
  "vitest": "^4.1.11",
40
- "@anvia/core": "1.12.0",
41
- "@anvia/durable": "0.6.0"
40
+ "@anvia/core": "1.13.0",
41
+ "@anvia/durable": "0.8.0"
42
42
  },
43
43
  "peerDependencies": {
44
- "@anvia/durable": "^0.1.1 || ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0",
45
- "@anvia/core": "^1.12.0"
44
+ "@anvia/durable": "^0.8.0",
45
+ "@anvia/core": "^1.13.0"
46
46
  },
47
47
  "peerDependenciesMeta": {
48
48
  "@anvia/durable": {