pi-fabric 0.75.0 → 0.76.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/agents/transports/process-utils.d.ts.map +1 -1
  2. package/dist/chunks/{chunk-X5FAVRK7.js → chunk-BT6UELLP.js} +4 -4
  3. package/dist/chunks/chunk-BT6UELLP.js.map +7 -0
  4. package/dist/chunks/{chunk-EY74VMKR.js → chunk-F2GKEXGI.js} +3 -3
  5. package/dist/chunks/{chunk-GLEX5U5Q.js → chunk-QWIKS6CT.js} +3 -3
  6. package/dist/chunks/chunk-QWIKS6CT.js.map +7 -0
  7. package/dist/chunks/{chunk-ATX3EMPY.js → chunk-USMTYVXY.js} +5 -5
  8. package/dist/chunks/chunk-USMTYVXY.js.map +7 -0
  9. package/dist/chunks/{fabric-runtime-state-MCH72UE2.js → fabric-runtime-state-FBAJTXB2.js} +22 -7
  10. package/dist/chunks/fabric-runtime-state-FBAJTXB2.js.map +7 -0
  11. package/dist/chunks/{node-process-runtime-ZJVCMM4O.js → node-process-runtime-ITTLVGWY.js} +3 -3
  12. package/dist/chunks/{quickjs-runtime-CHQOPOWA.js → quickjs-runtime-6LAQLSB4.js} +2 -2
  13. package/dist/core/system-guidance.d.ts.map +1 -1
  14. package/dist/fabric-exec-arguments.d.ts +4 -0
  15. package/dist/fabric-exec-arguments.d.ts.map +1 -1
  16. package/dist/fabric-exec-tool.d.ts.map +1 -1
  17. package/dist/index.js +111 -37
  18. package/dist/index.js.map +3 -3
  19. package/dist/residency/client.d.ts.map +1 -1
  20. package/dist/residency/host.d.ts.map +1 -1
  21. package/dist/residency/host.js +3 -3
  22. package/dist/residency/launcher.js +45 -5
  23. package/dist/residency/launcher.js.map +2 -2
  24. package/dist/residency/pi-entry.js +3 -3
  25. package/dist/runtime/quickjs-runtime.d.ts +1 -1
  26. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  27. package/dist/type-error-guidance.d.ts.map +1 -1
  28. package/docs/architecture.md +1 -1
  29. package/docs/residency-runtime.md +8 -0
  30. package/package.json +1 -1
  31. package/skills/fabric-exec/SKILL.md +1 -1
  32. package/dist/chunks/chunk-ATX3EMPY.js.map +0 -7
  33. package/dist/chunks/chunk-GLEX5U5Q.js.map +0 -7
  34. package/dist/chunks/chunk-X5FAVRK7.js.map +0 -7
  35. package/dist/chunks/fabric-runtime-state-MCH72UE2.js.map +0 -7
  36. /package/dist/chunks/{chunk-EY74VMKR.js.map → chunk-F2GKEXGI.js.map} +0 -0
  37. /package/dist/chunks/{node-process-runtime-ZJVCMM4O.js.map → node-process-runtime-ITTLVGWY.js.map} +0 -0
  38. /package/dist/chunks/{quickjs-runtime-CHQOPOWA.js.map → quickjs-runtime-6LAQLSB4.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../../../src/agents/transports/process-utils.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,MAAM,MAAM,EAAE,EACd,UAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,KACjD,OAAO,CAAC,cAAc,CAoBrB,CAAC;AAEL,eAAO,MAAM,gBAAgB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,CAOvE,CAAC;AAIF,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,OAQ5C,CAAC;AAIF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;8DAC0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAgDD,eAAO,MAAM,oBAAoB,GAAU,UAAU,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAazF,CAAC;AAMF,eAAO,MAAM,wBAAwB,GAAI,UAAS,oBAAyB,KAAG,MAS7E,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,EAClB,iBAAiB,SAAS,MAAM,EAAE,EAClC,UAAU,oBAAoB,KAC7B,OAAO,CAAC,MAAM,EAAE,CAGlB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,YAAY,MAAM,EAClB,iBAAiB,MAAM,EAAE,KACxB,OAAO,CAAC,MAAM,CAC+D,CAAC;AAEjF,eAAO,MAAM,aAAa,GACxB,YAAY,MAAM,EAClB,iBAAiB,MAAM,EAAE,EACzB,KAAK,MAAM,KACV,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAqB7E,CAAC"}
1
+ {"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../../../src/agents/transports/process-utils.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,MAAM,MAAM,EAAE,EACd,UAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,KACjD,OAAO,CAAC,cAAc,CAoBrB,CAAC;AAEL,eAAO,MAAM,gBAAgB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,CAOvE,CAAC;AAIF,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,OAU5C,CAAC;AAIF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;8DAC0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAgDD,eAAO,MAAM,oBAAoB,GAAU,UAAU,oBAAoB,KAAG,OAAO,CAAC,MAAM,CAazF,CAAC;AAMF,eAAO,MAAM,wBAAwB,GAAI,UAAS,oBAAyB,KAAG,MAS7E,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,EAClB,iBAAiB,SAAS,MAAM,EAAE,EAClC,UAAU,oBAAoB,KAC7B,OAAO,CAAC,MAAM,EAAE,CAGlB,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,YAAY,MAAM,EAClB,iBAAiB,MAAM,EAAE,KACxB,OAAO,CAAC,MAAM,CAC+D,CAAC;AAEjF,eAAO,MAAM,aAAa,GACxB,YAAY,MAAM,EAClB,iBAAiB,MAAM,EAAE,EACzB,KAAK,MAAM,KACV,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAqB7E,CAAC"}
@@ -9,7 +9,7 @@ import {
9
9
  agentParticipantRecords,
10
10
  lifecycleSourceIdentity,
11
11
  useBudgetLedger
12
- } from "./chunk-EY74VMKR.js";
12
+ } from "./chunk-F2GKEXGI.js";
13
13
  import {
14
14
  parseFabricOwnedModelGuidance,
15
15
  resolveFabricModelGuidance
@@ -48,8 +48,8 @@ var processAlive = (pid) => {
48
48
  try {
49
49
  process.kill(pid, 0);
50
50
  return true;
51
- } catch {
52
- return false;
51
+ } catch (error) {
52
+ return error instanceof Error && "code" in error && error.code === "EPERM";
53
53
  }
54
54
  };
55
55
  var ResidentHostAlreadyRunning = class extends Error {
@@ -662,4 +662,4 @@ if (isMain) {
662
662
  export {
663
663
  runResidentHostFromConfigPath
664
664
  };
665
- //# sourceMappingURL=chunk-X5FAVRK7.js.map
665
+ //# sourceMappingURL=chunk-BT6UELLP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/residency/host.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n\nimport { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { writeJsonAtomic } from \"../core/atomic-write.js\";\nimport {\n parseFabricOwnedModelGuidance,\n resolveFabricModelGuidance,\n} from \"../components/model-guidance.js\";\nimport { ActorManager } from \"../actors/manager.js\";\nimport type { FabricActorInfo } from \"../actors/types.js\";\nimport { AgentManager } from \"../agents/manager.js\";\nimport { useBudgetLedger } from \"../agents/budget-ledger.js\";\nimport { LifecycleBroker } from \"../lifecycle/broker.js\";\nimport { lifecycleSourceIdentity, type FabricLifecycleEvent, type FabricLifecycleSubscription } from \"../lifecycle/types.js\";\nimport { MeshStore, type MeshIdentity } from \"../mesh/store.js\";\nimport { FabricControlPlane, type FabricControlAcceptance, type FabricControlCommand } from \"../topology/control-plane.js\";\nimport { ParticipantDirectory } from \"../topology/participant-directory.js\";\nimport { actorParticipantRecord, agentParticipantRecords } from \"../topology/records.js\";\nimport {\n RESIDENT_HOST_FORMAT,\n residentDeliveryPrefix,\n residentHostId,\n type ResidentAgentMetadata,\n type ResidentCommand,\n type ResidentCommandResponse,\n type ResidentDeliveryRecord,\n type ResidentHostConfig,\n type ResidentHostOwner,\n} from \"./protocol.js\";\n\nconst REQUEST_POLL_MS = 50;\nconst IDLE_EXIT_MS = 30_000;\nconst COMPLETION_MAX_CHARS = 8_000;\n\nconst delay = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nconst atomicWrite = (filePath: string, value: unknown): void => {\n writeJsonAtomic(filePath, value, { space: 2 });\n};\n\nconst readJson = <T>(filePath: string): T | undefined => {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\")) as T;\n } catch {\n return undefined;\n }\n};\n\nconst errorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst processAlive = (pid: number): boolean => {\n if (!Number.isSafeInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n // On Windows, EPERM means the process exists but cannot be opened for\n // signaling; only ESRCH (or other errors) mean it is gone.\n return error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n};\n\nclass ResidentHostAlreadyRunning extends Error {}\n\nconst parseResidentHostConfigPath = (argv: readonly string[]): string => {\n const index = argv.indexOf(\"--config\");\n const value = index >= 0 ? argv[index + 1] : undefined;\n if (!value) throw new Error(\"Missing resident host argument: --config\");\n return path.resolve(value);\n};\n\nconst validateResidentHostConfig = (value: unknown, configPath: string): ResidentHostConfig => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"Invalid Fabric resident host config\");\n }\n const config = value as Partial<ResidentHostConfig>;\n if (\n config.format !== RESIDENT_HOST_FORMAT ||\n typeof config.rootId !== \"string\" ||\n typeof config.sessionId !== \"string\" ||\n typeof config.cwd !== \"string\" ||\n typeof config.projectRoot !== \"string\" ||\n typeof config.meshRoot !== \"string\" ||\n typeof config.actorRoot !== \"string\" ||\n typeof config.residencyRoot !== \"string\" ||\n typeof config.fullCodeMode !== \"boolean\" ||\n typeof config.agents !== \"object\" ||\n config.agents === null ||\n typeof config.mesh !== \"object\" ||\n config.mesh === null ||\n typeof config.retention !== \"object\" ||\n config.retention === null ||\n typeof config.workerPath !== \"string\" ||\n typeof config.fabricExtensionPath !== \"string\" ||\n typeof config.piBinary !== \"string\" ||\n typeof config.claudeBinary !== \"string\" ||\n typeof config.vedaBinary !== \"string\"\n ) {\n throw new Error(\"Fabric resident host config is incomplete\");\n }\n if (path.resolve(config.residencyRoot) !== path.dirname(configPath)) {\n throw new Error(\"Fabric resident host config is outside its residency root\");\n }\n if (!config.mesh.enabled) throw new Error(\"Durable residency requires the Fabric mesh\");\n return config as ResidentHostConfig;\n};\n\nclass ResidentHost {\n readonly hostId: string;\n readonly identity: MeshIdentity;\n readonly mesh: MeshStore;\n readonly participants: ParticipantDirectory;\n readonly control: FabricControlPlane;\n readonly agents: AgentManager;\n readonly actors: ActorManager;\n readonly lifecycle: LifecycleBroker;\n readonly #ownerPath: string;\n readonly #lockPath: string;\n readonly #errorPath: string;\n readonly #requestsPath: string;\n readonly #processingPath: string;\n readonly #responsesPath: string;\n readonly #agentsPath: string;\n readonly #deliveryPrefix: string;\n readonly #token = randomUUID();\n #requestTimer: NodeJS.Timeout | undefined;\n #pollingRequests = false;\n #closed = false;\n #started = false;\n #idleSince = Date.now();\n\n constructor(\n readonly config: ResidentHostConfig,\n readonly onIdle: () => void = () => {},\n ) {\n this.hostId = residentHostId(config.rootId);\n this.identity = { id: this.hostId, name: \"Fabric resident host\", kind: \"agent\" };\n this.#ownerPath = path.join(config.residencyRoot, \"owner.json\");\n this.#lockPath = path.join(config.residencyRoot, \"host.lock\");\n this.#errorPath = path.join(config.residencyRoot, \"error.json\");\n this.#requestsPath = path.join(config.residencyRoot, \"requests\");\n this.#processingPath = path.join(config.residencyRoot, \"processing\");\n this.#responsesPath = path.join(config.residencyRoot, \"responses\");\n this.#agentsPath = path.join(config.residencyRoot, \"agents\");\n this.#deliveryPrefix = residentDeliveryPrefix(config.rootId);\n this.mesh = new MeshStore(config.meshRoot, config.mesh.maxEventBytes, config.mesh.maxReadEvents);\n this.participants = new ParticipantDirectory(this.mesh, {\n enabled: true,\n hostId: this.hostId,\n rootId: config.rootId,\n identity: this.identity,\n });\n this.control = new FabricControlPlane(this.mesh, this.identity, {\n enabled: true,\n hostId: this.hostId,\n pollMs: config.mesh.actorPollMs,\n });\n if (config.agents.budgetUsd > 0) {\n const budgetFile = path.join(config.residencyRoot, \"budget.jsonl\");\n fs.mkdirSync(path.dirname(budgetFile), { recursive: true, mode: 0o700 });\n if (!fs.existsSync(budgetFile)) fs.writeFileSync(budgetFile, \"\", { mode: 0o600 });\n useBudgetLedger({\n budget: config.agents.budgetUsd,\n file: budgetFile,\n id: this.hostId,\n });\n }\n const guidanceConfigPath = path.join(config.residencyRoot, \"config.json\");\n const currentModelGuidance = () => {\n const current = readJson<Partial<ResidentHostConfig>>(guidanceConfigPath);\n return parseFabricOwnedModelGuidance(current?.modelGuidance ?? config.modelGuidance);\n };\n this.agents = new AgentManager(config.cwd, config.agents, {\n workerPath: config.workerPath,\n fabricExtensionPath: config.fabricExtensionPath,\n piBinary: config.piBinary,\n claudeBinary: config.claudeBinary,\n vedaBinary: config.vedaBinary,\n runRoot: path.join(config.residencyRoot, \"runs\"),\n fullCodeMode: config.fullCodeMode,\n mainAgentId: config.rootId,\n meshRoot: config.meshRoot,\n projectRoot: config.projectRoot,\n hostId: this.hostId,\n identityId: this.identity.id,\n retention: config.retention,\n resolveParticipantGuidance: ({ model }) => {\n if (!model) return undefined;\n return resolveFabricModelGuidance(currentModelGuidance(), {\n model,\n target: \"participant\",\n includeSlots: false,\n }).appendText || undefined;\n },\n onLifecycle: (event) => void this.lifecycle?.publish(event).catch(() => undefined),\n onBackgroundComplete: (result) => {\n if (!config.agents.notifyOnComplete) return;\n const durationMs = Math.max(0, (result.finishedAt ?? Date.now()) - result.startedAt);\n const summary = (result.text || result.error || \"no result\").slice(0, COMPLETION_MAX_CHARS);\n void this.#queueDelivery(\n { id: result.id, name: result.name, kind: \"agent\" },\n `Fabric agent ${result.id.slice(0, 8)} ${result.status} after ${Math.round(durationMs / 1_000)}s: ${summary}`,\n \"followUp\",\n true,\n result,\n ).catch(() => undefined);\n },\n });\n const canManageActor = (id: string): boolean | undefined => {\n const participant = this.participants.get(id);\n return participant ? participant.ownerHostId === this.hostId : undefined;\n };\n const lineageAlive = (rootId: string): boolean =>\n this.participants.get(rootId) !== undefined;\n this.actors = new ActorManager(\n config.sessionId,\n this.identity,\n this.mesh,\n config.mesh,\n this.agents,\n ({ actor, message, delivery, triggerTurn }) => {\n if (!message.text) return;\n const mode = delivery === \"steer\" ? \"steer\" : \"followUp\";\n const triggers = delivery === \"nextTurn\" ? false : triggerTurn;\n void this.#queueDelivery(\n { id: actor.id, name: actor.name, kind: \"actor\" },\n message.text,\n mode,\n triggers,\n message.data,\n ).catch(() => undefined);\n },\n {\n actorRoot: config.actorRoot,\n persistent: true,\n canManageActor,\n lineageAlive,\n claimResidency: \"durable\",\n rootId: config.rootId,\n meshCursorPath: path.join(config.residencyRoot, \"actor-mesh-cursor.json\"),\n retention: config.retention,\n },\n );\n this.lifecycle = new LifecycleBroker(\n this.mesh,\n this.identity,\n this.participants,\n {\n enabled: true,\n pollMs: config.mesh.actorPollMs,\n maxReadEvents: config.mesh.maxReadEvents,\n },\n (subscription, event) => this.#deliverLifecycle(subscription, event),\n );\n }\n\n async start(): Promise<void> {\n if (this.#started) return;\n this.#acquireLock();\n this.#started = true;\n fs.mkdirSync(this.#requestsPath, { recursive: true, mode: 0o700 });\n fs.mkdirSync(this.#processingPath, { recursive: true, mode: 0o700 });\n fs.mkdirSync(this.#responsesPath, { recursive: true, mode: 0o700 });\n fs.mkdirSync(this.#agentsPath, { recursive: true, mode: 0o700 });\n this.#recoverInterruptedRequests();\n const firstSeenAgents = new Map<string, number>();\n this.participants.registerSource(() =>\n agentParticipantRecords(\n this.agents.listForUi(),\n this.config.rootId,\n this.hostId,\n this.identity.id,\n this.config.rootId,\n firstSeenAgents,\n ),\n );\n this.participants.registerSource(() =>\n this.actors.listOwned().map((actor) =>\n actorParticipantRecord(\n actor,\n this.config.rootId,\n this.hostId,\n this.identity.id,\n this.config.rootId,\n ),\n ),\n );\n this.agents.subscribeUi(() => this.participants.scheduleRefresh());\n this.actors.subscribe(() => this.participants.scheduleRefresh());\n this.control.start((command, from, signal) =>\n this.#acceptControl(command, from, signal));\n await this.participants.start().catch(() => undefined);\n this.lifecycle.start();\n this.#requestTimer = setInterval(\n () => void this.#pollRequests().catch(() => undefined),\n REQUEST_POLL_MS,\n );\n const now = Date.now();\n const owner: ResidentHostOwner = {\n format: RESIDENT_HOST_FORMAT,\n hostId: this.hostId,\n pid: process.pid,\n token: this.#token,\n startedAt: now,\n readyAt: now,\n };\n atomicWrite(this.#ownerPath, owner);\n fs.rmSync(this.#errorPath, { force: true });\n await this.#pollRequests();\n }\n\n async close(): Promise<void> {\n if (this.#closed) return;\n this.#closed = true;\n if (this.#requestTimer) clearInterval(this.#requestTimer);\n this.#requestTimer = undefined;\n while (this.#pollingRequests) await delay(10);\n await this.participants.quiesce().catch(() => undefined);\n await this.lifecycle.close().catch(() => undefined);\n await this.control.close().catch(() => undefined);\n try {\n await this.actors.close();\n } finally {\n await this.agents.close();\n await this.participants.close().catch(() => undefined);\n this.#releaseLock();\n }\n }\n\n async #acceptControl(\n command: FabricControlCommand,\n _from: MeshIdentity,\n signal?: AbortSignal,\n ): Promise<FabricControlAcceptance> {\n if (command.operation === \"cancel\") {\n return { accepted: false, error: \"Cancel commands are handled by the control plane\" };\n }\n if (command.operation === \"stop\") {\n try {\n await this.agents.stop(command.targetId);\n this.participants.scheduleRefresh();\n return { accepted: true, messageId: command.commandId };\n } catch (error) {\n if (!(error instanceof Error && /Unknown Fabric agent/.test(error.message))) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n try {\n if (!this.actors.owns(command.targetId)) {\n return { accepted: false, error: `Resident host does not own ${command.targetId}` };\n }\n await this.actors.stop(command.targetId);\n this.participants.scheduleRefresh();\n return { accepted: true, messageId: command.commandId };\n } catch (error) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n const message = command.message?.trim();\n if (!message) return { accepted: false, error: \"Fabric control message must not be empty\" };\n if (command.operation === \"ask\") {\n try {\n if (!this.actors.owns(command.targetId)) {\n return { accepted: false, error: `Resident host does not own ${command.targetId}` };\n }\n const result = await this.actors.ask(\n command.targetId,\n message,\n command.data,\n signal,\n command.binding !== undefined ? { binding: command.binding } : {},\n );\n return { accepted: true, messageId: result.id, result };\n } catch (error) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n try {\n this.agents.status(command.targetId);\n const result = command.operation === \"steer\"\n ? this.agents.steer(command.targetId, message, command.data)\n : this.agents.followUp(command.targetId, message, command.data);\n return { accepted: true, messageId: result.messageId };\n } catch (error) {\n if (!(error instanceof Error && /Unknown Fabric agent/.test(error.message))) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n try {\n if (!this.actors.owns(command.targetId)) {\n return { accepted: false, error: `Resident host does not own ${command.targetId}` };\n }\n const result = this.actors.tell(\n command.targetId,\n message,\n command.data,\n command.binding !== undefined ? { binding: command.binding } : {},\n );\n return { accepted: true, messageId: result.messageId };\n } catch (error) {\n return { accepted: false, error: errorMessage(error) };\n }\n }\n\n async #deliverLifecycle(\n subscription: FabricLifecycleSubscription,\n event: FabricLifecycleEvent,\n ): Promise<void> {\n const message = `Fabric lifecycle ${event.event} from ${event.source.name} (${event.source.id})${event.status ? ` with status ${event.status}` : \"\"}.`;\n if (subscription.to === this.config.rootId) {\n await this.#queueDelivery(\n lifecycleSourceIdentity(event.source),\n message,\n subscription.delivery,\n subscription.triggerTurn,\n event,\n );\n return;\n }\n try {\n this.agents.status(subscription.to);\n if (subscription.delivery === \"steer\") this.agents.steer(subscription.to, message, event);\n else this.agents.followUp(subscription.to, message, event);\n return;\n } catch (error) {\n if (!(error instanceof Error && /Unknown Fabric agent/.test(error.message))) throw error;\n }\n try {\n if (this.actors.owns(subscription.to)) {\n this.actors.tell(subscription.to, message, event);\n return;\n }\n } catch {\n // Route through the current remote owner below.\n }\n const target = this.participants.get(subscription.to);\n if (!target) throw new Error(`Unknown Fabric lifecycle target: ${subscription.to}`);\n await this.control.request(\n target.ownerHostId,\n target.id,\n subscription.delivery,\n { message, data: event, triggerTurn: subscription.triggerTurn },\n target.ownerIdentityId,\n );\n }\n\n async #queueDelivery(\n from: MeshIdentity,\n message: string,\n delivery: \"steer\" | \"followUp\",\n triggerTurn: boolean,\n data?: unknown,\n ): Promise<void> {\n const id = randomUUID();\n const record: ResidentDeliveryRecord = {\n format: RESIDENT_HOST_FORMAT,\n id,\n rootId: this.config.rootId,\n from,\n delivery,\n triggerTurn,\n message,\n ...(data === undefined ? {} : { data }),\n createdAt: Date.now(),\n };\n try {\n await this.mesh.put({\n key: `${this.#deliveryPrefix}${id}`,\n value: record,\n identity: this.identity,\n ifVersion: 0,\n });\n } catch {\n await this.mesh.put({\n key: `${this.#deliveryPrefix}${id}`,\n value: {\n ...record,\n message: message.slice(0, Math.max(1, this.config.mesh.eventContextChars)),\n data: { fabricTruncated: true },\n },\n identity: this.identity,\n ifVersion: 0,\n });\n }\n }\n\n async #pollRequests(): Promise<void> {\n if (this.#pollingRequests || this.#closed) return;\n this.#pollingRequests = true;\n try {\n let entries: string[];\n try {\n entries = fs.readdirSync(this.#requestsPath).filter((entry) => entry.endsWith(\".json\"));\n } catch {\n return;\n }\n for (const entry of entries.slice(0, 32)) {\n const source = path.join(this.#requestsPath, entry);\n const processing = path.join(this.#processingPath, entry);\n try {\n fs.renameSync(source, processing);\n } catch {\n continue;\n }\n await this.#processRequest(processing);\n }\n } finally {\n this.#pollingRequests = false;\n this.#checkIdle();\n }\n }\n\n #checkIdle(): void {\n const activeActor = this.actors\n .listOwned()\n .some((actor) => actor.residency === \"durable\" && actor.status !== \"stopped\");\n const activeAgent = this.agents\n .listForUi()\n .some((agent) => agent.status === \"queued\" || agent.status === \"running\");\n let pendingRequest = false;\n try {\n pendingRequest = fs.readdirSync(this.#requestsPath).some((entry) => entry.endsWith(\".json\"));\n } catch {\n // Missing request directory is empty.\n }\n if (activeActor || activeAgent || pendingRequest) {\n this.#idleSince = Date.now();\n return;\n }\n if (Date.now() - this.#idleSince >= IDLE_EXIT_MS) this.onIdle();\n }\n\n async #processRequest(filePath: string): Promise<void> {\n const command = readJson<ResidentCommand>(filePath);\n const requestId = command?.requestId ?? path.basename(filePath, \".json\");\n let response: ResidentCommandResponse;\n try {\n if (\n command?.format !== RESIDENT_HOST_FORMAT ||\n command.rootId !== this.config.rootId ||\n command.requestId !== requestId\n ) {\n throw new Error(\"Invalid Fabric residency request\");\n }\n if (command.operation === \"spawn\") {\n if (\n command.request.sessionSeed ||\n command.request.sessionFile ||\n command.request.actorId ||\n command.request.actorName ||\n command.request.meshRoot ||\n command.request.runnerSessionId ||\n command.request.systemPrompt ||\n command.request.images\n ) {\n throw new Error(\"Durable agents.spawn accepts only its public task and run settings\");\n }\n const handle = await this.agents.spawn({ ...command.request, residency: \"durable\" });\n this.agents.detachSignal(handle.id);\n const runDirectory = this.agents.runDirectory(handle.id);\n if (!runDirectory) throw new Error(`Resident agent ${handle.id} has no run directory`);\n const worktreeGitRoot = this.agents.worktreeGitRoot(handle.id);\n const metadata: ResidentAgentMetadata = {\n format: RESIDENT_HOST_FORMAT,\n rootId: this.config.rootId,\n id: handle.id,\n runDirectory,\n handle: { ...handle, residency: \"durable\" },\n ...(worktreeGitRoot ? { worktreeGitRoot } : {}),\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n atomicWrite(path.join(this.#agentsPath, `${handle.id}.json`), metadata);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n handle: metadata.handle,\n completedAt: Date.now(),\n };\n } else if (command.operation === \"foreground\") {\n this.agents.markForeground(command.id);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n completedAt: Date.now(),\n };\n } else if (command.operation === \"cleanup\") {\n await this.agents.wait(command.id);\n await this.agents.cleanup(command.id, command.deleteBranch);\n fs.rmSync(path.join(this.#agentsPath, `${command.id}.json`), { force: true });\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n completedAt: Date.now(),\n };\n } else if (command.operation === \"createActor\") {\n if (command.request.residency !== \"durable\") {\n throw new Error(\"Resident host createActor only supports durable residency\");\n }\n // This handler already runs inside the authoritative durable host.\n // Keep the new actor locally owned; ceding it here created a needless\n // self-transfer window that blocked the next recruitment request.\n const actor = await this.actors.create(command.request);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n actor: actor as FabricActorInfo,\n completedAt: Date.now(),\n };\n } else {\n if (!this.actors.owns(command.id)) {\n throw new Error(`Resident host does not own ${command.id}`);\n }\n await this.actors.remove(command.id);\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: true,\n completedAt: Date.now(),\n };\n }\n } catch (error) {\n response = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: false,\n error: errorMessage(error),\n completedAt: Date.now(),\n };\n }\n atomicWrite(path.join(this.#responsesPath, `${requestId}.json`), response);\n fs.rmSync(filePath, { force: true });\n this.participants.scheduleRefresh();\n }\n\n #recoverInterruptedRequests(): void {\n let entries: string[];\n try {\n entries = fs.readdirSync(this.#processingPath).filter((entry) => entry.endsWith(\".json\"));\n } catch {\n return;\n }\n for (const entry of entries) {\n const requestId = path.basename(entry, \".json\");\n const response: ResidentCommandResponse = {\n format: RESIDENT_HOST_FORMAT,\n requestId,\n ok: false,\n error: \"Fabric residency outcome is indeterminate after resident host restart\",\n completedAt: Date.now(),\n };\n atomicWrite(path.join(this.#responsesPath, entry), response);\n fs.rmSync(path.join(this.#processingPath, entry), { force: true });\n }\n }\n\n #acquireLock(): void {\n fs.mkdirSync(this.config.residencyRoot, { recursive: true, mode: 0o700 });\n const existing = readJson<ResidentHostOwner>(this.#ownerPath);\n if (existing && processAlive(existing.pid)) {\n throw new ResidentHostAlreadyRunning(`Fabric resident host is already running (${existing.pid})`);\n }\n try {\n const descriptor = fs.openSync(this.#lockPath, \"wx\", 0o600);\n fs.writeFileSync(descriptor, JSON.stringify({ token: this.#token, pid: process.pid }));\n fs.closeSync(descriptor);\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"EEXIST\") {\n const locked = readJson<{ pid?: unknown }>(this.#lockPath);\n if (typeof locked?.pid === \"number\" && processAlive(locked.pid)) {\n throw new ResidentHostAlreadyRunning(`Fabric resident host is starting (${locked.pid})`);\n }\n fs.rmSync(this.#lockPath, { force: true });\n const descriptor = fs.openSync(this.#lockPath, \"wx\", 0o600);\n fs.writeFileSync(descriptor, JSON.stringify({ token: this.#token, pid: process.pid }));\n fs.closeSync(descriptor);\n } else {\n throw error;\n }\n }\n }\n\n #releaseLock(): void {\n const lock = readJson<{ token?: unknown }>(this.#lockPath);\n if (lock?.token === this.#token) fs.rmSync(this.#lockPath, { force: true });\n const owner = readJson<ResidentHostOwner>(this.#ownerPath);\n if (owner?.token === this.#token) fs.rmSync(this.#ownerPath, { force: true });\n }\n}\n\nconst runResidentHost = async (\n config: ResidentHostConfig,\n signal?: AbortSignal,\n): Promise<void> => {\n let finishIdle: (() => void) | undefined;\n const idle = new Promise<void>((resolve) => {\n finishIdle = resolve;\n });\n const host = new ResidentHost(config, () => finishIdle?.());\n await host.start();\n if (signal?.aborted) {\n await host.close();\n return;\n }\n await Promise.race([\n idle,\n new Promise<void>((resolve) => {\n const finish = (): void => resolve();\n signal?.addEventListener(\"abort\", finish, { once: true });\n process.once(\"SIGTERM\", finish);\n process.once(\"SIGINT\", finish);\n }),\n ]);\n await host.close();\n};\n\nexport const runResidentHostFromConfigPath = async (\n configPath: string,\n signal?: AbortSignal,\n): Promise<void> => {\n let config: ResidentHostConfig | undefined;\n try {\n config = validateResidentHostConfig(readJson<unknown>(configPath), configPath);\n await runResidentHost(config, signal);\n } catch (error) {\n if (error instanceof ResidentHostAlreadyRunning) return;\n const residencyRoot = config?.residencyRoot ?? path.dirname(configPath);\n try {\n atomicWrite(path.join(residencyRoot, \"error.json\"), {\n error: errorMessage(error),\n occurredAt: Date.now(),\n });\n } catch {\n // Startup diagnostics are best-effort.\n }\n throw error;\n }\n};\n\nconst isMain = process.argv[1] && path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url));\nif (isMain) {\n const configPath = parseResidentHostConfigPath(process.argv);\n try {\n await runResidentHostFromConfigPath(configPath);\n } catch {\n process.exitCode = 1;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -14,7 +14,7 @@ import {
14
14
  scriptSpawnArgs,
15
15
  spawnDetached,
16
16
  workerCommand
17
- } from "./chunk-GLEX5U5Q.js";
17
+ } from "./chunk-QWIKS6CT.js";
18
18
  import {
19
19
  peerLabelPrefix,
20
20
  writeHandoffSession
@@ -2727,7 +2727,7 @@ var MAX_PREDICATE_SOURCE_CHARS = 16e3;
2727
2727
  var PREDICATE_TIMEOUT_MS = 100;
2728
2728
  var PREDICATE_MEMORY_BYTES = 16 * 1024 * 1024;
2729
2729
  var runtimeInstance;
2730
- var runtime = async () => runtimeInstance ??= new (await import("./quickjs-runtime-CHQOPOWA.js")).QuickJsRuntime();
2730
+ var runtime = async () => runtimeInstance ??= new (await import("./quickjs-runtime-6LAQLSB4.js")).QuickJsRuntime();
2731
2731
  var predicateProgram = (source, invoke) => [
2732
2732
  `const predicate = (${source});`,
2733
2733
  'if (typeof predicate !== "function") throw new TypeError("validWhile must be a function");',
@@ -6245,4 +6245,4 @@ export {
6245
6245
  agentParticipantRecords,
6246
6246
  actorParticipantRecord
6247
6247
  };
6248
- //# sourceMappingURL=chunk-EY74VMKR.js.map
6248
+ //# sourceMappingURL=chunk-F2GKEXGI.js.map
@@ -35,8 +35,8 @@ var processIsAlive = (pid) => {
35
35
  try {
36
36
  process.kill(pid, 0);
37
37
  return true;
38
- } catch {
39
- return false;
38
+ } catch (error) {
39
+ return error instanceof Error && "code" in error && error.code === "EPERM";
40
40
  }
41
41
  };
42
42
  var GENERIC_RUNTIME = /^(node|bun)(\.exe)?$/;
@@ -126,4 +126,4 @@ export {
126
126
  workerCommand,
127
127
  spawnDetached
128
128
  };
129
- //# sourceMappingURL=chunk-GLEX5U5Q.js.map
129
+ //# sourceMappingURL=chunk-QWIKS6CT.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/agents/transports/process-utils.ts"],
4
+ "sourcesContent": ["import { execFile, spawn } from \"node:child_process\";\nimport path from \"node:path\";\n\nexport interface ExecFileResult {\n stdout: string;\n stderr: string;\n}\n\nexport const executeFile = (\n command: string,\n args: string[],\n options: { cwd?: string; timeoutMs?: number } = {},\n): Promise<ExecFileResult> =>\n new Promise((resolve, reject) => {\n execFile(\n command,\n args,\n {\n encoding: \"utf8\",\n maxBuffer: 10 * 1024 * 1024,\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.timeoutMs ? { timeout: options.timeoutMs } : {}),\n },\n (error, stdout, stderr) => {\n if (error) {\n Object.assign(error, { stdout, stderr });\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n\nexport const commandAvailable = async (command: string): Promise<boolean> => {\n try {\n await executeFile(\"sh\", [\"-lc\", `command -v ${shellQuote(command)}`], { timeoutMs: 2_000 });\n return true;\n } catch {\n return false;\n }\n};\n\nconst shellQuote = (value: string): string => `'${value.replaceAll(\"'\", `'\"'\"'`)}'`;\n\nexport const processIsAlive = (pid: number): boolean => {\n if (!Number.isSafeInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n // On Windows, EPERM means the process exists but cannot be opened for\n // signaling; only ESRCH (or other errors) mean it is gone.\n return error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n};\n\nconst GENERIC_RUNTIME = /^(node|bun)(\\.exe)?$/;\n\nexport interface ScriptRuntimeOptions {\n execPath?: string;\n env?: NodeJS.ProcessEnv;\n /** Require Node.js specifically; used by the Node-process executor whose\n * `--eval`/`--input-type=module` flags are Node-only. */\n requireNode?: boolean;\n /** Require Bun specifically; used by the Bun-process executor. */\n requireBun?: boolean;\n}\n\nconst runtimeOverride = (env: NodeJS.ProcessEnv): string | undefined => {\n const value = env.PI_FABRIC_NODE_BINARY;\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n};\n\nconst isGenericRuntime = (execPath: string, requireNode: boolean, requireBun = false): boolean => {\n const name = path.basename(execPath).toLowerCase();\n return GENERIC_RUNTIME.test(name)\n && (!requireNode || name.startsWith(\"node\"))\n && (!requireBun || name.startsWith(\"bun\"));\n};\n\nconst missingRuntimeError = (execPath: string, requireNode: boolean, requireBun = false): Error => {\n const required = requireNode\n ? \"a Node.js runtime\"\n : requireBun\n ? \"a Bun runtime\"\n : \"a Node.js or Bun runtime\";\n const shape = requireNode ? \"(not node)\" : requireBun ? \"(not bun)\" : \"(not node/bun)\";\n return new Error(\n `Fabric requires ${required} to launch a JavaScript worker, but ` +\n `process.execPath is ${execPath} ${shape} and PI_FABRIC_NODE_BINARY is unset. ` +\n \"Install Node.js or Bun, or set PI_FABRIC_NODE_BINARY to the runtime binary.\",\n );\n};\n\n// Transports launch the worker (a .js module) as `<runtime> worker.js args`.\n// Under the new Bun-compiled pi binary, process.execPath is the pi executable,\n// not node/bun, so it cannot run an arbitrary script. Resolve a real runtime\n// before spawning: reuse process.execPath when it IS node/bun, else fall back\n// to PI_FABRIC_NODE_BINARY, then the first node/bun on PATH.\nconst resolveScriptRuntimeUncached = async (options: ScriptRuntimeOptions = {}): Promise<string> => {\n const execPath = options.execPath ?? process.execPath;\n const env = options.env ?? process.env;\n const requireNode = options.requireNode === true;\n const requireBun = options.requireBun === true;\n if (isGenericRuntime(execPath, requireNode, requireBun)) return execPath;\n const override = runtimeOverride(env);\n if (override) return override;\n for (const candidate of requireNode ? [\"node\"] : requireBun ? [\"bun\"] : [\"node\", \"bun\"]) {\n if (await commandAvailable(candidate)) return candidate;\n }\n throw missingRuntimeError(execPath, requireNode, requireBun);\n};\n\nlet cachedDefaultRuntime: string | undefined;\nexport const resolveScriptRuntime = async (options?: ScriptRuntimeOptions): Promise<string> => {\n if (\n options &&\n (options.execPath !== undefined ||\n options.env !== undefined ||\n options.requireNode !== undefined ||\n options.requireBun !== undefined)\n ) {\n return resolveScriptRuntimeUncached(options);\n }\n if (cachedDefaultRuntime) return cachedDefaultRuntime;\n cachedDefaultRuntime = await resolveScriptRuntimeUncached();\n return cachedDefaultRuntime;\n};\n\n// Synchronous variant for callers that already run under a real runtime (e.g.\n// the worker, which a transport always launches via the resolved runtime). No\n// PATH lookup; throws if the current process is the bundled binary with no\n// override set.\nexport const resolveScriptRuntimeSync = (options: ScriptRuntimeOptions = {}): string => {\n const execPath = options.execPath ?? process.execPath;\n const env = options.env ?? process.env;\n const requireNode = options.requireNode === true;\n const requireBun = options.requireBun === true;\n if (isGenericRuntime(execPath, requireNode, requireBun)) return execPath;\n const override = runtimeOverride(env);\n if (override) return override;\n throw missingRuntimeError(execPath, requireNode, requireBun);\n};\n\nexport const scriptSpawnArgs = async (\n workerPath: string,\n workerArguments: readonly string[],\n options?: ScriptRuntimeOptions,\n): Promise<string[]> => {\n const runtime = await resolveScriptRuntime(options);\n return [runtime, workerPath, ...workerArguments];\n};\n\nexport const workerCommand = async (\n workerPath: string,\n workerArguments: string[],\n): Promise<string> =>\n (await scriptSpawnArgs(workerPath, workerArguments)).map(shellQuote).join(\" \");\n\nexport const spawnDetached = async (\n workerPath: string,\n workerArguments: string[],\n cwd: string,\n): Promise<{ pid: number; stop(): Promise<void>; isAlive(): Promise<boolean> }> => {\n const runtime = await resolveScriptRuntime();\n const child = spawn(runtime, [workerPath, ...workerArguments], {\n cwd,\n detached: process.platform !== \"win32\",\n stdio: \"ignore\",\n });\n if (!child.pid) throw new Error(\"Failed to launch Fabric worker process\");\n const pid = child.pid;\n child.unref();\n return {\n pid,\n async stop() {\n try {\n process.kill(process.platform === \"win32\" ? pid : -pid, \"SIGTERM\");\n } catch { /* process group already exited */ }\n },\n async isAlive() {\n return processIsAlive(pid);\n },\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -473,10 +473,10 @@ globalThis["\u03C0"] = new Proxy(__piStrings, {
473
473
  }
474
474
  const provided = Object.keys(target);
475
475
  throw new Error(
476
- "\u03C0." + name + " is not defined. \u03C0 only exposes keys from the fabric_exec strings parameter" +
476
+ "\u03C0." + name + " is not defined. \u03C0 only exposes keys from the fabric_exec payloads parameter" +
477
477
  (provided.length ? " (provided: " + provided.join(", ") + ")" : " (none provided)") +
478
- ". Pass strings: { " + name + ": '...' } to use \u03C0." + name + "." +
479
- " For large or quote-heavy content, keep it in top-level strings and reference \u03C0." + name + " instead of escaping it inside code."
478
+ ". Pass payloads: { " + name + ": '...' } to use \u03C0." + name + "." +
479
+ " For large or quote-heavy content, keep it in top-level payloads and reference \u03C0." + name + " instead of escaping it inside code."
480
480
  );
481
481
  },
482
482
  ownKeys(target) { return Reflect.ownKeys(target); },
@@ -859,7 +859,7 @@ var QuickJsRuntime = class {
859
859
  value: void 0,
860
860
  logs: [],
861
861
  terminationReason: "runtime_error",
862
- error: "Pre-execution check: " + missingKeys.map((key) => "\u03C0." + key).join(", ") + (missingKeys.length === 1 ? " is referenced in code but its key is missing from the strings parameter" : " are referenced in code but their keys are missing from the strings parameter") + (provided.length ? " (provided: " + provided.join(", ") + ")" : " (none provided)") + ". Add strings: { " + missingKeys.join(": '...', ") + ": '...' } to the fabric_exec arguments, then reference the value as \u03C0.<key>. For large or quote-heavy content, keep it in top-level strings and reference \u03C0.<key> instead of escaping it inside code."
862
+ error: "Pre-execution check: " + missingKeys.map((key) => "\u03C0." + key).join(", ") + (missingKeys.length === 1 ? " is referenced in code but its key is missing from the payloads parameter" : " are referenced in code but their keys are missing from the payloads parameter") + (provided.length ? " (provided: " + provided.join(", ") + ")" : " (none provided)") + ". Add payloads: { " + missingKeys.join(": '...', ") + ": '...' } to the fabric_exec arguments, then reference the value as \u03C0.<key>. For large or quote-heavy content, keep it in top-level payloads and reference \u03C0.<key> instead of escaping it inside code."
863
863
  };
864
864
  }
865
865
  if (!Number.isSafeInteger(options.memoryLimitBytes) || options.memoryLimitBytes < 1 || options.memoryLimitBytes > 4294967295) {
@@ -1154,4 +1154,4 @@ export {
1154
1154
  GUEST_SETUP,
1155
1155
  QuickJsRuntime
1156
1156
  };
1157
- //# sourceMappingURL=chunk-ATX3EMPY.js.map
1157
+ //# sourceMappingURL=chunk-USMTYVXY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runtime/quickjs-runtime.ts", "../../src/runtime/guest-stack-map.ts"],
4
+ "sourcesContent": ["import releaseSyncVariant from \"@jitl/quickjs-singlefile-mjs-release-sync\";\nimport { newQuickJSWASMModuleFromVariant } from \"quickjs-emscripten-core\";\nimport { runAbortable, settleWithin } from \"../async-settlement.js\";\nimport { piBashExitMetadata } from \"../core/pi-bash-error.js\";\nimport { createGuestStackMap, remapGuestErrorText } from \"./guest-stack-map.js\";\nimport { transpileFabricCodeWithSourceMap } from \"./type-checker.js\";\n\nexport type FabricSandboxTerminationReason =\n | \"completed\"\n | \"runtime_error\"\n | \"timed_out\"\n | \"aborted\";\n\nexport interface FabricSandboxResult {\n value: unknown;\n logs: string[];\n terminationReason: FabricSandboxTerminationReason;\n error?: string;\n}\n\nexport interface FabricSandboxOptions {\n timeoutMs: number;\n memoryLimitBytes: number;\n maxLogChars?: number;\n strings?: Record<string, string>;\n tokenBudget?: number;\n signal?: AbortSignal;\n minimumTimeoutMsForHostCall?(\n ref: string,\n args: Record<string, unknown>,\n ): number | undefined;\n transpiledCode?: string;\n transpiledSourceMap?: string;\n}\n\nexport type FabricHostCall = (\n ref: string,\n args: Record<string, unknown>,\n signal: AbortSignal,\n) => Promise<unknown>;\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).\nconst PI_REF_PATTERN = /(?:^|[^\\w$.])\u03C0\\.([A-Za-z_$][\\w$]*)/g;\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 const missing: string[] = [];\n for (const match of code.matchAll(PI_REF_PATTERN)) {\n const key = match[1];\n if (key === undefined || key in provided) continue;\n if (!missing.includes(key)) missing.push(key);\n }\n return missing;\n};\n\nconst quickJsModule = (): Promise<QuickJsModule> => {\n quickJsModulePromise ??= newQuickJSWASMModuleFromVariant(releaseSyncVariant);\n return quickJsModulePromise;\n};\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 __piToolNames = [\"read\",\"bash\",\"edit\",\"write\",\"grep\",\"find\",\"ls\"];\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// tools is discovery + generic calls only. The proxy keeps the seven discovery\n// methods and turns a core-tool name (read/bash/edit/...) into an actionable\n// error pointing at pi.<name>, so a model that writes tools.read(...) learns\n// the fix in one turn instead of looping on \"tools.read is not a function\".\nglobalThis.tools = new Proxy(__toolsBase, {\n get(target, property) {\n if (property === \"then\" || typeof property === \"symbol\") return undefined;\n const name = String(property);\n if (__piToolNames.indexOf(name) >= 0) {\n return () => {\n throw new Error(\n \"tools.\" + name + \" is not available on the discovery API. tools is discovery + generic calls only (providers/catalog/list/search/describe/call/models). For the Pi core tool, call pi.\" + name + \"(args), e.g. pi.\" + name + \"({ ... }).\"\n );\n };\n }\n return target[property];\n },\n set() { return true; },\n deleteProperty() { return true; },\n});\nconst __piStringFields = { bash: \"command\", read: \"path\", ls: \"path\", grep: \"pattern\", find: \"pattern\" };\n// Per-tool key aliases. The runtime normalizes them to the canonical form\n// before the host validates args; unit-converting aliases are handled separately\n// in __normalizePiArgs. This lets a model that writes { query, regex, ... }\n// or { file } instead of { pattern } / { path } still succeeds on the first\n// call. Keep these in sync with the PiToolsApi overloads in guest-types.ts so\n// the type-checker accepts the same spellings it coercion-handles at runtime.\nconst __piArgAliases = {\n bash: {\n cmd: \"command\", shell: \"command\", cmdline: \"command\", script: \"command\",\n commandLine: \"command\",\n workdir: \"cwd\", directory: \"cwd\", workingDirectory: \"cwd\",\n },\n find: {\n query: \"pattern\", regex: \"pattern\", search: \"pattern\", name: \"pattern\",\n filename: \"pattern\", glob: \"pattern\", expression: \"pattern\", include: \"pattern\",\n max: \"limit\",\n },\n grep: {\n query: \"pattern\", regex: \"pattern\", search: \"pattern\", q: \"pattern\",\n expression: \"pattern\", text: \"pattern\",\n ic: \"ignoreCase\", caseInsensitive: \"ignoreCase\",\n globPattern: \"glob\",\n max: \"limit\", ctx: \"context\",\n },\n read: {\n file: \"path\", absolutePath: \"path\", file_path: \"path\", filePath: \"path\",\n filepath: \"path\", pathname: \"path\", target_file: \"path\", targetFile: \"path\",\n absolute_path: \"path\", fileAbsolutePath: \"path\",\n max: \"limit\", start: \"offset\",\n },\n ls: {\n dir: \"path\", file: \"path\", folder: \"path\", absolutePath: \"path\",\n file_path: \"path\", filePath: \"path\", filepath: \"path\", pathname: \"path\",\n target_file: \"path\", targetFile: \"path\", absolute_path: \"path\",\n fileAbsolutePath: \"path\", directory: \"path\", directoryPath: \"path\",\n max: \"limit\",\n },\n edit: {\n file: \"path\", absolutePath: \"path\", file_path: \"path\", filePath: \"path\",\n filepath: \"path\", pathname: \"path\", target_file: \"path\", targetFile: \"path\",\n absolute_path: \"path\", fileAbsolutePath: \"path\",\n old: \"oldText\", old_string: \"oldText\", oldString: \"oldText\",\n old_str: \"oldText\", oldStr: \"oldText\", from: \"oldText\",\n old_value: \"oldText\", old_text: \"oldText\", oldContent: \"oldText\",\n old_content: \"oldText\",\n new: \"newText\", replacement: \"newText\", new_string: \"newText\",\n newString: \"newText\", new_str: \"newText\", newStr: \"newText\",\n to: \"newText\", new_value: \"newText\", new_text: \"newText\",\n newContent: \"newText\", new_content: \"newText\",\n },\n write: {\n file: \"path\", absolutePath: \"path\", file_path: \"path\", filePath: \"path\",\n filepath: \"path\", pathname: \"path\", target_file: \"path\", targetFile: \"path\",\n absolute_path: \"path\", fileAbsolutePath: \"path\",\n contents: \"content\", body: \"content\", text: \"content\", data: \"content\",\n fileContent: \"content\",\n },\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// Models often pass numbers as strings (\"20\"); coerce the known numeric\n// option fields so the host schema sees a number. Non-numeric strings pass\n// through untouched and fail host validation exactly as before. Kept in sync\n// with the numeric optionals in the PiToolsApi overloads in guest-types.ts.\nconst __piNumericFields = {\n read: [\"offset\", \"limit\"],\n grep: [\"limit\", \"context\"],\n find: [\"limit\"],\n ls: [\"limit\"],\n bash: [\"timeout\"],\n};\nconst __piOptionalFields = {\n read: [\"offset\", \"limit\"],\n grep: [\"path\", \"glob\", \"ignoreCase\", \"literal\", \"context\", \"limit\"],\n find: [\"path\", \"limit\"],\n ls: [\"path\", \"limit\"],\n bash: [\"timeout\"],\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 = Object.assign({}, 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};\nconst __normalizePiArgs = (name, args) => {\n const field = __piStringFields[name];\n if (typeof args === \"string\" && field) return { [field]: args };\n if (args === null || typeof args !== \"object\" || Array.isArray(args)) return args;\n const aliases = __piArgAliases[name];\n let out = args;\n if (name === \"bash\" && \"timeoutMs\" in out) {\n out = Object.assign({}, args);\n if (!(\"timeout\" in out)) {\n const timeoutMs = out.timeoutMs;\n if (timeoutMs !== null && timeoutMs !== undefined) {\n out.timeout = Number.isFinite(Number(timeoutMs)) ? Number(timeoutMs) / 1000 : timeoutMs;\n }\n }\n delete out.timeoutMs;\n }\n // settle is a guest-only directive (settles nonzero exits instead of\n // rejecting); strip it so it never reaches the host/bash schema.\n if (name === \"bash\" && \"settle\" in out) {\n if (out === args) out = Object.assign({}, args);\n delete out.settle;\n }\n if (aliases) {\n for (const alias in aliases) {\n const canonical = aliases[alias];\n if (alias in out) {\n if (out === args) out = Object.assign({}, args);\n if (!(canonical in out)) out[canonical] = out[alias];\n delete out[alias];\n }\n }\n }\n const numerics = __piNumericFields[name];\n if (numerics) {\n for (const key of numerics) {\n const value = out[key];\n if (typeof value === \"string\" && value.trim() !== \"\" && Number.isFinite(Number(value))) {\n if (out === args) out = Object.assign({}, args);\n out[key] = Number(value);\n }\n }\n }\n const optionalFields = __piOptionalFields[name];\n if (optionalFields) {\n for (const key of optionalFields) {\n if (out[key] !== null && out[key] !== undefined) continue;\n if (!(key in out)) continue;\n if (out === args) out = Object.assign({}, args);\n delete out[key];\n }\n }\n if (name === \"edit\" && Array.isArray(out.edits)) {\n let changed = false;\n const editAliases = __piArgAliases.edit;\n const edits = out.edits.map((entry) => {\n if (entry === null || typeof entry !== \"object\" || Array.isArray(entry)) return entry;\n let edit = entry;\n for (const alias in editAliases) {\n const canonical = editAliases[alias];\n if (canonical !== \"oldText\" && canonical !== \"newText\") continue;\n if (!(alias in edit)) continue;\n if (edit === entry) edit = Object.assign({}, entry);\n if (!(canonical in edit)) edit[canonical] = edit[alias];\n delete edit[alias];\n changed = true;\n }\n return edit;\n });\n if (changed) {\n if (out === args) out = Object.assign({}, args);\n out.edits = edits;\n }\n }\n if (name === \"edit\" && !Array.isArray(out.edits) && (\"oldText\" in out || \"newText\" in out)) {\n if (out === args) out = Object.assign({}, args);\n const edit = {};\n if (\"oldText\" in out) edit.oldText = out.oldText;\n if (\"newText\" in out) edit.newText = out.newText;\n out.edits = [edit];\n delete out.oldText;\n delete out.newText;\n }\n return out;\n};\n// bash/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, 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 \"(...). bash rejects 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 // bash rejects on an ordinary nonzero exit; settle:true returns\n // {ok:false, exitCode, ...} instead (opt-in). Other failures still reject.\n const settle = name === \"bash\" &&\n typeof args === \"object\" && args !== null && args.settle === true;\n const call = __call(\"pi.\" + name, __normalizePiArgs(name, args));\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 __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 __providerProxy = (provider) => new Proxy({}, {\n get(_target, property) {\n if (property === \"then\" || typeof property === \"symbol\") return undefined;\n return (args = {}) => __call(provider + \".\" + String(property), args);\n },\n});\nglobalThis.extensions = __providerProxy(\"extensions\");\nglobalThis.memory = __providerProxy(\"memory\");\nglobalThis.state = __providerProxy(\"state\");\nglobalThis.schema = __providerProxy(\"schema\");\nglobalThis.components = __providerProxy(\"components\");\nglobalThis.compact = __providerProxy(\"compact\");\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 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 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 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 setEvents: (args) => __call(\"agents.setEvents\", 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 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});\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\") {\n throw new Error(\"rlm.query requires the Pi runner because recursive Fabric is unavailable in Claude Code\");\n }\n return __budgetedRun({ ...args, runner: \"pi\", 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 });\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 (\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 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 (Date.now() <= executionDeadlineAt) return false;\n interruptedByDeadline = true;\n return true;\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 runtime.executePendingJobs();\n };\n\n const timeoutMessage = (): string =>\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 if (timeout) clearTimeout(timeout);\n timeout = setTimeout(expireDeadline, 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 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 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 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 runtime.executePendingJobs();\n }, ms);\n timer.unref?.();\n pendingTimers.add(timer);\n void promise.settled.then(() => pendingTimers.delete(timer));\n return promise.handle;\n }\n const task = runAbortable(hostAbortController.signal, () =>\n hostCall(reference, args, hostAbortController.signal),\n )\n .then((value) => {\n if (closing || promise.alive === false) return;\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\" ? piBashExitMetadata(error) : 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) runtime.executePendingJobs();\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 const setupResult = context.evalCode(GUEST_SETUP, \"pi-fabric-setup.js\");\n if (setupResult.error) {\n const deadlineExceeded = interruptedByDeadline || 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([__piFabricMain(), globalThis.__fabricExecutionGate])`;\n const evaluation = context.evalCode(wrappedCode, \"pi-fabric-guest.js\");\n runtime.executePendingJobs();\n if (evaluation.error) {\n const deadlineExceeded = interruptedByDeadline || 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 runtime.executePendingJobs();\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 || 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 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 const value = context.dump(resolution.value);\n resolution.value.dispose();\n return { value, logs, terminationReason: \"completed\" };\n } catch (error) {\n const deadlineExceeded = timedOut || interruptedByDeadline || 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 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 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 runtime.executePendingJobs();\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 runtime.executePendingJobs();\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 runtime.executePendingJobs();\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"],
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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
6
+ "names": ["value"]
7
+ }
@@ -76,14 +76,14 @@ import {
76
76
  resolveAgentCwd,
77
77
  resolvePiBinary,
78
78
  validateAgentCwdRequest
79
- } from "./chunk-EY74VMKR.js";
79
+ } from "./chunk-F2GKEXGI.js";
80
80
  import "./chunk-PM5I335G.js";
