@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/metrics.ts","../src/tasks/sqlite.ts","../src/sqlite.ts"],"sourcesContent":["import type { DatabaseSync } from \"node:sqlite\";\n\nexport type DurableMetrics = {\n observedAt: string;\n runs: Record<string, number>;\n tasks: Record<string, number>;\n oldestPendingAgeMs: number;\n operations: number;\n events: number;\n databaseBytes: number;\n};\n\n/** Aggregate only: no session identifiers, prompts, checkpoints, or outputs. */\nexport function sqliteMetrics(db: DatabaseSync): DurableMetrics {\n const statuses = (table: string) =>\n Object.fromEntries(\n db\n .prepare(`SELECT status, COUNT(*) AS n FROM ${table} GROUP BY status`)\n .all()\n .map((row) => [String(row.status), Number(row.n)]),\n );\n const oldest = db\n .prepare(`SELECT MIN(created) AS oldest FROM (\n SELECT MIN(json_extract(record, '$.createdAt')) AS created FROM anvia_durable_runs WHERE status NOT IN ('completed', 'failed', 'cancelled')\n UNION ALL SELECT MIN(json_extract(record, '$.createdAt')) FROM anvia_durable_tasks WHERE status NOT IN ('completed', 'failed', 'cancelled')\n )`)\n .get()!.oldest;\n const count = (table: string) =>\n Number(db.prepare(`SELECT COUNT(*) AS n FROM ${table}`).get()!.n);\n return {\n observedAt: new Date().toISOString(),\n runs: statuses(\"anvia_durable_runs\"),\n tasks: statuses(\"anvia_durable_tasks\"),\n oldestPendingAgeMs:\n typeof oldest === \"string\" ? Math.max(0, Date.now() - Date.parse(oldest)) : 0,\n operations: count(\"anvia_durable_operations\"),\n events: count(\"anvia_durable_events\"),\n databaseBytes:\n Number(db.prepare(\"PRAGMA page_count\").get()!.page_count) *\n Number(db.prepare(\"PRAGMA page_size\").get()!.page_size),\n };\n}\n","import type { DatabaseSync } from \"node:sqlite\";\nimport { parseTask, taskListSchema } from \"./schema.js\";\nimport type { TaskListOptions, TaskPage, TaskRecord, TaskTransaction } from \"./types.js\";\n\nexport const taskTables = `\n CREATE TABLE IF NOT EXISTS anvia_durable_tasks (\n id TEXT PRIMARY KEY, root_id TEXT NOT NULL, parent_id TEXT NOT NULL,\n session_id TEXT NOT NULL, key TEXT NOT NULL, status TEXT NOT NULL, ready_order INTEGER NOT NULL, record TEXT NOT NULL,\n UNIQUE(session_id, parent_id, key)\n );\n CREATE INDEX IF NOT EXISTS anvia_durable_task_root ON anvia_durable_tasks(root_id);\n CREATE INDEX IF NOT EXISTS anvia_durable_task_parent ON anvia_durable_tasks(parent_id);\n CREATE INDEX IF NOT EXISTS anvia_durable_task_status ON anvia_durable_tasks(status);\n`;\n\nexport function taskTransaction(db: DatabaseSync, assertActive: () => void): TaskTransaction {\n const read = (sql: string, ...parameters: string[]): TaskRecord[] => {\n assertActive();\n return db\n .prepare(sql)\n .all(...parameters)\n .map((row) => parseTask(JSON.parse(String(row.record))));\n };\n return {\n getTask: (id) => read(\"SELECT record FROM anvia_durable_tasks WHERE id = ?\", id)[0],\n findTask: (session, parent, key) =>\n read(\n \"SELECT record FROM anvia_durable_tasks WHERE session_id = ? AND parent_id = ? AND key = ?\",\n session,\n parent ?? \"\",\n key,\n )[0],\n taskChildren: (id) =>\n read(\"SELECT record FROM anvia_durable_tasks WHERE parent_id = ? ORDER BY rowid\", id),\n taskTree: (root) =>\n read(\"SELECT record FROM anvia_durable_tasks WHERE root_id = ? ORDER BY rowid\", root),\n putTask: (value) => {\n assertActive();\n const task = parseTask(value);\n db.prepare(`INSERT INTO anvia_durable_tasks(id, root_id, parent_id, session_id, key, status, record, ready_order)\n VALUES (?, ?, ?, ?, ?, ?, ?, (SELECT COALESCE(MAX(sequence), 0) + 1 FROM anvia_durable_events))\n ON CONFLICT(id) DO UPDATE SET status = excluded.status, record = excluded.record, ready_order = excluded.ready_order`).run(\n task.id,\n task.rootId,\n task.parentId ?? \"\",\n task.sessionId,\n task.key,\n task.status,\n JSON.stringify(task),\n );\n },\n };\n}\n\nexport function listTasks(db: DatabaseSync, input: TaskListOptions): TaskPage {\n const options = taskListSchema.parse(input);\n const limit = options.limit ?? 50;\n const rows = db\n .prepare(`SELECT rowid AS cursor, record FROM anvia_durable_tasks WHERE parent_id = ''\n AND rowid > ? ${options.sessionId === undefined ? \"\" : \"AND session_id = ?\"} ORDER BY rowid LIMIT ?`)\n .all(\n options.after ?? 0,\n ...(options.sessionId === undefined ? [] : [options.sessionId]),\n limit + 1,\n );\n const page = rows.slice(0, limit);\n return {\n tasks: page.map((row) => parseTask(JSON.parse(String(row.record)))),\n ...(rows.length > limit ? { nextCursor: Number(page.at(-1)!.cursor) } : {}),\n };\n}\n\nexport function scheduleTasks(\n db: DatabaseSync,\n excluded: readonly string[],\n limit: number,\n): string[] {\n const filter =\n excluded.length === 0 ? \"\" : `AND id NOT IN (${excluded.map(() => \"?\").join(\",\")})`;\n return db\n .prepare(\n `SELECT id FROM anvia_durable_tasks WHERE status IN ('pending', 'running') ${filter} ORDER BY ready_order, rowid LIMIT ?`,\n )\n .all(...excluded, limit)\n .map((row) => String(row.id));\n}\n\nexport function unsettledTaskRoots(\n db: DatabaseSync,\n after: number,\n): { ids: string[]; cursor?: number } {\n const rows = db\n .prepare(`SELECT rowid AS cursor, id FROM anvia_durable_tasks\n WHERE parent_id = '' AND status NOT IN ('completed', 'failed', 'cancelled') AND rowid > ? ORDER BY rowid LIMIT 100`)\n .all(after);\n return {\n ids: rows.map((row) => String(row.id)),\n ...(rows.length === 100 ? { cursor: Number(rows.at(-1)!.cursor) } : {}),\n };\n}\n","import { sqliteMetrics } from \"./metrics.js\";\nimport { graphListSchema, parseGraphRecord } from \"./graph-schema.js\";\nimport {\n taskTables,\n taskTransaction,\n listTasks,\n scheduleTasks,\n unsettledTaskRoots,\n} from \"./tasks/sqlite.js\";\nimport type { TaskListOptions } from \"./tasks/types.js\";\nimport type { DurableGraphListOptions, DurableGraphPage } from \"./graph-types.js\";\nimport { hostname } from \"node:os\";\nimport { DatabaseSync } from \"node:sqlite\";\nimport { json, nonblank } from \"./json.js\";\nimport { eventTypeSchema, listOptionsSchema, parseOperation, parseRun } from \"./schema.js\";\nimport type {\n DurableEvent,\n DurableListOptions,\n DurableRunPage,\n DurableRunRecord,\n DurableStore,\n DurableTransaction,\n} from \"./types.js\";\n\n/** SQLite storage for one host and one runtime owner. Use a dedicated local database file. */\nexport class SqliteDurableStore implements DurableStore {\n private readonly database: DatabaseSync;\n private readonly token = globalThis.crypto.randomUUID();\n private acquired = false;\n private closed = false;\n private inTransaction = false;\n\n constructor(path: string) {\n nonblank(path, \"SQLite path\");\n this.database = new DatabaseSync(path);\n try {\n if (\n this.database\n .prepare(\"SELECT 1 FROM sqlite_master WHERE name = 'anvia_durable_backup'\")\n .get() !== undefined\n )\n throw new Error(\"Sealed durable backup; restore it into a new database before opening.\");\n this.database.exec(`\n PRAGMA busy_timeout = 5000;\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = FULL;\n CREATE TABLE IF NOT EXISTS anvia_durable_owner (\n singleton INTEGER PRIMARY KEY CHECK (singleton = 1),\n version INTEGER NOT NULL, token TEXT, pid INTEGER, host TEXT\n );\n INSERT OR IGNORE INTO anvia_durable_owner(singleton, version) VALUES (1, 3);\n CREATE TABLE IF NOT EXISTS anvia_durable_runs (\n id TEXT PRIMARY KEY, session_id TEXT NOT NULL, request_id TEXT NOT NULL,\n status TEXT NOT NULL, record TEXT NOT NULL,\n UNIQUE(session_id, request_id)\n );\n CREATE INDEX IF NOT EXISTS anvia_durable_run_session ON anvia_durable_runs(session_id, status);\n CREATE TABLE IF NOT EXISTS anvia_durable_graphs (\n id TEXT PRIMARY KEY, session_id TEXT NOT NULL, request_id TEXT NOT NULL, record TEXT NOT NULL,\n UNIQUE(session_id, request_id)\n );\n CREATE INDEX IF NOT EXISTS anvia_durable_run_graph ON anvia_durable_runs(json_extract(record, '$.graphId'));\n CREATE TABLE IF NOT EXISTS anvia_durable_operations (\n run_id TEXT NOT NULL, key TEXT NOT NULL, record TEXT NOT NULL,\n PRIMARY KEY(run_id, key)\n );\n CREATE TABLE IF NOT EXISTS anvia_durable_events (\n sequence INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL, created_at TEXT NOT NULL, type TEXT NOT NULL, data TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS anvia_durable_event_run ON anvia_durable_events(run_id, sequence);\n ${taskTables}\n `);\n const version = this.database\n .prepare(\"SELECT version FROM anvia_durable_owner WHERE singleton = 1\")\n .get();\n if (version?.version !== 1 && version?.version !== 2 && version?.version !== 3)\n throw new Error(\"Unsupported durable database schema version.\");\n } catch (error) {\n this.database.close();\n throw error;\n }\n }\n\n acquire(): void {\n if (this.closed || this.acquired)\n throw new Error(\"Durable store is closed or already acquired.\");\n this.atomic(() => {\n const owner = this.database\n .prepare(\"SELECT token, pid, host FROM anvia_durable_owner WHERE singleton = 1\")\n .get()!;\n if (owner.token !== null && (owner.host !== hostname() || processExists(Number(owner.pid)))) {\n throw new Error(\n \"Durable store already has a live owner. Only one runtime per database is supported.\",\n );\n }\n this.database\n .prepare(\n \"UPDATE anvia_durable_owner SET token = ?, pid = ?, host = ?, version = 3 WHERE singleton = 1\",\n )\n .run(this.token, process.pid, hostname());\n });\n this.acquired = true;\n }\n\n close(): void {\n if (this.closed) return;\n try {\n if (this.acquired) {\n this.atomic(() => {\n this.database\n .prepare(\n \"UPDATE anvia_durable_owner SET token = NULL, pid = NULL, host = NULL WHERE singleton = 1 AND token = ?\",\n )\n .run(this.token);\n });\n }\n } finally {\n this.database.close();\n this.closed = true;\n this.acquired = false;\n }\n }\n\n transaction<T>(callback: (tx: DurableTransaction) => T): T {\n this.assertOpen();\n return this.atomic(() => {\n this.assertOwner();\n let active = true;\n try {\n return callback(\n this.transactionApi(() => {\n if (!active) throw new Error(\"Durable transaction has finished.\");\n }),\n );\n } finally {\n active = false;\n }\n });\n }\n\n metrics() {\n this.assertOpen();\n return sqliteMetrics(this.database);\n }\n\n listGraphs(input: DurableGraphListOptions): DurableGraphPage {\n this.assertOpen();\n const options = graphListSchema.parse(input);\n const limit = options.limit ?? 50;\n const filter = options.sessionId === undefined ? \"\" : \"AND session_id = ?\";\n const rows = this.database\n .prepare(`SELECT rowid AS cursor, id, session_id, request_id, json_extract(record, '$.createdAt') AS created_at\n FROM anvia_durable_graphs WHERE rowid > ? ${filter} ORDER BY rowid LIMIT ?`)\n .all(\n options.after ?? 0,\n ...(options.sessionId === undefined ? [] : [options.sessionId]),\n limit + 1,\n );\n const page = rows.slice(0, limit);\n return {\n graphs: page.map((row) => ({\n id: String(row.id),\n sessionId: String(row.session_id),\n requestId: String(row.request_id),\n createdAt: String(row.created_at),\n })),\n ...(rows.length > limit ? { nextCursor: Number(page.at(-1)!.cursor) } : {}),\n };\n }\n\n listTasks(options: TaskListOptions) {\n this.assertOpen();\n return listTasks(this.database, options);\n }\n\n scheduleTasks(excluded: readonly string[], limit: number) {\n this.assertOpen();\n return scheduleTasks(this.database, excluded, limit);\n }\n\n unsettledTaskRoots(after: number) {\n this.assertOpen();\n return unsettledTaskRoots(this.database, after);\n }\n\n taskEvents(rootId: string, after: number, limit: number): DurableEvent[] {\n this.assertOpen();\n if (\n !Number.isSafeInteger(after) ||\n after < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n throw new TypeError(\"Invalid task event cursor or page size.\");\n return this.database\n .prepare(`SELECT e.* FROM anvia_durable_events e JOIN anvia_durable_tasks t ON t.id = e.run_id\n WHERE t.root_id = ? AND e.sequence > ? ORDER BY e.sequence LIMIT ?`)\n .all(rootId, after, limit)\n .map((row) => ({\n sequence: Number(row.sequence),\n runId: String(row.run_id),\n createdAt: String(row.created_at),\n type: eventTypeSchema.parse(row.type),\n data: json(JSON.parse(String(row.data))),\n }));\n }\n\n graphEvents(graphId: string, after: number, limit: number): DurableEvent[] {\n this.assertOpen();\n if (\n !Number.isSafeInteger(after) ||\n after < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n throw new TypeError(\"Invalid graph event cursor or page size.\");\n return this.database\n .prepare(`SELECT e.* FROM anvia_durable_events e JOIN anvia_durable_runs r ON r.id = e.run_id\n WHERE json_extract(r.record, '$.graphId') = ? AND e.sequence > ? ORDER BY e.sequence LIMIT ?`)\n .all(graphId, after, limit)\n .map((row) => ({\n sequence: Number(row.sequence),\n runId: String(row.run_id),\n createdAt: String(row.created_at),\n type: eventTypeSchema.parse(row.type),\n data: json(JSON.parse(String(row.data))),\n }));\n }\n\n list(input: DurableListOptions): DurableRunPage {\n this.assertOpen();\n const options = listOptionsSchema.parse(input);\n const conditions = [\"rowid > ?\"];\n const parameters: (string | number)[] = [options.after ?? 0];\n for (const [column, value] of [\n [\"session_id\", options.sessionId],\n [\"json_extract(record, '$.agentId')\", options.agentId],\n [\"status\", options.status],\n ] as const) {\n if (value !== undefined) {\n conditions.push(`${column} = ?`);\n parameters.push(value);\n }\n }\n const limit = options.limit ?? 50;\n const rows = this.database\n .prepare(\n `SELECT rowid AS cursor, record FROM anvia_durable_runs WHERE ${conditions.join(\" AND \")} ORDER BY rowid LIMIT ?`,\n )\n .all(...parameters, limit + 1);\n const page = rows.slice(0, limit);\n return {\n runs: page.map((row) => {\n const {\n id,\n agentId,\n sessionId,\n requestId,\n status,\n createdAt,\n updatedAt,\n error,\n blockedOperation,\n nextAttemptAt,\n } = parseRun(JSON.parse(String(row.record)));\n return {\n id,\n agentId,\n sessionId,\n requestId,\n status,\n createdAt,\n updatedAt,\n ...(error === undefined ? {} : { error }),\n ...(blockedOperation === undefined ? {} : { blockedOperation }),\n ...(nextAttemptAt === undefined ? {} : { nextAttemptAt }),\n };\n }),\n ...(rows.length > limit ? { nextCursor: Number(page.at(-1)!.cursor) } : {}),\n };\n }\n\n schedule(\n now: string,\n limit: number,\n excludedSessions: readonly string[],\n ): { ids: string[]; nextAttemptAt?: string } {\n this.assertOpen();\n if (!Number.isSafeInteger(limit) || limit < 1) throw new TypeError(\"Invalid scheduler limit.\");\n const exclude =\n excludedSessions.length === 0\n ? \"\"\n : `AND r.session_id NOT IN (${excludedSessions.map(() => \"?\").join(\",\")})`;\n const eligible = `FROM anvia_durable_runs r\n WHERE r.status IN ('queued', 'pending', 'running', 'retry_wait') ${exclude}\n AND NOT EXISTS (SELECT 1 FROM anvia_durable_runs previous\n WHERE previous.session_id = r.session_id AND previous.rowid < r.rowid\n AND previous.status NOT IN ('completed', 'failed', 'cancelled'))\n AND NOT EXISTS (SELECT 1 FROM json_each(json_extract(r.record, '$.dependencies')) dependency\n LEFT JOIN anvia_durable_runs prerequisite ON prerequisite.id = dependency.value\n WHERE prerequisite.id IS NULL OR prerequisite.status != 'completed'\n OR json_extract(prerequisite.record, '$.outcome.type') IS NOT 'response')`;\n const ids = this.database\n .prepare(`SELECT r.id ${eligible}\n AND (r.status != 'retry_wait' OR json_extract(r.record, '$.nextAttemptAt') <= ?)\n ORDER BY r.rowid LIMIT ?`)\n .all(...excludedSessions, now, limit)\n .map((row) => String(row.id));\n const wake = this.database\n .prepare(`SELECT MIN(json_extract(r.record, '$.nextAttemptAt')) AS deadline\n ${eligible} AND r.status = 'retry_wait' AND json_extract(r.record, '$.nextAttemptAt') > ?`)\n .get(...excludedSessions, now);\n return { ids, ...(typeof wake?.deadline === \"string\" ? { nextAttemptAt: wake.deadline } : {}) };\n }\n\n events(runId: string, after: number, limit: number): DurableEvent[] {\n this.assertOpen();\n if (\n !Number.isSafeInteger(after) ||\n after < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 1 ||\n limit > 1000\n ) {\n throw new TypeError(\"Invalid durable event cursor or page size.\");\n }\n return this.database\n .prepare(\n \"SELECT * FROM anvia_durable_events WHERE run_id = ? AND sequence > ? ORDER BY sequence LIMIT ?\",\n )\n .all(runId, after, limit)\n .map((row) => ({\n sequence: Number(row.sequence),\n runId: String(row.run_id),\n createdAt: String(row.created_at),\n type: eventTypeSchema.parse(row.type),\n data: json(JSON.parse(String(row.data))),\n }));\n }\n\n private transactionApi(assertActive: () => void): DurableTransaction {\n const readRun = (sql: string, ...parameters: string[]): DurableRunRecord | undefined => {\n assertActive();\n const row = this.database.prepare(sql).get(...parameters);\n return row === undefined ? undefined : parseRun(JSON.parse(String(row.record)));\n };\n return {\n ...taskTransaction(this.database, assertActive),\n pendingCounts: () => {\n assertActive();\n const count = (table: string) =>\n Number(\n this.database\n .prepare(\n `SELECT COUNT(*) AS n FROM ${table} WHERE status NOT IN ('completed', 'failed', 'cancelled')`,\n )\n .get()!.n,\n );\n return { runs: count(\"anvia_durable_runs\"), tasks: count(\"anvia_durable_tasks\") };\n },\n operationCount: (id) => {\n assertActive();\n return Number(\n this.database\n .prepare(\"SELECT COUNT(*) AS n FROM anvia_durable_operations WHERE run_id = ?\")\n .get(id)!.n,\n );\n },\n getGraph: (id) => {\n assertActive();\n const row = this.database\n .prepare(\"SELECT record FROM anvia_durable_graphs WHERE id = ?\")\n .get(id);\n return row === undefined ? undefined : parseGraphRecord(JSON.parse(String(row.record)));\n },\n findGraphRequest: (session, request) => {\n assertActive();\n const row = this.database\n .prepare(\n \"SELECT record FROM anvia_durable_graphs WHERE session_id = ? AND request_id = ?\",\n )\n .get(session, request);\n return row === undefined ? undefined : parseGraphRecord(JSON.parse(String(row.record)));\n },\n putGraph: (graph) => {\n assertActive();\n this.database\n .prepare(`INSERT INTO anvia_durable_graphs(id, session_id, request_id, record) VALUES (?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET record = excluded.record`)\n .run(\n graph.id,\n graph.submission.sessionId,\n graph.submission.requestId,\n JSON.stringify(parseGraphRecord(json(graph))),\n );\n },\n getRun: (id) => readRun(\"SELECT record FROM anvia_durable_runs WHERE id = ?\", id),\n findRequest: (session, request) =>\n readRun(\n \"SELECT record FROM anvia_durable_runs WHERE session_id = ? AND request_id = ?\",\n session,\n request,\n ),\n activeRun: (session) =>\n readRun(\n \"SELECT record FROM anvia_durable_runs WHERE session_id = ? AND status NOT IN ('completed', 'failed', 'cancelled') LIMIT 1\",\n session,\n ),\n latestCompleted: (session) =>\n readRun(\n \"SELECT record FROM anvia_durable_runs WHERE session_id = ? AND status = 'completed' ORDER BY rowid DESC LIMIT 1\",\n session,\n ),\n hasLaterStartedRun: (id) => {\n assertActive();\n return (\n this.database\n .prepare(`SELECT 1 FROM anvia_durable_runs later\n JOIN anvia_durable_runs current ON later.session_id = current.session_id\n WHERE current.id = ? AND later.rowid > current.rowid AND (later.status NOT IN ('queued', 'cancelled') OR json_extract(later.record, '$.startedAt') IS NOT NULL) LIMIT 1`)\n .get(id) !== undefined\n );\n },\n putRun: (run) => {\n assertActive();\n const serialized = JSON.stringify(parseRun(json(run)));\n this.database\n .prepare(`INSERT INTO anvia_durable_runs(id, session_id, request_id, status, record)\n VALUES (?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET status = excluded.status, record = excluded.record`)\n .run(run.id, run.sessionId, run.requestId, run.status, serialized);\n },\n getOperation: (runId, key) => {\n assertActive();\n const row = this.database\n .prepare(\"SELECT record FROM anvia_durable_operations WHERE run_id = ? AND key = ?\")\n .get(runId, key);\n return row === undefined ? undefined : parseOperation(JSON.parse(String(row.record)));\n },\n operations: (runId) => {\n assertActive();\n return this.database\n .prepare(\"SELECT record FROM anvia_durable_operations WHERE run_id = ? ORDER BY rowid\")\n .all(runId)\n .map((row) => parseOperation(JSON.parse(String(row.record))));\n },\n putOperation: (runId, operation) => {\n assertActive();\n this.database\n .prepare(`INSERT INTO anvia_durable_operations(run_id, key, record) VALUES (?, ?, ?)\n ON CONFLICT(run_id, key) DO UPDATE SET record = excluded.record`)\n .run(runId, operation.key, JSON.stringify(parseOperation(json(operation))));\n },\n appendEvent: (runId, type, data) => {\n assertActive();\n this.database\n .prepare(\n \"INSERT INTO anvia_durable_events(run_id, created_at, type, data) VALUES (?, ?, ?, ?)\",\n )\n .run(runId, new Date().toISOString(), type, JSON.stringify(json(data)));\n },\n cursor: () => {\n assertActive();\n return Number(\n this.database\n .prepare(\"SELECT COALESCE(MAX(sequence), 0) AS cursor FROM anvia_durable_events\")\n .get()!.cursor,\n );\n },\n };\n }\n\n private atomic<T>(callback: () => T): T {\n if (this.inTransaction) throw new Error(\"Nested durable transactions are not supported.\");\n this.database.exec(\"BEGIN IMMEDIATE\");\n this.inTransaction = true;\n try {\n const result = callback();\n if (result !== null && typeof result === \"object\" && \"then\" in result) {\n void Promise.resolve(result).catch(() => {});\n throw new TypeError(\"Durable transactions must be synchronous.\");\n }\n this.database.exec(\"COMMIT\");\n return result;\n } catch (error) {\n this.database.exec(\"ROLLBACK\");\n throw error;\n } finally {\n this.inTransaction = false;\n }\n }\n\n private assertOpen(): void {\n if (this.closed || !this.acquired) throw new Error(\"Durable store is not acquired.\");\n }\n\n private assertOwner(): void {\n const owner = this.database\n .prepare(\"SELECT token FROM anvia_durable_owner WHERE singleton = 1\")\n .get();\n if (owner?.token !== this.token) throw new Error(\"Durable store ownership was lost.\");\n }\n}\n\nfunction processExists(pid: number): boolean {\n if (!Number.isSafeInteger(pid) || pid <= 0) return true;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code !== \"ESRCH\";\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,83 @@
1
+ import {
2
+ parseOperation,
3
+ parseTask,
4
+ taskListSchema
5
+ } from "./chunk-KIMHK6CE.js";
6
+
7
+ // src/task-protocol.ts
8
+ import { z } from "zod";
9
+ import { isJsonValue } from "@anvia/core/completion";
10
+ var id = z.string().min(1).max(256).refine((value) => value.trim() === value && value !== "__proto__");
11
+ var cursor = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
12
+ var json = z.custom(isJsonValue);
13
+ var task = z.unknown().transform((value) => parseTask(value));
14
+ var submission = z.object({
15
+ name: id,
16
+ version: z.number().int().positive(),
17
+ sessionId: id,
18
+ requestId: id,
19
+ input: json
20
+ }).strict();
21
+ function parse(schema, value) {
22
+ try {
23
+ return schema.parse(value);
24
+ } catch (cause) {
25
+ throw new TypeError("Invalid durable task payload.", { cause });
26
+ }
27
+ }
28
+ var parseTaskSubmission = (value) => parse(submission, value);
29
+ var parseTaskListOptions = (value) => parse(taskListSchema, value);
30
+ var parseTaskSignal = (value) => parse(z.object({ name: id, requestId: id, value: json }).strict(), value);
31
+ var parseTaskResolution = (value) => parse(z.object({ key: id, value: json }).strict(), value);
32
+ var parseTaskSnapshot = (value) => parse(
33
+ z.object({
34
+ task,
35
+ operations: z.array(z.unknown().transform((value2) => parseOperation(value2))),
36
+ cursor
37
+ }).strict(),
38
+ value
39
+ );
40
+ var parseTaskPage = (value) => parse(
41
+ z.object({ tasks: z.array(task), nextCursor: cursor.optional() }).strict(),
42
+ value
43
+ );
44
+ var parseTaskEvent = (value) => parse(
45
+ z.object({
46
+ rootId: id,
47
+ taskId: id,
48
+ sequence: cursor,
49
+ createdAt: z.iso.datetime(),
50
+ type: z.enum(["submitted", "status"]),
51
+ data: json
52
+ }).strict(),
53
+ value
54
+ );
55
+ function parseTaskGraph(value) {
56
+ const graph = parse(
57
+ z.object({
58
+ rootId: id,
59
+ nodes: z.array(task).min(1).max(1e3),
60
+ edges: z.array(
61
+ z.object({ source: id, target: id, type: z.enum(["owns", "waits"]) }).strict()
62
+ ),
63
+ cursor
64
+ }).strict(),
65
+ value
66
+ );
67
+ const ids = new Set(graph.nodes.map((node) => node.id));
68
+ if (ids.size !== graph.nodes.length || !ids.has(graph.rootId) || graph.nodes.some((node) => node.rootId !== graph.rootId) || graph.edges.some((edge) => !ids.has(edge.source) || !ids.has(edge.target)))
69
+ throw new TypeError("Invalid durable task graph identities.");
70
+ return graph;
71
+ }
72
+
73
+ export {
74
+ parseTaskSubmission,
75
+ parseTaskListOptions,
76
+ parseTaskSignal,
77
+ parseTaskResolution,
78
+ parseTaskSnapshot,
79
+ parseTaskPage,
80
+ parseTaskEvent,
81
+ parseTaskGraph
82
+ };
83
+ //# sourceMappingURL=chunk-ETGANBD4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/task-protocol.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { isJsonValue, type JsonValue } from \"@anvia/core/completion\";\nimport { parseTask, taskListSchema } from \"./tasks/schema.js\";\nimport { parseOperation } from \"./schema.js\";\nimport type { DurableOperation } from \"./types.js\";\nimport type { TaskRecord, TaskEvent, TaskGraphSnapshot, TaskPage } from \"./tasks/types.js\";\n\nexport type {\n TaskRecord,\n TaskEvent,\n TaskGraphSnapshot,\n TaskPage,\n TaskListOptions,\n} from \"./tasks/types.js\";\nexport type TaskSnapshot = { task: TaskRecord; operations: DurableOperation[]; cursor: number };\nconst id = z\n .string()\n .min(1)\n .max(256)\n .refine((value) => value.trim() === value && value !== \"__proto__\");\nconst cursor = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);\nconst json = z.custom<JsonValue>(isJsonValue);\nconst task = z.unknown().transform((value) => parseTask(value));\nconst submission = z\n .object({\n name: id,\n version: z.number().int().positive(),\n sessionId: id,\n requestId: id,\n input: json,\n })\n .strict();\nexport type TaskSubmission = z.infer<typeof submission>;\nfunction parse<T>(schema: z.ZodType<T>, value: unknown): T {\n try {\n return schema.parse(value);\n } catch (cause) {\n throw new TypeError(\"Invalid durable task payload.\", { cause });\n }\n}\nexport const parseTaskSubmission = (value: unknown): TaskSubmission => parse(submission, value);\nexport const parseTaskListOptions = (value: unknown) => parse(taskListSchema, value);\nexport const parseTaskSignal = (value: unknown) =>\n parse(z.object({ name: id, requestId: id, value: json }).strict(), value);\nexport const parseTaskResolution = (value: unknown) =>\n parse(z.object({ key: id, value: json }).strict(), value);\nexport const parseTaskSnapshot = (value: unknown): TaskSnapshot =>\n parse(\n z\n .object({\n task,\n operations: z.array(z.unknown().transform((value) => parseOperation(value))),\n cursor,\n })\n .strict(),\n value,\n );\nexport const parseTaskPage = (value: unknown): TaskPage =>\n parse(\n z.object({ tasks: z.array(task), nextCursor: cursor.optional() }).strict(),\n value,\n ) as TaskPage;\nexport const parseTaskEvent = (value: unknown): TaskEvent =>\n parse(\n z\n .object({\n rootId: id,\n taskId: id,\n sequence: cursor,\n createdAt: z.iso.datetime(),\n type: z.enum([\"submitted\", \"status\"]),\n data: json,\n })\n .strict(),\n value,\n );\nexport function parseTaskGraph(value: unknown): TaskGraphSnapshot {\n const graph = parse(\n z\n .object({\n rootId: id,\n nodes: z.array(task).min(1).max(1000),\n edges: z.array(\n z.object({ source: id, target: id, type: z.enum([\"owns\", \"waits\"]) }).strict(),\n ),\n cursor,\n })\n .strict(),\n value,\n );\n const ids = new Set(graph.nodes.map((node) => node.id));\n if (\n ids.size !== graph.nodes.length ||\n !ids.has(graph.rootId) ||\n graph.nodes.some((node) => node.rootId !== graph.rootId) ||\n graph.edges.some((edge) => !ids.has(edge.source) || !ids.has(edge.target))\n )\n throw new TypeError(\"Invalid durable task graph identities.\");\n return graph;\n}\n"],"mappings":"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","names":["value"]}
@@ -0,0 +1,353 @@
1
+ // src/json.ts
2
+ import { isJsonValue } from "@anvia/core/completion";
3
+ function json(value2) {
4
+ const normalized = normalize(value2, /* @__PURE__ */ new Set());
5
+ if (!isJsonValue(normalized)) throw new TypeError("Durable state must be JSON serializable.");
6
+ return normalized;
7
+ }
8
+ function normalize(value2, ancestors) {
9
+ if (typeof value2 !== "object" || value2 === null) return value2;
10
+ if (ancestors.has(value2)) throw new TypeError("Durable state contains a cycle.");
11
+ const prototype = Object.getPrototypeOf(value2);
12
+ if (prototype !== Object.prototype && prototype !== null && prototype !== Array.prototype) {
13
+ throw new TypeError("Durable state requires plain JSON objects.");
14
+ }
15
+ ancestors.add(value2);
16
+ try {
17
+ if (Array.isArray(value2)) return value2.map((item) => normalize(item, ancestors));
18
+ const output = {};
19
+ for (const key of Reflect.ownKeys(value2)) {
20
+ const descriptor = Object.getOwnPropertyDescriptor(value2, key);
21
+ if (typeof key !== "string" || !descriptor.enumerable || !("value" in descriptor)) {
22
+ throw new TypeError("Durable state requires ordinary string-keyed fields.");
23
+ }
24
+ if (descriptor.value !== void 0) {
25
+ Object.defineProperty(output, key, {
26
+ value: normalize(descriptor.value, ancestors),
27
+ enumerable: true
28
+ });
29
+ }
30
+ }
31
+ return output;
32
+ } finally {
33
+ ancestors.delete(value2);
34
+ }
35
+ }
36
+ function sameJson(left, right) {
37
+ return canonical(json(left)) === canonical(json(right));
38
+ }
39
+ function canonical(value2) {
40
+ if (Array.isArray(value2)) return `[${value2.map(canonical).join(",")}]`;
41
+ if (value2 !== null && typeof value2 === "object") {
42
+ return `{${Object.keys(value2).sort().map((key) => `${JSON.stringify(key)}:${canonical(value2[key])}`).join(",")}}`;
43
+ }
44
+ return JSON.stringify(value2);
45
+ }
46
+ function nonblank(value2, label) {
47
+ if (typeof value2 !== "string" || value2.trim().length === 0) {
48
+ throw new TypeError(`${label} must be a non-empty string.`);
49
+ }
50
+ }
51
+ function errorMessage(error) {
52
+ const message = error instanceof Error ? error.message : String(error);
53
+ return message.length <= 4096 ? message : `${message.slice(0, 4096)}\u2026`;
54
+ }
55
+
56
+ // src/schema.ts
57
+ import { z } from "zod";
58
+ import {
59
+ agentContinuationSchema,
60
+ agentInteractionRequestSchema,
61
+ agentInteractionResponseSchema
62
+ } from "@anvia/core/agent/interactions";
63
+ import { isJsonValue as isJsonValue2, messagesSchema, parseMessage } from "@anvia/core/completion";
64
+ var jsonValue = z.custom(isJsonValue2);
65
+ var id = z.string().min(1);
66
+ var count = z.number().int().nonnegative();
67
+ var usage = z.object({
68
+ inputTokens: count,
69
+ outputTokens: count,
70
+ totalTokens: count,
71
+ cachedInputTokens: count,
72
+ cacheCreationInputTokens: count,
73
+ details: z.record(z.string(), z.number().finite()).optional()
74
+ });
75
+ var outcomeBase = {
76
+ runId: id,
77
+ text: z.string(),
78
+ usage,
79
+ messages: messagesSchema
80
+ };
81
+ var outcome = z.discriminatedUnion("type", [
82
+ z.object({ ...outcomeBase, type: z.literal("response"), output: jsonValue }).passthrough(),
83
+ z.object({
84
+ ...outcomeBase,
85
+ type: z.literal("interaction"),
86
+ interaction: agentInteractionRequestSchema,
87
+ continuation: agentContinuationSchema
88
+ }).passthrough(),
89
+ z.object({
90
+ ...outcomeBase,
91
+ type: z.literal("blocked"),
92
+ stage: z.enum(["input", "output"]),
93
+ reason: z.string()
94
+ }).passthrough()
95
+ ]);
96
+ var runStatusSchema = z.enum([
97
+ "queued",
98
+ "retry_wait",
99
+ "pending",
100
+ "running",
101
+ "waiting",
102
+ "needs_attention",
103
+ "completed",
104
+ "failed",
105
+ "cancelled"
106
+ ]);
107
+ var modelRetrySchema = z.object({
108
+ maxAttempts: z.number().int().min(1).max(100),
109
+ initialDelayMs: z.number().int().min(1).max(864e5),
110
+ maxDelayMs: z.number().int().min(1).max(864e5)
111
+ }).strict().refine(
112
+ (value2) => value2.maxDelayMs >= value2.initialDelayMs,
113
+ "maxDelayMs must be at least initialDelayMs"
114
+ );
115
+ var listOptionsSchema = z.object({
116
+ sessionId: id.optional(),
117
+ agentId: id.optional(),
118
+ status: runStatusSchema.optional(),
119
+ after: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),
120
+ limit: z.number().int().min(1).max(100).optional()
121
+ }).strict();
122
+ var runSchema = z.object({
123
+ id,
124
+ agentId: id,
125
+ sessionId: id,
126
+ requestId: id,
127
+ prompt: z.string(),
128
+ version: id,
129
+ status: runStatusSchema,
130
+ createdAt: id,
131
+ updatedAt: id,
132
+ startedAt: z.iso.datetime().optional(),
133
+ graphId: id.optional(),
134
+ taskId: id.optional(),
135
+ dependencies: z.array(id).max(100).optional(),
136
+ epoch: count,
137
+ modelTurns: count,
138
+ maxModelTurns: count,
139
+ usage,
140
+ history: messagesSchema,
141
+ responses: z.record(z.string(), jsonValue),
142
+ input: z.union([
143
+ z.object({ messages: messagesSchema.min(1) }).strict(),
144
+ z.object({ continuation: agentContinuationSchema, response: agentInteractionResponseSchema }).strict()
145
+ ]),
146
+ outcome: outcome.optional(),
147
+ error: z.string().optional(),
148
+ blockedOperation: id.optional(),
149
+ modelRetry: modelRetrySchema.optional(),
150
+ nextAttemptAt: z.iso.datetime().optional()
151
+ }).strict();
152
+ function parseRun(value2) {
153
+ const run = runSchema.parse(value2);
154
+ if (run.graphId === void 0 !== (run.taskId === void 0) || run.graphId === void 0 !== (run.dependencies === void 0))
155
+ throw new Error("Incomplete graph task metadata.");
156
+ if (run.status === "retry_wait" && run.nextAttemptAt === void 0)
157
+ throw new Error("Retrying run has no deadline.");
158
+ if (run.status === "waiting" && run.outcome?.type !== "interaction")
159
+ throw new Error("Waiting run has no interaction.");
160
+ if (run.status === "completed" && (run.outcome === void 0 || run.outcome.type === "interaction"))
161
+ throw new Error("Completed run has no terminal outcome.");
162
+ return run;
163
+ }
164
+ var operationSchema = z.object({
165
+ key: id,
166
+ kind: z.enum(["model", "tool", "effect"]),
167
+ input: jsonValue,
168
+ status: z.enum(["started", "completed"]),
169
+ recovery: z.enum(["safe", "idempotent", "manual"]),
170
+ result: jsonValue.optional(),
171
+ attempts: count.optional()
172
+ }).strict();
173
+ function parseOperation(value2) {
174
+ const operation = operationSchema.parse(value2);
175
+ if (operation.status !== "completed") return operation;
176
+ if (operation.result === void 0) throw new Error("Completed operation has no result.");
177
+ if (operation.kind === "model") {
178
+ const result = z.object({ choice: z.array(jsonValue), usage, rawResponse: z.null() }).passthrough().parse(operation.result);
179
+ parseMessage({ role: "assistant", content: result.choice });
180
+ } else if (operation.kind === "tool") {
181
+ const result = z.discriminatedUnion("failed", [
182
+ z.object({ failed: z.literal(false), output: jsonValue }).strict(),
183
+ z.object({ failed: z.literal(true), output: jsonValue, error: z.string() }).strict()
184
+ ]).parse(operation.result);
185
+ parseMessage({
186
+ role: "tool",
187
+ content: [
188
+ { type: "tool-result", toolName: "saved", toolCallId: "saved", output: result.output }
189
+ ]
190
+ });
191
+ }
192
+ return operation;
193
+ }
194
+ var eventTypeSchema = z.enum([
195
+ "submitted",
196
+ "status",
197
+ "model_started",
198
+ "model_completed",
199
+ "tool_started",
200
+ "tool_completed"
201
+ ]);
202
+
203
+ // src/graph-schema.ts
204
+ import { z as z2 } from "zod";
205
+ var id2 = z2.string().refine((value2) => value2.trim().length > 0);
206
+ var taskId = z2.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/).refine((value2) => !["__proto__", "constructor", "prototype"].includes(value2));
207
+ var submissionSchema = z2.object({
208
+ sessionId: id2,
209
+ requestId: id2,
210
+ tasks: z2.array(
211
+ z2.object({
212
+ id: taskId,
213
+ agentId: id2,
214
+ prompt: id2,
215
+ dependsOn: z2.array(taskId).max(100).optional()
216
+ }).strict()
217
+ ).min(1).max(100)
218
+ }).strict();
219
+ var graphListSchema = z2.object({
220
+ sessionId: id2.optional(),
221
+ after: z2.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),
222
+ limit: z2.number().int().min(1).max(100).optional()
223
+ }).strict();
224
+ function parseDurableGraphSubmission(value2) {
225
+ const parsed = submissionSchema.safeParse(value2);
226
+ if (!parsed.success) throw new TypeError("Invalid durable graph submission.");
227
+ const tasks = parsed.data.tasks.map((task) => ({ ...task, dependsOn: task.dependsOn ?? [] }));
228
+ const byId = new Map(tasks.map((task) => [task.id, task]));
229
+ if (byId.size !== tasks.length) throw new TypeError("Duplicate task ID.");
230
+ const visited = /* @__PURE__ */ new Set();
231
+ const visiting = /* @__PURE__ */ new Set();
232
+ function visit(id4) {
233
+ if (visiting.has(id4)) throw new TypeError("Task dependencies contain a cycle.");
234
+ if (visited.has(id4)) return;
235
+ const task = byId.get(id4);
236
+ if (task === void 0) throw new TypeError(`Unknown task dependency: ${id4}`);
237
+ if (new Set(task.dependsOn).size !== task.dependsOn.length)
238
+ throw new TypeError("Duplicate task dependency.");
239
+ visiting.add(id4);
240
+ for (const dependency of task.dependsOn) visit(dependency);
241
+ visiting.delete(id4);
242
+ visited.add(id4);
243
+ }
244
+ for (const task of tasks) visit(task.id);
245
+ return { ...parsed.data, tasks };
246
+ }
247
+ function parseGraphRecord(value2) {
248
+ const envelope = z2.object({
249
+ id: id2,
250
+ submission: z2.unknown(),
251
+ createdAt: z2.iso.datetime(),
252
+ cancelled: z2.boolean(),
253
+ runIds: z2.record(taskId, id2)
254
+ }).strict().parse(value2);
255
+ const submission = parseDurableGraphSubmission(envelope.submission);
256
+ if (Object.keys(envelope.runIds).length !== submission.tasks.length || submission.tasks.some((task) => !Object.hasOwn(envelope.runIds, task.id)))
257
+ throw new TypeError("Graph task/run mapping is incomplete.");
258
+ if (new Set(Object.values(envelope.runIds)).size !== submission.tasks.length)
259
+ throw new TypeError("Graph contains duplicate run IDs.");
260
+ return { ...envelope, submission };
261
+ }
262
+
263
+ // src/tasks/schema.ts
264
+ import { z as z3 } from "zod";
265
+ import { isJsonValue as isJsonValue3 } from "@anvia/core/completion";
266
+ var id3 = z3.string().min(1).max(256).refine((value2) => value2 === value2.trim() && value2 !== "__proto__", "Invalid task identifier");
267
+ var value = z3.custom(isJsonValue3);
268
+ var taskWaitSchema = z3.discriminatedUnion("type", [
269
+ z3.object({
270
+ type: z3.literal("children"),
271
+ ids: z3.array(id3).max(1e3),
272
+ policy: z3.enum(["allSettled", "failFast"])
273
+ }).strict(),
274
+ z3.object({ type: z3.literal("timer"), until: z3.iso.datetime() }).strict(),
275
+ z3.object({ type: z3.literal("signal"), name: id3 }).strict(),
276
+ z3.object({ type: z3.literal("agent"), runId: id3, status: runStatusSchema }).strict()
277
+ ]);
278
+ var outcome2 = z3.discriminatedUnion("status", [
279
+ z3.object({ status: z3.literal("completed"), output: value }).strict(),
280
+ z3.object({ status: z3.literal("failed"), error: z3.string() }).strict(),
281
+ z3.object({ status: z3.literal("cancelled"), error: z3.string() }).strict()
282
+ ]);
283
+ var taskListSchema = z3.object({
284
+ sessionId: id3.optional(),
285
+ after: z3.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(),
286
+ limit: z3.number().int().min(1).max(100).optional()
287
+ }).strict();
288
+ var record = z3.object({
289
+ id: id3,
290
+ rootId: id3,
291
+ parentId: id3.optional(),
292
+ agentRunId: id3.optional(),
293
+ depth: z3.number().int().min(0).max(32),
294
+ sessionId: id3,
295
+ key: id3,
296
+ name: id3,
297
+ version: z3.number().int().positive(),
298
+ submissionVersion: z3.number().int().positive(),
299
+ submissionInput: value,
300
+ input: value,
301
+ checkpoint: value,
302
+ status: z3.enum([
303
+ "pending",
304
+ "running",
305
+ "waiting",
306
+ "completing",
307
+ "cancelling",
308
+ "completed",
309
+ "failed",
310
+ "cancelled",
311
+ "needs_attention"
312
+ ]),
313
+ wait: taskWaitSchema.optional(),
314
+ outcome: outcome2.optional(),
315
+ error: z3.string().optional(),
316
+ blockedOperation: z3.string().optional(),
317
+ signals: z3.record(id3, z3.object({ requestId: id3, value }).strict()),
318
+ createdAt: z3.iso.datetime(),
319
+ updatedAt: z3.iso.datetime()
320
+ }).strict().superRefine((task, context) => {
321
+ if (task.status === "waiting" !== (task.wait !== void 0))
322
+ context.addIssue({ code: "custom", message: "Only waiting tasks have a wait." });
323
+ const finishing = ["completing", "cancelling", "completed", "failed", "cancelled"].includes(
324
+ task.status
325
+ );
326
+ if (finishing !== (task.outcome !== void 0))
327
+ context.addIssue({ code: "custom", message: "Finishing tasks must have an outcome." });
328
+ if (["completed", "failed", "cancelled"].includes(task.status) && task.status !== task.outcome?.status)
329
+ context.addIssue({ code: "custom", message: "Task outcome and status disagree." });
330
+ });
331
+ function parseTask(value2) {
332
+ return record.parse(json(value2));
333
+ }
334
+
335
+ export {
336
+ json,
337
+ sameJson,
338
+ nonblank,
339
+ errorMessage,
340
+ runStatusSchema,
341
+ modelRetrySchema,
342
+ listOptionsSchema,
343
+ parseRun,
344
+ parseOperation,
345
+ eventTypeSchema,
346
+ taskWaitSchema,
347
+ taskListSchema,
348
+ parseTask,
349
+ graphListSchema,
350
+ parseDurableGraphSubmission,
351
+ parseGraphRecord
352
+ };
353
+ //# sourceMappingURL=chunk-KIMHK6CE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/json.ts","../src/schema.ts","../src/graph-schema.ts","../src/tasks/schema.ts"],"sourcesContent":["import { isJsonValue, type JsonValue, type JsonObject } from \"@anvia/core/completion\";\n\n/** Omit optional object fields, but reject values that JSON would silently corrupt. */\nexport function json(value: unknown): JsonValue {\n const normalized = normalize(value, new Set());\n if (!isJsonValue(normalized)) throw new TypeError(\"Durable state must be JSON serializable.\");\n return normalized;\n}\n\nfunction normalize(value: unknown, ancestors: Set<object>): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n if (ancestors.has(value)) throw new TypeError(\"Durable state contains a cycle.\");\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null && prototype !== Array.prototype) {\n throw new TypeError(\"Durable state requires plain JSON objects.\");\n }\n ancestors.add(value);\n try {\n if (Array.isArray(value)) return value.map((item) => normalize(item, ancestors));\n const output: Record<string, unknown> = {};\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)!;\n if (typeof key !== \"string\" || !descriptor.enumerable || !(\"value\" in descriptor)) {\n throw new TypeError(\"Durable state requires ordinary string-keyed fields.\");\n }\n if (descriptor.value !== undefined) {\n Object.defineProperty(output, key, {\n value: normalize(descriptor.value, ancestors),\n enumerable: true,\n });\n }\n }\n return output;\n } finally {\n ancestors.delete(value);\n }\n}\n\nexport function sameJson(left: unknown, right: unknown): boolean {\n return canonical(json(left)) === canonical(json(right));\n}\n\nfunction canonical(value: JsonValue): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n if (value !== null && typeof value === \"object\") {\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonical((value as JsonObject)[key]!)}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nexport function nonblank(value: unknown, label: string): asserts value is string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${label} must be a non-empty string.`);\n }\n}\n\nexport function errorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return message.length <= 4096 ? message : `${message.slice(0, 4096)}…`;\n}\n","import { z } from \"zod\";\nimport {\n agentContinuationSchema,\n agentInteractionRequestSchema,\n agentInteractionResponseSchema,\n} from \"@anvia/core/agent/interactions\";\nimport { isJsonValue, messagesSchema, parseMessage, type JsonValue } from \"@anvia/core/completion\";\nimport type { DurableOperation, DurableRunRecord } from \"./types.js\";\n\nconst jsonValue = z.custom<JsonValue>(isJsonValue);\nconst id = z.string().min(1);\nconst count = z.number().int().nonnegative();\nconst usage = z.object({\n inputTokens: count,\n outputTokens: count,\n totalTokens: count,\n cachedInputTokens: count,\n cacheCreationInputTokens: count,\n details: z.record(z.string(), z.number().finite()).optional(),\n});\nconst outcomeBase = {\n runId: id,\n text: z.string(),\n usage,\n messages: messagesSchema,\n};\nconst outcome = z.discriminatedUnion(\"type\", [\n z.object({ ...outcomeBase, type: z.literal(\"response\"), output: jsonValue }).passthrough(),\n z\n .object({\n ...outcomeBase,\n type: z.literal(\"interaction\"),\n interaction: agentInteractionRequestSchema,\n continuation: agentContinuationSchema,\n })\n .passthrough(),\n z\n .object({\n ...outcomeBase,\n type: z.literal(\"blocked\"),\n stage: z.enum([\"input\", \"output\"]),\n reason: z.string(),\n })\n .passthrough(),\n]);\n\nexport const runStatusSchema = z.enum([\n \"queued\",\n \"retry_wait\",\n \"pending\",\n \"running\",\n \"waiting\",\n \"needs_attention\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n]);\nexport const modelRetrySchema = z\n .object({\n maxAttempts: z.number().int().min(1).max(100),\n initialDelayMs: z.number().int().min(1).max(86_400_000),\n maxDelayMs: z.number().int().min(1).max(86_400_000),\n })\n .strict()\n .refine(\n (value) => value.maxDelayMs >= value.initialDelayMs,\n \"maxDelayMs must be at least initialDelayMs\",\n );\nexport const listOptionsSchema = z\n .object({\n sessionId: id.optional(),\n agentId: id.optional(),\n status: runStatusSchema.optional(),\n after: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n })\n .strict();\n\nconst runSchema = z\n .object({\n id,\n agentId: id,\n sessionId: id,\n requestId: id,\n prompt: z.string(),\n version: id,\n status: runStatusSchema,\n createdAt: id,\n updatedAt: id,\n startedAt: z.iso.datetime().optional(),\n graphId: id.optional(),\n taskId: id.optional(),\n dependencies: z.array(id).max(100).optional(),\n epoch: count,\n modelTurns: count,\n maxModelTurns: count,\n usage,\n history: messagesSchema,\n responses: z.record(z.string(), jsonValue),\n input: z.union([\n z.object({ messages: messagesSchema.min(1) }).strict(),\n z\n .object({ continuation: agentContinuationSchema, response: agentInteractionResponseSchema })\n .strict(),\n ]),\n outcome: outcome.optional(),\n error: z.string().optional(),\n blockedOperation: id.optional(),\n modelRetry: modelRetrySchema.optional(),\n nextAttemptAt: z.iso.datetime().optional(),\n })\n .strict();\n\nexport function parseRun(value: unknown): DurableRunRecord {\n // The core owns richer optional outcome fields; the envelope and execution state are checked here.\n const run = runSchema.parse(value) as DurableRunRecord;\n if (\n (run.graphId === undefined) !== (run.taskId === undefined) ||\n (run.graphId === undefined) !== (run.dependencies === undefined)\n )\n throw new Error(\"Incomplete graph task metadata.\");\n if (run.status === \"retry_wait\" && run.nextAttemptAt === undefined)\n throw new Error(\"Retrying run has no deadline.\");\n if (run.status === \"waiting\" && run.outcome?.type !== \"interaction\")\n throw new Error(\"Waiting run has no interaction.\");\n if (\n run.status === \"completed\" &&\n (run.outcome === undefined || run.outcome.type === \"interaction\")\n )\n throw new Error(\"Completed run has no terminal outcome.\");\n return run;\n}\n\nconst operationSchema = z\n .object({\n key: id,\n kind: z.enum([\"model\", \"tool\", \"effect\"]),\n input: jsonValue,\n status: z.enum([\"started\", \"completed\"]),\n recovery: z.enum([\"safe\", \"idempotent\", \"manual\"]),\n result: jsonValue.optional(),\n attempts: count.optional(),\n })\n .strict();\n\nexport function parseOperation(value: unknown): DurableOperation {\n const operation = operationSchema.parse(value);\n if (operation.status !== \"completed\") return operation;\n if (operation.result === undefined) throw new Error(\"Completed operation has no result.\");\n if (operation.kind === \"model\") {\n const result = z\n .object({ choice: z.array(jsonValue), usage, rawResponse: z.null() })\n .passthrough()\n .parse(operation.result);\n parseMessage({ role: \"assistant\", content: result.choice });\n } else if (operation.kind === \"tool\") {\n const result = z\n .discriminatedUnion(\"failed\", [\n z.object({ failed: z.literal(false), output: jsonValue }).strict(),\n z.object({ failed: z.literal(true), output: jsonValue, error: z.string() }).strict(),\n ])\n .parse(operation.result);\n parseMessage({\n role: \"tool\",\n content: [\n { type: \"tool-result\", toolName: \"saved\", toolCallId: \"saved\", output: result.output },\n ],\n });\n }\n return operation;\n}\n\nexport const eventTypeSchema = z.enum([\n \"submitted\",\n \"status\",\n \"model_started\",\n \"model_completed\",\n \"tool_started\",\n \"tool_completed\",\n]);\n","import { z } from \"zod\";\nimport type { DurableGraphRecord, DurableGraphSubmission } from \"./graph-types.js\";\n\nconst id = z.string().refine((value) => value.trim().length > 0);\nconst taskId = z\n .string()\n .regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/)\n .refine((value) => ![\"__proto__\", \"constructor\", \"prototype\"].includes(value));\nconst submissionSchema = z\n .object({\n sessionId: id,\n requestId: id,\n tasks: z\n .array(\n z\n .object({\n id: taskId,\n agentId: id,\n prompt: id,\n dependsOn: z.array(taskId).max(100).optional(),\n })\n .strict(),\n )\n .min(1)\n .max(100),\n })\n .strict();\nexport const graphListSchema = z\n .object({\n sessionId: id.optional(),\n after: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n })\n .strict();\n\nexport function parseDurableGraphSubmission(value: unknown): DurableGraphSubmission {\n const parsed = submissionSchema.safeParse(value);\n if (!parsed.success) throw new TypeError(\"Invalid durable graph submission.\");\n const tasks = parsed.data.tasks.map((task) => ({ ...task, dependsOn: task.dependsOn ?? [] }));\n const byId = new Map(tasks.map((task) => [task.id, task]));\n if (byId.size !== tasks.length) throw new TypeError(\"Duplicate task ID.\");\n const visited = new Set<string>();\n const visiting = new Set<string>();\n function visit(id: string): void {\n if (visiting.has(id)) throw new TypeError(\"Task dependencies contain a cycle.\");\n if (visited.has(id)) return;\n const task = byId.get(id);\n if (task === undefined) throw new TypeError(`Unknown task dependency: ${id}`);\n if (new Set(task.dependsOn).size !== task.dependsOn.length)\n throw new TypeError(\"Duplicate task dependency.\");\n visiting.add(id);\n for (const dependency of task.dependsOn) visit(dependency);\n visiting.delete(id);\n visited.add(id);\n }\n for (const task of tasks) visit(task.id);\n return { ...parsed.data, tasks };\n}\n\nexport function parseGraphRecord(value: unknown): DurableGraphRecord {\n const envelope = z\n .object({\n id,\n submission: z.unknown(),\n createdAt: z.iso.datetime(),\n cancelled: z.boolean(),\n runIds: z.record(taskId, id),\n })\n .strict()\n .parse(value);\n const submission = parseDurableGraphSubmission(envelope.submission);\n if (\n Object.keys(envelope.runIds).length !== submission.tasks.length ||\n submission.tasks.some((task) => !Object.hasOwn(envelope.runIds, task.id))\n )\n throw new TypeError(\"Graph task/run mapping is incomplete.\");\n if (new Set(Object.values(envelope.runIds)).size !== submission.tasks.length)\n throw new TypeError(\"Graph contains duplicate run IDs.\");\n return { ...envelope, submission };\n}\n","import { z } from \"zod\";\nimport { isJsonValue, type JsonValue } from \"@anvia/core/completion\";\nimport { json } from \"../json.js\";\nimport type { TaskRecord } from \"./types.js\";\nimport { runStatusSchema } from \"../schema.js\";\n\nconst id = z\n .string()\n .min(1)\n .max(256)\n .refine((value) => value === value.trim() && value !== \"__proto__\", \"Invalid task identifier\");\nconst value = z.custom<JsonValue>(isJsonValue);\nexport const taskWaitSchema = z.discriminatedUnion(\"type\", [\n z\n .object({\n type: z.literal(\"children\"),\n ids: z.array(id).max(1000),\n policy: z.enum([\"allSettled\", \"failFast\"]),\n })\n .strict(),\n z.object({ type: z.literal(\"timer\"), until: z.iso.datetime() }).strict(),\n z.object({ type: z.literal(\"signal\"), name: id }).strict(),\n z.object({ type: z.literal(\"agent\"), runId: id, status: runStatusSchema }).strict(),\n]);\nconst outcome = z.discriminatedUnion(\"status\", [\n z.object({ status: z.literal(\"completed\"), output: value }).strict(),\n z.object({ status: z.literal(\"failed\"), error: z.string() }).strict(),\n z.object({ status: z.literal(\"cancelled\"), error: z.string() }).strict(),\n]);\nexport const taskListSchema = z\n .object({\n sessionId: id.optional(),\n after: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n })\n .strict();\nconst record = z\n .object({\n id,\n rootId: id,\n parentId: id.optional(),\n agentRunId: id.optional(),\n depth: z.number().int().min(0).max(32),\n sessionId: id,\n key: id,\n name: id,\n version: z.number().int().positive(),\n submissionVersion: z.number().int().positive(),\n submissionInput: value,\n input: value,\n checkpoint: value,\n status: z.enum([\n \"pending\",\n \"running\",\n \"waiting\",\n \"completing\",\n \"cancelling\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n \"needs_attention\",\n ]),\n wait: taskWaitSchema.optional(),\n outcome: outcome.optional(),\n error: z.string().optional(),\n blockedOperation: z.string().optional(),\n signals: z.record(id, z.object({ requestId: id, value }).strict()),\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n })\n .strict()\n .superRefine((task, context) => {\n if ((task.status === \"waiting\") !== (task.wait !== undefined))\n context.addIssue({ code: \"custom\", message: \"Only waiting tasks have a wait.\" });\n const finishing = [\"completing\", \"cancelling\", \"completed\", \"failed\", \"cancelled\"].includes(\n task.status,\n );\n if (finishing !== (task.outcome !== undefined))\n context.addIssue({ code: \"custom\", message: \"Finishing tasks must have an outcome.\" });\n if (\n [\"completed\", \"failed\", \"cancelled\"].includes(task.status) &&\n task.status !== task.outcome?.status\n )\n context.addIssue({ code: \"custom\", message: \"Task outcome and status disagree.\" });\n });\nexport function parseTask(value: unknown): TaskRecord {\n return record.parse(json(value)) as TaskRecord;\n}\n"],"mappings":";AAAA,SAAS,mBAAoD;AAGtD,SAAS,KAAKA,QAA2B;AAC9C,QAAM,aAAa,UAAUA,QAAO,oBAAI,IAAI,CAAC;AAC7C,MAAI,CAAC,YAAY,UAAU,EAAG,OAAM,IAAI,UAAU,0CAA0C;AAC5F,SAAO;AACT;AAEA,SAAS,UAAUA,QAAgB,WAAiC;AAClE,MAAI,OAAOA,WAAU,YAAYA,WAAU,KAAM,QAAOA;AACxD,MAAI,UAAU,IAAIA,MAAK,EAAG,OAAM,IAAI,UAAU,iCAAiC;AAC/E,QAAM,YAAY,OAAO,eAAeA,MAAK;AAC7C,MAAI,cAAc,OAAO,aAAa,cAAc,QAAQ,cAAc,MAAM,WAAW;AACzF,UAAM,IAAI,UAAU,4CAA4C;AAAA,EAClE;AACA,YAAU,IAAIA,MAAK;AACnB,MAAI;AACF,QAAI,MAAM,QAAQA,MAAK,EAAG,QAAOA,OAAM,IAAI,CAAC,SAAS,UAAU,MAAM,SAAS,CAAC;AAC/E,UAAM,SAAkC,CAAC;AACzC,eAAW,OAAO,QAAQ,QAAQA,MAAK,GAAG;AACxC,YAAM,aAAa,OAAO,yBAAyBA,QAAO,GAAG;AAC7D,UAAI,OAAO,QAAQ,YAAY,CAAC,WAAW,cAAc,EAAE,WAAW,aAAa;AACjF,cAAM,IAAI,UAAU,sDAAsD;AAAA,MAC5E;AACA,UAAI,WAAW,UAAU,QAAW;AAClC,eAAO,eAAe,QAAQ,KAAK;AAAA,UACjC,OAAO,UAAU,WAAW,OAAO,SAAS;AAAA,UAC5C,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT,UAAE;AACA,cAAU,OAAOA,MAAK;AAAA,EACxB;AACF;AAEO,SAAS,SAAS,MAAe,OAAyB;AAC/D,SAAO,UAAU,KAAK,IAAI,CAAC,MAAM,UAAU,KAAK,KAAK,CAAC;AACxD;AAEA,SAAS,UAAUA,QAA0B;AAC3C,MAAI,MAAM,QAAQA,MAAK,EAAG,QAAO,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK,GAAG,CAAC;AACnE,MAAIA,WAAU,QAAQ,OAAOA,WAAU,UAAU;AAC/C,WAAO,IAAI,OAAO,KAAKA,MAAK,EACzB,KAAK,EACL,IAAI,CAAC,QAAQ,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,UAAWA,OAAqB,GAAG,CAAE,CAAC,EAAE,EAC/E,KAAK,GAAG,CAAC;AAAA,EACd;AACA,SAAO,KAAK,UAAUA,MAAK;AAC7B;AAEO,SAAS,SAASA,QAAgB,OAAwC;AAC/E,MAAI,OAAOA,WAAU,YAAYA,OAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,UAAU,GAAG,KAAK,8BAA8B;AAAA,EAC5D;AACF;AAEO,SAAS,aAAa,OAAwB;AACnD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,UAAU,OAAO,UAAU,GAAG,QAAQ,MAAM,GAAG,IAAI,CAAC;AACrE;;;AC9DA,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAAC,cAAa,gBAAgB,oBAAoC;AAG1E,IAAM,YAAY,EAAE,OAAkBA,YAAW;AACjD,IAAM,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;AAC3B,IAAM,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAC3C,IAAM,QAAQ,EAAE,OAAO;AAAA,EACrB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAC9D,CAAC;AACD,IAAM,cAAc;AAAA,EAClB,OAAO;AAAA,EACP,MAAM,EAAE,OAAO;AAAA,EACf;AAAA,EACA,UAAU;AACZ;AACA,IAAM,UAAU,EAAE,mBAAmB,QAAQ;AAAA,EAC3C,EAAE,OAAO,EAAE,GAAG,aAAa,MAAM,EAAE,QAAQ,UAAU,GAAG,QAAQ,UAAU,CAAC,EAAE,YAAY;AAAA,EACzF,EACG,OAAO;AAAA,IACN,GAAG;AAAA,IACH,MAAM,EAAE,QAAQ,aAAa;AAAA,IAC7B,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC,EACA,YAAY;AAAA,EACf,EACG,OAAO;AAAA,IACN,GAAG;AAAA,IACH,MAAM,EAAE,QAAQ,SAAS;AAAA,IACzB,OAAO,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,IACjC,QAAQ,EAAE,OAAO;AAAA,EACnB,CAAC,EACA,YAAY;AACjB,CAAC;AAEM,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,mBAAmB,EAC7B,OAAO;AAAA,EACN,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC5C,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAU;AAAA,EACtD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,KAAU;AACpD,CAAC,EACA,OAAO,EACP;AAAA,EACC,CAACC,WAAUA,OAAM,cAAcA,OAAM;AAAA,EACrC;AACF;AACK,IAAM,oBAAoB,EAC9B,OAAO;AAAA,EACN,WAAW,GAAG,SAAS;AAAA,EACvB,SAAS,GAAG,SAAS;AAAA,EACrB,QAAQ,gBAAgB,SAAS;AAAA,EACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS;AAAA,EACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AACnD,CAAC,EACA,OAAO;AAEV,IAAM,YAAY,EACf,OAAO;AAAA,EACN;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ,EAAE,OAAO;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW,EAAE,IAAI,SAAS,EAAE,SAAS;AAAA,EACrC,SAAS,GAAG,SAAS;AAAA,EACrB,QAAQ,GAAG,SAAS;AAAA,EACpB,cAAc,EAAE,MAAM,EAAE,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC5C,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,eAAe;AAAA,EACf;AAAA,EACA,SAAS;AAAA,EACT,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS;AAAA,EACzC,OAAO,EAAE,MAAM;AAAA,IACb,EAAE,OAAO,EAAE,UAAU,eAAe,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO;AAAA,IACrD,EACG,OAAO,EAAE,cAAc,yBAAyB,UAAU,+BAA+B,CAAC,EAC1F,OAAO;AAAA,EACZ,CAAC;AAAA,EACD,SAAS,QAAQ,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,kBAAkB,GAAG,SAAS;AAAA,EAC9B,YAAY,iBAAiB,SAAS;AAAA,EACtC,eAAe,EAAE,IAAI,SAAS,EAAE,SAAS;AAC3C,CAAC,EACA,OAAO;AAEH,SAAS,SAASA,QAAkC;AAEzD,QAAM,MAAM,UAAU,MAAMA,MAAK;AACjC,MACG,IAAI,YAAY,YAAgB,IAAI,WAAW,WAC/C,IAAI,YAAY,YAAgB,IAAI,iBAAiB;AAEtD,UAAM,IAAI,MAAM,iCAAiC;AACnD,MAAI,IAAI,WAAW,gBAAgB,IAAI,kBAAkB;AACvD,UAAM,IAAI,MAAM,+BAA+B;AACjD,MAAI,IAAI,WAAW,aAAa,IAAI,SAAS,SAAS;AACpD,UAAM,IAAI,MAAM,iCAAiC;AACnD,MACE,IAAI,WAAW,gBACd,IAAI,YAAY,UAAa,IAAI,QAAQ,SAAS;AAEnD,UAAM,IAAI,MAAM,wCAAwC;AAC1D,SAAO;AACT;AAEA,IAAM,kBAAkB,EACrB,OAAO;AAAA,EACN,KAAK;AAAA,EACL,MAAM,EAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,CAAC;AAAA,EACxC,OAAO;AAAA,EACP,QAAQ,EAAE,KAAK,CAAC,WAAW,WAAW,CAAC;AAAA,EACvC,UAAU,EAAE,KAAK,CAAC,QAAQ,cAAc,QAAQ,CAAC;AAAA,EACjD,QAAQ,UAAU,SAAS;AAAA,EAC3B,UAAU,MAAM,SAAS;AAC3B,CAAC,EACA,OAAO;AAEH,SAAS,eAAeA,QAAkC;AAC/D,QAAM,YAAY,gBAAgB,MAAMA,MAAK;AAC7C,MAAI,UAAU,WAAW,YAAa,QAAO;AAC7C,MAAI,UAAU,WAAW,OAAW,OAAM,IAAI,MAAM,oCAAoC;AACxF,MAAI,UAAU,SAAS,SAAS;AAC9B,UAAM,SAAS,EACZ,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,KAAK,EAAE,CAAC,EACnE,YAAY,EACZ,MAAM,UAAU,MAAM;AACzB,iBAAa,EAAE,MAAM,aAAa,SAAS,OAAO,OAAO,CAAC;AAAA,EAC5D,WAAW,UAAU,SAAS,QAAQ;AACpC,UAAM,SAAS,EACZ,mBAAmB,UAAU;AAAA,MAC5B,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK,GAAG,QAAQ,UAAU,CAAC,EAAE,OAAO;AAAA,MACjE,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,GAAG,QAAQ,WAAW,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,IACrF,CAAC,EACA,MAAM,UAAU,MAAM;AACzB,iBAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,QACP,EAAE,MAAM,eAAe,UAAU,SAAS,YAAY,SAAS,QAAQ,OAAO,OAAO;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ACnLD,SAAS,KAAAC,UAAS;AAGlB,IAAMC,MAAKD,GAAE,OAAO,EAAE,OAAO,CAACE,WAAUA,OAAM,KAAK,EAAE,SAAS,CAAC;AAC/D,IAAM,SAASF,GACZ,OAAO,EACP,MAAM,kCAAkC,EACxC,OAAO,CAACE,WAAU,CAAC,CAAC,aAAa,eAAe,WAAW,EAAE,SAASA,MAAK,CAAC;AAC/E,IAAM,mBAAmBF,GACtB,OAAO;AAAA,EACN,WAAWC;AAAA,EACX,WAAWA;AAAA,EACX,OAAOD,GACJ;AAAA,IACCA,GACG,OAAO;AAAA,MACN,IAAI;AAAA,MACJ,SAASC;AAAA,MACT,QAAQA;AAAA,MACR,WAAWD,GAAE,MAAM,MAAM,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,IAC/C,CAAC,EACA,OAAO;AAAA,EACZ,EACC,IAAI,CAAC,EACL,IAAI,GAAG;AACZ,CAAC,EACA,OAAO;AACH,IAAM,kBAAkBA,GAC5B,OAAO;AAAA,EACN,WAAWC,IAAG,SAAS;AAAA,EACvB,OAAOD,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS;AAAA,EACrE,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AACnD,CAAC,EACA,OAAO;AAEH,SAAS,4BAA4BE,QAAwC;AAClF,QAAM,SAAS,iBAAiB,UAAUA,MAAK;AAC/C,MAAI,CAAC,OAAO,QAAS,OAAM,IAAI,UAAU,mCAAmC;AAC5E,QAAM,QAAQ,OAAO,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,KAAK,aAAa,CAAC,EAAE,EAAE;AAC5F,QAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACzD,MAAI,KAAK,SAAS,MAAM,OAAQ,OAAM,IAAI,UAAU,oBAAoB;AACxE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,oBAAI,IAAY;AACjC,WAAS,MAAMD,KAAkB;AAC/B,QAAI,SAAS,IAAIA,GAAE,EAAG,OAAM,IAAI,UAAU,oCAAoC;AAC9E,QAAI,QAAQ,IAAIA,GAAE,EAAG;AACrB,UAAM,OAAO,KAAK,IAAIA,GAAE;AACxB,QAAI,SAAS,OAAW,OAAM,IAAI,UAAU,4BAA4BA,GAAE,EAAE;AAC5E,QAAI,IAAI,IAAI,KAAK,SAAS,EAAE,SAAS,KAAK,UAAU;AAClD,YAAM,IAAI,UAAU,4BAA4B;AAClD,aAAS,IAAIA,GAAE;AACf,eAAW,cAAc,KAAK,UAAW,OAAM,UAAU;AACzD,aAAS,OAAOA,GAAE;AAClB,YAAQ,IAAIA,GAAE;AAAA,EAChB;AACA,aAAW,QAAQ,MAAO,OAAM,KAAK,EAAE;AACvC,SAAO,EAAE,GAAG,OAAO,MAAM,MAAM;AACjC;AAEO,SAAS,iBAAiBC,QAAoC;AACnE,QAAM,WAAWF,GACd,OAAO;AAAA,IACN,IAAAC;AAAA,IACA,YAAYD,GAAE,QAAQ;AAAA,IACtB,WAAWA,GAAE,IAAI,SAAS;AAAA,IAC1B,WAAWA,GAAE,QAAQ;AAAA,IACrB,QAAQA,GAAE,OAAO,QAAQC,GAAE;AAAA,EAC7B,CAAC,EACA,OAAO,EACP,MAAMC,MAAK;AACd,QAAM,aAAa,4BAA4B,SAAS,UAAU;AAClE,MACE,OAAO,KAAK,SAAS,MAAM,EAAE,WAAW,WAAW,MAAM,UACzD,WAAW,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,OAAO,SAAS,QAAQ,KAAK,EAAE,CAAC;AAExE,UAAM,IAAI,UAAU,uCAAuC;AAC7D,MAAI,IAAI,IAAI,OAAO,OAAO,SAAS,MAAM,CAAC,EAAE,SAAS,WAAW,MAAM;AACpE,UAAM,IAAI,UAAU,mCAAmC;AACzD,SAAO,EAAE,GAAG,UAAU,WAAW;AACnC;;;AC/EA,SAAS,KAAAC,UAAS;AAClB,SAAS,eAAAC,oBAAmC;AAK5C,IAAMC,MAAKC,GACR,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP,OAAO,CAACC,WAAUA,WAAUA,OAAM,KAAK,KAAKA,WAAU,aAAa,yBAAyB;AAC/F,IAAM,QAAQD,GAAE,OAAkBE,YAAW;AACtC,IAAM,iBAAiBF,GAAE,mBAAmB,QAAQ;AAAA,EACzDA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,UAAU;AAAA,IAC1B,KAAKA,GAAE,MAAMD,GAAE,EAAE,IAAI,GAAI;AAAA,IACzB,QAAQC,GAAE,KAAK,CAAC,cAAc,UAAU,CAAC;AAAA,EAC3C,CAAC,EACA,OAAO;AAAA,EACVA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,OAAO,GAAG,OAAOA,GAAE,IAAI,SAAS,EAAE,CAAC,EAAE,OAAO;AAAA,EACvEA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,QAAQ,GAAG,MAAMD,IAAG,CAAC,EAAE,OAAO;AAAA,EACzDC,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,OAAO,GAAG,OAAOD,KAAI,QAAQ,gBAAgB,CAAC,EAAE,OAAO;AACpF,CAAC;AACD,IAAMI,WAAUH,GAAE,mBAAmB,UAAU;AAAA,EAC7CA,GAAE,OAAO,EAAE,QAAQA,GAAE,QAAQ,WAAW,GAAG,QAAQ,MAAM,CAAC,EAAE,OAAO;AAAA,EACnEA,GAAE,OAAO,EAAE,QAAQA,GAAE,QAAQ,QAAQ,GAAG,OAAOA,GAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,EACpEA,GAAE,OAAO,EAAE,QAAQA,GAAE,QAAQ,WAAW,GAAG,OAAOA,GAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AACzE,CAAC;AACM,IAAM,iBAAiBA,GAC3B,OAAO;AAAA,EACN,WAAWD,IAAG,SAAS;AAAA,EACvB,OAAOC,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS;AAAA,EAC5E,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AACnD,CAAC,EACA,OAAO;AACV,IAAM,SAASA,GACZ,OAAO;AAAA,EACN,IAAAD;AAAA,EACA,QAAQA;AAAA,EACR,UAAUA,IAAG,SAAS;AAAA,EACtB,YAAYA,IAAG,SAAS;AAAA,EACxB,OAAOC,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACrC,WAAWD;AAAA,EACX,KAAKA;AAAA,EACL,MAAMA;AAAA,EACN,SAASC,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,mBAAmBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC7C,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,QAAQA,GAAE,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,eAAe,SAAS;AAAA,EAC9B,SAASG,SAAQ,SAAS;AAAA,EAC1B,OAAOH,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACtC,SAASA,GAAE,OAAOD,KAAIC,GAAE,OAAO,EAAE,WAAWD,KAAI,MAAM,CAAC,EAAE,OAAO,CAAC;AAAA,EACjE,WAAWC,GAAE,IAAI,SAAS;AAAA,EAC1B,WAAWA,GAAE,IAAI,SAAS;AAC5B,CAAC,EACA,OAAO,EACP,YAAY,CAAC,MAAM,YAAY;AAC9B,MAAK,KAAK,WAAW,eAAgB,KAAK,SAAS;AACjD,YAAQ,SAAS,EAAE,MAAM,UAAU,SAAS,kCAAkC,CAAC;AACjF,QAAM,YAAY,CAAC,cAAc,cAAc,aAAa,UAAU,WAAW,EAAE;AAAA,IACjF,KAAK;AAAA,EACP;AACA,MAAI,eAAe,KAAK,YAAY;AAClC,YAAQ,SAAS,EAAE,MAAM,UAAU,SAAS,wCAAwC,CAAC;AACvF,MACE,CAAC,aAAa,UAAU,WAAW,EAAE,SAAS,KAAK,MAAM,KACzD,KAAK,WAAW,KAAK,SAAS;AAE9B,YAAQ,SAAS,EAAE,MAAM,UAAU,SAAS,oCAAoC,CAAC;AACrF,CAAC;AACI,SAAS,UAAUC,QAA4B;AACpD,SAAO,OAAO,MAAM,KAAKA,MAAK,CAAC;AACjC;","names":["value","isJsonValue","value","z","id","value","z","isJsonValue","id","z","value","isJsonValue","outcome"]}