pi-fabric 0.109.0 → 0.109.2
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/dist/agents/result.d.ts.map +1 -1
- package/dist/agents/result.js +1 -1
- package/dist/agents.js +1 -1
- package/dist/chunks/{chunk-THRQMRC3.js → chunk-3DUKKQHN.js} +2 -2
- package/dist/chunks/{chunk-SZCQA7FY.js → chunk-7AU3PYGA.js} +1 -1
- package/dist/chunks/{chunk-JO3EEBTY.js → chunk-DV2JZSCI.js} +5 -1
- package/dist/chunks/chunk-DV2JZSCI.js.map +7 -0
- package/dist/chunks/{chunk-2W2DTC45.js → chunk-FRPNQZV2.js} +1 -1
- package/dist/chunks/{chunk-PHXSUD52.js → chunk-LEDY5G2V.js} +1 -1
- package/dist/chunks/{chunk-3QECYQGA.js → chunk-VYQV5JRT.js} +13 -1
- package/dist/chunks/chunk-VYQV5JRT.js.map +7 -0
- package/dist/chunks/{chunk-DD3B7UU6.js → chunk-X3CHSIL2.js} +2 -2
- package/dist/durable/worker.js +31 -2
- package/dist/durable/worker.js.map +4 -4
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/extension-bootstrap.d.ts +1 -1
- package/dist/extension-bootstrap.js +1 -1
- package/dist/fabric-runtime-state.js +32 -9
- package/dist/fabric-runtime-state.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/jev.js +1 -1
- package/dist/providers/jev-provider.js +1 -1
- package/dist/providers/pi-native-mcp.d.ts.map +1 -1
- package/dist/residency/host.js +2 -2
- package/dist/residency/pi-entry.js +2 -2
- package/dist/runtime/node-process-runtime.js +2 -2
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +2 -1
- package/dist/runtime/typescript-kernel.js +2 -2
- package/dist/worker/result.js +12 -0
- package/dist/worker/result.js.map +2 -2
- package/docs/codemode-parity.md +1 -1
- package/docs/durable-pi.md +10 -0
- package/docs/speculation.md +1 -1
- package/package.json +3 -2
- package/dist/chunks/chunk-3QECYQGA.js.map +0 -7
- package/dist/chunks/chunk-JO3EEBTY.js.map +0 -7
- /package/dist/chunks/{chunk-THRQMRC3.js.map → chunk-3DUKKQHN.js.map} +0 -0
- /package/dist/chunks/{chunk-SZCQA7FY.js.map → chunk-7AU3PYGA.js.map} +0 -0
- /package/dist/chunks/{chunk-2W2DTC45.js.map → chunk-FRPNQZV2.js.map} +0 -0
- /package/dist/chunks/{chunk-PHXSUD52.js.map → chunk-LEDY5G2V.js.map} +0 -0
- /package/dist/chunks/{chunk-DD3B7UU6.js.map → chunk-X3CHSIL2.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/agents/result.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,OAqBnD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/agents/result.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,OAqBnD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAsC/J"}
|
package/dist/agents/result.js
CHANGED
package/dist/agents.js
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
createGuestStackMap,
|
|
3
3
|
guestSetupSource,
|
|
4
4
|
remapGuestErrorText
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DV2JZSCI.js";
|
|
6
6
|
import {
|
|
7
7
|
transpileFabricCodeWithSourceMap
|
|
8
8
|
} from "./chunk-P4KH4S4S.js";
|
|
@@ -402,4 +402,4 @@ export {
|
|
|
402
402
|
NodeProcessRuntime,
|
|
403
403
|
BunProcessRuntime
|
|
404
404
|
};
|
|
405
|
-
//# sourceMappingURL=chunk-
|
|
405
|
+
//# sourceMappingURL=chunk-3DUKKQHN.js.map
|
|
@@ -14,6 +14,9 @@ import {
|
|
|
14
14
|
runAbortable,
|
|
15
15
|
settleWithin
|
|
16
16
|
} from "./chunk-7TB7NXSL.js";
|
|
17
|
+
import {
|
|
18
|
+
PI_CORE_TOOL_NAMES
|
|
19
|
+
} from "./chunk-YU62DDKK.js";
|
|
17
20
|
|
|
18
21
|
// src/runtime/quickjs-runtime.ts
|
|
19
22
|
import releaseSyncVariant from "@jitl/quickjs-singlefile-mjs-release-sync";
|
|
@@ -425,6 +428,7 @@ globalThis.pi = new Proxy({}, {
|
|
|
425
428
|
};
|
|
426
429
|
},
|
|
427
430
|
});
|
|
431
|
+
const __piToolNames = ${JSON.stringify(PI_CORE_TOOL_NAMES)};
|
|
428
432
|
const __piStrings = (typeof globalThis["\u03C0"] === "object" && globalThis["\u03C0"] !== null) ? globalThis["\u03C0"] : {};
|
|
429
433
|
globalThis["\u03C0"] = new Proxy(__piStrings, {
|
|
430
434
|
get(target, property) {
|
|
@@ -1357,4 +1361,4 @@ export {
|
|
|
1357
1361
|
GUEST_SETUP,
|
|
1358
1362
|
QuickJsRuntime
|
|
1359
1363
|
};
|
|
1360
|
-
//# sourceMappingURL=chunk-
|
|
1364
|
+
//# sourceMappingURL=chunk-DV2JZSCI.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/runtime/quickjs-runtime.ts", "../../src/runtime/guest-stack-map.ts", "../../src/runtime/native-codemode-guest.ts"],
|
|
4
|
+
"sourcesContent": ["import releaseSyncVariant from \"@jitl/quickjs-singlefile-mjs-release-sync\";\nimport { newQuickJSWASMModuleFromVariant } from \"quickjs-emscripten-core\";\nimport ts from \"typescript\";\nimport { runAbortable, settleWithin } from \"../async-settlement.js\";\nimport { piBashExitMetadata } from \"../core/pi-bash-error.js\";\nimport { PI_ARGUMENT_NORMALIZATION_SOURCE } from \"../core/pi-arguments.js\";\nimport { PI_CORE_TOOL_NAMES } from \"../core/pi-tools.js\";\nimport { HumanWaitDeadlinePause } from \"./deadline-pause.js\";\nimport { createGuestStackMap, remapGuestErrorText } from \"./guest-stack-map.js\";\nimport { transpileFabricCodeWithSourceMap } from \"./type-checker.js\";\n\nimport type {\n FabricHostCall,\n FabricSandboxOptions,\n FabricSandboxResult,\n FabricSandboxTerminationReason,\n} from \"./kernel.js\";\n// Preserve existing import paths for runtime consumers.\nexport type {\n FabricHostCall,\n FabricSandboxOptions,\n FabricSandboxResult,\n FabricSandboxTerminationReason,\n} from \"./kernel.js\";\n\ntype QuickJsModule = Awaited<ReturnType<typeof newQuickJSWASMModuleFromVariant>>;\n\nlet quickJsModulePromise: Promise<QuickJsModule> | undefined;\n\n// Static \u03C0.<identifier> references (bracket access like \u03C0[k] is not provable).\n// Parse instead of scanning text so examples inside strings and comments do not\n// become false missing-payload failures.\nconst referencedPiKeys = (code: string): string[] => {\n const source = ts.createSourceFile(\n \"fabric-exec.ts\",\n `async function __fabricProgram() {\\n${code}\\n}`,\n ts.ScriptTarget.Latest,\n false,\n ts.ScriptKind.TS,\n );\n const keys: string[] = [];\n const visit = (node: ts.Node): void => {\n if (\n ts.isPropertyAccessExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === \"\u03C0\" &&\n !keys.includes(node.name.text)\n ) {\n keys.push(node.name.text);\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n return keys;\n};\n\n// Models routinely reference \u03C0.<key> without providing the payloads parameter,\n// and the runtime error only lands after a full execution round trip (#68).\n// Reject up front when a referenced key is statically provable missing, before\n// QuickJS is even loaded.\nconst missingStringsKeys = (\n code: string,\n strings: Record<string, string> | undefined,\n): string[] => {\n const provided = strings ?? {};\n return referencedPiKeys(code).filter((key) => !(key in provided));\n};\n\nconst quickJsModule = (): Promise<QuickJsModule> => {\n quickJsModulePromise ??= newQuickJSWASMModuleFromVariant(releaseSyncVariant);\n return quickJsModulePromise;\n};\n\nexport const guestSetupSource = (fields?: Record<string, string[]>, nativeStoreEnabled = false, profile = \"additive\", nativeToolsEnabled = false): string =>\n `const __piCanonicalFields = ${JSON.stringify(fields ?? {})}; const __nativeStoreEnabled = ${nativeStoreEnabled}; const __nativeProfile = ${profile === \"native\"}; const __nativeToolsEnabled = ${nativeToolsEnabled};\\n${GUEST_SETUP}`;\n\nimport { NATIVE_CODEMODE_GUEST } from \"./native-codemode-guest.js\";\n\nexport const GUEST_SETUP = `\n(() => {\nconst __fabricBridge = globalThis.__fabricHostCall;\ndelete globalThis.__fabricHostCall;\nconst __successfulCalls = [];\nconst __resolvedCallRef = (ref, args) =>\n ref === \"fabric.$call\" && args && typeof args.ref === \"string\" ? args.ref : ref;\nconst __recordSuccessfulCall = (ref, args) => {\n __successfulCalls.push(Object.freeze({ ref: __resolvedCallRef(ref, args) }));\n};\nconst __handoffFacts = () => {\n const calls = Object.freeze(__successfulCalls.slice());\n const count = (ref) => {\n if (ref === undefined) return calls.length;\n const refs = new Set(Array.isArray(ref) ? ref : [ref]);\n return calls.reduce((total, call) => total + (refs.has(call.ref) ? 1 : 0), 0);\n };\n return Object.freeze({ calls, count });\n};\nconst __call = async (ref, args) => {\n const normalizedArgs = args ?? {};\n const value = await __fabricBridge(ref, normalizedArgs);\n __recordSuccessfulCall(ref, normalizedArgs);\n return value;\n};\nconst __toolsBase = {\n providers: () => __call(\"fabric.$providers\", {}),\n catalog: (args = {}) => __call(\"fabric.$catalog\", args),\n list: (args = {}) => __call(\"fabric.$list\", args),\n search: (args) => __call(\n \"fabric.$search\",\n typeof args === \"string\" ? { query: args } : args,\n ),\n describe: (args) => __call(\"fabric.$describe\", args),\n call: (args) => __call(\"fabric.$call\", args),\n progress: (args) => __call(\"fabric.$progress\", args),\n models: () => __call(\"fabric.$models\", {}),\n};\n${NATIVE_CODEMODE_GUEST}\nconst __nativeToolNames = new Set();\nlet __nativeCatalogReady = false;\nglobalThis.nativeTools = new Proxy(Object.create(null), {\n get(_target, property) {\n if (typeof property === \"symbol\" || (__nativeCatalogReady ? !__nativeToolNames.has(property) : property === \"then\")) return undefined;\n return args => __call(\"fabric.$nativeTool\", { name: String(property), args: args === undefined ? {} : args });\n },\n ownKeys() { return [...__nativeToolNames]; },\n getOwnPropertyDescriptor(_target, property) { return __nativeToolNames.has(property) ? {enumerable:true, configurable:true} : undefined; },\n set() { return true; },\n deleteProperty() { return true; },\n});\nconst __fabricTools = new Proxy(__toolsBase, {\n get(target, property) {\n if (property === \"then\" || typeof property === \"symbol\") return undefined;\n return Object.prototype.hasOwnProperty.call(target, property) ? target[property] : globalThis.nativeTools[property];\n },\n set() { return true; },\n deleteProperty() { return true; },\n});\nglobalThis.fabric = Object.freeze({ tools: __fabricTools });\nglobalThis.tools = typeof __nativeProfile !== \"undefined\" && __nativeProfile ? globalThis.nativeTools : __fabricTools;\nconst __piStringFields = { bash: \"command\", powershell: \"command\", read: \"path\", ls: \"path\", grep: \"pattern\", find: \"pattern\" };\n// Object aliases and coercions are shared with host preparation in core/pi-arguments.ts.\n\n// Multi-arg positional order, used only when a call passes >= 2 args and the\n// (primary, options) merge in __positionalToArgs does not apply. One-field\n// tools (read/bash/ls) stay absent: their two-arg form is a bare string plus\n// an options object, repaired by the merge instead of a wrong-arity (2554)\n// type error; only a non-object second arg still fails 2554.\nconst __piPositionalFields = {\n grep: [\"pattern\", \"path\", \"limit\"],\n find: [\"pattern\", \"path\", \"limit\"],\n write: [\"path\", \"content\"],\n edit: [\"path\", \"oldText\", \"newText\"],\n};\n\n// (primary, options) two-arg merge for the string-primary tools:\n// pi.read(\"index.ts\", { limit: 120 }) becomes { path: \"index.ts\", limit: 120 }.\n// A plain-object second arg is never a valid positional value for these tools\n// (grep/find take (pattern, path, limit) strings/numbers), so merging is\n// unambiguous; the positional string wins the primary field on conflict. The\n// merged object flows through the same alias, unit, and numeric normalization\n// in __normalizePiArgs as any other options object.\nconst __positionalToArgs = (name, rest) => {\n const first = rest[0];\n const second = rest[1];\n const primaryField = __piStringFields[name];\n if (\n rest.length === 2 &&\n typeof first === \"string\" &&\n primaryField !== undefined &&\n second !== null && typeof second === \"object\" && !Array.isArray(second)\n ) {\n const merged = { ...second };\n merged[primaryField] = first;\n return merged;\n }\n const order = __piPositionalFields[name];\n if (!order) return rest.length > 0 ? first : {};\n const out = {};\n for (let i = 0; i < rest.length && i < order.length; i++) {\n const v = rest[i];\n if (v !== undefined) out[order[i]] = v;\n }\n return out;\n};\n${PI_ARGUMENT_NORMALIZATION_SOURCE}\n// shell/edit/write resolve envelope objects { ok, output, details }, and the\n// type-checker deliberately suppresses property-miss (2339) diagnostics, so\n// result.trim() on an envelope typechecks and then dies with QuickJS's terse\n// \"not a function\" \u2014 an error models cannot localize (observed: misdirected\n// debugging spirals probing unrelated globals). Guard envelopes with a proxy\n// that throws an actionable TypeError for string-method access and iteration,\n// naming the tool and the .output fix. Ordinary reads (ok/output/details/\n// exitCode/error), destructuring, 'in' checks, and JSON marshaling pass through.\nconst __piEnvelopeTools = { bash: true, powershell: true, edit: true, write: true };\nconst __piEnvelopeStringTraps = new Set([\n \"anchor\", \"at\", \"big\", \"blink\", \"bold\", \"charAt\", \"charCodeAt\", \"codePointAt\",\n \"concat\", \"endsWith\", \"fixed\", \"fontcolor\", \"fontsize\", \"includes\", \"indexOf\",\n \"italics\", \"lastIndexOf\", \"length\", \"link\", \"localeCompare\", \"match\", \"matchAll\",\n \"normalize\", \"padEnd\", \"padStart\", \"repeat\", \"replace\", \"replaceAll\", \"search\",\n \"slice\", \"small\", \"split\", \"startsWith\", \"strike\", \"sub\", \"substr\", \"substring\",\n \"sup\", \"toLocaleLowerCase\", \"toLocaleUpperCase\", \"toLowerCase\", \"toUpperCase\",\n \"trim\", \"trimEnd\", \"trimStart\",\n]);\nconst __piEnvelopeGuard = (name, value) => {\n if (value === null || typeof value !== \"object\" || typeof value.ok !== \"boolean\") return value;\n return new Proxy(value, {\n get(target, property, receiver) {\n if (property === Symbol.iterator || property === Symbol.asyncIterator) {\n throw new TypeError(\n \"pi.\" + name + \"(...) resolves an envelope { ok, output, details }, which is not iterable. \" +\n \"Iterate the text instead: (await pi.\" + name + \"(...)).output.split('\\\\\\\\n')\"\n );\n }\n if (typeof property === \"string\" && __piEnvelopeStringTraps.has(property)) {\n throw new TypeError(\n \"pi.\" + name + \"(...) resolves an envelope { ok, output, details }, not a string, so .\" + property +\n \" is unavailable on it. Read the text first: const out = (await pi.\" + name + \"(...)).output; then out.\" + property +\n \"(...). Shell commands reject on a nonzero exit \u2014 pass settle: true to receive an ok:false envelope instead.\"\n );\n }\n return Reflect.get(target, property, receiver);\n },\n });\n};\n// The pi proxy accepts: a bare string (primary field), an options object, a\n// (primary, options) two-arg merge for the string-primary tools, or a\n// positional spread mapped by __piPositionalFields. 0/1 args preserve the\n// legacy (args = {}) default so existing programs are unchanged.\nglobalThis.pi = new Proxy({}, {\n get(_target, property) {\n if (property === \"then\") return undefined;\n const name = String(property);\n return (...rest) => {\n let args;\n if (rest.length <= 1) {\n const first = rest.length === 1 ? rest[0] : undefined;\n args = first === undefined ? {} : first;\n } else {\n args = __positionalToArgs(name, rest);\n }\n // Shell tools reject on an ordinary nonzero exit; settle:true returns\n // {ok:false, exitCode, ...} instead (opt-in). Other failures still reject.\n const settle = (name === \"bash\" || name === \"powershell\") &&\n typeof args === \"object\" && args !== null && args.settle === true;\n const call = __call(\"pi.\" + name, __normalizePiArgs(name, args, typeof __piCanonicalFields === \"undefined\" ? undefined : __piCanonicalFields[name]));\n const promise = settle ? call.catch((error) => {\n // node-process bridge errors originate in a different VM realm.\n const message = typeof error?.message === \"string\" ? error.message : String(error);\n const exit = error?.__fabricBashExit;\n if (!exit || !Number.isSafeInteger(exit.exitCode) || exit.exitCode <= 0 ||\n typeof exit.output !== \"string\") throw error;\n return {\n ok: false,\n output: exit.output,\n details: null,\n exitCode: exit.exitCode,\n error: message,\n };\n }) : call;\n return __piEnvelopeTools[name] === true\n ? promise.then((value) => __piEnvelopeGuard(name, value))\n : promise;\n };\n },\n});\nconst __piToolNames = ${JSON.stringify(PI_CORE_TOOL_NAMES)};\nconst __piStrings = (typeof globalThis[\"\u03C0\"] === \"object\" && globalThis[\"\u03C0\"] !== null) ? globalThis[\"\u03C0\"] : {};\nglobalThis[\"\u03C0\"] = new Proxy(__piStrings, {\n get(target, property) {\n if (typeof property === \"symbol\") return undefined;\n const name = String(property);\n if (name === \"then\" || name === \"toJSON\" || name === \"constructor\") return undefined;\n if (Object.prototype.hasOwnProperty.call(target, name)) return target[name];\n if (__piToolNames.indexOf(name) >= 0) {\n throw new Error(\n \"\u03C0.\" + name + \" is the strings accessor, not a tool. For the Pi core tool, call pi.\" + name + \"(args).\"\n );\n }\n const provided = Object.keys(target);\n throw new Error(\n \"\u03C0.\" + name + \" is not defined. \u03C0 only exposes keys from the fabric_exec payloads parameter\" +\n (provided.length ? \" (provided: \" + provided.join(\", \") + \")\" : \" (none provided)\") +\n \". Pass payloads: { \" + name + \": '...' } to use \u03C0.\" + name + \".\" +\n \" For large or quote-heavy content, keep it in top-level payloads and reference \u03C0.\" + name + \" instead of escaping it inside code.\"\n );\n },\n ownKeys(target) { return Reflect.ownKeys(target); },\n getOwnPropertyDescriptor(target, prop) { return Reflect.getOwnPropertyDescriptor(target, prop); },\n has(target, prop) { return Object.prototype.hasOwnProperty.call(target, prop); }\n});\n// Stable providers share a lazy dispatch proxy; the guest declarations keep\n// their known actions typed while the registry remains the runtime authority.\n// extensions' per-tool surface is additionally rendered from the captured\n// catalog by guestTypeDeclarations (runtime/dynamic-guest-types.ts).\nconst __memorySelectionKeys = [\n \"indices\",\n \"entryIds\",\n \"operationAddresses\",\n \"entryRange\",\n \"index\",\n \"entry_ids\",\n \"operation_addresses\",\n \"entry_range\",\n];\nconst __hasMemorySelection = (args) => __memorySelectionKeys.some((key) => {\n const value = args[key];\n if (Array.isArray(value)) return value.length > 0;\n return value !== undefined && value !== null;\n});\nconst __memoryWalk = async (args, visitor) => {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new TypeError(\"memory.walk expects an expansion options object\");\n }\n if (typeof visitor !== \"function\") {\n throw new TypeError(\"memory.walk expects a visitor function as its second argument\");\n }\n\n let request = { ...args };\n if (Number(request.textOffset ?? request.text_offset ?? 0) !== 0) {\n throw new TypeError(\"memory.walk must start at text offset 0 to yield complete entries\");\n }\n if (!__hasMemorySelection(request)) {\n if (request.entryOffset !== undefined || request.entry_offset !== undefined ||\n request.textOffset !== undefined || request.text_offset !== undefined) {\n throw new TypeError(\"memory.walk continuation offsets require an explicit selection\");\n }\n if (Number(request.before ?? 0) > 0 || Number(request.after ?? 0) > 0) {\n throw new TypeError(\"memory.walk before/after requires an explicit selection\");\n }\n const head = await __call(\"memory.expand\", request);\n if (!head || typeof head !== \"object\") {\n throw new Error(\"memory.expand returned an invalid metadata response\");\n }\n if (head.error) return { visited: 0, stopped: false, error: head.error };\n if (!Number.isSafeInteger(head.entryCount) || head.entryCount < 0) {\n throw new Error(\"memory.expand metadata omitted a valid entryCount\");\n }\n if (head.entryCount === 0) return { visited: 0, stopped: false };\n request = {\n ...request,\n session: head.session ?? request.session,\n expectedSourceHash: head.sourceHash,\n expectedLineageFingerprint: head.lineageFingerprint,\n branches: head.branches,\n entryRange: { first: 0, last: head.entryCount - 1 },\n };\n }\n\n let visited = 0;\n let pending = null;\n let pendingStart = 0;\n let pendingEnd = 0;\n let pendingTotal = 0;\n const seen = new Set([JSON.stringify({ ref: \"memory.expand\", args: request })]);\n let page = await __call(\"memory.expand\", request);\n\n while (true) {\n if (!page || typeof page !== \"object\") {\n throw new Error(\"memory.expand returned an invalid page\");\n }\n if (page.error) return { visited, stopped: false, error: page.error };\n if (!Array.isArray(page.entries)) {\n throw new Error(\"memory.expand page omitted entries\");\n }\n\n for (const chunk of page.entries) {\n if (!chunk || typeof chunk !== \"object\" || typeof chunk.text !== \"string\") {\n throw new Error(\"memory.expand returned an invalid entry chunk\");\n }\n const range = chunk.textRange;\n if (!range || typeof range !== \"object\" ||\n !Number.isSafeInteger(range.start) || !Number.isSafeInteger(range.end) ||\n !Number.isSafeInteger(range.total) || range.start < 0 ||\n range.end < range.start || range.total < range.end) {\n throw new Error(\"memory.expand returned an invalid textRange\");\n }\n if (chunk.text.length !== range.end - range.start) {\n throw new Error(\"memory.expand entry chunk disagrees with textRange\");\n }\n\n if (pending === null) {\n pending = { ...chunk, text: \"\" };\n pendingStart = range.start;\n pendingEnd = range.start;\n pendingTotal = range.total;\n } else if (pending.index !== chunk.index) {\n throw new Error(\"memory.expand advanced before completing an entry\");\n }\n if (range.start !== pendingEnd || range.total !== pendingTotal) {\n throw new Error(\"memory.expand returned discontinuous entry chunks\");\n }\n for (const key of Object.keys(chunk)) {\n if (pending[key] === undefined) pending[key] = chunk[key];\n }\n pending.text += chunk.text;\n pendingEnd = range.end;\n\n if (range.complete) {\n pending.textRange = {\n start: pendingStart,\n end: pendingEnd,\n total: pendingTotal,\n complete: true,\n };\n const entry = pending;\n pending = null;\n const keepGoing = await visitor(entry, visited);\n visited += 1;\n if (keepGoing === false) return { visited, stopped: true };\n }\n }\n\n if (page.next === null || page.next === undefined) {\n if (pending !== null) {\n throw new Error(\"memory.expand ended before completing an entry\");\n }\n return { visited, stopped: false };\n }\n if (page.next.ref !== \"memory.expand\" || !page.next.args ||\n typeof page.next.args !== \"object\" || Array.isArray(page.next.args)) {\n throw new Error(\"memory.expand returned an invalid continuation\");\n }\n const continuationKey = JSON.stringify(page.next);\n if (seen.has(continuationKey)) {\n throw new Error(\"memory.expand returned a cyclic continuation\");\n }\n seen.add(continuationKey);\n page = await __call(page.next.ref, page.next.args);\n }\n};\n\nconst __providerProxy = (provider, local = {}) => new Proxy(local, {\n get(target, property) {\n if (property === \"then\" || typeof property === \"symbol\") return undefined;\n if (Object.prototype.hasOwnProperty.call(target, property)) return target[property];\n return (args = {}) => __call(provider + \".\" + String(property), args);\n },\n});\nglobalThis.extensions = __providerProxy(\"extensions\");\nglobalThis.memory = __providerProxy(\"memory\", { walk: __memoryWalk });\nglobalThis.state = __providerProxy(\"state\");\nglobalThis.schema = __providerProxy(\"schema\");\nglobalThis.components = __providerProxy(\"components\");\nglobalThis.compact = __providerProxy(\"compact\");\nglobalThis.cache = __providerProxy(\"cache\");\nglobalThis.thinking = __providerProxy(\"thinking\");\nglobalThis.decisions = __providerProxy(\"decisions\");\nglobalThis.programs = __providerProxy(\"programs\");\nglobalThis.prewalk = __providerProxy(\"prewalk\");\nglobalThis.jev = __providerProxy(\"jev\");\nconst __createActor = async (args = {}) => {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new TypeError(\"agents.create expects an options object\");\n }\n const request = { ...args };\n const validWhile = request.validWhile;\n if (validWhile !== undefined) {\n if (typeof validWhile !== \"function\") {\n throw new TypeError(\"agents.create validWhile must be a pure predicate function\");\n }\n const source = Function.prototype.toString.call(validWhile);\n if (source.trimStart().startsWith(\"async\")) {\n throw new TypeError(\"agents.create validWhile must be synchronous\");\n }\n request.validWhile = { version: 1, source };\n }\n return __call(\"agents.create\", request);\n};\nconst __handoff = async (args = {}) => {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new TypeError(\"agents.handoff expects an options object\");\n }\n const request = { ...args };\n const when = request.when;\n delete request.when;\n if (when !== undefined) {\n if (typeof when !== \"function\") {\n throw new TypeError(\"agents.handoff when must be a pure predicate function\");\n }\n const decision = when(__handoffFacts());\n if (decision && typeof decision.then === \"function\") {\n throw new TypeError(\"agents.handoff when must return a boolean synchronously\");\n }\n if (decision !== true) {\n throw new Error(\"agents.handoff predicate returned false; no agent was started\");\n }\n }\n return __call(\"agents.handoff\", request);\n};\nglobalThis.agents = Object.freeze({\n run: (args) => __call(\"agents.run\", args),\n handoff: __handoff,\n spawn: (args) => __call(\"agents.spawn\", args),\n wait: (args) => __call(\"agents.wait\", args),\n join: (args) => __call(\"agents.join\", args),\n status: (args) => __call(\"agents.status\", args),\n list: (args = {}) => __call(\"agents.list\", args),\n members: (args = {}) => __call(\"agents.members\", args),\n self: () => __call(\"agents.self\", {}),\n main: () => __call(\"agents.main\", {}),\n sessions: () => __call(\"agents.sessions\", {}),\n peers: () => __call(\"agents.peers\", {}),\n subscribe: (args) => __call(\"agents.subscribe\", args),\n subscriptions: (args = {}) => __call(\"agents.subscriptions\", args),\n unsubscribe: (args) => __call(\"agents.unsubscribe\", args),\n models: (args = {}) => __call(\"agents.models\", args),\n stop: (args) => __call(\"agents.stop\", args),\n cleanup: (args) => __call(\"agents.cleanup\", args),\n create: __createActor,\n ask: (args) => __call(\"agents.ask\", args),\n tell: (args) => __call(\"agents.tell\", args),\n steer: (args) => __call(\"agents.steer\", args),\n followUp: (args) => __call(\"agents.followUp\", args),\n setSteeringMode: (args) => __call(\"agents.setSteeringMode\", args),\n setFollowUpMode: (args) => __call(\"agents.setFollowUpMode\", args),\n compact: (args) => __call(\"agents.compact\", args),\n actorStatus: (args) => __call(\"agents.actorStatus\", args),\n setModel: (args) => __call(\"agents.setModel\", args),\n switchModel: (args) => __call(\"agents.switchModel\", args),\n setThinking: (args) => __call(\"agents.setThinking\", args),\n setTools: (args) => __call(\"agents.setTools\", args),\n setEvents: (args) => __call(\"agents.setEvents\", args),\n setDeliveryPolicy: (args) => __call(\"agents.setDeliveryPolicy\", args),\n clearMessages: (args) => __call(\"agents.clearMessages\", args),\n setInstructions: (args) => __call(\"agents.setInstructions\", args),\n actors: () => __call(\"agents.actors\", {}),\n messages: (args) => __call(\"agents.messages\", args),\n remove: (args) => __call(\"agents.remove\", args),\n // Keyword keys for the actor-template routes, spelled as the provider,\n // audit projection, and docs already spell them.\n \"import\": (args) => __call(\"agents.import\", args),\n \"export\": (args) => __call(\"agents.export\", args),\n log: (args) => __call(\"agents.log\", args),\n});\nglobalThis.mesh = Object.freeze({\n self: () => __call(\"mesh.self\", {}),\n publish: (args) => __call(\"mesh.publish\", args),\n read: (args = {}) => __call(\"mesh.read\", args),\n members: (args = {}) => __call(\"mesh.members\", args),\n get: (args) => __call(\"mesh.get\", args),\n list: (args = {}) => __call(\"mesh.list\", args),\n put: (args) => __call(\"mesh.put\", args),\n delete: (args) => __call(\"mesh.delete\", args),\n scheduled: (args = {}) => __call(\"mesh.scheduled\", args),\n unschedule: (args) => __call(\"mesh.unschedule\", args),\n grant: (args) => __call(\"mesh.grant\", args),\n revoke: (args) => __call(\"mesh.revoke\", args),\n grants: () => __call(\"mesh.grants\", {}),\n});\n// The mcp proxy itself stays schema-less \u2014 the registry validates args at\n// dispatch \u2014 but guestTypeDeclarations renders per-server argument types from\n// the live descriptor cache (runtime/dynamic-guest-types.ts), so known tools\n// fail type-check on argument-shape mistakes before this proxy ever runs.\nglobalThis.mcp = new Proxy({}, {\n get(_target, server) {\n if (server === \"then\") return undefined;\n if (server === \"servers\") return () => __call(\"mcp.$servers\", {});\n if (server === \"reload\") return () => __call(\"mcp.$reload\", {});\n if (server === \"register\") return (args) => __call(\"mcp.$register\", args);\n if (server === \"call\") return (args) => __call(\"mcp.$call\", args);\n return new Proxy({}, {\n get(_serverTarget, tool) {\n if (tool === \"then\") return undefined;\n return (args = {}) => __call(\"mcp.\" + String(server) + \".\" + String(tool), args);\n },\n });\n },\n});\nlet __workflowSpentTokens = 0;\nconst __workflowBudgetTotal = Number.isFinite(globalThis.__fabricTokenBudget)\n ? Math.max(0, globalThis.__fabricTokenBudget)\n : Number.POSITIVE_INFINITY;\nconst __recordAgentUsage = (result) => {\n const usage = result && result.usage;\n if (usage) __workflowSpentTokens += Number(usage.input || 0) + Number(usage.output || 0);\n return result;\n};\nconst __workflowAgent = async (prompt, options = {}) => {\n if (__workflowSpentTokens >= __workflowBudgetTotal) {\n throw new Error(\"Fabric workflow token budget exhausted\");\n }\n const { label, ...agentOptions } = options;\n const workerName = String(label || agentOptions.name || \"Fabric workflow agent\");\n const result = __recordAgentUsage(await agents.run({\n ...agentOptions,\n ...(label && !agentOptions.name ? { name: label } : {}),\n task: prompt,\n }));\n if (!result || result.status !== \"completed\") {\n const reason = result && result.error ? result.error : \"agent did not complete\";\n throw new Error(workerName + \" failed: \" + reason);\n }\n return result.value !== undefined ? result.value : result.text;\n};\n// Budget-aware agents.run used by council.run and rlm.query so their usage is\n// counted in budget.spent() and the tokenBudget guard can preempt them, just\n// like workflow.agent(). Without this, councils bypass the budget entirely.\nconst __budgetedRun = async (args) => {\n if (__workflowSpentTokens >= __workflowBudgetTotal) {\n throw new Error(\"Fabric workflow token budget exhausted\");\n }\n return __recordAgentUsage(await agents.run(args));\n};\nlet __nextWorkflowSpanId = 0;\nconst __workflowSpanMetadata = (kind, items, options, stageCount) => {\n const itemCount = Array.isArray(items) ? items.length : undefined;\n let concurrency;\n if (kind === \"parallel\" && itemCount !== undefined) {\n if (itemCount === 0) concurrency = 0;\n else {\n const concurrencyOpt = typeof options === \"number\" ? { concurrency: options } : options ?? {};\n const requested = Number(concurrencyOpt.concurrency ?? itemCount);\n if (Number.isFinite(requested) && requested >= 1) {\n concurrency = Math.max(1, Math.min(itemCount, Math.floor(requested)));\n }\n }\n }\n return {\n kind,\n ...(itemCount !== undefined ? { itemCount } : {}),\n ...(stageCount !== undefined ? { stageCount } : {}),\n ...(concurrency !== undefined ? { concurrency } : {}),\n };\n};\nconst __withWorkflowSpan = async (metadata, body) => {\n const id = \"span-\" + __nextWorkflowSpanId++;\n await __call(\"fabric.$spanStart\", { id, ...metadata });\n try {\n const value = await body();\n await __call(\"fabric.$spanEnd\", { id, outcome: \"succeeded\" });\n return value;\n } catch (error) {\n try { await __call(\"fabric.$spanEnd\", { id, outcome: \"failed\" }); } catch { /* preserve the workflow error */ }\n throw error;\n }\n};\nconst __runParallel = async (thunks, options) => {\n if (!Array.isArray(thunks) || thunks.some((thunk) => typeof thunk !== \"function\")) {\n throw new TypeError(\"workflow.parallel expects an array of functions or (items, mapper)\");\n }\n if (thunks.length === 0) return [];\n const concurrencyOpt = typeof options === \"number\" ? { concurrency: options } : options ?? {};\n const requestedConcurrency = Number(concurrencyOpt.concurrency ?? thunks.length);\n if (!Number.isFinite(requestedConcurrency) || requestedConcurrency < 1) {\n throw new RangeError(\"workflow.parallel concurrency must be a positive finite number\");\n }\n const concurrency = Math.max(1, Math.min(thunks.length || 1, Math.floor(requestedConcurrency)));\n const results = new Array(thunks.length);\n let cursor = 0;\n await Promise.all(Array.from({ length: concurrency }, async () => {\n while (cursor < thunks.length) {\n const index = cursor++;\n results[index] = await thunks[index]();\n }\n }));\n return results;\n};\nconst __workflowParallel = async (items, arg2, arg3) => {\n const options = typeof arg2 === \"function\" ? arg3 : arg2;\n return __withWorkflowSpan(\n __workflowSpanMetadata(\"parallel\", items, options),\n async () => {\n if (typeof arg2 === \"function\") {\n if (!Array.isArray(items)) throw new TypeError(\"workflow.parallel expects an array as the first argument\");\n return __runParallel(items.map((item, index) => () => arg2(item, index)), arg3);\n }\n return __runParallel(items, arg2);\n },\n );\n};\nconst __workflowPipeline = async (items, ...stages) =>\n __withWorkflowSpan(\n __workflowSpanMetadata(\"pipeline\", items, undefined, stages.length),\n async () => {\n if (!Array.isArray(items) || stages.some((stage) => typeof stage !== \"function\")) {\n throw new TypeError(\"workflow.pipeline expects an array followed by stage functions\");\n }\n return __workflowParallel(items.map((original, index) => async () => {\n let value = original;\n for (const stage of stages) value = await stage(value, original, index);\n return value;\n }));\n },\n );\nglobalThis.workflow = Object.freeze({\n agent: __workflowAgent,\n parallel: __workflowParallel,\n pipeline: __workflowPipeline,\n configure: (args) => __call(\"fabric.$configure\", args),\n phase: (nameOrInput, options = {}) => {\n const input =\n nameOrInput && typeof nameOrInput === \"object\" && !Array.isArray(nameOrInput)\n ? { ...nameOrInput }\n : { ...options, name: nameOrInput };\n return __call(\"fabric.$phase\", input);\n },\n item: (args) => __call(\"fabric.$item\", args),\n event: (args) => __call(\"fabric.$event\", args),\n log: (...values) => print(...values),\n budget: Object.freeze({\n total: __workflowBudgetTotal,\n spent: () => __workflowSpentTokens,\n remaining: () => Math.max(0, __workflowBudgetTotal - __workflowSpentTokens),\n }),\n});\nglobalThis.agent = __workflowAgent;\nglobalThis.parallel = __workflowParallel;\nglobalThis.pipeline = __workflowPipeline;\nglobalThis.phase = workflow.phase;\nglobalThis.log = workflow.log;\nglobalThis.budget = workflow.budget;\nglobalThis.rlm = Object.freeze({\n query: (args) => {\n if (args && args.runner && args.runner !== \"pi\" && args.runner !== \"pi-durable\") {\n throw new Error(\"rlm.query requires a Pi runner (pi-durable or pi) for recursive Fabric\");\n }\n return __budgetedRun({ ...args, runner: args?.runner ?? \"pi-durable\", recursive: true });\n },\n});\nglobalThis.council = Object.freeze({\n async run(args) {\n const { task, roles, synthesize = true, ...agentOptions } = args;\n const results = await Promise.all(roles.map((role) => __budgetedRun({\n ...agentOptions,\n name: role,\n task: \"Act as the \" + role + \" council member. Independently analyze this task:\\\\n\\\\n\" + task,\n })));\n if (!synthesize) return results;\n return __budgetedRun({\n ...agentOptions,\n name: \"council-synthesizer\",\n task: \"Synthesize the council's independent reports into one decision. Preserve disagreements and cite which role raised each concern.\\\\n\\\\nTask:\\\\n\" + task + \"\\\\n\\\\nReports:\\\\n\" + JSON.stringify(results),\n });\n },\n});\nglobalThis.console = Object.freeze({ log: print, info: print, warn: print, error: print, debug: print });\nconst __timerCallbacks = new Map();\nlet __nextTimerId = 1;\nglobalThis.setTimeout = (callback, ms = 0) => {\n const id = __nextTimerId++;\n __timerCallbacks.set(id, { callback, interval: false });\n __call(\"fabric.$timer\", { ms }).then(() => {\n const entry = __timerCallbacks.get(id);\n if (!entry) return;\n __timerCallbacks.delete(id);\n try { entry.callback(); } catch { /* swallow timer callback errors */ }\n });\n return id;\n};\nglobalThis.setInterval = (callback, ms = 0) => {\n const id = __nextTimerId++;\n __timerCallbacks.set(id, { callback, interval: true });\n const schedule = () => {\n __call(\"fabric.$timer\", { ms }).then(() => {\n const entry = __timerCallbacks.get(id);\n if (!entry) return;\n try { entry.callback(); } catch { /* swallow timer callback errors */ }\n if (__timerCallbacks.has(id)) schedule();\n });\n };\n schedule();\n return id;\n};\nglobalThis.clearTimeout = (id) => { __timerCallbacks.delete(id); };\nglobalThis.clearInterval = (id) => { __timerCallbacks.delete(id); };\n})();\n`;\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === \"string\") return value;\n if (value instanceof Error) return value.stack ?? value.message;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst jsonText = (value: unknown): string => {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) return \"null\";\n return serialized;\n};\n\nconst jsonHandle = (\n context: any,\n jsonObject: any,\n jsonParse: any,\n value: unknown,\n): any => {\n if (value === undefined) return context.undefined;\n if (value === null) return context.null;\n if (typeof value === \"string\") return context.newString(value);\n if (typeof value === \"boolean\") return value ? context.true : context.false;\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? context.newNumber(value) : context.null;\n }\n const serialized = context.newString(jsonText(value));\n try {\n return context.unwrapResult(context.callFunction(jsonParse, jsonObject, serialized));\n } finally {\n serialized.dispose();\n }\n};\n\nconst HOST_TASK_SETTLE_GRACE_MS = 250;\n\n// The release-sync WASM variant otherwise exhausts the host stack before\n// QuickJS can throw its guest-catchable InternalError.\nconst QUICKJS_MAX_STACK_SIZE_BYTES = 256 * 1024;\nconst QUICKJS_GC_LIST_ASSERTION = \"list_empty(&rt->gc_obj_list)\";\n\n// Preserve an already-computed result for this known Emscripten teardown\n// assertion while allowing every unrelated disposal failure to escape.\nconst disposeQuickJsContext = (context: any): void => {\n try {\n context.dispose();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(QUICKJS_GC_LIST_ASSERTION) && message.includes(\"JS_FreeRuntime\")) return;\n throw error;\n }\n};\n\nexport class QuickJsRuntime {\n async execute(\n code: string,\n hostCall: FabricHostCall,\n options: FabricSandboxOptions,\n ): Promise<FabricSandboxResult> {\n if (options.signal?.aborted) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"aborted\",\n error: \"Execution cancelled\",\n };\n }\n const missingKeys = missingStringsKeys(code, options.strings);\n if (missingKeys.length > 0) {\n const provided = Object.keys(options.strings ?? {});\n return {\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error:\n \"Pre-execution check: \" + missingKeys.map((key) => \"\u03C0.\" + key).join(\", \")\n + (missingKeys.length === 1 ? \" is referenced in code but its key is missing from the payloads parameter\"\n : \" are referenced in code but their keys are missing from the payloads parameter\")\n + (provided.length ? \" (provided: \" + provided.join(\", \") + \")\" : \" (none provided)\")\n + \". Add payloads: { \" + missingKeys.join(\": '...', \") + \": '...' } to the fabric_exec arguments, then reference the value as \u03C0.<key>.\"\n + \" For large or quote-heavy content, keep it in top-level payloads and reference \u03C0.<key> instead of escaping it inside code.\",\n };\n }\n if (!Number.isFinite(options.timeoutMs) || options.timeoutMs < 1) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: \"QuickJS timeout must be positive\",\n };\n }\n if (options.maxLogChars !== undefined && (!Number.isSafeInteger(options.maxLogChars) || options.maxLogChars < 0)) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: \"QuickJS log limit must be a nonnegative safe integer\",\n };\n }\n if (\n !Number.isSafeInteger(options.memoryLimitBytes) ||\n options.memoryLimitBytes < 1 ||\n options.memoryLimitBytes > 0xffff_ffff\n ) {\n return {\n value: undefined,\n logs: [],\n terminationReason: \"runtime_error\",\n error: \"QuickJS memory limit must be an integer between 1 byte and 4294967295 bytes (WASM32 maximum)\",\n };\n }\n const module = await quickJsModule();\n const context = module.newContext();\n const runtime = context.runtime;\n const jsonObject = context.getProp(context.global, \"JSON\");\n const jsonParse = context.getProp(jsonObject, \"parse\");\n const executionStartedAt = Date.now();\n let effectiveTimeoutMs = options.timeoutMs;\n let executionDeadlineAt = executionStartedAt + effectiveTimeoutMs;\n let interruptedByDeadline = false;\n let interruptedByCpu = false;\n let cpuDeadlineAt = Infinity;\n const pumpJobs = () => {\n cpuDeadlineAt = Date.now() + (options.maxCpuSliceMs ?? Infinity);\n return runtime.executePendingJobs();\n };\n runtime.setMemoryLimit(options.memoryLimitBytes);\n runtime.setMaxStackSize(QUICKJS_MAX_STACK_SIZE_BYTES);\n runtime.setInterruptHandler(() => {\n if (options.signal?.aborted === true) return true;\n if (interruptedByCpu || Date.now() > cpuDeadlineAt) {\n interruptedByCpu = true;\n return true;\n }\n if (Date.now() <= executionDeadlineAt) return false;\n interruptedByDeadline = true;\n return true;\n });\n const emittedSnapshot = (): unknown[] => {\n try {\n const handle = context.getProp(context.global, \"__fabricEmitted\");\n try { const value = context.dump(handle); return Array.isArray(value) ? value : []; }\n finally { handle.dispose(); }\n } catch { return []; }\n };\n const logs: string[] = [];\n const maxLogChars = options.maxLogChars ?? 100_000;\n let logChars = 0;\n let logsTruncated = false;\n const pendingHostPromises = new Set<any>();\n const hostTasks = new Set<Promise<void>>();\n const pendingTimers = new Set<NodeJS.Timeout>();\n let closing = false;\n let cancelled = false;\n let timedOut = false;\n let timeout: NodeJS.Timeout | undefined;\n let rejectDeadline: ((error: Error) => void) | undefined;\n let abortHandler: (() => void) | undefined;\n let activePromiseHandle: any;\n let executionGate: any;\n let pendingResolution: Promise<any> | undefined;\n const hostAbortController = new AbortController();\n const abortHostCalls = (reason: string): void => {\n if (!hostAbortController.signal.aborted) {\n hostAbortController.abort(new Error(reason));\n }\n };\n\n const rejectExecutionGate = (message: string): void => {\n if (!executionGate || executionGate.alive === false) return;\n const errorHandle = context.newError(message);\n executionGate.reject(errorHandle);\n errorHandle.dispose();\n pumpJobs();\n };\n\n const timeoutMessage = (): string =>\n interruptedByCpu\n ? `Guest exceeded ${options.maxCpuSliceMs}ms uninterrupted CPU; await host work or program.sleep() in loops`\n : `Execution timed out after ${effectiveTimeoutMs}ms`;\n const expireDeadline = (): void => {\n if (closing || cancelled || timedOut) return;\n timedOut = true;\n const message = timeoutMessage();\n abortHostCalls(message);\n rejectExecutionGate(message);\n rejectDeadline?.(new Error(message));\n };\n const scheduleDeadline = (): void => {\n if (!rejectDeadline || closing || cancelled || timedOut) return;\n clearTimeout(timeout);\n if (!Number.isFinite(executionDeadlineAt)) return;\n timeout = setTimeout(expireDeadline, Math.min(2_147_483_647, Math.max(0, executionDeadlineAt - Date.now())));\n };\n const extendExecutionTimeout = (\n ref: string,\n args: Record<string, unknown>,\n ): void => {\n const requestedTimeoutMs = options.minimumTimeoutMsForHostCall?.(ref, args);\n if (\n typeof requestedTimeoutMs !== \"number\" ||\n !Number.isFinite(requestedTimeoutMs)\n ) {\n return;\n }\n const requestedDurationMs = Math.max(1, Math.floor(requestedTimeoutMs));\n if (humanWait.paused) {\n humanWait.raise(requestedDurationMs);\n return;\n }\n const nextDeadlineAt = Date.now() + requestedDurationMs;\n const nextTimeoutMs = nextDeadlineAt - executionStartedAt;\n if (nextDeadlineAt <= executionDeadlineAt) return;\n effectiveTimeoutMs = nextTimeoutMs;\n executionDeadlineAt = nextDeadlineAt;\n scheduleDeadline();\n };\n\n const humanWait = new HumanWaitDeadlinePause({\n remainingMs: () => executionDeadlineAt - Date.now(),\n suspend: () => {\n clearTimeout(timeout);\n executionDeadlineAt = Infinity;\n },\n resume: (remainingMs) => {\n executionDeadlineAt = Date.now() + remainingMs;\n scheduleDeadline();\n },\n });\n\n try {\n const hostFunction = context.newFunction(\n \"__fabricHostCall\",\n (referenceHandle: any, argsHandle: any) => {\n const reference = context.getString(referenceHandle);\n const dumpedArgs = context.dump(argsHandle);\n const args =\n typeof dumpedArgs === \"object\" && dumpedArgs !== null && !Array.isArray(dumpedArgs)\n ? (dumpedArgs as Record<string, unknown>)\n : {};\n extendExecutionTimeout(reference, args);\n const promise = context.newPromise();\n pendingHostPromises.add(promise);\n void promise.settled.then(() => pendingHostPromises.delete(promise));\n if (reference === \"fabric.$timer\") {\n if (pendingTimers.size >= (options.maxPendingTimers ?? Infinity)) {\n const errorHandle = context.newError(\"Guest pending timer limit exceeded\");\n promise.reject(errorHandle);\n errorHandle.dispose();\n return promise.handle;\n }\n const ms = Math.max(0, Number(args.ms ?? 0));\n const timer = setTimeout(() => {\n if (closing || promise.alive === false) return;\n promise.resolve(context.undefined);\n pumpJobs();\n }, ms);\n timer.unref?.();\n pendingTimers.add(timer);\n void promise.settled.then(() => pendingTimers.delete(timer));\n return promise.handle;\n }\n const waitsForHuman = options.isHumanWaitHostCall?.(reference, args) === true;\n if (waitsForHuman) humanWait.enter();\n const task = runAbortable(hostAbortController.signal, () =>\n hostCall(reference, args, hostAbortController.signal),\n )\n .finally(() => {\n if (waitsForHuman) humanWait.leave();\n })\n .then((value) => {\n if (closing || promise.alive === false) return;\n cpuDeadlineAt = Date.now() + (options.maxCpuSliceMs ?? Infinity);\n const handle = jsonHandle(context, jsonObject, jsonParse, value);\n promise.resolve(handle);\n handle.dispose();\n })\n .catch((error) => {\n if (closing || promise.alive === false) return;\n const errorHandle = context.newError(\n error instanceof Error ? error.message : String(error),\n );\n const exit = reference === \"pi.bash\" || reference === \"pi.powershell\"\n ? piBashExitMetadata(error)\n : undefined;\n if (exit) {\n const metadata = jsonHandle(context, jsonObject, jsonParse, exit);\n context.setProp(errorHandle, \"__fabricBashExit\", metadata);\n metadata.dispose();\n }\n promise.reject(errorHandle);\n errorHandle.dispose();\n })\n .finally(() => {\n if (!closing) pumpJobs();\n });\n hostTasks.add(task);\n void task.finally(() => hostTasks.delete(task));\n return promise.handle;\n },\n );\n context.setProp(context.global, \"__fabricHostCall\", hostFunction);\n hostFunction.dispose();\n\n const printFunction = context.newFunction(\"print\", (...handles: any[]) => {\n if (logsTruncated) return;\n const line = handles.map((handle) => formatValue(context.dump(handle))).join(\" \");\n const remaining = maxLogChars - logChars;\n if (line.length > remaining) {\n if (remaining > 0) logs.push(line.slice(0, remaining));\n logs.push(\"[Pi Fabric log output truncated]\");\n logsTruncated = true;\n return;\n }\n logs.push(line);\n logChars += line.length;\n });\n context.setProp(context.global, \"print\", printFunction);\n printFunction.dispose();\n\n const strings = jsonHandle(context, jsonObject, jsonParse, options.strings ?? {});\n context.setProp(context.global, \"\u03C0\", strings);\n strings.dispose();\n const tokenBudget = context.newNumber(options.tokenBudget ?? Number.POSITIVE_INFINITY);\n context.setProp(context.global, \"__fabricTokenBudget\", tokenBudget);\n tokenBudget.dispose();\n\n cpuDeadlineAt = Date.now() + (options.maxCpuSliceMs ?? Infinity);\n const setupResult = context.evalCode(guestSetupSource(options.piToolCanonicalFields, options.nativeStoreEnabled, options.codemodeProfile, options.nativeToolsEnabled), \"pi-fabric-setup.js\");\n if (setupResult.error) {\n const deadlineExceeded = interruptedByDeadline || interruptedByCpu || Date.now() > executionDeadlineAt;\n if (deadlineExceeded) timedOut = true;\n const error = options.signal?.aborted\n ? \"Execution cancelled\"\n : deadlineExceeded\n ? timeoutMessage()\n : formatValue(context.dump(setupResult.error));\n setupResult.error.dispose();\n abortHostCalls(error);\n return {\n value: undefined,\n logs,\n terminationReason: options.signal?.aborted\n ? \"aborted\"\n : deadlineExceeded\n ? \"timed_out\"\n : \"runtime_error\",\n error,\n };\n }\n setupResult.value.dispose();\n\n executionGate = context.newPromise();\n context.setProp(context.global, \"__fabricExecutionGate\", executionGate.handle);\n const guestBundle = options.transpiledCode === undefined\n ? transpileFabricCodeWithSourceMap(code)\n : { code: options.transpiledCode, sourceMap: options.transpiledSourceMap };\n const guestStackMap = createGuestStackMap(guestBundle.sourceMap);\n const guestLineCount = guestBundle.code.split(\"\\n\").length;\n const wrappedCode = `${guestBundle.code}\\nPromise.race([globalThis.__fabricRun(__piFabricMain), globalThis.__fabricExecutionGate])`;\n cpuDeadlineAt = Date.now() + (options.maxCpuSliceMs ?? Infinity);\n const evaluation = context.evalCode(wrappedCode, \"pi-fabric-guest.js\");\n pumpJobs();\n if (evaluation.error) {\n const deadlineExceeded = interruptedByDeadline || interruptedByCpu || Date.now() > executionDeadlineAt;\n if (deadlineExceeded) timedOut = true;\n const error = options.signal?.aborted\n ? \"Execution cancelled\"\n : deadlineExceeded\n ? timeoutMessage()\n : remapGuestErrorText(formatValue(context.dump(evaluation.error)), guestStackMap, guestLineCount);\n evaluation.error.dispose();\n abortHostCalls(error);\n return {\n value: undefined,\n logs,\n terminationReason: options.signal?.aborted\n ? \"aborted\"\n : deadlineExceeded\n ? \"timed_out\"\n : \"runtime_error\",\n error,\n };\n }\n\n activePromiseHandle = evaluation.value;\n const cancellation = new Promise<never>((_resolve, reject) => {\n abortHandler = () => {\n cancelled = true;\n hostAbortController.abort(options.signal?.reason);\n rejectExecutionGate(\"Execution cancelled\");\n reject(new Error(\"Execution cancelled\"));\n };\n if (options.signal?.aborted) abortHandler();\n else options.signal?.addEventListener(\"abort\", abortHandler, { once: true });\n });\n void cancellation.catch(() => undefined);\n const deadline = new Promise<never>((_resolve, reject) => {\n rejectDeadline = reject;\n scheduleDeadline();\n });\n pendingResolution = context.resolvePromise(activePromiseHandle);\n pumpJobs();\n const resolution = await Promise.race([pendingResolution, deadline, cancellation]);\n pendingResolution = undefined;\n activePromiseHandle.dispose();\n activePromiseHandle = undefined;\n if (resolution.error) {\n const deadlineExceeded = timedOut || interruptedByDeadline || interruptedByCpu || Date.now() > executionDeadlineAt;\n if (deadlineExceeded) timedOut = true;\n const error = options.signal?.aborted\n ? \"Execution cancelled\"\n : deadlineExceeded\n ? timeoutMessage()\n : remapGuestErrorText(formatValue(context.dump(resolution.error)), guestStackMap, guestLineCount);\n resolution.error.dispose();\n const emittedHandle = context.getProp(context.global, \"__fabricEmitted\");\n const emitted = context.dump(emittedHandle) as unknown[];\n emittedHandle.dispose();\n abortHostCalls(error);\n return {\n value: undefined,\n logs,\n emitted,\n terminationReason: options.signal?.aborted\n ? \"aborted\"\n : deadlineExceeded\n ? \"timed_out\"\n : \"runtime_error\",\n error,\n };\n }\n const value = context.dump(resolution.value);\n resolution.value.dispose();\n const emittedHandle = context.getProp(context.global, \"__fabricEmitted\");\n const emitted = context.dump(emittedHandle) as unknown[];\n emittedHandle.dispose();\n return { value, logs, emitted, terminationReason: \"completed\" };\n } catch (error) {\n const deadlineExceeded = timedOut || interruptedByDeadline || interruptedByCpu || Date.now() > executionDeadlineAt;\n if (deadlineExceeded) timedOut = true;\n abortHostCalls(error instanceof Error ? error.message : String(error));\n return {\n value: undefined,\n logs,\n emitted: emittedSnapshot(),\n terminationReason: cancelled ? \"aborted\" : deadlineExceeded ? \"timed_out\" : \"runtime_error\",\n error: cancelled\n ? \"Execution cancelled\"\n : deadlineExceeded\n ? timeoutMessage()\n : error instanceof Error\n ? error.message\n : String(error),\n };\n } finally {\n if (timeout) clearTimeout(timeout);\n for (const timer of pendingTimers) clearTimeout(timer);\n if (abortHandler) options.signal?.removeEventListener(\"abort\", abortHandler);\n if (hostTasks.size > 0) {\n abortHostCalls(\"Fabric guest execution ended before its host calls settled\");\n const settled = await settleWithin(hostTasks, HOST_TASK_SETTLE_GRACE_MS);\n if (!settled) {\n abortHostCalls(\"Fabric guest execution ended before its host calls settled\");\n await settleWithin(hostTasks, HOST_TASK_SETTLE_GRACE_MS);\n }\n pumpJobs();\n }\n closing = true;\n if (timedOut || cancelled || pendingHostPromises.size > 0) {\n const cleanupMessage = cancelled\n ? \"Execution cancelled\"\n : timedOut\n ? timeoutMessage()\n : \"Fabric guest execution ended before its host calls settled\";\n if (!hostAbortController.signal.aborted) hostAbortController.abort(new Error(cleanupMessage));\n rejectExecutionGate(cleanupMessage);\n const errorHandle = context.newError(cleanupMessage);\n for (const promise of pendingHostPromises) promise.reject(errorHandle);\n errorHandle.dispose();\n pumpJobs();\n await new Promise((resolve) => setImmediate(resolve));\n const settled = await Promise.race<any>([\n pendingResolution ? pendingResolution.catch(() => undefined) : Promise.resolve(undefined),\n new Promise<undefined>((resolve) => {\n const timer = setTimeout(() => resolve(undefined), 1_000);\n timer.unref?.();\n }),\n ]);\n if (settled?.error) settled.error.dispose();\n if (settled?.value) settled.value.dispose();\n for (const promise of pendingHostPromises) {\n if (promise.alive !== false) promise.dispose();\n }\n }\n if (activePromiseHandle?.alive !== false) activePromiseHandle?.dispose();\n if (executionGate?.alive !== false) executionGate?.dispose();\n pumpJobs();\n jsonParse.dispose();\n jsonObject.dispose();\n disposeQuickJsContext(context);\n }\n }\n}\n", "// Stack frames captured from the executed guest bundle reference the emitted\n// pi-fabric-guest.js (wrapper header plus TypeScript printer layout), not the\n// author's program. These helpers decode the transpile source map and rewrite\n// error text so stack positions point back at the user-submitted code.\n\ninterface GuestSourcePosition {\n line: number;\n column: number;\n}\n\nexport interface GuestStackMap {\n lookup(line: number, column: number): GuestSourcePosition | undefined;\n}\n\ninterface GuestSourceMapJson {\n mappings?: unknown;\n}\n\ninterface MappingSegment {\n generatedColumn: number;\n sourceLine: number;\n sourceColumn: number;\n}\n\nconst BASE64_VALUES = (() => {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n const table = new Map<string, number>();\n for (let index = 0; index < alphabet.length; index += 1) {\n table.set(alphabet[index] as string, index);\n }\n return table;\n})();\n\nconst decodeVlqSegment = (segment: string): number[] => {\n const values: number[] = [];\n let index = 0;\n while (index < segment.length) {\n let value = 0;\n let shift = 0;\n let continuation = true;\n while (continuation) {\n const digit = BASE64_VALUES.get(segment[index] as string);\n if (digit === undefined) return values;\n index += 1;\n continuation = (digit & 32) !== 0;\n value += (digit & 31) * 2 ** shift;\n shift += 5;\n }\n values.push((value & 1) === 1 ? -(value >> 1) : value >> 1);\n }\n return values;\n};\n\nconst decodeMappings = (mappings: string): MappingSegment[][] => {\n const lines: MappingSegment[][] = [];\n let sourceLine = 0;\n let sourceColumn = 0;\n for (const line of mappings.split(\";\")) {\n const segments: MappingSegment[] = [];\n let generatedColumn = 0;\n for (const rawSegment of line.split(\",\")) {\n if (!rawSegment) continue;\n const values = decodeVlqSegment(rawSegment);\n // values[1] is the source index delta; single-source guest maps never\n // need it, so only generated column and source position accumulate.\n if (values.length < 4) continue;\n generatedColumn += values[0] as number;\n sourceLine += values[2] as number;\n sourceColumn += values[3] as number;\n segments.push({ generatedColumn, sourceLine, sourceColumn });\n }\n lines.push(segments);\n }\n return lines;\n};\n\nexport const createGuestStackMap = (\n sourceMapText: string | undefined,\n): GuestStackMap | undefined => {\n if (!sourceMapText) return undefined;\n let mappings: string;\n try {\n const parsed = JSON.parse(sourceMapText) as GuestSourceMapJson;\n if (typeof parsed.mappings !== \"string\") return undefined;\n mappings = parsed.mappings;\n } catch {\n return undefined;\n }\n // Validating the envelope above is cheap; decoding the VLQ mappings defers\n // to the first error lookup so clean executions pay almost nothing for\n // diagnostics they never render.\n let decoded: MappingSegment[][] | undefined;\n return {\n lookup(line, column) {\n decoded ??= decodeMappings(mappings);\n const segments = decoded[line - 1];\n if (!segments) return undefined;\n const target = column - 1;\n let best: MappingSegment | undefined;\n for (const segment of segments) {\n if (segment.generatedColumn > target) break;\n best = segment;\n }\n // Columns before the first segment point at line indentation; anchor\n // them to the first statement segment rather than leaving the frame\n // in emitted-file coordinates.\n best ??= segments[0];\n if (!best) return undefined;\n // The wrapper header occupies source line 1, so the zero-based source\n // line already equals the author's one-based program line.\n return { line: best.sourceLine, column: best.sourceColumn + 1 };\n },\n };\n};\n\nconst GUEST_FRAME_PATTERN = /pi-fabric-guest\\.js:(\\d+):(\\d+)/g;\n\nexport const remapGuestErrorText = (\n text: string,\n stackMap: GuestStackMap | undefined,\n guestLineCount?: number,\n): string => {\n if (!stackMap || !text.includes(\"pi-fabric-guest.js:\")) return text;\n return text.replace(GUEST_FRAME_PATTERN, (match, lineText, columnText) => {\n const line = Number(lineText);\n const mapped = stackMap.lookup(line, Number(columnText));\n if (mapped) return `guest code:${mapped.line}:${mapped.column}`;\n // Both runtimes append their driver call after the emitted bundle, so\n // frames beyond it can only be harness machinery, never user statements.\n if (guestLineCount !== undefined && line > guestLineCount) return \"fabric driver\";\n return match;\n });\n};\n", "// Shared by QuickJS and the trusted Node/Bun executor. No host dependencies.\nexport const NATIVE_CODEMODE_GUEST = String.raw`\nconst __nativeModels = Object.assign(() => __call(\"fabric.$models\", {}), {\n getModelsOfType: (type, provider) => __call(\"native.getModelsOfType\", { type, provider }),\n getAvailableOfType: (type, provider) => __call(\"native.getAvailableOfType\", { type, provider }),\n getModelOfType: (type, provider, id) => __call(\"native.getModelOfType\", { type, provider, id }),\n classify: (model, context) => __call(\"native.classify\", { model: { provider: model.provider, id: model.id }, context }),\n generateImages: (model, context) => __call(\"native.generateImages\", { model: { provider: model.provider, id: model.id }, context }),\n});\n__toolsBase.models = Object.freeze(__nativeModels);\nglobalThis.models = __toolsBase.models;\nglobalThis.ALL_TOOLS = Object.freeze([]);\nglobalThis.searchTools = (query, options = {}) => __call(\"fabric.$nativeSearch\", { query, ...options });\nglobalThis.describeTool = name => __call(\"fabric.$nativeDescribe\", { name });\nglobalThis.describeNamespace = name => __call(\"fabric.$describeNamespace\", { name });\nlet __nativeAllTools = Object.freeze([]);\nglobalThis.nativeDiscovery = Object.freeze({\n get ALL_TOOLS() { return __nativeAllTools; },\n searchTools: (query, options = {}) => __call(\"fabric.$piSearch\", { query, ...options }),\n describeTool: name => __call(\"fabric.$piDescribe\", { name }),\n describeNamespace: name => __call(\"fabric.$piNamespace\", { name }),\n});\nif (typeof __nativeProfile !== \"undefined\" && __nativeProfile) {\n globalThis.searchTools = globalThis.nativeDiscovery.searchTools;\n globalThis.describeTool = globalThis.nativeDiscovery.describeTool;\n globalThis.describeNamespace = globalThis.nativeDiscovery.describeNamespace;\n}\nconst __exit = Object.freeze({});\nlet __storeValues;\nlet __storeDirty = false;\nlet __storeError;\nconst __cloneJson = value => JSON.parse(JSON.stringify(value));\nglobalThis.load = key => {\n if (typeof key !== \"string\") throw new Error(\"load key must be a string\");\n if (!__storeValues) throw (__storeError ?? new Error(\"Script store is unavailable in this runtime\"));\n return Object.prototype.hasOwnProperty.call(__storeValues, key) ? __cloneJson(__storeValues[key]) : undefined;\n};\nglobalThis.store = (key, value) => {\n if (typeof key !== \"string\") throw new Error(\"store key must be a string\");\n if (!__storeValues) throw (__storeError ?? new Error(\"Script store is unavailable in this runtime\"));\n const next = Object.assign(Object.create(null), __storeValues);\n if (value === undefined) delete next[key];\n else {\n const json = JSON.stringify(value);\n if (json === undefined) throw new Error(\"Script store values must be JSON\");\n if (json.length > 262144) throw new Error(\"Script store value exceeds 262144 characters\");\n next[key] = JSON.parse(json);\n }\n if (Object.values(next).reduce((sum, item) => sum + JSON.stringify(item).length, 0) > 1048576) throw new Error(\"Script store exceeds 1048576 characters\");\n __storeValues = next;\n __storeDirty = true;\n};\nconst __emitted = [];\nObject.defineProperty(globalThis, \"__fabricEmitted\", { value: __emitted });\nlet __emittedChars = 0;\nlet __emittedCalls = 0;\nconst __countOutput = chars => {\n __emittedChars += chars;\n if (++__emittedCalls > 100000 || __emittedChars > 16777216) throw new Error(\"Script output limit exceeded\");\n};\nglobalThis.text = value => {\n const text = typeof value === \"string\" ? value : JSON.stringify(value);\n __countOutput((text ?? \"\").length);\n print(text);\n};\nglobalThis.image = value => {\n if (value && typeof value === \"object\" && \"image_url\" in value) value = typeof value.image_url === \"string\" ? value.image_url : value.image_url?.url;\n if (typeof value === \"string\") {\n const match = /^data:(image\\/(?:png|jpeg|gif|webp));base64,([A-Za-z0-9+/=\\s]+)$/.exec(value);\n if (!match) throw new Error(\"image() requires a local base64 PNG, JPEG, GIF or WebP; remote URLs are unsupported\");\n value = { type: \"image\", mimeType: match[1], data: match[2].replace(/\\s/g, \"\") };\n }\n if (!value || value.type !== \"image\" || !/^image\\/(png|jpeg|gif|webp)$/.test(value.mimeType) || typeof value.data !== \"string\" || !/^[A-Za-z0-9+/=\\s]+$/.test(value.data)) throw new Error(\"Invalid image block\");\n __countOutput(value.data.length);\n const block = { type: \"image\", mimeType: value.mimeType, data: value.data };\n __emitted.push(block);\n if (typeof globalThis.__fabricEmitImage === \"function\") globalThis.__fabricEmitImage(block);\n};\nglobalThis.exit = () => { throw __exit; };\nglobalThis.__fabricRun = async (main) => {\n if (typeof __nativeToolsEnabled !== \"undefined\" && __nativeToolsEnabled) {\n __nativeAllTools = Object.freeze(await __call(\"fabric.$piAllTools\", {}));\n for (const tool of __nativeAllTools) __nativeToolNames.add(tool.name);\n __nativeCatalogReady = true;\n if (__nativeProfile) globalThis.ALL_TOOLS = __nativeAllTools;\n }\n if (typeof __nativeStoreEnabled !== \"undefined\" && __nativeStoreEnabled) {\n if (!(typeof __nativeProfile !== \"undefined\" && __nativeProfile)) globalThis.ALL_TOOLS = Object.freeze(await __call(\"fabric.$allTools\", {}));\n try { __storeValues = Object.assign(Object.create(null), await __call(\"native.load\", {})); }\n catch (error) { __storeError = error; }\n }\n let value;\n try { value = await main(); } catch (error) { if (error !== __exit) throw error; }\n if (__storeDirty) await __call(\"native.store\", { values: __storeValues });\n return value;\n};\n`;\n"],
|
|
5
|
+
"mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoErB,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAiFV,KAAK,UAAU,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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",
|
|
6
|
+
"names": ["value", "emittedHandle", "emitted"]
|
|
7
|
+
}
|
|
@@ -46,14 +46,26 @@ var parseStructuredValue = (text) => {
|
|
|
46
46
|
};
|
|
47
47
|
function validateAgentResult(record, schema) {
|
|
48
48
|
if (record.status !== "completed" || !schema) return record;
|
|
49
|
+
let parsed = false;
|
|
49
50
|
try {
|
|
50
51
|
const value = record.value ?? parseStructuredValue(record.text);
|
|
52
|
+
parsed = true;
|
|
51
53
|
if (!Value.Check(schema, value)) {
|
|
52
54
|
const errors = [...Value.Errors(schema, value)].slice(0, 5).map((error) => error.message).join("; ");
|
|
53
55
|
throw new Error(errors || "value does not match schema");
|
|
54
56
|
}
|
|
55
57
|
record.value = value;
|
|
56
58
|
} catch (error) {
|
|
59
|
+
const actionSchema = schema.properties?.action;
|
|
60
|
+
const prose = record.text.trim();
|
|
61
|
+
const plainProse = !/^[{[\"]|```/.test(prose);
|
|
62
|
+
if (!parsed && error instanceof SyntaxError && plainProse && Array.isArray(actionSchema?.enum) && actionSchema.enum.includes("silent")) {
|
|
63
|
+
const coerced = prose ? { action: "message", message: prose.slice(0, 2400) } : { action: "silent" };
|
|
64
|
+
if (Value.Check(schema, coerced)) {
|
|
65
|
+
record.value = coerced;
|
|
66
|
+
return record;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
57
69
|
record.status = "failed";
|
|
58
70
|
const reason = error instanceof Error ? error.message : String(error);
|
|
59
71
|
const output = record.text.trim();
|
|
@@ -67,4 +79,4 @@ export {
|
|
|
67
79
|
parseStructuredValue,
|
|
68
80
|
validateAgentResult
|
|
69
81
|
};
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
82
|
+
//# sourceMappingURL=chunk-VYQV5JRT.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/agents/result.ts"],
|
|
4
|
+
"sourcesContent": ["import { Value } from \"typebox/value\";\n\nconst extractBalancedJson = (text: string, start: number): string | null => {\n const open = text[start];\n if (open !== \"{\" && open !== \"[\") return null;\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === open) depth++;\n else if (ch === close) {\n depth--;\n if (depth === 0) return text.slice(start, i + 1);\n }\n }\n return null;\n};\n\nexport const parseStructuredValue = (text: string): unknown => {\n const trimmed = text.trim();\n try {\n return JSON.parse(trimmed);\n } catch {\n // Whole text is not JSON; try extraction below.\n }\n const fenced = trimmed.match(/```(?:json)?\\s*\\n([\\s\\S]*?)\\n```/i);\n if (fenced?.[1]) {\n try {\n return JSON.parse(fenced[1].trim());\n } catch {\n // Fenced block is not JSON; try balanced extraction below.\n }\n }\n const start = trimmed.search(/[{\\[]/);\n if (start >= 0) {\n const balanced = extractBalancedJson(trimmed, start);\n if (balanced) return JSON.parse(balanced);\n }\n return JSON.parse(trimmed);\n};\n\nexport function validateAgentResult<T extends { status: string; text: string; value?: unknown; error?: string }>(record: T, schema?: Record<string, unknown>): T {\n if (record.status !== \"completed\" || !schema) return record;\n let parsed = false;\n try {\n const value = record.value ?? parseStructuredValue(record.text);\n parsed = true;\n if (!Value.Check(schema, value)) {\n const errors = [...Value.Errors(schema, value)].slice(0, 5).map((error) => error.message).join(\"; \");\n throw new Error(errors || \"value does not match schema\");\n }\n record.value = value;\n } catch (error) {\n // Directive-mode actors (schema's action enum contains \"silent\") prefer\n // silence over chatter, so a model that ignored the JSON contract and\n // answered in prose produced advice, not a protocol failure. Coerce the\n // prose into the nearest valid action instead of failing the whole run.\n // The coerced value must itself validate against the schema, so schemas\n // that do not actually accept a message action still fail loudly.\n const actionSchema = (schema as { properties?: { action?: { enum?: unknown[] } } }).properties?.action;\n const prose = record.text.trim();\n // Invalid JSON/schema values are protocol failures, not advice. Only plain\n // unstructured prose (or silence) is eligible for the directive fallback.\n const plainProse = !/^[{[\\\"]|```/.test(prose);\n if (!parsed && error instanceof SyntaxError && plainProse &&\n Array.isArray(actionSchema?.enum) && actionSchema.enum.includes(\"silent\")) {\n const coerced = prose ? { action: \"message\", message: prose.slice(0, 2400) } : { action: \"silent\" };\n if (Value.Check(schema, coerced)) {\n record.value = coerced;\n return record;\n }\n }\n record.status = \"failed\";\n const reason = error instanceof Error ? error.message : String(error);\n const output = record.text.trim();\n const snippet = output.slice(0, 200);\n record.error = `Structured agent output was invalid: ${reason}${snippet ? ` (output: ${snippet}${output.length > 200 ? \"\u2026\" : \"\"})` : \"\"}`;\n }\n return record;\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,aAAa;AAEtB,IAAM,sBAAsB,CAAC,MAAc,UAAiC;AAC1E,QAAM,OAAO,KAAK,KAAK;AACvB,MAAI,SAAS,OAAO,SAAS,IAAK,QAAO;AACzC,QAAM,QAAQ,SAAS,MAAM,MAAM;AACnC,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,UAAU;AACd,WAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK;AACxC,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,UAAU;AACZ,UAAI,QAAS,WAAU;AAAA,eACd,OAAO,KAAM,WAAU;AAAA,eACvB,OAAO,IAAK,YAAW;AAChC;AAAA,IACF;AACA,QAAI,OAAO,IAAK,YAAW;AAAA,aAClB,OAAO,KAAM;AAAA,aACb,OAAO,OAAO;AACrB;AACA,UAAI,UAAU,EAAG,QAAO,KAAK,MAAM,OAAO,IAAI,CAAC;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,uBAAuB,CAAC,SAA0B;AAC7D,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AAAA,EAER;AACA,QAAM,SAAS,QAAQ,MAAM,mCAAmC;AAChE,MAAI,SAAS,CAAC,GAAG;AACf,QAAI;AACF,aAAO,KAAK,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC;AAAA,IACpC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,QAAQ,QAAQ,OAAO,OAAO;AACpC,MAAI,SAAS,GAAG;AACd,UAAM,WAAW,oBAAoB,SAAS,KAAK;AACnD,QAAI,SAAU,QAAO,KAAK,MAAM,QAAQ;AAAA,EAC1C;AACA,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEO,SAAS,oBAAiG,QAAW,QAAqC;AAC/J,MAAI,OAAO,WAAW,eAAe,CAAC,OAAQ,QAAO;AACrD,MAAI,SAAS;AACb,MAAI;AACF,UAAM,QAAQ,OAAO,SAAS,qBAAqB,OAAO,IAAI;AAC9D,aAAS;AACT,QAAI,CAAC,MAAM,MAAM,QAAQ,KAAK,GAAG;AAC/B,YAAM,SAAS,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI;AACnG,YAAM,IAAI,MAAM,UAAU,6BAA6B;AAAA,IACzD;AACA,WAAO,QAAQ;AAAA,EACjB,SAAS,OAAO;AAOd,UAAM,eAAgB,OAA8D,YAAY;AAChG,UAAM,QAAQ,OAAO,KAAK,KAAK;AAG/B,UAAM,aAAa,CAAC,cAAc,KAAK,KAAK;AAC5C,QAAI,CAAC,UAAU,iBAAiB,eAAe,cAC3C,MAAM,QAAQ,cAAc,IAAI,KAAK,aAAa,KAAK,SAAS,QAAQ,GAAG;AAC7E,YAAM,UAAU,QAAQ,EAAE,QAAQ,WAAW,SAAS,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,SAAS;AAClG,UAAI,MAAM,MAAM,QAAQ,OAAO,GAAG;AAChC,eAAO,QAAQ;AACf,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,SAAS;AAChB,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,UAAM,SAAS,OAAO,KAAK,KAAK;AAChC,UAAM,UAAU,OAAO,MAAM,GAAG,GAAG;AACnC,WAAO,QAAQ,wCAAwC,MAAM,GAAG,UAAU,aAAa,OAAO,GAAG,OAAO,SAAS,MAAM,WAAM,EAAE,MAAM,EAAE;AAAA,EACzI;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
agentParticipantRecords,
|
|
9
9
|
loadModelUsage,
|
|
10
10
|
useBudgetLedger
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-FRPNQZV2.js";
|
|
12
12
|
import {
|
|
13
13
|
MeshStore
|
|
14
14
|
} from "./chunk-3GJJG2FV.js";
|
|
@@ -815,4 +815,4 @@ export {
|
|
|
815
815
|
residentIdleDecision,
|
|
816
816
|
runResidentHostFromConfigPath
|
|
817
817
|
};
|
|
818
|
-
//# sourceMappingURL=chunk-
|
|
818
|
+
//# sourceMappingURL=chunk-X3CHSIL2.js.map
|
package/dist/durable/worker.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
// src/durable/worker.ts
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import module from "node:module";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
3
8
|
// src/durable/worker-options.ts
|
|
4
9
|
import path from "node:path";
|
|
5
10
|
function parseDurableWorkerOptions(argv, cwd = process.cwd()) {
|
|
@@ -71,8 +76,32 @@ function parseDurableWorkerOptions(argv, cwd = process.cwd()) {
|
|
|
71
76
|
// src/durable/worker.ts
|
|
72
77
|
try {
|
|
73
78
|
const options = parseDurableWorkerOptions(process.argv.slice(2));
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
if (process.versions.bun) {
|
|
80
|
+
const child = spawn("node", [fileURLToPath(import.meta.url), ...process.argv.slice(2)], { stdio: "inherit" });
|
|
81
|
+
const code = await new Promise((resolve, reject) => {
|
|
82
|
+
child.once("error", (error) => reject(new Error(`Bun-launched durable workers require Node.js 24+ on PATH: ${error.message}`, { cause: error })));
|
|
83
|
+
child.once("exit", (code2, signal) => resolve(code2 ?? (signal ? 1 : 0)));
|
|
84
|
+
});
|
|
85
|
+
process.exitCode = code;
|
|
86
|
+
} else {
|
|
87
|
+
if (Number.parseInt(process.versions.node, 10) < 24) throw new Error("Durable Pi workers require Node.js 24+");
|
|
88
|
+
const sdkEntry = import.meta.resolve("pi-fabric-worker-sdk");
|
|
89
|
+
const sdkName = "@earendil-works/pi-coding-agent";
|
|
90
|
+
const peers = ["@earendil-works/pi-agent-core", "@earendil-works/pi-ai", "@earendil-works/pi-tui", "typebox"];
|
|
91
|
+
module.registerHooks({
|
|
92
|
+
resolve(specifier, context, nextResolve) {
|
|
93
|
+
if (specifier === sdkName || specifier.startsWith(`${sdkName}/`)) {
|
|
94
|
+
return nextResolve(`pi-fabric-worker-sdk${specifier.slice(sdkName.length)}`, { ...context, parentURL: import.meta.url });
|
|
95
|
+
}
|
|
96
|
+
if (peers.some((name) => specifier === name || specifier.startsWith(`${name}/`))) {
|
|
97
|
+
return nextResolve(specifier, { ...context, parentURL: sdkEntry });
|
|
98
|
+
}
|
|
99
|
+
return nextResolve(specifier, context);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const { runDurableWorker } = await import("./worker-host.js");
|
|
103
|
+
await runDurableWorker(options);
|
|
104
|
+
}
|
|
76
105
|
} catch (error) {
|
|
77
106
|
process.stderr.write(`Durable Pi worker failed: ${error instanceof Error ? error.stack ?? error.message : String(error)}
|
|
78
107
|
`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/durable/worker
|
|
4
|
-
"sourcesContent": ["import path from \"node:path\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport interface DurableWorkerOptions {\n directory: string;\n runId: string;\n sessionFile?: string;\n model?: string;\n provider?: string;\n thinking?: ThinkingLevel;\n tools?: string[];\n noTools?: \"all\";\n extensions: string[];\n noExtensions: boolean;\n appendSystemPrompt: string;\n}\n\n/** Internal worker protocol, deliberately not a second general-purpose Pi CLI. */\nexport function parseDurableWorkerOptions(argv: readonly string[], cwd = process.cwd()): DurableWorkerOptions {\n const options: DurableWorkerOptions = {\n directory: \"\", runId: \"\", extensions: [], noExtensions: false, appendSystemPrompt: \"\",\n };\n const prompts: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const flag = argv[i]!;\n if (flag === \"--no-session\") continue;\n if (flag === \"--no-extensions\") { options.noExtensions = true; continue; }\n if (flag === \"--no-tools\") { options.noTools = \"all\"; continue; }\n if (![\"--mode\", \"--durable-directory\", \"--durable-run-id\", \"--session\", \"--model\", \"--provider\", \"--thinking\", \"--tools\", \"-e\", \"--extension\", \"--append-system-prompt\"].includes(flag)) {\n throw new Error(`Unsupported durable worker option: ${flag}`);\n }\n const value = argv[++i];\n if (value === undefined || value.startsWith(\"--\")) throw new Error(`Missing value for ${flag}`);\n switch (flag) {\n case \"--mode\": if (value !== \"rpc\") throw new Error(\"The durable worker only supports RPC mode\"); break;\n case \"--durable-directory\": options.directory = path.resolve(cwd, value); break;\n case \"--durable-run-id\": options.runId = value.trim(); break;\n case \"--session\": options.sessionFile = path.resolve(cwd, value); break;\n case \"--model\": options.model = value; break;\n case \"--provider\": options.provider = value; break;\n case \"--thinking\":\n if (![\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(value)) throw new Error(`Invalid thinking level: ${value}`);\n options.thinking = value as ThinkingLevel;\n break;\n case \"--tools\": options.tools = value.split(\",\").map(tool => tool.trim()).filter(Boolean); break;\n case \"-e\": case \"--extension\": options.extensions.push(value.startsWith(\"builtin:\") ? value : path.resolve(cwd, value)); break;\n case \"--append-system-prompt\": prompts.push(value); break;\n }\n }\n if (!options.directory || !options.runId) throw new Error(\"Durable workers require --durable-directory and --durable-run-id\");\n if (options.tools && options.noTools) throw new Error(\"--tools and --no-tools are mutually exclusive\");\n options.appendSystemPrompt = prompts.join(\"\\n\\n\");\n return options;\n}\n"
|
|
5
|
-
"mappings": ";;;
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../src/durable/worker.ts", "../../src/durable/worker-options.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\nimport { spawn } from \"node:child_process\";\nimport module from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseDurableWorkerOptions } from \"./worker-options.js\";\n\ntry {\n // This process-only entry is never imported by extension registration.\n const options = parseDurableWorkerOptions(process.argv.slice(2));\n if (process.versions.bun) {\n // Bun cannot install Node's peer-resolution hooks. Keep the pinned SDK in\n // the package's required Node 24+ runtime; never inject ambient NODE_PATH.\n const child = spawn(\"node\", [fileURLToPath(import.meta.url), ...process.argv.slice(2)], { stdio: \"inherit\" });\n const code = await new Promise<number>((resolve, reject) => {\n child.once(\"error\", error => reject(new Error(`Bun-launched durable workers require Node.js 24+ on PATH: ${error.message}`, { cause: error })));\n child.once(\"exit\", (code, signal) => resolve(code ?? (signal ? 1 : 0)));\n });\n process.exitCode = code;\n } else {\n if (Number.parseInt(process.versions.node, 10) < 24) throw new Error(\"Durable Pi workers require Node.js 24+\");\n // Managed Pi installs omit host peers. A subprocess cannot use Main's virtual\n // modules, so it owns a pinned SDK under a non-peer name. Resolve all Pi peers\n // through that SDK's dependency tree (also with non-hoisting installers), not\n // an ambient checkout or another extension's SDK. This hook is process-local\n // and must be installed before importing any durable host/engine modules.\n const sdkEntry = import.meta.resolve(\"pi-fabric-worker-sdk\");\n const sdkName = \"@earendil-works/pi-coding-agent\";\n const peers = [\"@earendil-works/pi-agent-core\", \"@earendil-works/pi-ai\", \"@earendil-works/pi-tui\", \"typebox\"];\n module.registerHooks({\n resolve(specifier, context, nextResolve) {\n if (specifier === sdkName || specifier.startsWith(`${sdkName}/`)) {\n return nextResolve(`pi-fabric-worker-sdk${specifier.slice(sdkName.length)}`, { ...context, parentURL: import.meta.url });\n }\n if (peers.some(name => specifier === name || specifier.startsWith(`${name}/`))) {\n return nextResolve(specifier, { ...context, parentURL: sdkEntry });\n }\n return nextResolve(specifier, context);\n },\n });\n const { runDurableWorker } = await import(\"./worker-host.js\");\n await runDurableWorker(options);\n }\n} catch (error) {\n process.stderr.write(`Durable Pi worker failed: ${error instanceof Error ? error.stack ?? error.message : String(error)}\\n`);\n process.exitCode = 1;\n}\n", "import path from \"node:path\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport interface DurableWorkerOptions {\n directory: string;\n runId: string;\n sessionFile?: string;\n model?: string;\n provider?: string;\n thinking?: ThinkingLevel;\n tools?: string[];\n noTools?: \"all\";\n extensions: string[];\n noExtensions: boolean;\n appendSystemPrompt: string;\n}\n\n/** Internal worker protocol, deliberately not a second general-purpose Pi CLI. */\nexport function parseDurableWorkerOptions(argv: readonly string[], cwd = process.cwd()): DurableWorkerOptions {\n const options: DurableWorkerOptions = {\n directory: \"\", runId: \"\", extensions: [], noExtensions: false, appendSystemPrompt: \"\",\n };\n const prompts: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const flag = argv[i]!;\n if (flag === \"--no-session\") continue;\n if (flag === \"--no-extensions\") { options.noExtensions = true; continue; }\n if (flag === \"--no-tools\") { options.noTools = \"all\"; continue; }\n if (![\"--mode\", \"--durable-directory\", \"--durable-run-id\", \"--session\", \"--model\", \"--provider\", \"--thinking\", \"--tools\", \"-e\", \"--extension\", \"--append-system-prompt\"].includes(flag)) {\n throw new Error(`Unsupported durable worker option: ${flag}`);\n }\n const value = argv[++i];\n if (value === undefined || value.startsWith(\"--\")) throw new Error(`Missing value for ${flag}`);\n switch (flag) {\n case \"--mode\": if (value !== \"rpc\") throw new Error(\"The durable worker only supports RPC mode\"); break;\n case \"--durable-directory\": options.directory = path.resolve(cwd, value); break;\n case \"--durable-run-id\": options.runId = value.trim(); break;\n case \"--session\": options.sessionFile = path.resolve(cwd, value); break;\n case \"--model\": options.model = value; break;\n case \"--provider\": options.provider = value; break;\n case \"--thinking\":\n if (![\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"].includes(value)) throw new Error(`Invalid thinking level: ${value}`);\n options.thinking = value as ThinkingLevel;\n break;\n case \"--tools\": options.tools = value.split(\",\").map(tool => tool.trim()).filter(Boolean); break;\n case \"-e\": case \"--extension\": options.extensions.push(value.startsWith(\"builtin:\") ? value : path.resolve(cwd, value)); break;\n case \"--append-system-prompt\": prompts.push(value); break;\n }\n }\n if (!options.directory || !options.runId) throw new Error(\"Durable workers require --durable-directory and --durable-run-id\");\n if (options.tools && options.noTools) throw new Error(\"--tools and --no-tools are mutually exclusive\");\n options.appendSystemPrompt = prompts.join(\"\\n\\n\");\n return options;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["code"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../src/execution-service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"execution-service.d.ts","sourceRoot":"","sources":["../src/execution-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { FABRIC_MANAGED_HOST_VERSION } from "./extension.js";
|
|
2
2
|
export type { FabricManagedHostOptions } from "./managed-host.js";
|
|
3
|
-
declare const _default: (pi: import("
|
|
3
|
+
declare const _default: (pi: import("pi-fabric-worker-sdk").ExtensionAPI, options?: {
|
|
4
4
|
managedHost?: import("./managed-host.js").FabricManagedHostOptions;
|
|
5
5
|
}) => Promise<void>;
|
|
6
6
|
export default _default;
|
|
@@ -114,7 +114,7 @@ import {
|
|
|
114
114
|
snapshotHandoffSession,
|
|
115
115
|
thinkingTransferPolicy,
|
|
116
116
|
withInheritedSessionPins
|
|
117
|
-
} from "./chunks/chunk-
|
|
117
|
+
} from "./chunks/chunk-FRPNQZV2.js";
|
|
118
118
|
import {
|
|
119
119
|
executeFile,
|
|
120
120
|
processIsAlive,
|
|
@@ -5059,7 +5059,8 @@ var FabricExecutionService = class {
|
|
|
5059
5059
|
const loadNativeCatalog = async (context) => {
|
|
5060
5060
|
const api = await import("./native-tool-catalog.js");
|
|
5061
5061
|
const definitions = options.context.tools ?? this.capturedTools?.registeredTools().map((entry) => entry.definition) ?? [];
|
|
5062
|
-
const
|
|
5062
|
+
const providers = definitions.length ? ["pi", "extensions"] : ["pi", "extensions", "mcp"];
|
|
5063
|
+
const actions = (await Promise.all(providers.filter((provider) => this.registry.has(provider)).map((provider) => this.registry.list({ provider, limit: 1e3 }, context)))).flat();
|
|
5063
5064
|
const refs = new Set(actions.map((action) => action.ref));
|
|
5064
5065
|
for (const definition of definitions) {
|
|
5065
5066
|
const ref = nativeToolRef(definition, nativeMcpIdentity);
|
|
@@ -10542,7 +10543,11 @@ var PiNativeMcpTools = class {
|
|
|
10542
10543
|
return this.#tools(server).map((entry) => this.#descriptor(entry)).filter((entry) => !query || `${entry.name} ${entry.description}`.toLowerCase().includes(query));
|
|
10543
10544
|
}
|
|
10544
10545
|
serverInfo() {
|
|
10545
|
-
|
|
10546
|
+
let tools = this.#tools();
|
|
10547
|
+
const indexed = new Set(tools.map((tool) => tool.server));
|
|
10548
|
+
if (this.servers.some((name) => !indexed.has(name)) && this.#pollLiveRegistrations()) {
|
|
10549
|
+
tools = this.#tools();
|
|
10550
|
+
}
|
|
10546
10551
|
return this.servers.map((name) => {
|
|
10547
10552
|
const selected = tools.filter((tool) => tool.server === name);
|
|
10548
10553
|
return {
|
|
@@ -10555,17 +10560,35 @@ var PiNativeMcpTools = class {
|
|
|
10555
10560
|
});
|
|
10556
10561
|
}
|
|
10557
10562
|
#resolve(server, requested) {
|
|
10558
|
-
|
|
10559
|
-
|
|
10560
|
-
|
|
10561
|
-
|
|
10562
|
-
|
|
10563
|
-
|
|
10563
|
+
const attempt = () => {
|
|
10564
|
+
this.#refreshIndex();
|
|
10565
|
+
const visible = this.#visibility();
|
|
10566
|
+
const index = this.#indexes.get(server);
|
|
10567
|
+
if (index) this.#checkMetadata(index, visible);
|
|
10568
|
+
const candidates = index?.exact.get(requested) ?? index?.aliases.get(requested) ?? [];
|
|
10569
|
+
return candidates.filter((entry) => visible(entry.registered));
|
|
10570
|
+
};
|
|
10571
|
+
let matches = attempt();
|
|
10572
|
+
if (matches.length !== 1 && this.#pollLiveRegistrations()) matches = attempt();
|
|
10564
10573
|
if (matches.length !== 1) {
|
|
10565
10574
|
throw new Error(`Unknown or ambiguous Pi MCP tool: ${server}.${requested}. Check /mcp and the tool exposure; no mcporter fallback was attempted.`);
|
|
10566
10575
|
}
|
|
10567
10576
|
return matches[0];
|
|
10568
10577
|
}
|
|
10578
|
+
// Mirrors Pi's "waits for the servers it names" semantics inside the borrow
|
|
10579
|
+
// layer: never polls on a timer, only once per failed lookup, and reports
|
|
10580
|
+
// change only when the capture catalog actually moved.
|
|
10581
|
+
#pollLiveRegistrations() {
|
|
10582
|
+
const runner = this.catalog.runner;
|
|
10583
|
+
if (typeof runner?.getAllRegisteredTools !== "function") return false;
|
|
10584
|
+
const before = this.catalog.registeredTools();
|
|
10585
|
+
try {
|
|
10586
|
+
runner.getAllRegisteredTools();
|
|
10587
|
+
} catch {
|
|
10588
|
+
return false;
|
|
10589
|
+
}
|
|
10590
|
+
return this.catalog.registeredTools() !== before;
|
|
10591
|
+
}
|
|
10569
10592
|
describe(server, tool) {
|
|
10570
10593
|
return this.#descriptor(this.#resolve(server, tool));
|
|
10571
10594
|
}
|