81
81
  import "./chunk-VPPIJRNZ.js";
82
82
  import {
83
83
  executeFile,
84
84
  processIsAlive,
85
85
  spawnDetached
86
- } from "./chunk-GLEX5U5Q.js";
86
+ } from "./chunk-QWIKS6CT.js";
87
87
  import {
88
88
  checkedHandoffCompaction
89
89
  } from "./chunk-FL52NCFS.js";
@@ -2739,8 +2739,8 @@ var codeUsesOrchestration = (code) => ORCHESTRATION_RE.test(code);
2739
2739
  // src/execution-service.ts
2740
2740
  var runtimeDependencies;
2741
2741
  var loadRuntimeDependencies = () => runtimeDependencies ??= Promise.all([
2742
- import("./quickjs-runtime-CHQOPOWA.js"),
2743
- import("./node-process-runtime-ZJVCMM4O.js"),
2742
+ import("./quickjs-runtime-6LAQLSB4.js"),
2743
+ import("./node-process-runtime-ITTLVGWY.js"),
2744
2744
  import("./type-checker-NTAWUHJL.js"),
2745
2745
  import("./guest-types-2P2LKCZE.js"),
2746
2746
  import("./dynamic-guest-types-7ZQD4IZT.js"),
@@ -4470,7 +4470,7 @@ import fs3 from "node:fs";
4470
4470
  import os from "node:os";
4471
4471
  import path4 from "node:path";
4472
4472
  import { fileURLToPath } from "node:url";
4473
- var STARTUP_TIMEOUT_MS = 1e4;
4473
+ var STARTUP_TIMEOUT_MS = 3e4;
4474
4474
  var COMMAND_TIMEOUT_MS = 3e4;
4475
4475
  var STATUS_POLL_MS = 100;
4476
4476
  var AGENT_ID_PATTERN = /^[a-f0-9]{32}$/;
@@ -4585,7 +4585,22 @@ var ResidencyClient = class {
4585
4585
  }
4586
4586
  await delay(STATUS_POLL_MS);
4587
4587
  }
4588
- throw new Error(`Timed out starting Fabric resident host ${this.hostId}`);
4588
+ const readIfPresent = (name) => {
4589
+ try {
4590
+ return fs3.readFileSync(path4.join(this.options.config.residencyRoot, name), "utf8").trim();
4591
+ } catch {
4592
+ return "";
4593
+ }
4594
+ };
4595
+ const childOutput = readIfPresent("child-stderr.log");
4596
+ const launcherLog = readIfPresent("launcher.log").split("\n").slice(-6).join("\n");
4597
+ const ownerState = readIfPresent("owner.json").slice(0, 300);
4598
+ const diagnostics = [
4599
+ childOutput ? `Child output: ${childOutput.slice(-500)}` : "",
4600
+ launcherLog ? `Launcher log: ${launcherLog}` : "",
4601
+ ownerState ? `Owner state: ${ownerState}` : "Owner state: absent"
4602
+ ].filter(Boolean).join(" | ");
4603
+ throw new Error(`Timed out starting Fabric resident host ${this.hostId}. ${diagnostics}`);
4589
4604
  }
4590
4605
  async ensureActor(id) {
4591
4606
  await this.ensureHost();
@@ -12232,4 +12247,4 @@ var deepAssign = (target, source) => {
12232
12247
  export {
12233
12248
  FabricRuntimeState
12234
12249
  };
12235
- //# sourceMappingURL=fabric-runtime-state-MCH72UE2.js.map
12250
+ //# sourceMappingURL=fabric-runtime-state-FBAJTXB2.js.map