@tangle-network/agent-runtime 6.0.2 → 6.0.3
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/CHANGELOG.md +4 -0
- package/dist/{activation-BRfZOfwb.js → activation-DNqjZEo7.js} +4 -4
- package/dist/{activation-BRfZOfwb.js.map → activation-DNqjZEo7.js.map} +1 -1
- package/dist/agent.js +4 -4
- package/dist/{bundle-vFFiCigS.js → bundle-BET6gl5r.js} +2 -2
- package/dist/{bundle-vFFiCigS.js.map → bundle-BET6gl5r.js.map} +1 -1
- package/dist/candidate-execution/index.js +4 -4
- package/dist/{coordination-manager-RSJg5GmY.js → coordination-manager-CYElgkMI.js} +7 -6
- package/dist/{coordination-manager-RSJg5GmY.js.map → coordination-manager-CYElgkMI.js.map} +1 -1
- package/dist/{coordination-map-routing-DVjW5Gx0.js → coordination-map-routing-CKRNZSaV.js} +2 -2
- package/dist/{coordination-map-routing-DVjW5Gx0.js.map → coordination-map-routing-CKRNZSaV.js.map} +1 -1
- package/dist/{delegate-C0cprMUN.js → delegate-dW2jsqFF.js} +2 -2
- package/dist/{delegate-C0cprMUN.js.map → delegate-dW2jsqFF.js.map} +1 -1
- package/dist/durable.js +12 -11
- package/dist/durable.js.map +1 -1
- package/dist/failure-cause-BzjUUsRz.js +3208 -0
- package/dist/failure-cause-BzjUUsRz.js.map +1 -0
- package/dist/{graph-cEg-gquv.js → graph-A7AvOP1I.js} +7 -6
- package/dist/{graph-cEg-gquv.js.map → graph-A7AvOP1I.js.map} +1 -1
- package/dist/{graph-registry-C-hjRx2t.js → graph-registry-C4ASeL2P.js} +1 -1
- package/dist/{graph-registry-B25FxBZN.js → graph-registry-DbCwfHMY.js} +3 -3
- package/dist/{graph-registry-B25FxBZN.js.map → graph-registry-DbCwfHMY.js.map} +1 -1
- package/dist/{improve-DNl4_6lP.js → improve-4qJclc9J.js} +10 -8
- package/dist/{improve-DNl4_6lP.js.map → improve-4qJclc9J.js.map} +1 -1
- package/dist/index.js +13 -11
- package/dist/index.js.map +1 -1
- package/dist/intelligence.js +8 -8
- package/dist/jsonl-file-BeUa5EDx.js +232 -0
- package/dist/jsonl-file-BeUa5EDx.js.map +1 -0
- package/dist/kernel.js +14 -13
- package/dist/{loop-runner-DQJjowz0.js → loop-runner-DZxVXLLU.js} +2 -2
- package/dist/{loop-runner-DQJjowz0.js.map → loop-runner-DZxVXLLU.js.map} +1 -1
- package/dist/loop-runner-bin.js +1 -1
- package/dist/mcp/bin.js +3 -3
- package/dist/mcp/index.js +7 -7
- package/dist/mcp/memory-bin.js +1 -1
- package/dist/{prepare-B6SQA12v.js → prepare-O1HbzOqs.js} +4 -3
- package/dist/{prepare-B6SQA12v.js.map → prepare-O1HbzOqs.js.map} +1 -1
- package/dist/{profile-DN8Dw2Kp.js → profile-DcRoyryP.js} +2 -2
- package/dist/{profile-DN8Dw2Kp.js.map → profile-DcRoyryP.js.map} +1 -1
- package/dist/{provision-supervisor-CtAaJCUa.js → provision-supervisor-CBeTMpMY.js} +7 -6
- package/dist/{provision-supervisor-CtAaJCUa.js.map → provision-supervisor-CBeTMpMY.js.map} +1 -1
- package/dist/{run-cancellation-BCuu6khW.js → run-cancellation-ZmRSYLu5.js} +4 -3
- package/dist/{run-cancellation-BCuu6khW.js.map → run-cancellation-ZmRSYLu5.js.map} +1 -1
- package/dist/{run-state-ByHiAjUs.js → run-state-Dn2AIE5m.js} +6 -6
- package/dist/{run-state-ByHiAjUs.js.map → run-state-Dn2AIE5m.js.map} +1 -1
- package/dist/{runtime-9EYvBcHG.js → runtime-D5eL70Is.js} +20 -17
- package/dist/{runtime-9EYvBcHG.js.map → runtime-D5eL70Is.js.map} +1 -1
- package/dist/{scope-DzhBJrRN.js → scope-DSm2RW5I.js} +9 -3204
- package/dist/scope-DSm2RW5I.js.map +1 -0
- package/dist/{search-executor-BJRNavck.js → search-executor-1qaSeY70.js} +6 -4
- package/dist/{search-executor-BJRNavck.js.map → search-executor-1qaSeY70.js.map} +1 -1
- package/dist/{server-DH0P6OY_.js → server-Dp4JKuTZ.js} +5 -5
- package/dist/{server-DH0P6OY_.js.map → server-Dp4JKuTZ.js.map} +1 -1
- package/dist/{settle-record-BSDDf9Z4.js → settle-record-DTh0cvF-.js} +2 -2
- package/dist/{settle-record-BSDDf9Z4.js.map → settle-record-DTh0cvF-.js.map} +1 -1
- package/dist/snapshot-Cgj2Wzi6.js +210 -0
- package/dist/snapshot-Cgj2Wzi6.js.map +1 -0
- package/dist/{structural-rollout-DgvJLTO0.js → structural-rollout-BwyAIuww.js} +6 -4
- package/dist/{structural-rollout-DgvJLTO0.js.map → structural-rollout-BwyAIuww.js.map} +1 -1
- package/dist/{supervise-Cqhkb2Oj.js → supervise-C2Do7hEd.js} +11 -10
- package/dist/{supervise-Cqhkb2Oj.js.map → supervise-C2Do7hEd.js.map} +1 -1
- package/dist/{supervision-discovery-DI5GIFBJ.js → supervision-discovery-BNChDps7.js} +5 -4
- package/dist/{supervision-discovery-DI5GIFBJ.js.map → supervision-discovery-BNChDps7.js.map} +1 -1
- package/dist/{supervisor-B6sl14OR.js → supervisor-jXN2xXiU.js} +8 -5
- package/dist/{supervisor-B6sl14OR.js.map → supervisor-jXN2xXiU.js.map} +1 -1
- package/dist/testing.js +13 -13
- package/dist/{tool-server-CZWd_Opp.js → tool-server-B9q2dtnW.js} +11 -8
- package/dist/tool-server-B9q2dtnW.js.map +1 -0
- package/dist/{top-web-DGoXGxH8.js → top-web-CQNkrh_j.js} +7 -6
- package/dist/{top-web-DGoXGxH8.js.map → top-web-CQNkrh_j.js.map} +1 -1
- package/dist/tui/bin.js +3 -3
- package/dist/tui/index.js +2 -2
- package/dist/util-C_cdPNC4.js +653 -0
- package/dist/util-C_cdPNC4.js.map +1 -0
- package/dist/{workspace-streams-BqNM06y4.js → workspace-streams-uB9rRbms.js} +3 -652
- package/dist/workspace-streams-uB9rRbms.js.map +1 -0
- package/package.json +3 -3
- package/dist/jsonl-file-CeVYTIQJ.js +0 -439
- package/dist/jsonl-file-CeVYTIQJ.js.map +0 -1
- package/dist/scope-DzhBJrRN.js.map +0 -1
- package/dist/tool-server-CZWd_Opp.js.map +0 -1
- package/dist/workspace-streams-BqNM06y4.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as isNoEntError } from "./jsonl-file-
|
|
1
|
+
import { t as isNoEntError } from "./jsonl-file-BeUa5EDx.js";
|
|
2
2
|
import { a as writeAtomicDurableFile, r as publishExclusiveDurableFile } from "./durable-file-DstVeHcj.js";
|
|
3
3
|
import { canonicalCandidateDigest, canonicalCandidateJson } from "@tangle-network/agent-interface";
|
|
4
4
|
import { resolve } from "node:path";
|
|
@@ -127,4 +127,4 @@ async function readFailureRecord(runDir) {
|
|
|
127
127
|
}
|
|
128
128
|
export { readFailureRecord as a, writeFailureRecord as c, parseSettleRecord as i, writeSettleRecord as l, SETTLE_RECORD_FILE as n, readSettleRecord as o, SettledRunDirectoryError as r, settleRecordDigest as s, FAILURE_RECORD_FILE as t };
|
|
129
129
|
|
|
130
|
-
//# sourceMappingURL=settle-record-
|
|
130
|
+
//# sourceMappingURL=settle-record-DTh0cvF-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settle-record-BSDDf9Z4.js","names":[],"sources":["../src/durable/settle-record.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { canonicalCandidateDigest, canonicalCandidateJson } from '@tangle-network/agent-interface'\nimport {\n publishExclusiveDurableFile,\n writeAtomicDurableFile,\n} from '../runtime/supervise/durable-file'\nimport type { RootStreamReceipt, SupervisedResult } from '../runtime/supervise/types'\nimport { isNoEntError } from './jsonl-file'\n\n/** Terminal evidence has one result per segment. Reopen archives that result byte for byte;\n * a failed attempt may resume because failure.json records only the latest throw.\n * Serialization, exclusive publication and validation stay with the record operations below.\n */\n\n/** The settle record: the returned `SupervisedResult` as canonical JSON, written once. */\nexport const SETTLE_RECORD_FILE = 'result.json'\n/** The failure record: the most recent throw, replaced by a later throw. */\nexport const FAILURE_RECORD_FILE = 'failure.json'\n\n/** What `failure.json` records about the most recent throw. */\nexport interface DurableFailureRecord {\n readonly runId: string\n readonly pursuitId: string\n /** ISO instant the throw was recorded. */\n readonly at: string\n readonly error: { readonly name: string; readonly message: string }\n /** The root's retained provider stream at the time of the throw, when the directory holds one:\n * a root that died mid-turn keeps what it had streamed, and this names it. */\n readonly rootStream?: RootStreamReceipt\n}\n\n/** The directory already holds a settle record, so the run it records must not be re-entered. */\nexport class SettledRunDirectoryError extends Error {\n readonly path: string\n /** The root of the recorded run, which is its `runId`. */\n readonly recordedRunId: string\n\n constructor(path: string, recordedRunId: string, requestedRunId: string) {\n super(\n recordedRunId === requestedRunId\n ? `supervisePursuit: ${path} records that run '${recordedRunId}' already settled; a settled run is not re-entered unless the call passes reopen: { operator, reason, operationId }`\n : `supervisePursuit: ${path} records that run '${recordedRunId}' already settled in this directory; a directory holds one settle record, so run '${requestedRunId}' needs its own runDir`,\n )\n this.name = 'SettledRunDirectoryError'\n this.path = path\n this.recordedRunId = recordedRunId\n }\n}\n\n/** A result member whose JSON form would misstate it. */\nclass UnrecordableSettleValueError extends TypeError {\n readonly path: string\n\n constructor(path: string, kind: string) {\n super(\n `supervisePursuit: result${path} is a ${kind}, which JSON cannot record faithfully; a settle record holds plain data only`,\n )\n this.name = 'UnrecordableSettleValueError'\n this.path = path\n }\n}\n\nconst PLAIN_PROTOTYPES = new Set<unknown>([Object.prototype, Array.prototype, null])\n\n/**\n * The JSON value of a result, or a throw naming the first member JSON would misstate. An\n * `undefined` member and a function are dropped, exactly as any JSON consumer drops them; a Map,\n * a Set, a Date, a typed array, or a class instance would be rewritten to `{}` or a string and\n * so is refused.\n */\nfunction jsonValue(result: unknown): unknown {\n const seen: unknown[] = []\n const visit = (value: unknown, path: string): void => {\n if (value === null || typeof value !== 'object') return\n if (value instanceof Map) throw new UnrecordableSettleValueError(path, 'Map')\n if (value instanceof Set) throw new UnrecordableSettleValueError(path, 'Set')\n if (value instanceof Date) throw new UnrecordableSettleValueError(path, 'Date')\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n throw new UnrecordableSettleValueError(path, 'binary buffer')\n }\n if (!PLAIN_PROTOTYPES.has(Object.getPrototypeOf(value))) {\n throw new UnrecordableSettleValueError(path, 'class instance')\n }\n if (seen.includes(value)) throw new UnrecordableSettleValueError(path, 'cycle')\n seen.push(value)\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) visit(item, `${path}[${index}]`)\n } else {\n for (const [key, item] of Object.entries(value)) visit(item, `${path}.${key}`)\n }\n seen.pop()\n }\n visit(result, '')\n return JSON.parse(JSON.stringify(result))\n}\n\n/**\n * The exact bytes `result.json` holds for a result: its JSON value serialized as RFC 8785\n * canonical JSON. Throws `UnrecordableSettleValueError` before any byte is written when the\n * result carries a value JSON would misstate.\n */\nexport function settleRecordJson(result: unknown): string {\n return canonicalCandidateJson(jsonValue(result))\n}\n\n/** The digest the settle record's bytes hash to: the candidate digest of the result's JSON value. */\nexport function settleRecordDigest(result: unknown): string {\n return canonicalCandidateDigest(jsonValue(result))\n}\n\n/** Publish `result.json` in the run directory once. Throws when a record is already there. */\nexport async function writeSettleRecord(runDir: string, result: unknown): Promise<string> {\n const path = resolve(runDir, SETTLE_RECORD_FILE)\n if (!publishExclusiveDurableFile(path, settleRecordJson(result))) {\n throw new Error(`supervisePursuit: ${path} already exists; a settle record is written once`)\n }\n return path\n}\n\n/** Replace `failure.json` in the run directory with the most recent throw. */\nexport async function writeFailureRecord(\n runDir: string,\n record: DurableFailureRecord,\n): Promise<string> {\n const path = resolve(runDir, FAILURE_RECORD_FILE)\n writeAtomicDurableFile(path, `${JSON.stringify(record, null, 2)}\\n`)\n return path\n}\n\n/**\n * Read the settle record a run directory holds, or `undefined` when it holds none. A file that\n * is present but is not a settle record is corruption and fails loud.\n */\nexport async function readSettleRecord(\n runDir: string,\n): Promise<SupervisedResult<unknown> | undefined> {\n return readTerminalFile(runDir, SETTLE_RECORD_FILE, parseSettleRecord)\n}\n\nasync function readTerminalFile<T>(\n runDir: string,\n file: string,\n parse: (text: string, path: string) => T,\n): Promise<T | undefined> {\n const path = resolve(runDir, file)\n try {\n return parse(await readFile(path, 'utf8'), path)\n } catch (error) {\n if (isNoEntError(error)) return undefined\n throw error\n }\n}\n\nfunction parseTerminalJson(text: string, path: string): unknown {\n try {\n return JSON.parse(text)\n } catch (cause) {\n throw new Error(`supervisePursuit: ${path} is not valid JSON`, { cause })\n }\n}\n\n/** Parse settle-record bytes already read, so a caller hashes and parses the same bytes. */\nexport function parseSettleRecord(text: string, path: string): SupervisedResult<unknown> {\n const parsed = parseTerminalJson(text, path)\n const record = parsed as { kind?: unknown; tree?: { root?: unknown } }\n if (\n typeof record !== 'object' ||\n record === null ||\n typeof record.kind !== 'string' ||\n typeof record.tree !== 'object' ||\n record.tree === null ||\n typeof record.tree.root !== 'string'\n ) {\n throw new Error(`supervisePursuit: ${path} is not a settle record (no kind or tree.root)`)\n }\n return parsed as SupervisedResult<unknown>\n}\n\n/** Read the most recent failure record, or `undefined` when the directory holds none. */\nexport async function readFailureRecord(runDir: string): Promise<DurableFailureRecord | undefined> {\n return readTerminalFile(runDir, FAILURE_RECORD_FILE, (text, path) => {\n const parsed = parseTerminalJson(text, path)\n const record = parsed as Partial<DurableFailureRecord>\n if (\n typeof record !== 'object' ||\n record === null ||\n typeof record.runId !== 'string' ||\n typeof record.pursuitId !== 'string' ||\n typeof record.at !== 'string' ||\n typeof record.error?.name !== 'string' ||\n typeof record.error.message !== 'string' ||\n (record.rootStream !== undefined &&\n (typeof record.rootStream.ref !== 'string' || typeof record.rootStream.events !== 'number'))\n ) {\n throw new Error(`supervisePursuit: ${path} is not a failure record`)\n }\n return parsed as DurableFailureRecord\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settle-record-DTh0cvF-.js","names":[],"sources":["../src/durable/settle-record.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { canonicalCandidateDigest, canonicalCandidateJson } from '@tangle-network/agent-interface'\nimport {\n publishExclusiveDurableFile,\n writeAtomicDurableFile,\n} from '../runtime/supervise/durable-file'\nimport type { RootStreamReceipt, SupervisedResult } from '../runtime/supervise/types'\nimport { isNoEntError } from './jsonl-file'\n\n/** Terminal evidence has one result per segment. Reopen archives that result byte for byte;\n * a failed attempt may resume because failure.json records only the latest throw.\n * Serialization, exclusive publication and validation stay with the record operations below.\n */\n\n/** The settle record: the returned `SupervisedResult` as canonical JSON, written once. */\nexport const SETTLE_RECORD_FILE = 'result.json'\n/** The failure record: the most recent throw, replaced by a later throw. */\nexport const FAILURE_RECORD_FILE = 'failure.json'\n\n/** What `failure.json` records about the most recent throw. */\nexport interface DurableFailureRecord {\n readonly runId: string\n readonly pursuitId: string\n /** ISO instant the throw was recorded. */\n readonly at: string\n readonly error: { readonly name: string; readonly message: string }\n /** The root's retained provider stream at the time of the throw, when the directory holds one:\n * a root that died mid-turn keeps what it had streamed, and this names it. */\n readonly rootStream?: RootStreamReceipt\n}\n\n/** The directory already holds a settle record, so the run it records must not be re-entered. */\nexport class SettledRunDirectoryError extends Error {\n readonly path: string\n /** The root of the recorded run, which is its `runId`. */\n readonly recordedRunId: string\n\n constructor(path: string, recordedRunId: string, requestedRunId: string) {\n super(\n recordedRunId === requestedRunId\n ? `supervisePursuit: ${path} records that run '${recordedRunId}' already settled; a settled run is not re-entered unless the call passes reopen: { operator, reason, operationId }`\n : `supervisePursuit: ${path} records that run '${recordedRunId}' already settled in this directory; a directory holds one settle record, so run '${requestedRunId}' needs its own runDir`,\n )\n this.name = 'SettledRunDirectoryError'\n this.path = path\n this.recordedRunId = recordedRunId\n }\n}\n\n/** A result member whose JSON form would misstate it. */\nclass UnrecordableSettleValueError extends TypeError {\n readonly path: string\n\n constructor(path: string, kind: string) {\n super(\n `supervisePursuit: result${path} is a ${kind}, which JSON cannot record faithfully; a settle record holds plain data only`,\n )\n this.name = 'UnrecordableSettleValueError'\n this.path = path\n }\n}\n\nconst PLAIN_PROTOTYPES = new Set<unknown>([Object.prototype, Array.prototype, null])\n\n/**\n * The JSON value of a result, or a throw naming the first member JSON would misstate. An\n * `undefined` member and a function are dropped, exactly as any JSON consumer drops them; a Map,\n * a Set, a Date, a typed array, or a class instance would be rewritten to `{}` or a string and\n * so is refused.\n */\nfunction jsonValue(result: unknown): unknown {\n const seen: unknown[] = []\n const visit = (value: unknown, path: string): void => {\n if (value === null || typeof value !== 'object') return\n if (value instanceof Map) throw new UnrecordableSettleValueError(path, 'Map')\n if (value instanceof Set) throw new UnrecordableSettleValueError(path, 'Set')\n if (value instanceof Date) throw new UnrecordableSettleValueError(path, 'Date')\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer) {\n throw new UnrecordableSettleValueError(path, 'binary buffer')\n }\n if (!PLAIN_PROTOTYPES.has(Object.getPrototypeOf(value))) {\n throw new UnrecordableSettleValueError(path, 'class instance')\n }\n if (seen.includes(value)) throw new UnrecordableSettleValueError(path, 'cycle')\n seen.push(value)\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) visit(item, `${path}[${index}]`)\n } else {\n for (const [key, item] of Object.entries(value)) visit(item, `${path}.${key}`)\n }\n seen.pop()\n }\n visit(result, '')\n return JSON.parse(JSON.stringify(result))\n}\n\n/**\n * The exact bytes `result.json` holds for a result: its JSON value serialized as RFC 8785\n * canonical JSON. Throws `UnrecordableSettleValueError` before any byte is written when the\n * result carries a value JSON would misstate.\n */\nexport function settleRecordJson(result: unknown): string {\n return canonicalCandidateJson(jsonValue(result))\n}\n\n/** The digest the settle record's bytes hash to: the candidate digest of the result's JSON value. */\nexport function settleRecordDigest(result: unknown): string {\n return canonicalCandidateDigest(jsonValue(result))\n}\n\n/** Publish `result.json` in the run directory once. Throws when a record is already there. */\nexport async function writeSettleRecord(runDir: string, result: unknown): Promise<string> {\n const path = resolve(runDir, SETTLE_RECORD_FILE)\n if (!publishExclusiveDurableFile(path, settleRecordJson(result))) {\n throw new Error(`supervisePursuit: ${path} already exists; a settle record is written once`)\n }\n return path\n}\n\n/** Replace `failure.json` in the run directory with the most recent throw. */\nexport async function writeFailureRecord(\n runDir: string,\n record: DurableFailureRecord,\n): Promise<string> {\n const path = resolve(runDir, FAILURE_RECORD_FILE)\n writeAtomicDurableFile(path, `${JSON.stringify(record, null, 2)}\\n`)\n return path\n}\n\n/**\n * Read the settle record a run directory holds, or `undefined` when it holds none. A file that\n * is present but is not a settle record is corruption and fails loud.\n */\nexport async function readSettleRecord(\n runDir: string,\n): Promise<SupervisedResult<unknown> | undefined> {\n return readTerminalFile(runDir, SETTLE_RECORD_FILE, parseSettleRecord)\n}\n\nasync function readTerminalFile<T>(\n runDir: string,\n file: string,\n parse: (text: string, path: string) => T,\n): Promise<T | undefined> {\n const path = resolve(runDir, file)\n try {\n return parse(await readFile(path, 'utf8'), path)\n } catch (error) {\n if (isNoEntError(error)) return undefined\n throw error\n }\n}\n\nfunction parseTerminalJson(text: string, path: string): unknown {\n try {\n return JSON.parse(text)\n } catch (cause) {\n throw new Error(`supervisePursuit: ${path} is not valid JSON`, { cause })\n }\n}\n\n/** Parse settle-record bytes already read, so a caller hashes and parses the same bytes. */\nexport function parseSettleRecord(text: string, path: string): SupervisedResult<unknown> {\n const parsed = parseTerminalJson(text, path)\n const record = parsed as { kind?: unknown; tree?: { root?: unknown } }\n if (\n typeof record !== 'object' ||\n record === null ||\n typeof record.kind !== 'string' ||\n typeof record.tree !== 'object' ||\n record.tree === null ||\n typeof record.tree.root !== 'string'\n ) {\n throw new Error(`supervisePursuit: ${path} is not a settle record (no kind or tree.root)`)\n }\n return parsed as SupervisedResult<unknown>\n}\n\n/** Read the most recent failure record, or `undefined` when the directory holds none. */\nexport async function readFailureRecord(runDir: string): Promise<DurableFailureRecord | undefined> {\n return readTerminalFile(runDir, FAILURE_RECORD_FILE, (text, path) => {\n const parsed = parseTerminalJson(text, path)\n const record = parsed as Partial<DurableFailureRecord>\n if (\n typeof record !== 'object' ||\n record === null ||\n typeof record.runId !== 'string' ||\n typeof record.pursuitId !== 'string' ||\n typeof record.at !== 'string' ||\n typeof record.error?.name !== 'string' ||\n typeof record.error.message !== 'string' ||\n (record.rootStream !== undefined &&\n (typeof record.rootStream.ref !== 'string' || typeof record.rootStream.events !== 'number'))\n ) {\n throw new Error(`supervisePursuit: ${path} is not a failure record`)\n }\n return parsed as DurableFailureRecord\n })\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { m as ValidationError } from "./errors-AzSuGI23.js";
|
|
2
|
+
import { REDACTION_VERSION, redact } from "@tangle-network/agent-eval/traces";
|
|
3
|
+
// src/redact.ts
|
|
4
|
+
/**
|
|
5
|
+
* Redaction for values that may leave the Runtime process. The built-in
|
|
6
|
+
* redactor is agent-eval's redaction core (`@tangle-network/agent-eval/traces`,
|
|
7
|
+
* default profile): credentials found by field name or value shape are
|
|
8
|
+
* replaced whole, email, card, SSN and phone values in place, and token counts
|
|
9
|
+
* such as `inputTokens` or `max_tokens` are kept. A customer with
|
|
10
|
+
* domain-specific PII supplies their own `redact` hook.
|
|
11
|
+
*
|
|
12
|
+
* This is narrower than `src/sanitize.ts`, which drops fields of the runtime's
|
|
13
|
+
* *event envelope* unless the caller opts in: here the value is opaque customer
|
|
14
|
+
* payload, so the scrub is value-shaped, not schema-shaped.
|
|
15
|
+
*
|
|
16
|
+
* @experimental
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* The built-in redactor. Cycle-safe, depth-bounded and total: it never throws
|
|
20
|
+
* on customer input and never mutates it.
|
|
21
|
+
*/
|
|
22
|
+
function defaultRedactor(value) {
|
|
23
|
+
return redact(value).value;
|
|
24
|
+
}
|
|
25
|
+
/** Stable identity input for saved work that depends on built-in redaction behavior. */
|
|
26
|
+
function defaultRedactorIdentityMaterial() {
|
|
27
|
+
return {
|
|
28
|
+
core: "@tangle-network/agent-eval/traces redact",
|
|
29
|
+
profile: "default",
|
|
30
|
+
version: REDACTION_VERSION
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the redactor a client uses. A caller-supplied hook handles
|
|
35
|
+
* domain-specific values first, then the built-in scrubber still removes
|
|
36
|
+
* credentials and personal data. Returning `false` is the explicit opt-out for
|
|
37
|
+
* already-reviewed public values.
|
|
38
|
+
*/
|
|
39
|
+
function resolveRedactor(redact) {
|
|
40
|
+
if (redact === false) return (value) => value;
|
|
41
|
+
if (!redact) return defaultRedactor;
|
|
42
|
+
return (value) => defaultRedactor(redact(value));
|
|
43
|
+
}
|
|
44
|
+
// src/runtime/supervise/error-message.ts
|
|
45
|
+
const maxCauseDepth = 4;
|
|
46
|
+
const maxMessageLength = 32768;
|
|
47
|
+
const maxPartLength = 2048;
|
|
48
|
+
/** A persisted failure must explain its wrappers without exporting credentials or unbounded data. */
|
|
49
|
+
function errorText(value) {
|
|
50
|
+
let text;
|
|
51
|
+
try {
|
|
52
|
+
text = typeof value === "string" ? value : JSON.stringify(value) ?? String(value);
|
|
53
|
+
} catch {
|
|
54
|
+
text = "[unprintable rejection]";
|
|
55
|
+
}
|
|
56
|
+
return String(defaultRedactor(text)).slice(0, maxMessageLength);
|
|
57
|
+
}
|
|
58
|
+
function errorProperty(error, field) {
|
|
59
|
+
try {
|
|
60
|
+
const value = error[field];
|
|
61
|
+
return value === void 0 ? void 0 : errorText(value).slice(0, field === "name" ? 256 : maxMessageLength);
|
|
62
|
+
} catch {
|
|
63
|
+
return `[unreadable error ${field}]`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** An HTTP status carried on a thrown error, read without trusting its getter. Provider SDKs put
|
|
67
|
+
* one on their own error classes, so this is how a refusal is recognised outside the transport
|
|
68
|
+
* taxonomy — for the persisted message here, and for the driver's retry verdict. */
|
|
69
|
+
function errorHttpStatus(error) {
|
|
70
|
+
try {
|
|
71
|
+
const status = Reflect.get(error, "status");
|
|
72
|
+
return typeof status === "number" && Number.isInteger(status) && status >= 100 && status <= 599 ? status : void 0;
|
|
73
|
+
} catch {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Shared by child settlements, driver attempts, and the final no-winner result. */
|
|
78
|
+
function errMessage(error) {
|
|
79
|
+
const parts = [];
|
|
80
|
+
const seen = /* @__PURE__ */ new Set();
|
|
81
|
+
let current = error;
|
|
82
|
+
for (let depth = 0; depth <= maxCauseDepth; depth += 1) try {
|
|
83
|
+
if (!(current instanceof Error)) {
|
|
84
|
+
parts.push(errorText(current).slice(0, maxPartLength));
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
if (seen.has(current)) {
|
|
88
|
+
parts.push("[circular]");
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
seen.add(current);
|
|
92
|
+
const status = errorHttpStatus(current);
|
|
93
|
+
const message = (status === void 0 ? "" : `HTTP ${status}: `) + (errorProperty(current, "message") ?? "");
|
|
94
|
+
const members = Reflect.get(current, "errors");
|
|
95
|
+
const named = Array.isArray(members) ? ` [${members.map((m) => m instanceof Error ? `${errorProperty(m, "name")}: ${errorProperty(m, "message")}` : errorText(m)).join("; ")}]` : "";
|
|
96
|
+
const part = depth === 0 ? message : `${errorProperty(current, "name")}: ${message}`;
|
|
97
|
+
parts.push(`${part}${named}`.slice(0, maxPartLength));
|
|
98
|
+
current = current.cause;
|
|
99
|
+
if (current === void 0 || current === null) break;
|
|
100
|
+
if (depth === maxCauseDepth) parts.push("[cause chain truncated]");
|
|
101
|
+
} catch {
|
|
102
|
+
parts.push("[unreadable error cause]");
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
return parts.join(": caused by ").slice(0, maxMessageLength);
|
|
106
|
+
}
|
|
107
|
+
/** The error and its causes (`cause`, and `errors` members), bounded and cycle-safe. */
|
|
108
|
+
function causeChain(error) {
|
|
109
|
+
const chain = [];
|
|
110
|
+
const queue = [error];
|
|
111
|
+
while (queue.length > 0 && chain.length < 12) {
|
|
112
|
+
const value = queue.shift();
|
|
113
|
+
if (typeof value !== "object" || value === null || chain.includes(value)) continue;
|
|
114
|
+
chain.push(value);
|
|
115
|
+
try {
|
|
116
|
+
const errors = Reflect.get(value, "errors");
|
|
117
|
+
if (Array.isArray(errors)) queue.push(...errors);
|
|
118
|
+
queue.push(Reflect.get(value, "cause"));
|
|
119
|
+
} catch {}
|
|
120
|
+
}
|
|
121
|
+
return chain;
|
|
122
|
+
}
|
|
123
|
+
// src/runtime/supervise/snapshot.ts
|
|
124
|
+
/** Deeply detach and freeze untrusted data at a runtime decision boundary. The clone prevents the
|
|
125
|
+
* caller from mutating it later; the freeze prevents downstream code from mutating the snapshot.
|
|
126
|
+
* Strings are immutable, so the snapshot shares the caller's strings instead of copying them. */
|
|
127
|
+
function detachedSnapshot(value, context) {
|
|
128
|
+
let clone;
|
|
129
|
+
try {
|
|
130
|
+
clone = structuredClone(value);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
throw new ValidationError(`${context}: input must be structured-cloneable`, { cause: error });
|
|
133
|
+
}
|
|
134
|
+
return deepFreeze(shareSourceStrings(value, clone));
|
|
135
|
+
}
|
|
136
|
+
/** Detach a value from its caller and freeze it, without the `ValidationError` framing
|
|
137
|
+
* {@link detachedSnapshot} adds. For a boundary that has already validated its input. */
|
|
138
|
+
function detachedFrozen(value) {
|
|
139
|
+
return deepFreeze(shareSourceStrings(value, structuredClone(value)));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Point each string in a fresh structured clone at the equal string in its source.
|
|
143
|
+
*
|
|
144
|
+
* `structuredClone` copies every string, and a copied string buys no isolation: only objects and
|
|
145
|
+
* arrays can change through a shared reference. A spawned profile passes several boundaries, and
|
|
146
|
+
* each one kept its own copy: in a reproduction of Discovery's hosted coordinator, a child profile
|
|
147
|
+
* that mounts a 5.3 MB file packet was held four times per spawned child. A scope keeps every
|
|
148
|
+
* child it spawned, so the heap grew about 22 MB per spawn, and hosted coordinators died with V8
|
|
149
|
+
* heap OOM after 37 spawns.
|
|
150
|
+
*
|
|
151
|
+
* The walk pairs only own data properties of plain objects and arrays. Accessors, Maps, Sets and
|
|
152
|
+
* other cloned types keep the clone's values. A string is replaced only by a string equal to it,
|
|
153
|
+
* so the snapshot holds exactly the clone's value. The snapshot keeps the source's strings alive.
|
|
154
|
+
*/
|
|
155
|
+
function shareSourceStrings(source, clone) {
|
|
156
|
+
const visited = /* @__PURE__ */ new Set();
|
|
157
|
+
const visit = (from, to) => {
|
|
158
|
+
if (from === null || to === null || typeof from !== "object" || typeof to !== "object") return;
|
|
159
|
+
const array = Array.isArray(to);
|
|
160
|
+
if (array !== Array.isArray(from)) return;
|
|
161
|
+
if (!array && Object.getPrototypeOf(to) !== Object.prototype) return;
|
|
162
|
+
if (visited.has(to)) return;
|
|
163
|
+
visited.add(to);
|
|
164
|
+
const target = to;
|
|
165
|
+
for (const key of Object.keys(target)) {
|
|
166
|
+
const own = Object.getOwnPropertyDescriptor(from, key);
|
|
167
|
+
if (own === void 0 || !("value" in own)) continue;
|
|
168
|
+
const cloned = target[key];
|
|
169
|
+
if (typeof cloned === "string") {
|
|
170
|
+
if (own.value === cloned) target[key] = own.value;
|
|
171
|
+
} else visit(own.value, cloned);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
visit(source, clone);
|
|
175
|
+
return clone;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Replace each string in a freshly parsed JSON value with an equal string already in `pool`, and
|
|
179
|
+
* add the new ones. One recovery pass parses every interrupted child's profile from its own blob,
|
|
180
|
+
* so children that carry the same file packet would otherwise hold one copy each. The value is
|
|
181
|
+
* updated in place, so it must belong to the caller; frozen objects are left as they are.
|
|
182
|
+
*/
|
|
183
|
+
function shareParsedStrings(value, pool) {
|
|
184
|
+
const visit = (node) => {
|
|
185
|
+
if (node === null || typeof node !== "object" || Object.isFrozen(node)) return;
|
|
186
|
+
if (!Array.isArray(node) && Object.getPrototypeOf(node) !== Object.prototype) return;
|
|
187
|
+
const target = node;
|
|
188
|
+
for (const key of Object.keys(target)) {
|
|
189
|
+
const item = target[key];
|
|
190
|
+
if (typeof item !== "string") {
|
|
191
|
+
visit(item);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const shared = pool.get(item);
|
|
195
|
+
if (shared === void 0) pool.set(item, item);
|
|
196
|
+
else target[key] = shared;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
visit(value);
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
function deepFreeze(value, seen = /* @__PURE__ */ new Set()) {
|
|
203
|
+
if (value === null || typeof value !== "object" || ArrayBuffer.isView(value) || seen.has(value)) return value;
|
|
204
|
+
seen.add(value);
|
|
205
|
+
for (const child of Object.values(value)) deepFreeze(child, seen);
|
|
206
|
+
return Object.freeze(value);
|
|
207
|
+
}
|
|
208
|
+
export { errMessage as a, errorText as c, resolveRedactor as d, causeChain as i, defaultRedactor as l, detachedSnapshot as n, errorHttpStatus as o, shareParsedStrings as r, errorProperty as s, detachedFrozen as t, defaultRedactorIdentityMaterial as u };
|
|
209
|
+
|
|
210
|
+
//# sourceMappingURL=snapshot-Cgj2Wzi6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-Cgj2Wzi6.js","names":[],"sources":["../src/redact.ts","../src/runtime/supervise/error-message.ts","../src/runtime/supervise/snapshot.ts"],"sourcesContent":["/**\n * Redaction for values that may leave the Runtime process. The built-in\n * redactor is agent-eval's redaction core (`@tangle-network/agent-eval/traces`,\n * default profile): credentials found by field name or value shape are\n * replaced whole, email, card, SSN and phone values in place, and token counts\n * such as `inputTokens` or `max_tokens` are kept. A customer with\n * domain-specific PII supplies their own `redact` hook.\n *\n * This is narrower than `src/sanitize.ts`, which drops fields of the runtime's\n * *event envelope* unless the caller opts in: here the value is opaque customer\n * payload, so the scrub is value-shaped, not schema-shaped.\n *\n * @experimental\n */\n\nimport { REDACTION_VERSION, redact } from '@tangle-network/agent-eval/traces'\n\n/** A redactor maps an arbitrary trace value to a safe-to-export value. Pure;\n * must not throw on cyclic input (the default tolerates cycles). */\nexport type Redactor = (value: unknown) => unknown\n\n/**\n * The built-in redactor. Cycle-safe, depth-bounded and total: it never throws\n * on customer input and never mutates it.\n */\nexport function defaultRedactor(value: unknown): unknown {\n return redact(value).value\n}\n\n/** Stable identity input for saved work that depends on built-in redaction behavior. */\nexport function defaultRedactorIdentityMaterial(): unknown {\n return {\n core: '@tangle-network/agent-eval/traces redact',\n profile: 'default',\n version: REDACTION_VERSION,\n }\n}\n\n/**\n * Resolve the redactor a client uses. A caller-supplied hook handles\n * domain-specific values first, then the built-in scrubber still removes\n * credentials and personal data. Returning `false` is the explicit opt-out for\n * already-reviewed public values.\n */\nexport function resolveRedactor(redact: Redactor | false | undefined): Redactor {\n if (redact === false) return (value) => value\n if (!redact) return defaultRedactor\n return (value) => defaultRedactor(redact(value))\n}\n","import { defaultRedactor } from '../../redact'\n\nconst maxCauseDepth = 4\nconst maxMessageLength = 32_768\nconst maxPartLength = 2_048\n\n/** A persisted failure must explain its wrappers without exporting credentials or unbounded data. */\nexport function errorText(value: unknown): string {\n let text: string\n try {\n text = typeof value === 'string' ? value : (JSON.stringify(value) ?? String(value))\n } catch {\n text = '[unprintable rejection]'\n }\n return String(defaultRedactor(text)).slice(0, maxMessageLength)\n}\n\nexport function errorProperty(\n error: Error,\n field: 'name' | 'message' | 'stack',\n): string | undefined {\n try {\n const value = error[field]\n return value === undefined\n ? undefined\n : errorText(value).slice(0, field === 'name' ? 256 : maxMessageLength)\n } catch {\n return `[unreadable error ${field}]`\n }\n}\n\n/** An HTTP status carried on a thrown error, read without trusting its getter. Provider SDKs put\n * one on their own error classes, so this is how a refusal is recognised outside the transport\n * taxonomy — for the persisted message here, and for the driver's retry verdict. */\nexport function errorHttpStatus(error: Error): number | undefined {\n try {\n const status: unknown = Reflect.get(error, 'status')\n return typeof status === 'number' && Number.isInteger(status) && status >= 100 && status <= 599\n ? status\n : undefined\n } catch {\n return undefined\n }\n}\n\n/** Shared by child settlements, driver attempts, and the final no-winner result. */\nexport function errMessage(error: unknown): string {\n const parts: string[] = []\n const seen = new Set<Error>()\n let current = error\n for (let depth = 0; depth <= maxCauseDepth; depth += 1) {\n try {\n if (!(current instanceof Error)) {\n parts.push(errorText(current).slice(0, maxPartLength))\n break\n }\n if (seen.has(current)) {\n parts.push('[circular]')\n break\n }\n seen.add(current)\n const status = errorHttpStatus(current)\n const message =\n (status === undefined ? '' : `HTTP ${status}: `) + (errorProperty(current, 'message') ?? '')\n // An AggregateError's members carry its evidence: name each, one level deep.\n const members: unknown = Reflect.get(current, 'errors')\n const named = Array.isArray(members)\n ? ` [${members.map((m) => (m instanceof Error ? `${errorProperty(m, 'name')}: ${errorProperty(m, 'message')}` : errorText(m))).join('; ')}]`\n : ''\n const part = depth === 0 ? message : `${errorProperty(current, 'name')}: ${message}`\n parts.push(`${part}${named}`.slice(0, maxPartLength))\n current = current.cause\n if (current === undefined || current === null) break\n if (depth === maxCauseDepth) parts.push('[cause chain truncated]')\n } catch {\n parts.push('[unreadable error cause]')\n break\n }\n }\n return parts.join(': caused by ').slice(0, maxMessageLength)\n}\n\n/** The error and its causes (`cause`, and `errors` members), bounded and cycle-safe. */\nexport function causeChain(error: unknown): object[] {\n const chain: object[] = []\n const queue: unknown[] = [error]\n while (queue.length > 0 && chain.length < 12) {\n const value = queue.shift()\n if (typeof value !== 'object' || value === null || chain.includes(value)) continue\n chain.push(value)\n try {\n const errors: unknown = Reflect.get(value, 'errors')\n if (Array.isArray(errors)) queue.push(...errors)\n queue.push(Reflect.get(value, 'cause'))\n } catch {\n // A cause that cannot be read ends this branch of the walk.\n }\n }\n return chain\n}\n","import { ValidationError } from '../../errors'\n\n/** Deeply detach and freeze untrusted data at a runtime decision boundary. The clone prevents the\n * caller from mutating it later; the freeze prevents downstream code from mutating the snapshot.\n * Strings are immutable, so the snapshot shares the caller's strings instead of copying them. */\nexport function detachedSnapshot<T>(value: T, context: string): T {\n let clone: T\n try {\n clone = structuredClone(value)\n } catch (error) {\n throw new ValidationError(`${context}: input must be structured-cloneable`, { cause: error })\n }\n return deepFreeze(shareSourceStrings(value, clone))\n}\n\n/** Detach a value from its caller and freeze it, without the `ValidationError` framing\n * {@link detachedSnapshot} adds. For a boundary that has already validated its input. */\nexport function detachedFrozen<T>(value: T): T {\n return deepFreeze(shareSourceStrings(value, structuredClone(value)))\n}\n\n/**\n * Point each string in a fresh structured clone at the equal string in its source.\n *\n * `structuredClone` copies every string, and a copied string buys no isolation: only objects and\n * arrays can change through a shared reference. A spawned profile passes several boundaries, and\n * each one kept its own copy: in a reproduction of Discovery's hosted coordinator, a child profile\n * that mounts a 5.3 MB file packet was held four times per spawned child. A scope keeps every\n * child it spawned, so the heap grew about 22 MB per spawn, and hosted coordinators died with V8\n * heap OOM after 37 spawns.\n *\n * The walk pairs only own data properties of plain objects and arrays. Accessors, Maps, Sets and\n * other cloned types keep the clone's values. A string is replaced only by a string equal to it,\n * so the snapshot holds exactly the clone's value. The snapshot keeps the source's strings alive.\n */\nfunction shareSourceStrings<T>(source: unknown, clone: T): T {\n const visited = new Set<object>()\n const visit = (from: unknown, to: unknown): void => {\n if (from === null || to === null || typeof from !== 'object' || typeof to !== 'object') return\n const array = Array.isArray(to)\n if (array !== Array.isArray(from)) return\n if (!array && Object.getPrototypeOf(to) !== Object.prototype) return\n if (visited.has(to)) return\n visited.add(to)\n const target = to as Record<string, unknown>\n for (const key of Object.keys(target)) {\n const own = Object.getOwnPropertyDescriptor(from, key)\n if (own === undefined || !('value' in own)) continue\n const cloned = target[key]\n if (typeof cloned === 'string') {\n if (own.value === cloned) target[key] = own.value\n } else visit(own.value, cloned)\n }\n }\n visit(source, clone)\n return clone\n}\n\n/**\n * Replace each string in a freshly parsed JSON value with an equal string already in `pool`, and\n * add the new ones. One recovery pass parses every interrupted child's profile from its own blob,\n * so children that carry the same file packet would otherwise hold one copy each. The value is\n * updated in place, so it must belong to the caller; frozen objects are left as they are.\n */\nexport function shareParsedStrings<T>(value: T, pool: Map<string, string>): T {\n const visit = (node: unknown): void => {\n if (node === null || typeof node !== 'object' || Object.isFrozen(node)) return\n if (!Array.isArray(node) && Object.getPrototypeOf(node) !== Object.prototype) return\n const target = node as Record<string, unknown>\n for (const key of Object.keys(target)) {\n const item = target[key]\n if (typeof item !== 'string') {\n visit(item)\n continue\n }\n const shared = pool.get(item)\n if (shared === undefined) pool.set(item, item)\n else target[key] = shared\n }\n }\n visit(value)\n return value\n}\n\nfunction deepFreeze<T>(value: T, seen = new Set<object>()): T {\n // `Object.freeze` throws `TypeError: Cannot freeze array buffer views with elements` on any\n // non-empty TypedArray or Buffer, so binary inside a payload must be handed back untouched\n // rather than frozen. Its bytes are already detached by the `structuredClone` above.\n if (value === null || typeof value !== 'object' || ArrayBuffer.isView(value) || seen.has(value)) {\n return value\n }\n seen.add(value)\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child, seen)\n return Object.freeze(value)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,gBAAgB,OAAyB;CACvD,OAAO,OAAO,KAAK,CAAC,CAAC;AACvB;;AAGA,SAAgB,kCAA2C;CACzD,OAAO;EACL,MAAM;EACN,SAAS;EACT,SAAS;CACX;AACF;;;;;;;AAQA,SAAgB,gBAAgB,QAAgD;CAC9E,IAAI,WAAW,OAAO,QAAQ,UAAU;CACxC,IAAI,CAAC,QAAQ,OAAO;CACpB,QAAQ,UAAU,gBAAgB,OAAO,KAAK,CAAC;AACjD;;AC9CA,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AACzB,MAAM,gBAAgB;;AAGtB,SAAgB,UAAU,OAAwB;CAChD,IAAI;CACJ,IAAI;EACF,OAAO,OAAO,UAAU,WAAW,QAAS,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK;CACnF,QAAQ;EACN,OAAO;CACT;CACA,OAAO,OAAO,gBAAgB,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,gBAAgB;AAChE;AAEA,SAAgB,cACd,OACA,OACoB;CACpB,IAAI;EACF,MAAM,QAAQ,MAAM;EACpB,OAAO,UAAU,KAAA,IACb,KAAA,IACA,UAAU,KAAK,CAAC,CAAC,MAAM,GAAG,UAAU,SAAS,MAAM,gBAAgB;CACzE,QAAQ;EACN,OAAO,qBAAqB,MAAM;CACpC;AACF;;;;AAKA,SAAgB,gBAAgB,OAAkC;CAChE,IAAI;EACF,MAAM,SAAkB,QAAQ,IAAI,OAAO,QAAQ;EACnD,OAAO,OAAO,WAAW,YAAY,OAAO,UAAU,MAAM,KAAK,UAAU,OAAO,UAAU,MACxF,SACA,KAAA;CACN,QAAQ;EACN;CACF;AACF;;AAGA,SAAgB,WAAW,OAAwB;CACjD,MAAM,QAAkB,CAAC;CACzB,MAAM,uBAAO,IAAI,IAAW;CAC5B,IAAI,UAAU;CACd,KAAK,IAAI,QAAQ,GAAG,SAAS,eAAe,SAAS,GACnD,IAAI;EACF,IAAI,EAAE,mBAAmB,QAAQ;GAC/B,MAAM,KAAK,UAAU,OAAO,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC;GACrD;EACF;EACA,IAAI,KAAK,IAAI,OAAO,GAAG;GACrB,MAAM,KAAK,YAAY;GACvB;EACF;EACA,KAAK,IAAI,OAAO;EAChB,MAAM,SAAS,gBAAgB,OAAO;EACtC,MAAM,WACH,WAAW,KAAA,IAAY,KAAK,QAAQ,OAAO,QAAQ,cAAc,SAAS,SAAS,KAAK;EAE3F,MAAM,UAAmB,QAAQ,IAAI,SAAS,QAAQ;EACtD,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAC/B,KAAK,QAAQ,KAAK,MAAO,aAAa,QAAQ,GAAG,cAAc,GAAG,MAAM,EAAE,IAAI,cAAc,GAAG,SAAS,MAAM,UAAU,CAAC,CAAE,CAAC,CAAC,KAAK,IAAI,EAAE,KACxI;EACJ,MAAM,OAAO,UAAU,IAAI,UAAU,GAAG,cAAc,SAAS,MAAM,EAAE,IAAI;EAC3E,MAAM,KAAK,GAAG,OAAO,QAAQ,MAAM,GAAG,aAAa,CAAC;EACpD,UAAU,QAAQ;EAClB,IAAI,YAAY,KAAA,KAAa,YAAY,MAAM;EAC/C,IAAI,UAAU,eAAe,MAAM,KAAK,yBAAyB;CACnE,QAAQ;EACN,MAAM,KAAK,0BAA0B;EACrC;CACF;CAEF,OAAO,MAAM,KAAK,cAAc,CAAC,CAAC,MAAM,GAAG,gBAAgB;AAC7D;;AAGA,SAAgB,WAAW,OAA0B;CACnD,MAAM,QAAkB,CAAC;CACzB,MAAM,QAAmB,CAAC,KAAK;CAC/B,OAAO,MAAM,SAAS,KAAK,MAAM,SAAS,IAAI;EAC5C,MAAM,QAAQ,MAAM,MAAM;EAC1B,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,SAAS,KAAK,GAAG;EAC1E,MAAM,KAAK,KAAK;EAChB,IAAI;GACF,MAAM,SAAkB,QAAQ,IAAI,OAAO,QAAQ;GACnD,IAAI,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK,GAAG,MAAM;GAC/C,MAAM,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC;EACxC,QAAQ,CAER;CACF;CACA,OAAO;AACT;;;;;AC9FA,SAAgB,iBAAoB,OAAU,SAAoB;CAChE,IAAI;CACJ,IAAI;EACF,QAAQ,gBAAgB,KAAK;CAC/B,SAAS,OAAO;EACd,MAAM,IAAI,gBAAgB,GAAG,QAAQ,uCAAuC,EAAE,OAAO,MAAM,CAAC;CAC9F;CACA,OAAO,WAAW,mBAAmB,OAAO,KAAK,CAAC;AACpD;;;AAIA,SAAgB,eAAkB,OAAa;CAC7C,OAAO,WAAW,mBAAmB,OAAO,gBAAgB,KAAK,CAAC,CAAC;AACrE;;;;;;;;;;;;;;;AAgBA,SAAS,mBAAsB,QAAiB,OAAa;CAC3D,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,SAAS,MAAe,OAAsB;EAClD,IAAI,SAAS,QAAQ,OAAO,QAAQ,OAAO,SAAS,YAAY,OAAO,OAAO,UAAU;EACxF,MAAM,QAAQ,MAAM,QAAQ,EAAE;EAC9B,IAAI,UAAU,MAAM,QAAQ,IAAI,GAAG;EACnC,IAAI,CAAC,SAAS,OAAO,eAAe,EAAE,MAAM,OAAO,WAAW;EAC9D,IAAI,QAAQ,IAAI,EAAE,GAAG;EACrB,QAAQ,IAAI,EAAE;EACd,MAAM,SAAS;EACf,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG;GACrC,MAAM,MAAM,OAAO,yBAAyB,MAAM,GAAG;GACrD,IAAI,QAAQ,KAAA,KAAa,EAAE,WAAW,MAAM;GAC5C,MAAM,SAAS,OAAO;GACtB,IAAI,OAAO,WAAW,UAChB;QAAA,IAAI,UAAU,QAAQ,OAAO,OAAO,IAAI;GAAA,OACvC,MAAM,IAAI,OAAO,MAAM;EAChC;CACF;CACA,MAAM,QAAQ,KAAK;CACnB,OAAO;AACT;;;;;;;AAQA,SAAgB,mBAAsB,OAAU,MAA8B;CAC5E,MAAM,SAAS,SAAwB;EACrC,IAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,GAAG;EACxE,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,OAAO,eAAe,IAAI,MAAM,OAAO,WAAW;EAC9E,MAAM,SAAS;EACf,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG;GACrC,MAAM,OAAO,OAAO;GACpB,IAAI,OAAO,SAAS,UAAU;IAC5B,MAAM,IAAI;IACV;GACF;GACA,MAAM,SAAS,KAAK,IAAI,IAAI;GAC5B,IAAI,WAAW,KAAA,GAAW,KAAK,IAAI,MAAM,IAAI;QACxC,OAAO,OAAO;EACrB;CACF;CACA,MAAM,KAAK;CACX,OAAO;AACT;AAEA,SAAS,WAAc,OAAU,uBAAO,IAAI,IAAY,GAAM;CAI5D,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,YAAY,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,GAC5F,OAAO;CAET,KAAK,IAAI,KAAK;CACd,KAAK,MAAM,SAAS,OAAO,OAAO,KAAgC,GAAG,WAAW,OAAO,IAAI;CAC3F,OAAO,OAAO,OAAO,KAAK;AAC5B"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { Br as executableAgentProfileSnapshot, Cr as knownMaterializationReceipt, Fr as runtimeOwnedPendingExecutorMaterialization,
|
|
1
|
+
import { Br as executableAgentProfileSnapshot, Cr as knownMaterializationReceipt, Fr as runtimeOwnedPendingExecutorMaterialization, Mr as runtimeOwnedExecutorExecutionBinding, Nr as runtimeOwnedExecutorMaterialization, Rr as unknownExecutionBindingReceipt, Sr as knownExecutionBindingReceipt, ii as providerMessageText, ni as promptFromAgentTurnInput, qr as awaitAbortable, ri as promptOptionsFromAgentTurnInput, yr as authoredProfileDigest, zr as unknownMaterializationReceipt } from "./scope-DSm2RW5I.js";
|
|
2
2
|
import { m as ValidationError, p as SessionMismatchError, r as BackendTransportError } from "./errors-AzSuGI23.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { I as armDeadlineTimer, c as errorMessage, f as isAsyncIterable } from "./util-C_cdPNC4.js";
|
|
4
|
+
import { ct as canonicalStreamEventFromSandboxEvent, mt as createSandboxUsageLedger, n as runtimeFailureCause, nt as mapSandboxEvent, rt as mapSandboxToolEvent, st as terminalTextFromSandboxEvent, tt as createSandboxToolPartState } from "./failure-cause-BzjUUsRz.js";
|
|
5
|
+
import { C as createExecutor, S as captureReusableExecutorConfig, _ as withDriverExecutor, an as projectSandboxOutcome, b as createExecutorRegistry, n as createSupervisor, on as readSandboxOutcome, v as InMemoryResultBlobStore, y as InMemorySpawnJournal } from "./supervisor-jXN2xXiU.js";
|
|
5
6
|
import { c as profileModelExecutionSettings, g as observedModelMatchesDeclared, i as concreteModelId, l as profileProviderModel, o as enforceTokenLimits, s as profileBridgeWireModel, t as assertExecutableAgentProfile } from "./model-policy-JOcg3NRs.js";
|
|
7
|
+
import { R as sha256Bytes$1 } from "./workspace-streams-uB9rRbms.js";
|
|
6
8
|
import { agentProfileSchema, canonicalAgentProfileDigest, canonicalCandidateDigest, renderInputPartsAsText } from "@tangle-network/agent-interface";
|
|
7
9
|
import { costForTokenPricing, makeProposalFinding, scoreKnowledgeReadiness } from "@tangle-network/agent-eval";
|
|
8
10
|
import { createAgentRunOutcomeTracker } from "@tangle-network/sandbox/runtime";
|
|
@@ -3068,4 +3070,4 @@ function structuralRollout(config = {}) {
|
|
|
3068
3070
|
}
|
|
3069
3071
|
export { defaultAnalystInstruction as A, InMemoryRuntimeSessionStore as B, optimizerMethod as C, runAgentic as D, refine as E, collectAgentTurn as F, nowIso as H, streamAgentTurn as I, createIterableBackend as L, renderReport as M, profileChatClient as N, sample as O, profileOptimizerModelCall as P, createSandboxPromptBackend as R, strategyAuthorSystemPrompt as S, depthStrategy as T, startOrResumeRuntimeSession as U, newRuntimeSession as V, touchSession as W, defineStrategy as _, defaultStructuralRolloutPolicy as a, sampleThenRefine as b, officialChecksFromMeta as c, selectBestIndex as d, structuralRollout as f, authorStrategy as g, assertStrategyContract as h, defaultExtractCandidate as i, observe as j, ObservationError as k, resolveEntrySymbol as l, adaptiveRefine as m, compareCheckOutcomes as n, filterAuthoredAsserts as o, visibleCheckScore as p, composeCheckSources as r, modelAuthoredChecks as s, canDisplace as t, sandboxCheckRunner as u, loadAuthoredStrategy as v, breadthStrategy as w, strategyAuthorContract as x, requestStrategySource as y, normalizeBackendStreamEvent as z };
|
|
3070
3072
|
|
|
3071
|
-
//# sourceMappingURL=structural-rollout-
|
|
3073
|
+
//# sourceMappingURL=structural-rollout-BwyAIuww.js.map
|