@anvia/durable 0.0.0-bootstrap.0 → 0.1.1
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/LICENSE +21 -0
- package/README.md +161 -3
- package/dist/chunk-7WOOJGHA.js +499 -0
- package/dist/chunk-7WOOJGHA.js.map +1 -0
- package/dist/chunk-ETGANBD4.js +83 -0
- package/dist/chunk-ETGANBD4.js.map +1 -0
- package/dist/chunk-KIMHK6CE.js +353 -0
- package/dist/chunk-KIMHK6CE.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.js +1930 -0
- package/dist/index.js.map +1 -0
- package/dist/maintenance.d.ts +10 -0
- package/dist/maintenance.js +119 -0
- package/dist/maintenance.js.map +1 -0
- package/dist/protocol.d.ts +37 -0
- package/dist/protocol.js +213 -0
- package/dist/protocol.js.map +1 -0
- package/dist/sqlite.d.ts +40 -0
- package/dist/sqlite.js +8 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/task-protocol-Cewz7y6v.d.ts +38 -0
- package/dist/types-CBjKEKQ7.d.ts +396 -0
- package/package.json +50 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/limits.ts","../src/storage-guard.ts","../src/wait.ts","../src/task-graph.ts","../src/tasks/state.ts","../src/tasks/invocation.ts","../src/tasks/agent.ts","../src/run-record.ts","../src/tasks/definition.ts","../src/tasks/scheduler.ts","../src/tasks/handle.ts","../src/graph-state.ts","../src/runtime.ts","../src/execution.ts","../src/registration.ts","../src/run.ts"],"sourcesContent":["export class DurableRecoveryError extends Error {\n constructor(\n message: string,\n readonly operationId?: string,\n ) {\n super(message);\n this.name = \"DurableRecoveryError\";\n }\n}\n\nexport class DurableRunError extends Error {\n constructor(\n readonly runId: string,\n readonly status: \"failed\" | \"cancelled\",\n message: string,\n ) {\n super(message);\n this.name = \"DurableRunError\";\n }\n}\n\nexport class DurableNotFoundError extends Error {}\nexport class DurableConflictError extends Error {}\n\n/** Internal marker for errors within core completion, excluding journal and tool failures. */\nexport class DurableModelError extends Error {\n constructor(\n readonly operationId: string,\n readonly attempts: number,\n cause: unknown,\n ) {\n super(cause instanceof Error ? cause.message : String(cause), { cause });\n }\n}\n\n/** Fatal journal failure; application retries cannot repair a poisoned runtime. */\nexport class DurableStorageError extends Error {}\n\nexport class DurableLimitError extends Error {}\n","import { DurableLimitError } from \"./errors.js\";\nimport type { DurableTransaction } from \"./types.js\";\n\nexport type DurableLimits = {\n maxPendingRuns: number;\n maxPendingTasks: number;\n maxPayloadBytes: number;\n maxOperations: number;\n};\nexport function durableLimits(input: Partial<DurableLimits> = {}): DurableLimits {\n const limits = {\n maxPendingRuns: 10_000,\n maxPendingTasks: 10_000,\n maxPayloadBytes: 1_048_576,\n maxOperations: 10_000,\n ...input,\n };\n for (const [name, value] of Object.entries(limits))\n if (!Number.isSafeInteger(value) || value < 1)\n throw new TypeError(`Invalid durable limit: ${name}`);\n return limits;\n}\n\n/** Runs inside the journal transaction; capacity decisions and writes are atomic. */\nexport function limitedTransaction(\n tx: DurableTransaction,\n limits: DurableLimits,\n): DurableTransaction {\n const payload = (value: unknown) => {\n if (\n value !== undefined &&\n new TextEncoder().encode(JSON.stringify(value)).byteLength > limits.maxPayloadBytes\n )\n throw new DurableLimitError(\"Durable payload byte limit exceeded.\");\n };\n const terminal = (status: string) => [\"completed\", \"failed\", \"cancelled\"].includes(status);\n return {\n ...tx,\n putRun(run) {\n const previous = tx.getRun(run.id);\n if (\n !terminal(run.status) &&\n (previous === undefined || terminal(previous.status)) &&\n tx.pendingCounts().runs >= limits.maxPendingRuns\n )\n throw new DurableLimitError(\"Pending durable run limit reached.\");\n if (previous === undefined) payload(run.prompt);\n for (const key of [\"input\", \"history\", \"responses\", \"outcome\"] as const)\n if (JSON.stringify(previous?.[key]) !== JSON.stringify(run[key])) payload(run[key]);\n tx.putRun(run);\n },\n putTask(task) {\n const previous = tx.getTask(task.id);\n if (\n !terminal(task.status) &&\n (previous === undefined || terminal(previous.status)) &&\n tx.pendingCounts().tasks >= limits.maxPendingTasks\n )\n throw new DurableLimitError(\"Pending durable task limit reached.\");\n // Allow control/status transitions after limits are lowered on restart.\n for (const key of [\"input\", \"checkpoint\", \"signals\"] as const)\n if (JSON.stringify(previous?.[key]) !== JSON.stringify(task[key])) payload(task[key]);\n // Owned-agent output was admitted with its run; copying it must survive lower quotas.\n if (\n task.agentRunId === undefined &&\n task.outcome?.status === \"completed\" &&\n JSON.stringify(previous?.outcome) !== JSON.stringify(task.outcome)\n )\n payload(task.outcome.output);\n tx.putTask(task);\n },\n putOperation(id, operation) {\n const previous = tx.getOperation(id, operation.key);\n if (previous === undefined && tx.operationCount(id) >= limits.maxOperations)\n throw new DurableLimitError(\"Durable operation count limit reached.\");\n if (JSON.stringify(previous?.input) !== JSON.stringify(operation.input))\n payload(operation.input);\n if (JSON.stringify(previous?.result) !== JSON.stringify(operation.result))\n payload(operation.result);\n tx.putOperation(id, operation);\n },\n };\n}\n","import { limitedTransaction, type DurableLimits } from \"./limits.js\";\nimport { DurableStorageError } from \"./errors.js\";\nimport type { DurableStore, DurableTransaction } from \"./types.js\";\n\n/** A journal failure poisons the owner, even when application code catches the error. */\nexport function guardStore(\n store: DurableStore,\n onFailure: (error: DurableStorageError) => void,\n limits: DurableLimits,\n): DurableStore {\n let failure: DurableStorageError | undefined;\n const fail = (cause: unknown) => {\n if (failure === undefined) {\n failure = new DurableStorageError(\"Durable storage failed; close and reopen the runtime.\", {\n cause,\n });\n onFailure(failure);\n }\n return failure;\n };\n const check = () => {\n if (failure !== undefined) throw failure;\n };\n const transaction = <T>(callback: (tx: DurableTransaction) => T): T => {\n check();\n let callbackFailed = false;\n let callbackError: unknown;\n try {\n return store.transaction((tx) => {\n const guarded = new Proxy(tx, {\n get(target, key) {\n const method: unknown = Reflect.get(target, key);\n if (typeof method !== \"function\") return method;\n return (...args: unknown[]) => {\n check();\n try {\n return Reflect.apply(method, target, args);\n } catch (error) {\n throw fail(error);\n }\n };\n },\n });\n try {\n const result = callback(limitedTransaction(guarded, limits));\n check(); // A caught write failure must roll back, never commit a partial transaction.\n return result;\n } catch (error) {\n callbackFailed = true;\n callbackError = error;\n throw error;\n }\n });\n } catch (error) {\n if (!callbackFailed || error !== callbackError) throw fail(error);\n throw failure ?? error;\n }\n };\n return new Proxy(store, {\n get(target, key) {\n if (key === \"transaction\") return transaction;\n const method: unknown = Reflect.get(target, key);\n if (typeof method !== \"function\") return method;\n if (key === \"close\") return method.bind(target);\n return (...args: unknown[]) => {\n check();\n try {\n return Reflect.apply(method, target, args);\n } catch (error) {\n throw fail(error);\n }\n };\n },\n });\n}\n","export function delay(signal: AbortSignal | undefined): Promise<void> {\n return new Promise((resolve, reject) => {\n signal?.throwIfAborted();\n const done = () => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n };\n const timer = setTimeout(done, 25);\n const abort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", abort);\n reject(signal?.reason);\n };\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n","import type { DurableRuntime } from \"./runtime.js\";\nimport type { DurableStreamOptions } from \"./run.js\";\nimport type { DurableGraphEvent, DurableGraphSnapshot } from \"./graph-types.js\";\nimport { delay } from \"./wait.js\";\n\n/** A persisted static DAG. Each node is an ordinary durable agent run in an isolated session. */\nexport class DurableTaskGraph {\n constructor(\n readonly id: string,\n private readonly runtime: DurableRuntime,\n ) {}\n async snapshot(): Promise<DurableGraphSnapshot> {\n return this.runtime.graphSnapshot(this.id);\n }\n async cancel(): Promise<void> {\n this.runtime.cancelGraph(this.id);\n }\n async *stream(options: DurableStreamOptions = {}): AsyncIterable<DurableGraphEvent> {\n let cursor = options.after ?? 0;\n const initial = await this.snapshot();\n if (!Number.isSafeInteger(cursor) || cursor < 0 || cursor > initial.cursor)\n throw new TypeError(\"Invalid graph event cursor.\");\n const taskIds = new Map(initial.nodes.map((node) => [node.runId, node.id]));\n while (true) {\n options.abortSignal?.throwIfAborted();\n const events = this.runtime.graphEvents(this.id, cursor);\n for (const event of events) {\n options.abortSignal?.throwIfAborted();\n const taskId = taskIds.get(event.runId);\n if (taskId === undefined) throw new Error(\"Graph event belongs to an unknown task.\");\n cursor = event.sequence;\n yield { ...event, graphId: this.id, taskId };\n }\n if (events.length > 0) continue;\n const snapshot = await this.snapshot();\n if (snapshot.status === \"completed\" || snapshot.status === \"cancelled\") return;\n await delay(options.abortSignal);\n }\n }\n}\n","import { DurableConflictError, DurableNotFoundError } from \"../errors.js\";\nimport { json, nonblank, sameJson } from \"../json.js\";\nimport type { DurableTransaction } from \"../types.js\";\nimport type { RegisteredTask, TaskRecord } from \"./types.js\";\n\nexport function taskKey(value: string): void {\n nonblank(value, \"Task key\");\n if (value.length > 256 || value !== value.trim())\n throw new TypeError(\"Task keys must be trimmed and at most 256 characters.\");\n if (value === \"__proto__\") throw new TypeError(\"Reserved task key.\");\n}\nexport function requireTask(tx: DurableTransaction, id: string): TaskRecord {\n const task = tx.getTask(id);\n if (task === undefined) throw new DurableNotFoundError(`Unknown durable task: ${id}`);\n return task;\n}\nexport function terminal(task: TaskRecord): boolean {\n return [\"completed\", \"failed\", \"cancelled\"].includes(task.status);\n}\nexport function saveTask(tx: DurableTransaction, task: TaskRecord): void {\n task.updatedAt = new Date().toISOString();\n tx.putTask(task);\n tx.appendEvent(\n task.id,\n \"status\",\n json({\n status: task.status,\n wait: task.wait,\n outcome: task.outcome,\n error: task.error,\n blockedOperation: task.blockedOperation,\n }),\n );\n}\nexport function createTask(\n tx: DurableTransaction,\n definition: RegisteredTask,\n input: unknown,\n sessionId: string,\n key: string,\n parentId?: string,\n): TaskRecord {\n taskKey(key);\n taskKey(sessionId);\n let parsed;\n try {\n parsed = definition.parseInput(input);\n } catch (cause) {\n if (cause instanceof TypeError) throw cause;\n throw new TypeError(\"Invalid task input.\", { cause });\n }\n const parent = parentId === undefined ? undefined : requireTask(tx, parentId);\n if (parent !== undefined && parent.status !== \"running\")\n throw new DurableConflictError(\"Parent task is no longer running.\");\n const existing = tx.findTask(sessionId, parentId, key);\n if (existing !== undefined) {\n if (\n existing.name !== definition.name ||\n existing.submissionVersion !== definition.version ||\n !sameJson(existing.submissionInput, parsed)\n )\n throw new DurableConflictError(\"Task key already belongs to a different submission.\");\n return existing;\n }\n if (parent !== undefined && (parent.depth >= 32 || tx.taskTree(parent.rootId).length >= 1000))\n throw new DurableConflictError(\"Task trees support at most 1000 nodes and depth 32.\");\n const id = globalThis.crypto.randomUUID();\n const now = new Date().toISOString();\n const task: TaskRecord = {\n id,\n rootId: parent?.rootId ?? id,\n ...(parentId === undefined ? {} : { parentId }),\n depth: parent === undefined ? 0 : parent.depth + 1,\n sessionId,\n key,\n name: definition.name,\n version: definition.version,\n submissionVersion: definition.version,\n submissionInput: parsed,\n input: parsed,\n checkpoint: definition.initial(parsed),\n status: \"pending\",\n signals: {},\n createdAt: now,\n updatedAt: now,\n };\n tx.putTask(task);\n tx.appendEvent(id, \"submitted\", json({ name: task.name, parentId, rootId: task.rootId }));\n return task;\n}\n\n/** Fence the whole owned subtree in one transaction before aborting invocations. */\nexport function cancelTree(tx: DurableTransaction, id: string, error: string): string[] {\n const ids: string[] = [];\n const pending = [requireTask(tx, id)];\n for (const task of pending) {\n if (terminal(task)) continue;\n ids.push(task.id);\n pending.push(...tx.taskChildren(task.id));\n task.status = \"cancelling\";\n task.outcome = { status: \"cancelled\", error };\n if (task.agentRunId !== undefined) {\n const run = tx.getRun(task.agentRunId)!;\n if (![\"completed\", \"failed\", \"cancelled\"].includes(run.status)) {\n run.status = \"cancelled\";\n run.error = error;\n run.updatedAt = new Date().toISOString();\n delete run.nextAttemptAt;\n tx.putRun(run);\n tx.appendEvent(run.id, \"status\", { status: \"cancelled\", error });\n }\n }\n delete task.wait;\n delete task.error;\n delete task.blockedOperation;\n saveTask(tx, task);\n }\n return ids;\n}\n\nexport function reconcileTree(\n tx: DurableTransaction,\n rootId: string,\n active: ReadonlySet<string>,\n agentActive: (id: string) => boolean,\n): { abort: string[]; deadline?: number } {\n const abort: string[] = [];\n let deadline: number | undefined;\n const nodes = tx.taskTree(rootId).reverse();\n for (const node of nodes) {\n const task = requireTask(tx, node.id);\n if (terminal(task)) continue;\n if (task.status === \"waiting\") {\n const wait = task.wait!;\n let ready = false;\n if (wait.type === \"children\") {\n const children = wait.ids.map((id) => requireTask(tx, id));\n if (\n wait.policy === \"failFast\" &&\n children.some((child) => terminal(child) && child.status !== \"completed\")\n ) {\n for (const child of children)\n if (!terminal(child) && child.status !== \"cancelling\")\n abort.push(...cancelTree(tx, child.id, \"Sibling task failed.\"));\n }\n ready = children.every(terminal);\n } else if (wait.type === \"agent\") {\n const run = tx.getRun(wait.runId);\n if (run === undefined) throw new Error(\"Owned agent run is missing.\");\n if (wait.status !== run.status) {\n wait.status = run.status;\n saveTask(tx, task);\n }\n if ([\"completed\", \"failed\", \"cancelled\"].includes(run.status)) {\n task.outcome =\n run.status === \"completed\" && run.outcome?.type === \"response\"\n ? { status: \"completed\", output: json(run.outcome.output) }\n : {\n status: run.status === \"cancelled\" ? \"cancelled\" : \"failed\",\n error: run.error ?? \"Agent did not return a successful response.\",\n };\n task.status = \"completing\";\n delete task.wait;\n saveTask(tx, task);\n }\n } else if (wait.type === \"signal\") ready = Object.hasOwn(task.signals, wait.name);\n else {\n const until = Date.parse(wait.until);\n ready = until <= Date.now();\n if (!ready) deadline = Math.min(deadline ?? Infinity, until);\n }\n if (ready) {\n task.status = \"pending\";\n delete task.wait;\n saveTask(tx, task);\n }\n }\n if (\n [\"completing\", \"cancelling\"].includes(task.status) &&\n !active.has(task.id) &&\n (task.agentRunId === undefined || !agentActive(task.agentRunId)) &&\n tx.taskChildren(task.id).every(terminal)\n ) {\n task.status = task.outcome!.status;\n saveTask(tx, task);\n }\n }\n return { abort, ...(deadline === undefined ? {} : { deadline }) };\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport {\n DurableConflictError,\n DurableRecoveryError,\n DurableStorageError,\n DurableLimitError,\n} from \"../errors.js\";\nimport { json, sameJson } from \"../json.js\";\nimport type { DurableStore, DurableTransaction, ToolRecovery } from \"../types.js\";\nimport { createTask, requireTask, taskKey } from \"./state.js\";\nimport type { RegisteredTask, TaskContext, TaskRecord } from \"./types.js\";\n\nexport function taskInvocation(\n store: DurableStore,\n task: TaskRecord,\n definitions: ReadonlyMap<string, RegisteredTask>,\n controller: AbortController,\n changed: () => void,\n spawnAgent: (\n tx: DurableTransaction,\n parent: TaskRecord,\n key: string,\n input: { agentId: string; prompt: string },\n ) => string,\n) {\n let open = true;\n let fatal: unknown;\n const transaction = <T>(callback: (tx: DurableTransaction) => T): T => {\n try {\n return store.transaction(callback);\n } catch (error) {\n if (error instanceof DurableStorageError) fatal = error;\n throw error;\n }\n };\n const effects = new Set<Promise<JsonValue>>();\n const keys = new Set<string>();\n const assertActive = () => {\n if (fatal !== undefined) throw fatal;\n controller.signal.throwIfAborted();\n if (!open) throw new DurableConflictError(\"Task invocation has finished.\");\n transaction((tx) => {\n if (requireTask(tx, task.id).status !== \"running\")\n throw new DurableConflictError(\"Task is no longer running.\");\n });\n };\n const effect = async <T extends JsonValue>(\n key: string,\n input: JsonValue,\n execute: (operationId: string, signal: AbortSignal) => Promise<T>,\n recovery: ToolRecovery = \"manual\",\n ): Promise<T> => {\n assertActive();\n taskKey(key);\n if (![\"manual\", \"safe\", \"idempotent\"].includes(recovery))\n throw new TypeError(\"Invalid effect recovery policy.\");\n if (keys.has(key))\n throw new DurableConflictError(\"Concurrent use of one effect key is not allowed.\");\n keys.add(key);\n try {\n const saved = transaction((tx) => {\n const existing = tx.getOperation(task.id, key);\n if (existing !== undefined) {\n if (!sameJson(existing.input, input) || existing.recovery !== recovery)\n throw new DurableRecoveryError(\"Effect input or recovery policy changed.\", key);\n return existing;\n }\n const operation = {\n key,\n kind: \"effect\" as const,\n input: json(input),\n status: \"started\" as const,\n recovery,\n };\n tx.putOperation(task.id, operation);\n return undefined;\n });\n if (saved?.status === \"completed\") return json(saved.result) as T;\n if (saved?.recovery === \"manual\")\n throw new DurableRecoveryError(\"Effect requires external reconciliation.\", key);\n const output = await execute(`${task.id}/${key}`, controller.signal);\n let result: JsonValue;\n try {\n result = json(output);\n } catch {\n throw new DurableRecoveryError(\n \"Effect returned non-JSON output; reconcile its external result.\",\n key,\n );\n }\n assertActive();\n try {\n transaction((tx) => {\n const operation = tx.getOperation(task.id, key)!;\n tx.putOperation(task.id, { ...operation, status: \"completed\", result });\n });\n } catch (error) {\n if (error instanceof DurableLimitError)\n throw new DurableRecoveryError(\n \"Effect result exceeds the payload limit; reconcile its external result.\",\n key,\n );\n throw error;\n }\n return result as T;\n } catch (error) {\n if (error instanceof DurableRecoveryError) fatal ??= error;\n throw error;\n } finally {\n keys.delete(key);\n }\n };\n const context: TaskContext<JsonValue, JsonValue> = {\n id: task.id,\n input: json(task.input),\n checkpoint: json(task.checkpoint),\n signal: controller.signal,\n spawn: (key, definition, input) => {\n assertActive();\n const registered = definitions.get(definition.name);\n if (registered === undefined || registered.version !== definition.version)\n throw new DurableRecoveryError(`Task definition is not registered: ${definition.name}`);\n const child = transaction((tx) =>\n createTask(tx, registered, input, task.sessionId, key, task.id),\n );\n changed();\n return child.id;\n },\n spawnAgent: (key, input) => {\n assertActive();\n const id = transaction((tx) => spawnAgent(tx, task, key, input));\n changed();\n return id;\n },\n children: () => {\n assertActive();\n return transaction((tx) => tx.taskChildren(task.id));\n },\n signalValue: (name) => {\n assertActive();\n const signals = transaction((tx) => requireTask(tx, task.id).signals);\n return Object.hasOwn(signals, name) ? json(signals[name]!.value) : undefined;\n },\n effect: (key, input, execute, recovery) => {\n const pending = effect(key, input, execute, recovery);\n effects.add(pending);\n void pending.then(\n () => effects.delete(pending),\n () => effects.delete(pending),\n );\n return pending;\n },\n };\n return {\n context,\n async finish() {\n open = false;\n if (effects.size > 0) {\n controller.abort(new Error(\"Task returned before its effects settled.\"));\n await Promise.allSettled(effects);\n if (fatal !== undefined) throw fatal;\n throw new Error(\"Task returned before its effects settled.\");\n }\n if (fatal !== undefined) throw fatal;\n },\n };\n}\n","import { z } from \"zod\";\nimport { isJsonValue, type JsonValue } from \"@anvia/core/completion\";\nimport { DurableNotFoundError } from \"../errors.js\";\nimport { json } from \"../json.js\";\nimport { createRunRecord } from \"../run-record.js\";\nimport type { DurableAgentRegistration, DurableTransaction } from \"../types.js\";\nimport { defineTask } from \"./definition.js\";\nimport { createTask, saveTask } from \"./state.js\";\nimport type { TaskRecord } from \"./types.js\";\n\nexport const TASK_SESSION_PREFIX = \"__anvia_task__:\";\nexport const agentTask = defineTask({\n name: \"anvia.agent\",\n version: 1,\n input: z.object({ agentId: z.string().min(1), prompt: z.string().min(1) }).strict(),\n checkpoint: z.null(),\n output: z.custom<JsonValue>(isJsonValue),\n initial: () => null,\n run: async () => {\n throw new Error(\"Agent task is advanced by its owned run.\");\n },\n});\n\nexport function spawnAgent(\n tx: DurableTransaction,\n agents: ReadonlyMap<string, DurableAgentRegistration>,\n parent: TaskRecord,\n key: string,\n input: { agentId: string; prompt: string },\n): string {\n const registration = agents.get(input.agentId);\n if (registration === undefined)\n throw new DurableNotFoundError(`Unknown durable agent: ${input.agentId}`);\n const child = createTask(tx, agentTask.registration, input, parent.sessionId, key, parent.id);\n if (child.agentRunId !== undefined) return child.id;\n const run = createRunRecord(\n {\n agentId: input.agentId,\n prompt: input.prompt,\n sessionId: `${TASK_SESSION_PREFIX}${child.id}`,\n requestId: child.id,\n },\n registration,\n );\n tx.putRun(run);\n tx.appendEvent(run.id, \"submitted\", json({ taskId: child.id, prompt: input.prompt }));\n child.agentRunId = run.id;\n child.status = \"waiting\";\n child.wait = { type: \"agent\", runId: run.id, status: run.status };\n saveTask(tx, child);\n return child.id;\n}\n","import { Usage } from \"@anvia/core/completion\";\nimport type { DurableAgentRegistration, DurableRunRecord, DurableSubmission } from \"./types.js\";\n\nexport const GRAPH_SESSION_PREFIX = \"__anvia_graph__:\";\nexport function createRunRecord(\n submission: DurableSubmission,\n registration: DurableAgentRegistration,\n): DurableRunRecord {\n const now = new Date().toISOString();\n return {\n ...submission,\n id: globalThis.crypto.randomUUID(),\n version: registration.version,\n status: \"queued\",\n createdAt: now,\n updatedAt: now,\n epoch: 0,\n modelTurns: 0,\n maxModelTurns: (registration.agent.defaultMaxTurns ?? 0) + 1,\n usage: Usage.empty(),\n history: [],\n responses: {},\n ...(registration.modelRetry === undefined\n ? {}\n : { modelRetry: { ...registration.modelRetry } }),\n input: { messages: [{ role: \"user\", content: submission.prompt }] },\n };\n}\n","import { json, nonblank, sameJson } from \"../json.js\";\nimport type {\n DefinedTask,\n RegisteredTask,\n TaskContext,\n TaskDefinition,\n TaskTransition,\n} from \"./types.js\";\nimport type { JsonValue } from \"@anvia/core/completion\";\nimport type { z } from \"zod\";\nimport { taskKey } from \"./state.js\";\n\nexport function defineTask<I, S, R>(definition: TaskDefinition<I, S, R>): DefinedTask<I, S, R> {\n return { ...definition, registration: registerTask(definition) };\n}\n\nexport function registerTask<I, S, R>(task: TaskDefinition<I, S, R>): RegisteredTask {\n nonblank(task.name, \"Task name\");\n taskKey(task.name);\n if (!Number.isSafeInteger(task.version) || task.version < 1)\n throw new TypeError(\"Task version must be a positive integer.\");\n const parse = (schema: z.ZodType, value: unknown): JsonValue => {\n const result = json(schema.parse(json(value)));\n if (!sameJson(result, schema.parse(json(result))))\n throw new TypeError(\"Task schemas must round-trip persisted JSON without changing it.\");\n return result;\n };\n const input = (value: unknown) => parse(task.input, value);\n const checkpoint = (value: unknown) => parse(task.checkpoint, value);\n return {\n name: task.name,\n version: task.version,\n parseInput: input,\n parseCheckpoint: checkpoint,\n parseOutput: (value) => parse(task.output, value),\n initial: (value) => checkpoint(task.initial(value as I)),\n // Both values came through the registered schemas before this invocation.\n run: async (context) =>\n (await task.run(context as unknown as TaskContext<I, S>)) as TaskTransition<\n JsonValue,\n JsonValue\n >,\n ...(task.migrate === undefined\n ? {}\n : {\n migrate: (value, state, version) => {\n const result = task.migrate!(value, state, version);\n return { input: input(result.input), checkpoint: checkpoint(result.checkpoint) };\n },\n }),\n };\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport {\n DurableConflictError,\n DurableRecoveryError,\n DurableStorageError,\n DurableLimitError,\n} from \"../errors.js\";\nimport { errorMessage, json, sameJson } from \"../json.js\";\nimport type { DurableStore, DurableAgentRegistration } from \"../types.js\";\nimport { taskWaitSchema } from \"./schema.js\";\nimport { taskInvocation } from \"./invocation.js\";\nimport { spawnAgent } from \"./agent.js\";\nimport {\n cancelTree,\n createTask,\n reconcileTree,\n requireTask,\n saveTask,\n taskKey,\n terminal,\n} from \"./state.js\";\nimport type { RegisteredTask, TaskGraphSnapshot, TaskTransition } from \"./types.js\";\n\n/** Owns phase invocations only; DurableRuntime owns the shared database lifecycle. */\nexport class TaskScheduler {\n private readonly active = new Map<\n string,\n { controller: AbortController; promise: Promise<void> }\n >();\n private readonly deadlines = new Map<string, number>();\n private timer: ReturnType<typeof setTimeout> | undefined;\n private closing = false;\n\n constructor(\n private readonly store: DurableStore,\n private readonly definitions: ReadonlyMap<string, RegisteredTask>,\n private readonly capacity: number,\n private readonly fatal: (error: unknown) => void,\n private readonly agents: ReadonlyMap<string, DurableAgentRegistration>,\n private readonly agentActive: (id: string) => boolean,\n private readonly syncAgents: (root: string) => void,\n ) {}\n\n get activeCount(): number {\n return this.active.size;\n }\n\n agentChanged(id: string): void {\n if (this.closing) return;\n this.reconcile(this.snapshot(id).task.rootId);\n this.pump();\n }\n\n submit(name: string, version: number, input: unknown, sessionId: string, key: string): string {\n const definition = this.definitions.get(name);\n if (definition === undefined || definition.version !== version)\n throw new DurableConflictError(`Task definition/version is not registered: ${name}`);\n const task = this.store.transaction((tx) => createTask(tx, definition, input, sessionId, key));\n this.pump();\n return task.id;\n }\n\n resume(): void {\n let cursor: number | undefined = 0;\n while (cursor !== undefined) {\n const page = this.store.unsettledTaskRoots(cursor);\n for (const root of page.ids) this.reconcile(root);\n cursor = page.cursor;\n }\n this.pump();\n }\n\n stop(reason: unknown): void {\n this.closing = true;\n clearTimeout(this.timer);\n for (const invocation of this.active.values()) invocation.controller.abort(reason);\n }\n\n async close(): Promise<void> {\n this.stop(new Error(\"Durable runtime closed.\"));\n await Promise.all([...this.active.values()].map((value) => value.promise));\n }\n\n snapshot(id: string) {\n return this.store.transaction((tx) => ({\n task: requireTask(tx, id),\n operations: tx.operations(id),\n cursor: tx.cursor(),\n }));\n }\n\n graph(id: string): TaskGraphSnapshot {\n return this.store.transaction((tx) => {\n const rootId = requireTask(tx, id).rootId;\n const nodes = tx.taskTree(rootId);\n const edges: TaskGraphSnapshot[\"edges\"] = [];\n for (const task of nodes) {\n if (task.parentId !== undefined)\n edges.push({ source: task.parentId, target: task.id, type: \"owns\" });\n if (task.wait?.type === \"children\")\n for (const child of task.wait.ids)\n edges.push({ source: task.id, target: child, type: \"waits\" });\n }\n return { rootId, nodes, edges, cursor: tx.cursor() };\n });\n }\n\n cancel(id: string, expectedTreeIds?: readonly string[]): void {\n const root = this.snapshot(id).task.rootId;\n const ids = this.store.transaction((tx) => {\n if (expectedTreeIds !== undefined) {\n const current = tx.taskTree(root);\n const expected = new Set(expectedTreeIds);\n if (current.length !== expected.size || current.some((task) => !expected.has(task.id)))\n throw new DurableConflictError(\n \"Task tree changed during authorization; retry cancellation.\",\n );\n }\n return cancelTree(tx, id, \"Durable task cancelled.\");\n });\n for (const task of ids)\n this.active.get(task)?.controller.abort(new Error(\"Durable task cancelled.\"));\n this.reconcile(root);\n this.pump();\n }\n\n signal(id: string, name: string, requestId: string, value: JsonValue): void {\n taskKey(name);\n taskKey(requestId);\n const root = this.store.transaction((tx) => {\n const task = requireTask(tx, id);\n if (Object.hasOwn(task.signals, name)) {\n if (!sameJson(task.signals[name], { requestId, value: json(value) }))\n throw new DurableConflictError(\"Signal already has a different delivery.\");\n return task.rootId;\n }\n if (terminal(task) || [\"completing\", \"cancelling\"].includes(task.status))\n throw new DurableConflictError(\"Task cannot receive a signal.\");\n if (Object.keys(task.signals).length >= 1000)\n throw new DurableConflictError(\"Task signal limit reached.\");\n Object.defineProperty(task.signals, name, {\n value: { requestId, value: json(value) },\n enumerable: true,\n });\n saveTask(tx, task);\n return task.rootId;\n });\n this.reconcile(root);\n this.pump();\n }\n\n retry(id: string): void {\n if (this.active.has(id)) throw new DurableConflictError(\"Task invocation is still settling.\");\n this.store.transaction((tx) => {\n const task = requireTask(tx, id);\n if (task.status !== \"needs_attention\")\n throw new DurableConflictError(\n \"Only tasks needing attention can resume; terminal outcomes are immutable.\",\n );\n delete task.error;\n delete task.blockedOperation;\n task.status = \"pending\";\n saveTask(tx, task);\n });\n this.pump();\n }\n\n resolveEffect(id: string, key: string, value: JsonValue): void {\n if (this.active.has(id)) throw new DurableConflictError(\"Task invocation is still settling.\");\n this.store.transaction((tx) => {\n const task = requireTask(tx, id);\n const operation = tx.getOperation(id, key);\n if (\n task.status !== \"needs_attention\" ||\n task.blockedOperation !== key ||\n operation?.status !== \"started\" ||\n operation.kind !== \"effect\"\n )\n throw new DurableConflictError(\"No matching effect awaiting reconciliation.\");\n tx.putOperation(id, { ...operation, status: \"completed\", result: json(value) });\n task.status = \"pending\";\n delete task.blockedOperation;\n delete task.error;\n saveTask(tx, task);\n });\n this.pump();\n }\n\n private reconcile(root: string): void {\n // A fail-fast pass may mark earlier children cancelling; the second pass settles idle ones.\n for (let pass = 0; pass < 2; pass++) {\n const result = this.store.transaction((tx) =>\n reconcileTree(tx, root, new Set(this.active.keys()), this.agentActive),\n );\n for (const id of result.abort)\n this.active.get(id)?.controller.abort(new Error(\"Sibling task failed.\"));\n if (result.deadline === undefined) this.deadlines.delete(root);\n else this.deadlines.set(root, result.deadline);\n }\n this.syncAgents(root);\n }\n\n private pump(): void {\n if (this.closing) return;\n clearTimeout(this.timer);\n for (const [root, deadline] of this.deadlines) if (deadline <= Date.now()) this.reconcile(root);\n const capacity = this.capacity - this.active.size;\n if (capacity > 0)\n for (const id of this.store.scheduleTasks([...this.active.keys()], capacity)) this.launch(id);\n if (this.deadlines.size > 0) {\n const deadline = Math.min(...this.deadlines.values());\n this.timer = setTimeout(\n () => {\n try {\n this.pump();\n } catch (error) {\n this.stop(error);\n this.fatal(error);\n }\n },\n Math.max(1, Math.min(2_147_483_647, deadline - Date.now())),\n );\n this.timer.unref();\n }\n }\n\n private launch(id: string): void {\n const controller = new AbortController();\n const promise = new Promise<void>((resolve) => setTimeout(resolve, 0))\n .then(() => this.execute(id, controller))\n .catch((error: unknown) => {\n if (!(error instanceof DurableLimitError)) throw error;\n this.store.transaction((tx) => {\n const task = requireTask(tx, id);\n delete task.wait;\n delete task.outcome;\n task.status = \"needs_attention\";\n task.error = error.message;\n saveTask(tx, task);\n });\n })\n .finally(() => {\n this.active.delete(id);\n if (!this.closing) {\n this.reconcile(this.snapshot(id).task.rootId);\n this.pump();\n }\n })\n .catch((error: unknown) => {\n this.stop(error);\n this.fatal(error);\n });\n this.active.set(id, { controller, promise });\n }\n\n private async execute(id: string, controller: AbortController): Promise<void> {\n if (controller.signal.aborted) return;\n const task = this.store.transaction((tx) => {\n const saved = requireTask(tx, id);\n if (![\"pending\", \"running\"].includes(saved.status)) return undefined;\n const definition = this.definitions.get(saved.name);\n try {\n if (definition === undefined || definition.version < saved.version)\n throw new Error(\"Task definition/version is unavailable.\");\n if (definition.version !== saved.version) {\n if (definition.migrate === undefined)\n throw new Error(\"Task checkpoint requires a migration.\");\n const migrated = definition.migrate(saved.input, saved.checkpoint, saved.version);\n saved.input = migrated.input;\n saved.checkpoint = migrated.checkpoint;\n saved.version = definition.version;\n }\n saved.input = definition.parseInput(saved.input);\n saved.checkpoint = definition.parseCheckpoint(saved.checkpoint);\n saved.status = \"running\";\n delete saved.error;\n } catch (error) {\n saved.status = \"needs_attention\";\n saved.error = errorMessage(error);\n }\n saveTask(tx, saved);\n return saved;\n });\n if (task?.status !== \"running\") return;\n const definition = this.definitions.get(task.name)!;\n const invocation = taskInvocation(\n this.store,\n task,\n this.definitions,\n controller,\n () => {\n this.syncAgents(task.rootId);\n this.pump();\n },\n (tx, parent, key, input) => spawnAgent(tx, this.agents, parent, key, input),\n );\n let transition: TaskTransition<JsonValue, JsonValue> | undefined;\n let failure: unknown;\n try {\n transition = await definition.run(invocation.context);\n } catch (error) {\n failure = error;\n }\n try {\n await invocation.finish();\n } catch (error) {\n failure = error;\n }\n if (failure instanceof DurableStorageError) throw failure;\n if (this.closing) return;\n const abort = this.store.transaction((tx) => {\n const current = requireTask(tx, id);\n if (current.status !== \"running\") return [];\n let cancelChildren = false;\n try {\n if (failure !== undefined) throw failure;\n if (transition === undefined) throw new TypeError(\"Task must return a transition.\");\n switch (transition.status) {\n case \"pending\":\n current.checkpoint = definition.parseCheckpoint(transition.checkpoint);\n current.status = \"pending\";\n break;\n case \"waiting\": {\n const wait = taskWaitSchema.parse(transition.wait);\n if (wait.type === \"agent\")\n throw new TypeError(\"Agent waits are managed by spawnAgent().\");\n if (\n wait.type === \"children\" &&\n (new Set(wait.ids).size !== wait.ids.length ||\n wait.ids.some((child) => requireTask(tx, child).parentId !== id))\n )\n throw new TypeError(\"Tasks may wait only on distinct direct children.\");\n current.checkpoint = definition.parseCheckpoint(transition.checkpoint);\n current.wait = wait;\n current.status = \"waiting\";\n break;\n }\n case \"completed\":\n current.outcome = {\n status: \"completed\",\n output: definition.parseOutput(transition.output),\n };\n current.status = \"completing\";\n break;\n case \"failed\":\n case \"cancelled\":\n current.outcome = { status: transition.status, error: errorMessage(transition.error) };\n current.status = \"cancelling\";\n cancelChildren = true;\n break;\n default:\n throw new TypeError(\"Invalid task transition.\");\n }\n } catch (error) {\n delete current.wait;\n delete current.outcome;\n current.error = errorMessage(error);\n if (error instanceof DurableRecoveryError || error instanceof DurableLimitError) {\n current.status = \"needs_attention\";\n if (error instanceof DurableRecoveryError && error.operationId !== undefined)\n current.blockedOperation = error.operationId;\n } else {\n current.status = \"cancelling\";\n current.outcome = { status: \"failed\", error: current.error };\n cancelChildren = true;\n }\n }\n const ids = cancelChildren\n ? tx\n .taskChildren(id)\n .flatMap((child) => cancelTree(tx, child.id, \"Owner task failed or was cancelled.\"))\n : [];\n saveTask(tx, current);\n return ids;\n });\n for (const child of abort)\n this.active.get(child)?.controller.abort(new Error(\"Owner task ended.\"));\n }\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { DurableRunError } from \"../errors.js\";\nimport type { DurableStreamOptions } from \"../run.js\";\nimport { delay } from \"../wait.js\";\nimport type { TaskScheduler } from \"./scheduler.js\";\nimport { terminal } from \"./state.js\";\nimport type { TaskEvent } from \"./types.js\";\nimport type { DurableStore } from \"../types.js\";\n\n/** Typed output is available for submitted definitions; reacquired IDs return JSON. */\nexport class DurableTaskHandle<R = JsonValue> {\n constructor(\n readonly id: string,\n private readonly scheduler: TaskScheduler,\n private readonly store: DurableStore,\n private readonly assertOpen: () => void,\n ) {}\n\n async snapshot() {\n this.assertOpen();\n return this.scheduler.snapshot(this.id);\n }\n async graph() {\n this.assertOpen();\n return this.scheduler.graph(this.id);\n }\n /** Optional identity fence for callers authorizing a captured ownership tree. */\n async cancel(options: { expectedTreeIds?: readonly string[] } = {}): Promise<void> {\n this.assertOpen();\n this.scheduler.cancel(this.id, options.expectedTreeIds);\n }\n async retry(): Promise<void> {\n this.assertOpen();\n this.scheduler.retry(this.id);\n }\n async resolveEffect(key: string, value: JsonValue): Promise<void> {\n this.assertOpen();\n this.scheduler.resolveEffect(this.id, key, value);\n }\n async signal(name: string, requestId: string, value: JsonValue): Promise<void> {\n this.assertOpen();\n this.scheduler.signal(this.id, name, requestId, value);\n }\n\n async result(options: { abortSignal?: AbortSignal } = {}): Promise<R> {\n while (true) {\n options.abortSignal?.throwIfAborted();\n const { task } = await this.snapshot();\n if (terminal(task)) {\n const outcome = task.outcome!;\n if (outcome.status === \"completed\") return outcome.output as R;\n throw new DurableRunError(task.id, outcome.status, outcome.error);\n }\n await delay(options.abortSignal);\n }\n }\n\n /** Streams the entire owned tree, including children created after attachment. */\n async *stream(options: DurableStreamOptions = {}): AsyncIterable<TaskEvent> {\n let cursor = options.after ?? 0;\n const initial = await this.snapshot();\n if (!Number.isSafeInteger(cursor) || cursor < 0 || cursor > initial.cursor)\n throw new TypeError(\"Invalid task event cursor.\");\n while (true) {\n this.assertOpen();\n options.abortSignal?.throwIfAborted();\n const events = this.store.taskEvents(initial.task.rootId, cursor, 100);\n for (const event of events) {\n options.abortSignal?.throwIfAborted();\n if (event.type !== \"submitted\" && event.type !== \"status\")\n throw new Error(\"Invalid task event type.\");\n cursor = event.sequence;\n yield {\n rootId: initial.task.rootId,\n sequence: event.sequence,\n taskId: event.runId,\n createdAt: event.createdAt,\n type: event.type,\n data: event.data,\n };\n }\n if (events.length > 0) continue;\n if (terminal(this.scheduler.snapshot(initial.task.rootId).task)) return;\n await delay(options.abortSignal);\n }\n }\n}\n","import type { JsonValue } from \"@anvia/core/completion\";\nimport { DurableConflictError, DurableNotFoundError } from \"./errors.js\";\nimport { json, sameJson } from \"./json.js\";\nimport { GRAPH_SESSION_PREFIX, createRunRecord } from \"./run-record.js\";\nimport type { DurableAgentRegistration, DurableRunRecord, DurableTransaction } from \"./types.js\";\nimport type {\n DurableGraphRecord,\n DurableGraphSnapshot,\n DurableGraphSubmission,\n DurableTaskWait,\n} from \"./graph-types.js\";\n\nexport function createGraph(\n tx: DurableTransaction,\n submission: DurableGraphSubmission,\n agents: ReadonlyMap<string, DurableAgentRegistration>,\n): string {\n const existing = tx.findGraphRequest(submission.sessionId, submission.requestId);\n if (existing !== undefined) {\n if (!sameJson(existing.submission, submission))\n throw new DurableConflictError(\"Graph requestId already belongs to a different submission.\");\n return existing.id;\n }\n const id = globalThis.crypto.randomUUID();\n const runs = submission.tasks.map((task) => {\n const registration = agents.get(task.agentId);\n if (registration === undefined)\n throw new DurableNotFoundError(`Unknown durable agent: ${task.agentId}`);\n return {\n task,\n run: createRunRecord(\n {\n agentId: task.agentId,\n sessionId: `${GRAPH_SESSION_PREFIX}${id}:${task.id}`,\n requestId: task.id,\n prompt: task.prompt,\n },\n registration,\n ),\n };\n });\n const runIds = Object.fromEntries(runs.map(({ task, run }) => [task.id, run.id]));\n const graph: DurableGraphRecord = {\n id,\n submission,\n createdAt: new Date().toISOString(),\n cancelled: false,\n runIds,\n };\n tx.putGraph(graph);\n for (const { task, run } of runs) {\n run.graphId = id;\n run.taskId = task.id;\n run.dependencies = (task.dependsOn ?? []).map((dependency) => runIds[dependency]!);\n tx.putRun(run);\n tx.appendEvent(\n run.id,\n \"submitted\",\n json({ graphId: id, taskId: task.id, prompt: task.prompt }),\n );\n }\n return id;\n}\n\nexport function requireGraph(tx: DurableTransaction, id: string): DurableGraphRecord {\n const graph = tx.getGraph(id);\n if (graph === undefined) throw new DurableNotFoundError(`Unknown durable graph: ${id}`);\n return graph;\n}\n\nexport function graphSnapshot(tx: DurableTransaction, id: string): DurableGraphSnapshot {\n const graph = requireGraph(tx, id);\n const runs = new Map(\n graph.submission.tasks.map((task) => [task.id, tx.getRun(graph.runIds[task.id]!)!]),\n );\n const nodes = graph.submission.tasks.map((task) => {\n const run = runs.get(task.id)!;\n if (run === undefined || run.graphId !== id || run.taskId !== task.id)\n throw new Error(\"Graph task/run mapping changed.\");\n let wait: DurableTaskWait | undefined;\n if (run.status === \"queued\") {\n const incomplete = (task.dependsOn ?? []).filter(\n (dependency) => !successful(runs.get(dependency)!),\n );\n const failed = incomplete.filter((dependency) => dependencyFailed(runs.get(dependency)!));\n wait =\n failed.length > 0\n ? { type: \"dependency_failed\", taskIds: failed }\n : incomplete.length > 0\n ? { type: \"dependencies\", taskIds: incomplete }\n : { type: \"capacity\" };\n } else if (run.status === \"retry_wait\") wait = { type: \"retry\", until: run.nextAttemptAt! };\n else if (run.status === \"waiting\" && run.outcome?.type === \"interaction\")\n wait = { type: \"interaction\", interactionId: run.outcome.interaction.id };\n else if (run.status === \"needs_attention\")\n wait = {\n type: \"recovery\",\n ...(run.blockedOperation === undefined ? {} : { operationId: run.blockedOperation }),\n };\n return {\n id: task.id,\n agentId: task.agentId,\n runId: run.id,\n status: run.status,\n ...(wait === undefined ? {} : { wait }),\n ...(run.error === undefined ? {} : { error: run.error }),\n ...(run.outcome?.type === \"response\" ? { output: json(run.outcome.output) } : {}),\n ...(run.outcome?.type === \"interaction\" ? { interaction: run.outcome.interaction } : {}),\n };\n });\n const all = [...runs.values()];\n const status = graph.cancelled\n ? \"cancelled\"\n : all.every(successful)\n ? \"completed\"\n : nodes.some(\n (node) =>\n node.status === \"running\" ||\n node.status === \"pending\" ||\n node.wait?.type === \"capacity\",\n )\n ? \"running\"\n : all.some((run) => dependencyFailed(run) || run.status === \"needs_attention\")\n ? \"blocked\"\n : \"waiting\";\n return {\n id,\n sessionId: graph.submission.sessionId,\n requestId: graph.submission.requestId,\n createdAt: graph.createdAt,\n status,\n nodes,\n edges: graph.submission.tasks.flatMap((task) =>\n (task.dependsOn ?? []).map((source) => ({ source, target: task.id })),\n ),\n cursor: tx.cursor(),\n };\n}\n\nexport function successful(run: DurableRunRecord): boolean {\n return run.status === \"completed\" && run.outcome?.type === \"response\";\n}\nfunction dependencyFailed(run: DurableRunRecord): boolean {\n return (\n run.status === \"failed\" ||\n run.status === \"cancelled\" ||\n (run.status === \"completed\" && !successful(run))\n );\n}\n\n/** Resolve dependency outputs once, in the same transaction that activates the task. */\nexport function graphInput(tx: DurableTransaction, run: DurableRunRecord): string {\n const values: Record<string, JsonValue> = {};\n for (const dependency of run.dependencies ?? []) {\n const prerequisite = tx.getRun(dependency);\n if (\n prerequisite === undefined ||\n prerequisite.graphId !== run.graphId ||\n !successful(prerequisite) ||\n prerequisite.outcome?.type !== \"response\"\n )\n throw new DurableConflictError(\"Task dependencies are not successful.\");\n values[prerequisite.taskId!] = json(prerequisite.outcome.output);\n }\n return Object.keys(values).length === 0\n ? run.prompt\n : `${run.prompt}\\n\\nTask dependency results (JSON):\\n${JSON.stringify(values)}`;\n}\n","import { parseTaskSubmission, type TaskSubmission } from \"./task-protocol.js\";\nimport { durableLimits, type DurableLimits } from \"./limits.js\";\nimport { guardStore } from \"./storage-guard.js\";\nimport { taskListSchema } from \"./tasks/schema.js\";\nimport { DurableTaskGraph } from \"./task-graph.js\";\nimport { TaskScheduler } from \"./tasks/scheduler.js\";\nimport { DurableTaskHandle } from \"./tasks/handle.js\";\nimport type { DefinedTask, RegisteredTask, TaskListOptions } from \"./tasks/types.js\";\nimport { TASK_SESSION_PREFIX, agentTask } from \"./tasks/agent.js\";\nimport { parseDurableGraphSubmission, graphListSchema } from \"./graph-schema.js\";\nimport { createGraph, graphInput, graphSnapshot, requireGraph } from \"./graph-state.js\";\nimport { createRunRecord, GRAPH_SESSION_PREFIX } from \"./run-record.js\";\nimport type {\n DurableGraphSubmission,\n DurableGraphSnapshot,\n DurableGraphListOptions,\n DurableGraphPage,\n} from \"./graph-types.js\";\nimport {\n assertAgentInteractionResponse,\n parseAgentInteractionResponse,\n type AgentInteractionResponse,\n} from \"@anvia/core/agent/interactions\";\nimport { parseMessage, type ToolResultOutput } from \"@anvia/core/completion\";\nimport { withInternalAgentRunOptions } from \"@anvia/core/internal/agent\";\nimport {\n DurableConflictError,\n DurableModelError,\n DurableNotFoundError,\n DurableRecoveryError,\n DurableStorageError,\n DurableLimitError,\n} from \"./errors.js\";\nimport { createExecution } from \"./execution.js\";\nimport { errorMessage, json, nonblank, sameJson } from \"./json.js\";\nimport { listOptionsSchema } from \"./schema.js\";\nimport { registrations } from \"./registration.js\";\nimport { DurableRun } from \"./run.js\";\nimport type {\n DurableAgentRegistration,\n DurableListOptions,\n DurableRunPage,\n DurableSubmitOptions,\n DurableRunRecord,\n DurableRuntimeOptions,\n DurableSnapshot,\n DurableStore,\n DurableSubmission,\n DurableTransaction,\n DurableRunScope,\n} from \"./types.js\";\n\nexport class DurableRuntime {\n private readonly agents: Map<string, DurableAgentRegistration>;\n private readonly active = new Map<\n string,\n { sessionId: string; controller: AbortController; task: Promise<void> }\n >();\n private closing = false;\n private closed = false;\n private readonly store: DurableStore;\n private closePromise: Promise<void> | undefined;\n private failure: unknown;\n private wakeTimer: ReturnType<typeof setTimeout> | undefined;\n private readonly tasks: TaskScheduler;\n\n private constructor(\n store: DurableStore,\n agents: Map<string, DurableAgentRegistration>,\n private readonly maxConcurrentRuns: number,\n definitions: ReadonlyMap<string, RegisteredTask>,\n maxConcurrentTasks: number,\n limits: DurableLimits,\n private readonly onFatalError?: (error: unknown) => void,\n ) {\n this.agents = agents;\n this.store = guardStore(store, (error) => this.fail(error), limits);\n this.tasks = new TaskScheduler(\n this.store,\n definitions,\n maxConcurrentTasks,\n (error) => this.fail(error),\n agents,\n (id) => this.active.has(id),\n (root) => {\n const tasks = this.store.transaction((tx) => tx.taskTree(root));\n for (const task of tasks)\n if (task.agentRunId !== undefined && task.status === \"cancelling\")\n this.active.get(task.agentRunId)?.controller.abort(new Error(\"Owner task cancelled.\"));\n this.pump();\n },\n );\n }\n\n static async open(options: DurableRuntimeOptions): Promise<DurableRuntime> {\n const maxConcurrentRuns = options.maxConcurrentRuns ?? 4;\n if (\n !Number.isSafeInteger(maxConcurrentRuns) ||\n maxConcurrentRuns < 1 ||\n maxConcurrentRuns > 1000\n )\n throw new TypeError(\"maxConcurrentRuns must be an integer between 1 and 1000.\");\n const maxConcurrentTasks = options.maxConcurrentTasks ?? 4;\n if (\n !Number.isSafeInteger(maxConcurrentTasks) ||\n maxConcurrentTasks < 1 ||\n maxConcurrentTasks > 1000\n )\n throw new TypeError(\"maxConcurrentTasks must be an integer between 1 and 1000.\");\n const definitions = new Map<string, RegisteredTask>();\n for (const { registration } of options.tasks ?? []) {\n if (registration.name === agentTask.name)\n throw new TypeError(\"Reserved task name: anvia.agent\");\n if (definitions.has(registration.name))\n throw new TypeError(`Duplicate task definition: ${registration.name}`);\n definitions.set(registration.name, registration);\n }\n const agents = registrations(options.agents ?? []);\n const limits = durableLimits(options.limits);\n options.store.acquire();\n return new DurableRuntime(\n options.store,\n agents,\n maxConcurrentRuns,\n definitions,\n maxConcurrentTasks,\n limits,\n options.onFatalError,\n );\n }\n\n async submitTask<I, S, R>(\n definition: DefinedTask<I, S, R>,\n input: { sessionId: string; requestId: string; input: I },\n ): Promise<DurableTaskHandle<R>> {\n this.assertOpen();\n const id = this.tasks.submit(\n definition.name,\n definition.version,\n input.input,\n input.sessionId,\n input.requestId,\n );\n return new DurableTaskHandle<R>(id, this.tasks, this.store, () => this.assertOpen());\n }\n\n async submitRegisteredTask(input: TaskSubmission): Promise<DurableTaskHandle> {\n this.assertOpen();\n const submission = parseTaskSubmission(input);\n const id = this.tasks.submit(\n submission.name,\n submission.version,\n submission.input,\n submission.sessionId,\n submission.requestId,\n );\n return new DurableTaskHandle(id, this.tasks, this.store, () => this.assertOpen());\n }\n\n /** Owning scope for authorization without loading operation journals or graph results. */\n runScope(runId: string): DurableRunScope {\n this.assertOpen();\n return this.store.transaction((tx) => {\n const run = requireRun(tx, runId);\n const base = { runId, agentId: run.agentId, sessionId: run.sessionId };\n if (run.graphId !== undefined)\n return {\n ...base,\n sessionId: requireGraph(tx, run.graphId).submission.sessionId,\n graphId: run.graphId,\n taskId: run.taskId!,\n };\n if (!run.sessionId.startsWith(TASK_SESSION_PREFIX)) return base;\n const task = tx.getTask(run.sessionId.slice(TASK_SESSION_PREFIX.length));\n if (task === undefined || task.agentRunId !== runId)\n throw new DurableNotFoundError(\"Owned task is missing.\");\n return {\n ...base,\n sessionId: task.sessionId,\n taskId: task.id,\n rootTaskId: task.rootId,\n taskName: task.name,\n };\n });\n }\n\n async getTask(id: string): Promise<DurableTaskHandle> {\n this.assertOpen();\n this.tasks.snapshot(id);\n return new DurableTaskHandle(id, this.tasks, this.store, () => this.assertOpen());\n }\n\n async listTasks(options: TaskListOptions = {}) {\n this.assertOpen();\n return this.store.listTasks(taskListSchema.parse(options));\n }\n\n async taskGraph(id: string) {\n this.assertOpen();\n return this.tasks.graph(id);\n }\n\n async submit(input: DurableSubmission, options: DurableSubmitOptions = {}): Promise<DurableRun> {\n this.assertOpen();\n if (options.enqueue !== undefined && typeof options.enqueue !== \"boolean\")\n throw new TypeError(\"enqueue must be a boolean.\");\n for (const key of [\"agentId\", \"sessionId\", \"requestId\", \"prompt\"] as const)\n nonblank(input[key], key);\n if (\n input.sessionId.startsWith(GRAPH_SESSION_PREFIX) ||\n input.sessionId.startsWith(TASK_SESSION_PREFIX)\n )\n throw new TypeError(\"Reserved durable session ID.\");\n const submission = {\n agentId: input.agentId,\n sessionId: input.sessionId,\n requestId: input.requestId,\n prompt: input.prompt,\n };\n const registration = this.agents.get(input.agentId);\n if (registration === undefined)\n throw new DurableNotFoundError(`Unknown durable agent: ${input.agentId}`);\n const id = this.store.transaction((tx) => {\n const existing = tx.findRequest(input.sessionId, input.requestId);\n if (existing !== undefined) {\n if (existing.agentId !== input.agentId || existing.prompt !== input.prompt) {\n throw new DurableConflictError(\"requestId already belongs to a different submission.\");\n }\n return existing.id;\n }\n if (!options.enqueue && tx.activeRun(input.sessionId) !== undefined)\n throw new DurableConflictError(\"Session already has unfinished work.\");\n if (\n !options.enqueue &&\n [...this.active.values()].some((active) => active.sessionId === input.sessionId)\n ) {\n throw new DurableConflictError(\"Previous session execution is still settling.\");\n }\n const run = createRunRecord(submission, registration);\n tx.putRun(run);\n tx.appendEvent(run.id, \"submitted\", json(submission));\n return run.id;\n });\n this.pump();\n return new DurableRun(id, this);\n }\n\n async submitGraph(input: DurableGraphSubmission): Promise<DurableTaskGraph> {\n this.assertOpen();\n const submission = parseDurableGraphSubmission(input);\n const id = this.store.transaction((tx) => createGraph(tx, submission, this.agents));\n this.pump();\n return new DurableTaskGraph(id, this);\n }\n\n async getGraph(id: string): Promise<DurableTaskGraph> {\n this.graphSnapshot(id);\n return new DurableTaskGraph(id, this);\n }\n\n async listGraphs(options: DurableGraphListOptions = {}): Promise<DurableGraphPage> {\n this.assertOpen();\n return this.store.listGraphs(graphListSchema.parse(options));\n }\n\n graphSnapshot(id: string): DurableGraphSnapshot {\n this.assertOpen();\n return this.store.transaction((tx) => graphSnapshot(tx, id));\n }\n\n graphEvents(id: string, after: number) {\n this.assertOpen();\n if (!Number.isSafeInteger(after) || after < 0) throw new TypeError(\"Invalid event cursor.\");\n return this.store.graphEvents(id, after, 100);\n }\n\n cancelGraph(id: string): void {\n this.assertOpen();\n const ids = this.store.transaction((tx) => {\n const graph = requireGraph(tx, id);\n if (graph.cancelled || graphSnapshot(tx, id).status === \"completed\") return [];\n graph.cancelled = true;\n tx.putGraph(graph);\n const runIds = Object.values(graph.runIds);\n for (const runId of runIds) {\n const run = requireRun(tx, runId);\n if ([\"completed\", \"failed\", \"cancelled\"].includes(run.status)) continue;\n delete run.nextAttemptAt;\n run.error = \"Durable graph cancelled.\";\n setStatus(tx, run, \"cancelled\");\n }\n // Cancellation remains observable even when every task had already failed.\n tx.appendEvent(runIds[0]!, \"status\", { graphCancelled: true });\n return runIds;\n });\n for (const runId of ids)\n this.active.get(runId)?.controller.abort(new Error(\"Durable graph cancelled.\"));\n this.pump();\n }\n\n async listRuns(options: DurableListOptions = {}): Promise<DurableRunPage> {\n this.assertOpen();\n return this.store.list(listOptionsSchema.parse(options));\n }\n\n async getRun(id: string): Promise<DurableRun> {\n this.snapshot(id);\n return new DurableRun(id, this);\n }\n\n /** Discover recoverable work. This does not wait for runs or approvals to finish. */\n async resume(): Promise<void> {\n this.assertOpen();\n this.pump();\n this.tasks.resume();\n }\n\n /** Abort in-flight attempts, retain checkpoints, and release ownership after callbacks settle. */\n close(): Promise<void> {\n if (this.closePromise !== undefined) return this.closePromise;\n this.closing = true;\n clearTimeout(this.wakeTimer);\n for (const { controller } of this.active.values())\n controller.abort(new Error(\"Durable runtime closed.\"));\n this.closePromise = Promise.all([\n this.tasks.close(),\n ...[...this.active.values()].map(({ task }) => task),\n ]).then(() => {\n try {\n this.store.close();\n } finally {\n this.closed = true;\n }\n });\n return this.closePromise;\n }\n\n snapshot(id: string): DurableSnapshot {\n this.assertOpen();\n return this.store.transaction((tx) => ({\n run: requireRun(tx, id),\n operations: tx.operations(id),\n cursor: tx.cursor(),\n }));\n }\n\n events(id: string, after: number) {\n this.assertOpen();\n if (!Number.isSafeInteger(after) || after < 0) throw new TypeError(\"Invalid event cursor.\");\n return this.store.events(id, after, 100);\n }\n\n respond(id: string, interactionId: string, value: AgentInteractionResponse): void {\n this.assertOpen();\n nonblank(interactionId, \"Interaction ID\");\n const response = parseAgentInteractionResponse(value);\n this.store.transaction((tx) => {\n const run = requireRun(tx, id);\n if (run.graphId !== undefined && requireGraph(tx, run.graphId).cancelled)\n throw new DurableConflictError(\"Graph is cancelled.\");\n if (Object.hasOwn(run.responses, interactionId)) {\n if (!sameJson(run.responses[interactionId], response))\n throw new DurableConflictError(\"Interaction already received a different response.\");\n return;\n }\n assertOwnedTaskMutable(tx, run);\n if (\n run.status !== \"waiting\" ||\n run.outcome?.type !== \"interaction\" ||\n run.outcome.interaction.id !== interactionId\n ) {\n throw new DurableConflictError(\"No matching pending interaction.\");\n }\n try {\n assertAgentInteractionResponse(run.outcome.interaction, response);\n } catch (error) {\n throw new DurableConflictError(errorMessage(error));\n }\n run.responses[interactionId] = json(response);\n const continuation = run.outcome.continuation;\n // Core resumes with previous segments as history and returns messages from the new segment.\n run.history = [...run.history, ...run.outcome.messages];\n run.input = { continuation, response };\n run.epoch += 1;\n delete run.outcome;\n setStatus(tx, run, \"pending\");\n });\n this.pump();\n }\n\n resolveTool(id: string, operationId: string, output: ToolResultOutput): void {\n this.assertOpen();\n this.store.transaction((tx) => {\n const run = requireRun(tx, id);\n assertOwnedTaskMutable(tx, run);\n if (run.graphId !== undefined && requireGraph(tx, run.graphId).cancelled)\n throw new DurableConflictError(\"Graph is cancelled.\");\n if (run.status !== \"needs_attention\" || run.blockedOperation !== operationId) {\n throw new DurableConflictError(\"No matching tool awaiting reconciliation.\");\n }\n const operation = tx.getOperation(id, operationId);\n if (operation?.kind !== \"tool\" || operation.status !== \"started\")\n throw new DurableConflictError(\"Operation cannot be reconciled.\");\n const checked = parseMessage({\n role: \"tool\",\n content: [{ type: \"tool-result\", toolCallId: operationId, toolName: \"reconciled\", output }],\n });\n if (checked.role !== \"tool\" || checked.content[0]?.type !== \"tool-result\")\n throw new TypeError(\"Invalid tool result.\");\n const result = json({ output: checked.content[0].output, failed: false });\n tx.putOperation(id, { ...operation, status: \"completed\", result });\n tx.appendEvent(id, \"tool_completed\", { operationId, result, reconciled: true });\n delete run.blockedOperation;\n delete run.error;\n setStatus(tx, run, \"pending\");\n });\n this.pump();\n }\n\n retry(id: string): void {\n this.assertOpen();\n if (this.active.has(id)) throw new DurableConflictError(\"Run is still settling.\");\n this.store.transaction((tx) => {\n const run = requireRun(tx, id);\n assertOwnedTaskMutable(tx, run);\n if (run.graphId !== undefined && requireGraph(tx, run.graphId).cancelled)\n throw new DurableConflictError(\"Graph is cancelled.\");\n if (run.status !== \"failed\" && run.status !== \"needs_attention\")\n throw new DurableConflictError(\"Only failed or blocked runs can be retried.\");\n const other = tx.activeRun(run.sessionId);\n if (other !== undefined && other.id !== id && other.status !== \"queued\")\n throw new DurableConflictError(\"Session already has unfinished work.\");\n if (tx.hasLaterStartedRun(id))\n throw new DurableConflictError(\"Session has advanced; create a new submission.\");\n for (const operation of tx.operations(id)) {\n if (operation.kind === \"model\" && operation.status === \"started\")\n tx.putOperation(id, { ...operation, attempts: 0 });\n }\n delete run.error;\n delete run.blockedOperation;\n setStatus(tx, run, \"pending\");\n });\n this.pump();\n }\n\n cancel(id: string): void {\n this.assertOpen();\n const sessionId = this.store.transaction((tx) => {\n const run = requireRun(tx, id);\n if ([\"completed\", \"failed\", \"cancelled\"].includes(run.status)) return run.sessionId;\n delete run.nextAttemptAt;\n run.error = \"Durable run cancelled.\";\n setStatus(tx, run, \"cancelled\");\n return run.sessionId;\n });\n this.active.get(id)?.controller.abort(new Error(\"Durable run cancelled.\"));\n if (sessionId.startsWith(TASK_SESSION_PREFIX))\n this.tasks.agentChanged(sessionId.slice(TASK_SESSION_PREFIX.length));\n this.pump();\n }\n\n private pump(): void {\n if (this.closing || this.failure !== undefined) return;\n clearTimeout(this.wakeTimer);\n const capacity = this.maxConcurrentRuns - this.active.size;\n if (capacity <= 0) return;\n const candidates = this.store.schedule(\n new Date().toISOString(),\n capacity,\n [...this.active.values()].map((active) => active.sessionId),\n );\n for (const id of candidates.ids) this.launch(id);\n if (candidates.nextAttemptAt !== undefined) {\n this.wakeTimer = setTimeout(\n () => {\n try {\n this.pump();\n } catch (error) {\n this.fail(error);\n }\n },\n Math.max(1, Math.min(2_147_483_647, Date.parse(candidates.nextAttemptAt) - Date.now())),\n );\n this.wakeTimer.unref();\n }\n }\n\n private launch(id: string): void {\n if (this.active.has(id) || this.closing) return;\n const { status, sessionId } = this.snapshot(id).run;\n if (![\"queued\", \"pending\", \"running\", \"retry_wait\"].includes(status)) return;\n const controller = new AbortController();\n const task = Promise.resolve()\n .then(() => this.execute(id, controller.signal))\n .catch((error: unknown) => {\n if (!(error instanceof DurableLimitError)) throw error;\n this.store.transaction((tx) => {\n const run = requireRun(tx, id);\n run.error = error.message;\n setStatus(tx, run, \"needs_attention\");\n });\n })\n .finally(() => {\n this.active.delete(id);\n if (\n !this.closing &&\n this.failure === undefined &&\n sessionId.startsWith(TASK_SESSION_PREFIX)\n )\n this.tasks.agentChanged(sessionId.slice(TASK_SESSION_PREFIX.length));\n if (!this.closing && this.failure === undefined) this.pump();\n })\n .catch((error: unknown) => {\n if (controller.signal.aborted) return;\n this.fail(error);\n });\n this.active.set(id, { sessionId, controller, task });\n }\n\n private async execute(id: string, signal: AbortSignal): Promise<void> {\n signal.throwIfAborted();\n const run = this.store.transaction((tx) => {\n const current = requireRun(tx, id);\n if (![\"queued\", \"pending\", \"running\", \"retry_wait\"].includes(current.status))\n return undefined;\n if (current.status === \"queued\") {\n if (current.graphId !== undefined) {\n current.input = { messages: [{ role: \"user\", content: graphInput(tx, current) }] };\n } else {\n const previous = tx.latestCompleted(current.sessionId);\n current.history =\n previous === undefined\n ? []\n : [...previous.history, ...(previous.outcome?.messages ?? [])];\n current.input = {\n messages: [...current.history, { role: \"user\", content: current.prompt }],\n };\n }\n }\n current.startedAt ??= new Date().toISOString();\n delete current.nextAttemptAt;\n delete current.error;\n setStatus(tx, current, \"running\");\n return current;\n });\n if (run === undefined) return;\n if (run.sessionId.startsWith(TASK_SESSION_PREFIX))\n this.tasks.agentChanged(run.sessionId.slice(TASK_SESSION_PREFIX.length));\n try {\n const registration = this.agents.get(run.agentId);\n if (registration === undefined || registration.version !== run.version) {\n throw new DurableRecoveryError(\n \"The saved agent version is not registered. Restore it before retrying.\",\n );\n }\n const outcome = await registration.agent.generate(\n withInternalAgentRunOptions(\n {\n ...run.input,\n abortSignal: signal,\n retries: false,\n },\n { runId: id, execution: createExecution(this.store, run, registration, signal) },\n ),\n );\n signal.throwIfAborted();\n this.store.transaction((tx) => {\n const current = requireRun(tx, id);\n current.outcome = { ...outcome, usage: current.usage };\n setStatus(tx, current, outcome.type === \"interaction\" ? \"waiting\" : \"completed\");\n });\n } catch (error) {\n if (error instanceof DurableStorageError) throw error;\n if (signal.aborted) return;\n this.store.transaction((tx) => {\n const current = requireRun(tx, id);\n current.error = errorMessage(error);\n if (error instanceof DurableRecoveryError && error.operationId !== undefined)\n current.blockedOperation = error.operationId;\n if (\n error instanceof DurableModelError &&\n current.modelRetry !== undefined &&\n error.attempts < current.modelRetry.maxAttempts\n ) {\n const delay = Math.min(\n current.modelRetry.maxDelayMs,\n current.modelRetry.initialDelayMs * 2 ** (error.attempts - 1),\n );\n current.nextAttemptAt = new Date(Date.now() + delay).toISOString();\n setStatus(tx, current, \"retry_wait\");\n } else {\n setStatus(\n tx,\n current,\n error instanceof DurableRecoveryError ? \"needs_attention\" : \"failed\",\n );\n }\n });\n }\n }\n\n metrics() {\n this.assertOpen();\n return this.store.metrics();\n }\n\n /** Does not touch storage, so supervisors can inspect a failed owner. */\n health() {\n return {\n status: this.closed\n ? (\"closed\" as const)\n : this.closing\n ? (\"closing\" as const)\n : this.failure !== undefined\n ? (\"failed\" as const)\n : (\"ready\" as const),\n ready: !this.closing && this.failure === undefined,\n activeRuns: this.active.size,\n activeTasks: this.tasks.activeCount,\n };\n }\n\n private fail(error: unknown): void {\n if (this.failure !== undefined) return;\n this.failure = error;\n clearTimeout(this.wakeTimer);\n this.tasks?.stop(error);\n for (const active of this.active.values()) active.controller.abort(error);\n // Diagnostics must never replace the journal failure or create an unhandled rejection.\n try {\n void Promise.resolve(this.onFatalError?.(error)).catch(() => {});\n } catch {}\n }\n\n private assertOpen(): void {\n if (this.closing) throw new Error(\"Durable runtime is closed.\");\n if (this.failure !== undefined) throw this.failure;\n }\n}\n\nfunction requireRun(tx: DurableTransaction, id: string): DurableRunRecord {\n const run = tx.getRun(id);\n if (run === undefined) throw new DurableNotFoundError(`Unknown durable run: ${id}`);\n return run;\n}\n\nfunction setStatus(\n tx: DurableTransaction,\n run: DurableRunRecord,\n status: DurableRunRecord[\"status\"],\n): void {\n run.status = status;\n run.updatedAt = new Date().toISOString();\n tx.putRun(run);\n tx.appendEvent(\n run.id,\n \"status\",\n json({\n status,\n error: run.error,\n blockedOperation: run.blockedOperation,\n nextAttemptAt: run.nextAttemptAt,\n outcome: run.outcome,\n }),\n );\n}\n\nfunction assertOwnedTaskMutable(tx: DurableTransaction, run: DurableRunRecord): void {\n if (!run.sessionId.startsWith(TASK_SESSION_PREFIX)) return;\n const task = tx.getTask(run.sessionId.slice(TASK_SESSION_PREFIX.length));\n if (\n task === undefined ||\n [\"completing\", \"cancelling\", \"completed\", \"failed\", \"cancelled\"].includes(task.status)\n )\n throw new DurableConflictError(\n \"Owned task outcomes are immutable; create a new task submission.\",\n );\n}\n","import { Usage, type CompletionResponse, type JsonValue } from \"@anvia/core/completion\";\nimport type { AgentRunExecution, AgentToolExecutionResult } from \"@anvia/core/internal/agent\";\nimport { DurableModelError, DurableRecoveryError, DurableStorageError } from \"./errors.js\";\nimport { errorMessage, json, sameJson } from \"./json.js\";\nimport type {\n DurableAgentRegistration,\n DurableOperation,\n DurableRunRecord,\n DurableStore,\n} from \"./types.js\";\n\n/** Reconstruct the agent loop from committed operation results, never repeating completed effects. */\nexport function createExecution(\n store: DurableStore,\n run: DurableRunRecord,\n registration: DurableAgentRegistration,\n signal: AbortSignal,\n): AgentRunExecution {\n const prefix = `${run.epoch}:`;\n let modelPhase = 0;\n const check = () => signal.throwIfAborted();\n\n function start(\n key: string,\n kind: DurableOperation[\"kind\"],\n input: JsonValue,\n recovery: DurableOperation[\"recovery\"],\n ): DurableOperation {\n check();\n return store.transaction((tx) => {\n const previous = tx.getOperation(run.id, key);\n if (previous !== undefined) {\n if (!sameJson(previous.input, input) || previous.kind !== kind) {\n throw new DurableRecoveryError(\n \"Execution changed at a saved checkpoint; restore the registered agent version.\",\n key,\n );\n }\n if (previous.status === \"started\" && previous.recovery === \"manual\") {\n throw new DurableRecoveryError(\n \"An interrupted tool has an uncertain outcome and requires reconciliation.\",\n key,\n );\n }\n return previous;\n }\n const current = tx.getRun(run.id)!;\n if (kind === \"model\") {\n // Core's maxTurns counts tool-loop continuations in addition to the initial response.\n if (current.modelTurns >= current.maxModelTurns) {\n throw new Error(\"Durable run exhausted its model-turn budget.\");\n }\n current.modelTurns += 1;\n tx.putRun(current);\n }\n const operation: DurableOperation = { key, kind, input, recovery, status: \"started\" };\n tx.putOperation(run.id, operation);\n tx.appendEvent(run.id, kind === \"model\" ? \"model_started\" : \"tool_started\", {\n operationId: key,\n input,\n });\n return operation;\n });\n }\n\n function complete(operation: DurableOperation, result: JsonValue, usage?: Usage): void {\n check();\n store.transaction((tx) => {\n const current = tx.getRun(run.id)!;\n if (current.status !== \"running\") throw new Error(\"Durable run is no longer running.\");\n tx.putOperation(run.id, { ...operation, status: \"completed\", result });\n if (usage !== undefined) {\n current.usage = Usage.add(current.usage, usage);\n tx.putRun(current);\n }\n tx.appendEvent(run.id, operation.kind === \"model\" ? \"model_completed\" : \"tool_completed\", {\n operationId: operation.key,\n result,\n });\n });\n }\n\n return {\n async completion(turn, request, execute) {\n modelPhase = turn;\n const operation = start(\n `${prefix}model:${turn}`,\n \"model\",\n json({\n provider: registration.agent.model.provider,\n modelId: registration.agent.model.modelId,\n request,\n }),\n \"safe\",\n );\n if (operation.status === \"completed\")\n return operation.result as unknown as CompletionResponse;\n if (run.modelRetry !== undefined && (operation.attempts ?? 0) >= run.modelRetry.maxAttempts) {\n throw new DurableModelError(\n operation.key,\n operation.attempts!,\n new Error(\"Durable model attempt budget exhausted; retry explicitly to reset it.\"),\n );\n }\n const attempts = (operation.attempts ?? 0) + 1;\n operation.attempts = attempts;\n store.transaction((tx) => tx.putOperation(run.id, operation));\n let response: CompletionResponse;\n try {\n response = await execute();\n } catch (error) {\n check();\n throw new DurableModelError(operation.key, attempts, error);\n }\n // SDK response objects can contain classes, cycles, or credentials. Persist normalized fields only.\n const { rawResponse: _raw, ...normalized } = response;\n const saved = json({ ...normalized, rawResponse: null });\n complete(operation, saved, response.usage);\n return saved as unknown as CompletionResponse;\n },\n async tool(call, execute) {\n const key = `${prefix}tool:${modelPhase === 0 ? \"resume\" : modelPhase}:${call.toolCall.toolCallId}`;\n const operation = start(\n key,\n \"tool\",\n json(call),\n registration.toolRecovery?.[call.toolCall.toolName] ?? \"manual\",\n );\n if (operation.status === \"completed\") return restoreToolResult(operation.result!);\n const result = await execute({ operationId: `${run.id}/${key}` });\n check();\n try {\n const saved = json(\n result.failed\n ? { output: result.output, failed: true, error: errorMessage(result.error) }\n : result,\n );\n complete(operation, saved);\n return restoreToolResult(saved);\n } catch (error) {\n if (error instanceof DurableStorageError) throw error;\n throw new DurableRecoveryError(\n `Could not record the tool result: ${errorMessage(error)}`,\n key,\n );\n }\n },\n };\n}\n\nfunction restoreToolResult(value: JsonValue): AgentToolExecutionResult {\n const result = value as unknown as AgentToolExecutionResult;\n return result.failed ? { ...result, error: new Error(String(result.error)) } : result;\n}\n","import { AGENT_RUN_EXECUTION_VERSION, getResolvedAgentOptions } from \"@anvia/core/internal/agent\";\nimport { modelRetrySchema } from \"./schema.js\";\nimport { nonblank } from \"./json.js\";\nimport type { DurableAgentRegistration } from \"./types.js\";\n\nexport function registrations(\n values: readonly DurableAgentRegistration[],\n): Map<string, DurableAgentRegistration> {\n if (AGENT_RUN_EXECUTION_VERSION !== 1) throw new Error(\"Unsupported core execution protocol.\");\n const result = new Map<string, DurableAgentRegistration>();\n for (const registration of values) {\n nonblank(registration.version, \"Agent version\");\n const { agent } = registration;\n const options = getResolvedAgentOptions(agent);\n if (result.has(agent.id)) throw new TypeError(`Duplicate durable agent: ${agent.id}`);\n // These callbacks can perform effects or change requests during reconstruction.\n // Add them only with their own persistence boundaries, never silently replay them.\n if (\n agent.memory !== undefined ||\n agent.lifecycle !== undefined ||\n agent.middlewares.length > 0 ||\n agent.guardrails.length > 0 ||\n agent.context.length > 0 ||\n agent.mcpServers.length > 0 ||\n (options.providerTools?.length ?? 0) > 0 ||\n (options.toolIndexes?.length ?? 0) > 0\n ) {\n throw new TypeError(\n \"Durable agents currently support static local tools and instructions; memory, lifecycle, middleware, guardrails, context, MCP, provider tools, and tool indexes require additional checkpoint support.\",\n );\n }\n for (const [name, policy] of Object.entries(registration.toolRecovery ?? {})) {\n if (agent.getTool(name) === undefined) throw new TypeError(`Unknown recovery tool: ${name}`);\n if (policy !== \"safe\" && policy !== \"idempotent\" && policy !== \"manual\")\n throw new TypeError(`Invalid recovery policy for ${name}`);\n }\n result.set(agent.id, {\n agent,\n version: registration.version,\n toolRecovery: { ...registration.toolRecovery },\n ...(registration.modelRetry === undefined\n ? {}\n : { modelRetry: modelRetrySchema.parse(registration.modelRetry) }),\n });\n }\n return result;\n}\n","import { delay } from \"./wait.js\";\nimport type { AgentOutcome } from \"@anvia/core/agent\";\nimport type { AgentInteractionResponse } from \"@anvia/core/agent/interactions\";\nimport type { ToolResultOutput } from \"@anvia/core/completion\";\nimport { DurableRunError } from \"./errors.js\";\nimport type { DurableRuntime } from \"./runtime.js\";\nimport type { DurableEvent, DurableSnapshot } from \"./types.js\";\n\nexport type DurableStreamOptions = { after?: number; abortSignal?: AbortSignal };\n\n/** An identity and subscription handle. Closing a subscription never cancels execution. */\nexport class DurableRun {\n constructor(\n readonly id: string,\n private readonly runtime: DurableRuntime,\n ) {}\n\n async snapshot(): Promise<DurableSnapshot> {\n return this.runtime.snapshot(this.id);\n }\n\n async *stream(options: DurableStreamOptions = {}): AsyncIterable<DurableEvent> {\n let cursor = options.after ?? 0;\n if (!Number.isSafeInteger(cursor) || cursor < 0) throw new TypeError(\"Invalid event cursor.\");\n if (cursor > (await this.snapshot()).cursor)\n throw new TypeError(\"Event cursor is ahead of the store.\");\n while (true) {\n options.abortSignal?.throwIfAborted();\n const events = this.runtime.events(this.id, cursor);\n for (const event of events) {\n options.abortSignal?.throwIfAborted();\n cursor = event.sequence;\n yield event;\n }\n if (events.length > 0) continue;\n const { run } = await this.snapshot();\n if (run.status === \"completed\" || run.status === \"failed\" || run.status === \"cancelled\")\n return;\n await delay(options.abortSignal);\n }\n }\n\n async result(options: { abortSignal?: AbortSignal } = {}): Promise<AgentOutcome<unknown>> {\n while (true) {\n options.abortSignal?.throwIfAborted();\n // Settle from the observed state: another caller may retry before the next snapshot.\n const { run } = await this.snapshot();\n if (run.status === \"failed\" || run.status === \"cancelled\") {\n throw new DurableRunError(run.id, run.status, run.error ?? run.status);\n }\n if (run.status === \"completed\") {\n if (run.outcome === undefined) throw new Error(\"Completed durable run has no outcome.\");\n return run.outcome;\n }\n // Cancelling a wait only detaches this subscriber.\n await delay(options.abortSignal);\n }\n }\n\n async respond(interactionId: string, response: AgentInteractionResponse): Promise<void> {\n this.runtime.respond(this.id, interactionId, response);\n }\n\n async resolveTool(operationId: string, output: ToolResultOutput): Promise<void> {\n this.runtime.resolveTool(this.id, operationId, output);\n }\n\n async retry(): Promise<void> {\n this.runtime.retry(this.id);\n }\n\n async cancel(): Promise<void> {\n this.runtime.cancel(this.id);\n }\n}\n"],"mappings":"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","names":["terminal","spawnAgent","definition","Usage","Usage","delay"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type DurableBackupInfo = {
|
|
2
|
+
createdAt: string;
|
|
3
|
+
schemaVersion: number;
|
|
4
|
+
};
|
|
5
|
+
/** Offline only: close the runtime first. Acquires its ownership lock throughout the backup. */
|
|
6
|
+
declare function backupSqlite(source: string, destination: string): Promise<DurableBackupInfo>;
|
|
7
|
+
/** Restore a sealed backup into a NEW file. Never run original and restored deployments together. */
|
|
8
|
+
declare function restoreSqlite(source: string, destination: string): Promise<DurableBackupInfo>;
|
|
9
|
+
|
|
10
|
+
export { type DurableBackupInfo, backupSqlite, restoreSqlite };
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SqliteDurableStore
|
|
3
|
+
} from "./chunk-7WOOJGHA.js";
|
|
4
|
+
import "./chunk-KIMHK6CE.js";
|
|
5
|
+
|
|
6
|
+
// src/maintenance.ts
|
|
7
|
+
import { backup, DatabaseSync } from "node:sqlite";
|
|
8
|
+
import {
|
|
9
|
+
chmodSync,
|
|
10
|
+
closeSync,
|
|
11
|
+
fsyncSync,
|
|
12
|
+
linkSync,
|
|
13
|
+
lstatSync,
|
|
14
|
+
mkdtempSync,
|
|
15
|
+
openSync,
|
|
16
|
+
rmSync,
|
|
17
|
+
statSync
|
|
18
|
+
} from "node:fs";
|
|
19
|
+
import { dirname, join, resolve } from "node:path";
|
|
20
|
+
function validate(db) {
|
|
21
|
+
if (db.prepare("PRAGMA integrity_check").get().integrity_check !== "ok")
|
|
22
|
+
throw new Error("Durable database integrity check failed.");
|
|
23
|
+
if (db.prepare("SELECT version FROM anvia_durable_owner WHERE singleton = 1").get()?.version !== 3)
|
|
24
|
+
throw new Error("Maintenance requires durable schema version 3.");
|
|
25
|
+
}
|
|
26
|
+
function sync(path) {
|
|
27
|
+
const fd = openSync(path, "r");
|
|
28
|
+
try {
|
|
29
|
+
fsyncSync(fd);
|
|
30
|
+
} finally {
|
|
31
|
+
closeSync(fd);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function assertDestination(path) {
|
|
35
|
+
for (const suffix of ["", "-wal", "-shm", "-journal"])
|
|
36
|
+
if (lstatSync(path + suffix, { throwIfNoEntry: false }) !== void 0)
|
|
37
|
+
throw Object.assign(
|
|
38
|
+
new Error("Backup/restore destination and SQLite sidecars must not exist."),
|
|
39
|
+
{ code: "EEXIST" }
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
async function copy(source, destination, prepare) {
|
|
43
|
+
const path = resolve(destination);
|
|
44
|
+
assertDestination(path);
|
|
45
|
+
const directory = mkdtempSync(join(dirname(path), ".anvia-backup-"));
|
|
46
|
+
const temporary = join(directory, "snapshot.sqlite");
|
|
47
|
+
try {
|
|
48
|
+
closeSync(openSync(temporary, "wx", 384));
|
|
49
|
+
await backup(source, temporary);
|
|
50
|
+
chmodSync(temporary, 384);
|
|
51
|
+
const db = new DatabaseSync(temporary);
|
|
52
|
+
try {
|
|
53
|
+
db.exec("PRAGMA synchronous = FULL");
|
|
54
|
+
validate(db);
|
|
55
|
+
prepare(db);
|
|
56
|
+
db.exec("PRAGMA wal_checkpoint(TRUNCATE); PRAGMA journal_mode = DELETE");
|
|
57
|
+
} finally {
|
|
58
|
+
db.close();
|
|
59
|
+
}
|
|
60
|
+
sync(temporary);
|
|
61
|
+
assertDestination(path);
|
|
62
|
+
linkSync(temporary, path);
|
|
63
|
+
sync(dirname(path));
|
|
64
|
+
} finally {
|
|
65
|
+
rmSync(directory, { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function backupSqlite(source, destination) {
|
|
69
|
+
if (!statSync(source).isFile())
|
|
70
|
+
throw new TypeError("Backup source must be an existing database file.");
|
|
71
|
+
const validation = new DatabaseSync(source, { readOnly: true });
|
|
72
|
+
try {
|
|
73
|
+
validate(validation);
|
|
74
|
+
} finally {
|
|
75
|
+
validation.close();
|
|
76
|
+
}
|
|
77
|
+
const owner = new SqliteDurableStore(source);
|
|
78
|
+
try {
|
|
79
|
+
owner.acquire();
|
|
80
|
+
const db = new DatabaseSync(source, { readOnly: true });
|
|
81
|
+
const info = { createdAt: (/* @__PURE__ */ new Date()).toISOString(), schemaVersion: 3 };
|
|
82
|
+
try {
|
|
83
|
+
await copy(db, destination, (snapshot) => {
|
|
84
|
+
snapshot.exec(
|
|
85
|
+
"UPDATE anvia_durable_owner SET token = NULL, pid = NULL, host = NULL WHERE singleton = 1; CREATE TABLE anvia_durable_backup (metadata TEXT NOT NULL)"
|
|
86
|
+
);
|
|
87
|
+
snapshot.prepare("INSERT INTO anvia_durable_backup VALUES (?)").run(JSON.stringify(info));
|
|
88
|
+
});
|
|
89
|
+
} finally {
|
|
90
|
+
db.close();
|
|
91
|
+
}
|
|
92
|
+
return info;
|
|
93
|
+
} finally {
|
|
94
|
+
owner.close();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function restoreSqlite(source, destination) {
|
|
98
|
+
const db = new DatabaseSync(source, { readOnly: true });
|
|
99
|
+
try {
|
|
100
|
+
validate(db);
|
|
101
|
+
const row = db.prepare("SELECT metadata FROM anvia_durable_backup").get();
|
|
102
|
+
const info = JSON.parse(String(row?.metadata));
|
|
103
|
+
if (info.schemaVersion !== 3 || typeof info.createdAt !== "string" || !Number.isFinite(Date.parse(info.createdAt)))
|
|
104
|
+
throw new Error("Invalid durable backup metadata.");
|
|
105
|
+
await copy(db, destination, (snapshot) => {
|
|
106
|
+
snapshot.exec(
|
|
107
|
+
"DROP TABLE anvia_durable_backup; UPDATE anvia_durable_owner SET token = NULL, pid = NULL, host = NULL WHERE singleton = 1"
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
return info;
|
|
111
|
+
} finally {
|
|
112
|
+
db.close();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export {
|
|
116
|
+
backupSqlite,
|
|
117
|
+
restoreSqlite
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/maintenance.ts"],"sourcesContent":["import { backup, DatabaseSync } from \"node:sqlite\";\nimport {\n chmodSync,\n closeSync,\n fsyncSync,\n linkSync,\n lstatSync,\n mkdtempSync,\n openSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { SqliteDurableStore } from \"./sqlite.js\";\n\nexport type DurableBackupInfo = { createdAt: string; schemaVersion: number };\n\nfunction validate(db: DatabaseSync): void {\n if (db.prepare(\"PRAGMA integrity_check\").get()!.integrity_check !== \"ok\")\n throw new Error(\"Durable database integrity check failed.\");\n if (\n db.prepare(\"SELECT version FROM anvia_durable_owner WHERE singleton = 1\").get()?.version !== 3\n )\n throw new Error(\"Maintenance requires durable schema version 3.\");\n}\nfunction sync(path: string): void {\n const fd = openSync(path, \"r\");\n try {\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n}\n\nfunction assertDestination(path: string): void {\n for (const suffix of [\"\", \"-wal\", \"-shm\", \"-journal\"])\n if (lstatSync(path + suffix, { throwIfNoEntry: false }) !== undefined)\n throw Object.assign(\n new Error(\"Backup/restore destination and SQLite sidecars must not exist.\"),\n { code: \"EEXIST\" },\n );\n}\n\n/** Publishes a sealed SQLite snapshot without replacing any existing destination. */\nasync function copy(\n source: DatabaseSync,\n destination: string,\n prepare: (db: DatabaseSync) => void,\n): Promise<void> {\n const path = resolve(destination);\n assertDestination(path);\n const directory = mkdtempSync(join(dirname(path), \".anvia-backup-\"));\n const temporary = join(directory, \"snapshot.sqlite\");\n try {\n closeSync(openSync(temporary, \"wx\", 0o600));\n await backup(source, temporary);\n chmodSync(temporary, 0o600);\n const db = new DatabaseSync(temporary);\n try {\n db.exec(\"PRAGMA synchronous = FULL\");\n validate(db);\n prepare(db);\n db.exec(\"PRAGMA wal_checkpoint(TRUNCATE); PRAGMA journal_mode = DELETE\");\n } finally {\n db.close();\n }\n sync(temporary);\n assertDestination(path);\n linkSync(temporary, path); // Atomic, and EEXIST rather than replacing a database or symlink.\n sync(dirname(path));\n } finally {\n rmSync(directory, { recursive: true, force: true });\n }\n}\n\n/** Offline only: close the runtime first. Acquires its ownership lock throughout the backup. */\nexport async function backupSqlite(\n source: string,\n destination: string,\n): Promise<DurableBackupInfo> {\n if (!statSync(source).isFile())\n throw new TypeError(\"Backup source must be an existing database file.\");\n const validation = new DatabaseSync(source, { readOnly: true });\n try {\n validate(validation);\n } finally {\n validation.close();\n }\n const owner = new SqliteDurableStore(source);\n try {\n owner.acquire();\n const db = new DatabaseSync(source, { readOnly: true });\n const info = { createdAt: new Date().toISOString(), schemaVersion: 3 };\n try {\n await copy(db, destination, (snapshot) => {\n snapshot.exec(\n \"UPDATE anvia_durable_owner SET token = NULL, pid = NULL, host = NULL WHERE singleton = 1; CREATE TABLE anvia_durable_backup (metadata TEXT NOT NULL)\",\n );\n snapshot.prepare(\"INSERT INTO anvia_durable_backup VALUES (?)\").run(JSON.stringify(info));\n });\n } finally {\n db.close();\n }\n return info;\n } finally {\n owner.close();\n }\n}\n\n/** Restore a sealed backup into a NEW file. Never run original and restored deployments together. */\nexport async function restoreSqlite(\n source: string,\n destination: string,\n): Promise<DurableBackupInfo> {\n const db = new DatabaseSync(source, { readOnly: true });\n try {\n validate(db);\n const row = db.prepare(\"SELECT metadata FROM anvia_durable_backup\").get();\n const info = JSON.parse(String(row?.metadata)) as DurableBackupInfo;\n if (\n info.schemaVersion !== 3 ||\n typeof info.createdAt !== \"string\" ||\n !Number.isFinite(Date.parse(info.createdAt))\n )\n throw new Error(\"Invalid durable backup metadata.\");\n await copy(db, destination, (snapshot) => {\n snapshot.exec(\n \"DROP TABLE anvia_durable_backup; UPDATE anvia_durable_owner SET token = NULL, pid = NULL, host = NULL WHERE singleton = 1\",\n );\n });\n return info;\n } finally {\n db.close();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as _anvia_core_agent_interactions from '@anvia/core/agent/interactions';
|
|
2
|
+
import { p as DurableGraphSubmission, q as DurableGraphListOptions, r as DurableGraphPage, b as DurableGraphSnapshot, a as DurableEvent, c as DurableGraphEvent, s as DurableListOptions, t as DurableRunPage, D as DurableSnapshot } from './types-CBjKEKQ7.js';
|
|
3
|
+
export { w as DurableGraphNode, C as DurableRunSummary, n as DurableSubmission, o as DurableSubmitOptions, E as DurableTask, F as DurableTaskWait, h as TaskEvent, g as TaskGraphSnapshot, l as TaskListOptions, m as TaskPage, T as TaskRecord } from './types-CBjKEKQ7.js';
|
|
4
|
+
import { ToolResultOutput } from '@anvia/core/completion';
|
|
5
|
+
export { a as TaskSnapshot, T as TaskSubmission, p as parseTaskEvent, b as parseTaskGraph, c as parseTaskListOptions, d as parseTaskPage, e as parseTaskResolution, f as parseTaskSignal, g as parseTaskSnapshot, h as parseTaskSubmission } from './task-protocol-Cewz7y6v.js';
|
|
6
|
+
import 'zod';
|
|
7
|
+
import '@anvia/core/agent';
|
|
8
|
+
|
|
9
|
+
declare function parseDurableGraphSubmission(value: unknown): DurableGraphSubmission;
|
|
10
|
+
|
|
11
|
+
declare function parseDurableGraphSnapshot(value: unknown): DurableGraphSnapshot;
|
|
12
|
+
declare function parseDurableGraphListOptions(value: unknown): DurableGraphListOptions;
|
|
13
|
+
declare function parseDurableGraphPage(value: unknown): DurableGraphPage;
|
|
14
|
+
|
|
15
|
+
declare function parseDurableSubmission(value: unknown): {
|
|
16
|
+
agentId: string;
|
|
17
|
+
sessionId: string;
|
|
18
|
+
requestId: string;
|
|
19
|
+
prompt: string;
|
|
20
|
+
enqueue?: boolean | undefined;
|
|
21
|
+
};
|
|
22
|
+
declare function parseDurableResponse(value: unknown): {
|
|
23
|
+
interactionId: string;
|
|
24
|
+
response: _anvia_core_agent_interactions.AgentInteractionResponse;
|
|
25
|
+
};
|
|
26
|
+
declare function parseDurableListOptions(value: unknown): DurableListOptions;
|
|
27
|
+
declare function parseDurableResolution(value: unknown): {
|
|
28
|
+
operationId: string;
|
|
29
|
+
output: ToolResultOutput;
|
|
30
|
+
};
|
|
31
|
+
declare function parseDurableSnapshot(value: unknown): DurableSnapshot;
|
|
32
|
+
declare function parseDurableEvent(value: unknown): DurableEvent;
|
|
33
|
+
declare function parseDurableRunPage(value: unknown): DurableRunPage;
|
|
34
|
+
|
|
35
|
+
declare function parseDurableGraphEvent(value: unknown): DurableGraphEvent;
|
|
36
|
+
|
|
37
|
+
export { DurableEvent, DurableGraphEvent, DurableGraphListOptions, DurableGraphPage, DurableGraphSnapshot, DurableGraphSubmission, DurableListOptions, DurableRunPage, DurableSnapshot, parseDurableEvent, parseDurableGraphEvent, parseDurableGraphListOptions, parseDurableGraphPage, parseDurableGraphSnapshot, parseDurableGraphSubmission, parseDurableListOptions, parseDurableResolution, parseDurableResponse, parseDurableRunPage, parseDurableSnapshot, parseDurableSubmission };
|