@bastani/atomic 0.9.41 → 0.9.42-alpha.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 (270) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +13 -0
  3. package/dist/builtin/intercom/README.md +7 -3
  4. package/dist/builtin/intercom/broker/broker-status.ts +48 -0
  5. package/dist/builtin/intercom/broker/broker.ts +90 -9
  6. package/dist/builtin/intercom/broker/client.ts +112 -12
  7. package/dist/builtin/intercom/broker/control.ts +225 -0
  8. package/dist/builtin/intercom/broker/multinode-router.ts +32 -39
  9. package/dist/builtin/intercom/broker/paths.ts +4 -0
  10. package/dist/builtin/intercom/broker/pending-send-registry.ts +27 -5
  11. package/dist/builtin/intercom/broker/shared-storage-setting.ts +60 -0
  12. package/dist/builtin/intercom/broker/spawn.ts +13 -4
  13. package/dist/builtin/intercom/broker/sql-lease-store.ts +23 -0
  14. package/dist/builtin/intercom/broker/watchdog.ts +105 -0
  15. package/dist/builtin/intercom/index.bundle.mjs +200 -22
  16. package/dist/builtin/intercom/package.json +1 -1
  17. package/dist/builtin/intercom/types.ts +34 -2
  18. package/dist/builtin/mcp/package.json +1 -1
  19. package/dist/builtin/subagents/package.json +1 -1
  20. package/dist/builtin/subagents/src/extension/index.bundle.mjs +1 -0
  21. package/dist/builtin/web-access/package.json +1 -1
  22. package/dist/builtin/workflows/CHANGELOG.md +12 -0
  23. package/dist/builtin/workflows/README.md +10 -0
  24. package/dist/builtin/workflows/builtin/{chunk-txbc93t6.js → chunk-3s95f7ry.js} +1 -1
  25. package/dist/builtin/workflows/builtin/{chunk-n2gkzkty.js → chunk-edhf30ef.js} +1 -1
  26. package/dist/builtin/workflows/builtin/{chunk-8x61e0s7.js → chunk-frqxd4d1.js} +18 -9
  27. package/dist/builtin/workflows/builtin/goal.js +2 -2
  28. package/dist/builtin/workflows/builtin/index.js +3 -3
  29. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  30. package/dist/builtin/workflows/package.json +6 -1
  31. package/dist/builtin/workflows/src/authoring.d.ts +3 -1
  32. package/dist/builtin/workflows/src/durable/journal/internal.d.ts +13 -0
  33. package/dist/builtin/workflows/src/durable/journal/resolution.d.ts +2 -0
  34. package/dist/builtin/workflows/src/durable/journal/sql-run-journal.d.ts +1 -0
  35. package/dist/builtin/workflows/src/extension/index.bundle.mjs +88554 -82820
  36. package/dist/builtin/workflows/src/extension/local-worker-entry.mjs +72635 -0
  37. package/dist/builtin/workflows/src/index.js +53824 -5907
  38. package/dist/builtin/workflows/src/local-worker-entry.mjs +72635 -0
  39. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +7 -0
  40. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +2 -0
  41. package/dist/builtin/workflows/src/workers/public-options.d.ts +31 -0
  42. package/dist/bun/app-host-modules.d.ts +9 -0
  43. package/dist/bun/app-host-modules.d.ts.map +1 -0
  44. package/dist/bun/app-host-modules.js +10 -0
  45. package/dist/bun/app-host-modules.js.map +1 -0
  46. package/dist/bun/cli.d.ts +3 -1
  47. package/dist/bun/cli.d.ts.map +1 -1
  48. package/dist/bun/cli.js +15 -1
  49. package/dist/bun/cli.js.map +1 -1
  50. package/dist/bun/internal-intercom-broker.d.ts +17 -0
  51. package/dist/bun/internal-intercom-broker.d.ts.map +1 -1
  52. package/dist/bun/internal-intercom-broker.js +29 -0
  53. package/dist/bun/internal-intercom-broker.js.map +1 -1
  54. package/dist/bun/internal-workflow-worker.d.ts +4 -0
  55. package/dist/bun/internal-workflow-worker.d.ts.map +1 -0
  56. package/dist/bun/internal-workflow-worker.js +37 -0
  57. package/dist/bun/internal-workflow-worker.js.map +1 -0
  58. package/dist/bun/split-loader.js +10 -2
  59. package/dist/bun/split-loader.js.map +1 -1
  60. package/dist/cli/args.d.ts.map +1 -1
  61. package/dist/cli/args.js +3 -1
  62. package/dist/cli/args.js.map +1 -1
  63. package/dist/cli/intercom-command.d.ts +15 -0
  64. package/dist/cli/intercom-command.d.ts.map +1 -0
  65. package/dist/cli/intercom-command.js +87 -0
  66. package/dist/cli/intercom-command.js.map +1 -0
  67. package/dist/cli/storage-command.d.ts +39 -0
  68. package/dist/cli/storage-command.d.ts.map +1 -0
  69. package/dist/cli/storage-command.js +367 -0
  70. package/dist/cli/storage-command.js.map +1 -0
  71. package/dist/core/agent-session-events.d.ts.map +1 -1
  72. package/dist/core/agent-session-events.js +5 -1
  73. package/dist/core/agent-session-events.js.map +1 -1
  74. package/dist/core/agent-session-methods.d.ts +1 -0
  75. package/dist/core/agent-session-methods.d.ts.map +1 -1
  76. package/dist/core/agent-session-methods.js.map +1 -1
  77. package/dist/core/agent-session-tasks.d.ts.map +1 -1
  78. package/dist/core/agent-session-tasks.js +1 -0
  79. package/dist/core/agent-session-tasks.js.map +1 -1
  80. package/dist/core/agent-session-types.d.ts +1 -0
  81. package/dist/core/agent-session-types.d.ts.map +1 -1
  82. package/dist/core/agent-session-types.js.map +1 -1
  83. package/dist/core/agent-session.d.ts +1 -0
  84. package/dist/core/agent-session.d.ts.map +1 -1
  85. package/dist/core/agent-session.js +2 -0
  86. package/dist/core/agent-session.js.map +1 -1
  87. package/dist/core/builtin-install-layout.d.ts +6 -0
  88. package/dist/core/builtin-install-layout.d.ts.map +1 -1
  89. package/dist/core/builtin-install-layout.js +9 -0
  90. package/dist/core/builtin-install-layout.js.map +1 -1
  91. package/dist/core/child-session-options.d.ts.map +1 -1
  92. package/dist/core/child-session-options.js +3 -0
  93. package/dist/core/child-session-options.js.map +1 -1
  94. package/dist/core/exec.js +2 -2
  95. package/dist/core/exec.js.map +1 -1
  96. package/dist/core/export-html/template.css +9 -0
  97. package/dist/core/export-html/template.js +165 -45
  98. package/dist/core/extensions/loader-host-modules.d.ts +6 -0
  99. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
  100. package/dist/core/extensions/loader-host-modules.js +12 -1
  101. package/dist/core/extensions/loader-host-modules.js.map +1 -1
  102. package/dist/core/extensions/loader-virtual-modules.d.ts +6 -0
  103. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  104. package/dist/core/extensions/loader-virtual-modules.js +18 -0
  105. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  106. package/dist/core/extensions/message-types.d.ts +4 -0
  107. package/dist/core/extensions/message-types.d.ts.map +1 -1
  108. package/dist/core/extensions/message-types.js.map +1 -1
  109. package/dist/core/fast-model-routing-transport.d.ts.map +1 -1
  110. package/dist/core/fast-model-routing-transport.js +5 -1
  111. package/dist/core/fast-model-routing-transport.js.map +1 -1
  112. package/dist/core/intercom-broker-control.d.ts +67 -0
  113. package/dist/core/intercom-broker-control.d.ts.map +1 -0
  114. package/dist/core/intercom-broker-control.js +17 -0
  115. package/dist/core/intercom-broker-control.js.map +1 -0
  116. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  117. package/dist/core/model-runtime-streaming.js +38 -1
  118. package/dist/core/model-runtime-streaming.js.map +1 -1
  119. package/dist/core/package-manager-git.d.ts +2 -2
  120. package/dist/core/package-manager-git.d.ts.map +1 -1
  121. package/dist/core/package-manager-git.js.map +1 -1
  122. package/dist/core/package-manager-manifest.d.ts.map +1 -1
  123. package/dist/core/package-manager-manifest.js +9 -1
  124. package/dist/core/package-manager-manifest.js.map +1 -1
  125. package/dist/core/package-manager-npm.d.ts +2 -2
  126. package/dist/core/package-manager-npm.d.ts.map +1 -1
  127. package/dist/core/package-manager-npm.js.map +1 -1
  128. package/dist/core/package-manager-paths.d.ts +7 -7
  129. package/dist/core/package-manager-paths.d.ts.map +1 -1
  130. package/dist/core/package-manager-paths.js.map +1 -1
  131. package/dist/core/package-manager-storage-adapters.d.ts +7 -0
  132. package/dist/core/package-manager-storage-adapters.d.ts.map +1 -0
  133. package/dist/core/package-manager-storage-adapters.js +76 -0
  134. package/dist/core/package-manager-storage-adapters.js.map +1 -0
  135. package/dist/core/package-manager-types.d.ts +4 -0
  136. package/dist/core/package-manager-types.d.ts.map +1 -1
  137. package/dist/core/package-manager-types.js.map +1 -1
  138. package/dist/core/provider-rate-limits.d.ts +23 -0
  139. package/dist/core/provider-rate-limits.d.ts.map +1 -0
  140. package/dist/core/provider-rate-limits.js +113 -0
  141. package/dist/core/provider-rate-limits.js.map +1 -0
  142. package/dist/core/provider-request-admission.d.ts +7 -0
  143. package/dist/core/provider-request-admission.d.ts.map +1 -0
  144. package/dist/core/provider-request-admission.js +91 -0
  145. package/dist/core/provider-request-admission.js.map +1 -0
  146. package/dist/core/resource-admission-scope.d.ts +4 -0
  147. package/dist/core/resource-admission-scope.d.ts.map +1 -0
  148. package/dist/core/resource-admission-scope.js +9 -0
  149. package/dist/core/resource-admission-scope.js.map +1 -0
  150. package/dist/core/sdk-types.d.ts +16 -0
  151. package/dist/core/sdk-types.d.ts.map +1 -1
  152. package/dist/core/sdk-types.js.map +1 -1
  153. package/dist/core/sdk.d.ts +2 -1
  154. package/dist/core/sdk.d.ts.map +1 -1
  155. package/dist/core/sdk.js +18 -2
  156. package/dist/core/sdk.js.map +1 -1
  157. package/dist/core/session-lifecycle-work.d.ts +1 -0
  158. package/dist/core/session-lifecycle-work.d.ts.map +1 -1
  159. package/dist/core/session-lifecycle-work.js +1 -0
  160. package/dist/core/session-lifecycle-work.js.map +1 -1
  161. package/dist/core/settings-manager-basic-accessors.d.ts +3 -0
  162. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  163. package/dist/core/settings-manager-basic-accessors.js +6 -0
  164. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  165. package/dist/core/settings-schema.d.ts +22 -0
  166. package/dist/core/settings-schema.d.ts.map +1 -1
  167. package/dist/core/settings-schema.js +18 -1
  168. package/dist/core/settings-schema.js.map +1 -1
  169. package/dist/core/storage/index.d.ts +1 -0
  170. package/dist/core/storage/index.d.ts.map +1 -1
  171. package/dist/core/storage/index.js +1 -0
  172. package/dist/core/storage/index.js.map +1 -1
  173. package/dist/core/storage/node-sqlite.d.ts +2 -1
  174. package/dist/core/storage/node-sqlite.d.ts.map +1 -1
  175. package/dist/core/storage/node-sqlite.js +5 -4
  176. package/dist/core/storage/node-sqlite.js.map +1 -1
  177. package/dist/core/storage/provider.d.ts +6 -0
  178. package/dist/core/storage/provider.d.ts.map +1 -1
  179. package/dist/core/storage/provider.js +27 -7
  180. package/dist/core/storage/provider.js.map +1 -1
  181. package/dist/core/storage/sqlite-facade.d.ts +49 -0
  182. package/dist/core/storage/sqlite-facade.d.ts.map +1 -0
  183. package/dist/core/storage/sqlite-facade.js +180 -0
  184. package/dist/core/storage/sqlite-facade.js.map +1 -0
  185. package/dist/core/storage/storage-status.d.ts +81 -0
  186. package/dist/core/storage/storage-status.d.ts.map +1 -0
  187. package/dist/core/storage/storage-status.js +409 -0
  188. package/dist/core/storage/storage-status.js.map +1 -0
  189. package/dist/core/tasks/supervisor.d.ts +2 -1
  190. package/dist/core/tasks/supervisor.d.ts.map +1 -1
  191. package/dist/core/tasks/supervisor.js +105 -4
  192. package/dist/core/tasks/supervisor.js.map +1 -1
  193. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  194. package/dist/core/tools/bash-pty-native.js +1 -1
  195. package/dist/core/tools/bash-pty-native.js.map +1 -1
  196. package/dist/index.d.ts +2 -1
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +2 -1
  199. package/dist/index.js.map +1 -1
  200. package/dist/main.d.ts.map +1 -1
  201. package/dist/main.js +28 -2
  202. package/dist/main.js.map +1 -1
  203. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  204. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  205. package/dist/modes/interactive/components/assistant-message.js +7 -3
  206. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  207. package/dist/modes/interactive/components/chat-message-renderer.d.ts +9 -1
  208. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  209. package/dist/modes/interactive/components/chat-message-renderer.js +16 -8
  210. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  211. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  212. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  213. package/dist/modes/interactive/components/login-dialog.js +69 -2
  214. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  215. package/dist/modes/interactive/components/markdown-transform.d.ts +1 -1
  216. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/markdown-transform.js +2 -2
  218. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  219. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  220. package/dist/modes/interactive/components/session-selector-search.js +80 -22
  221. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  222. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  223. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/user-message.js +6 -2
  225. package/dist/modes/interactive/components/user-message.js.map +1 -1
  226. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  227. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  228. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  229. package/dist/modes/interactive/interactive-render-chat.js +6 -2
  230. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  231. package/dist/modes/interactive-engine/engine-health.d.ts +8 -4
  232. package/dist/modes/interactive-engine/engine-health.d.ts.map +1 -1
  233. package/dist/modes/interactive-engine/engine-health.js +41 -6
  234. package/dist/modes/interactive-engine/engine-health.js.map +1 -1
  235. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  236. package/dist/modes/interactive-engine/isolated-runtime.js +19 -17
  237. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  238. package/dist/modes/interactive-engine/remote-queue-pause.js +1 -1
  239. package/dist/modes/interactive-engine/remote-queue-pause.js.map +1 -1
  240. package/dist/modes/rpc/rpc-input-scheduler.d.ts +1 -0
  241. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  242. package/dist/modes/rpc/rpc-input-scheduler.js +4 -1
  243. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  244. package/dist/modes/rpc/rpc-input.d.ts.map +1 -1
  245. package/dist/modes/rpc/rpc-input.js +29 -7
  246. package/dist/modes/rpc/rpc-input.js.map +1 -1
  247. package/dist/utils/shell.d.ts.map +1 -1
  248. package/dist/utils/shell.js +14 -0
  249. package/dist/utils/shell.js.map +1 -1
  250. package/docs/custom-provider/oauth.md +8 -1
  251. package/docs/extensions/api-reference.md +2 -0
  252. package/docs/intercom/operations.md +17 -8
  253. package/docs/intercom/reference.md +1 -1
  254. package/docs/keybindings.md +1 -1
  255. package/docs/packages/authoring.md +15 -0
  256. package/docs/packages.md +3 -2
  257. package/docs/providers.md +2 -0
  258. package/docs/reference/cli.md +17 -0
  259. package/docs/sdk.md +37 -0
  260. package/docs/settings.md +33 -2
  261. package/docs/storage.md +191 -219
  262. package/docs/usage.md +1 -1
  263. package/docs/workflows/api-reference.md +50 -0
  264. package/docs/workflows/operations.md +44 -1
  265. package/docs/workflows.md +25 -0
  266. package/examples/extensions/gondolin/package-lock.json +14 -24
  267. package/examples/extensions/gondolin/package.json +1 -1
  268. package/npm-shrinkwrap.json +35 -35
  269. package/package.json +4 -4
  270. package/schemas/settings.schema.json +87 -1
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared command execution utilities for extensions and custom tools.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { createChildProcessEnvironment, waitForChildProcess } from \"../utils/child-process.ts\";\n\n/**\n * Options for executing shell commands.\n */\nexport interface ExecOptions {\n\t/** AbortSignal to cancel the command */\n\tsignal?: AbortSignal;\n\t/** Timeout in milliseconds */\n\ttimeout?: number;\n\t/** Working directory */\n\tcwd?: string;\n}\n\n/**\n * Result of executing a shell command.\n */\nexport interface ExecResult {\n\tstdout: string;\n\tstderr: string;\n\tcode: number;\n\tkilled: boolean;\n}\n\n/**\n * Execute a shell command and return stdout/stderr/code.\n * Supports timeout and abort signal.\n */\nexport async function execCommand(\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tshell: false,\n\t\t\t// Pass the environment explicitly. Bun snapshots the process environment\n\t\t\t// at startup for spawns that omit `env`, so an inherited default would\n\t\t\t// still carry values this process deleted from `process.env` — including\n\t\t\t// the interactive-engine control variables and their --api-key. Preserve\n\t\t\t// Atomic's child attribution in the same explicit environment.\n\t\t\tenv: createChildProcessEnvironment(),\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet killed = false;\n\t\tlet timeoutId: NodeJS.Timeout | undefined;\n\n\t\tconst killProcess = () => {\n\t\t\tif (!killed) {\n\t\t\t\tkilled = true;\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\t// Force kill after 5 seconds if SIGTERM doesn't work\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!proc.killed) {\n\t\t\t\t\t\tproc.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t};\n\n\t\t// Handle abort signal\n\t\tif (options?.signal) {\n\t\t\tif (options.signal.aborted) {\n\t\t\t\tkillProcess();\n\t\t\t} else {\n\t\t\t\toptions.signal.addEventListener(\"abort\", killProcess, { once: true });\n\t\t\t}\n\t\t}\n\n\t\t// Handle timeout\n\t\tif (options?.timeout && options.timeout > 0) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tkillProcess();\n\t\t\t}, options.timeout);\n\t\t}\n\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\t// Wait for process termination without hanging on inherited stdio handles\n\t\t// held open by detached descendants.\n\t\twaitForChildProcess(proc)\n\t\t\t.then((code) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: code ?? 0, killed });\n\t\t\t})\n\t\t\t.catch((_err) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: 1, killed });\n\t\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared command execution utilities for extensions and custom tools.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { createChildProcessEnvironment, waitForChildProcess } from \"../utils/child-process.ts\";\n\n/**\n * Options for executing shell commands.\n */\nexport interface ExecOptions {\n\t/** AbortSignal to cancel the command */\n\tsignal?: AbortSignal;\n\t/** Timeout in milliseconds */\n\ttimeout?: number;\n\t/** Working directory */\n\tcwd?: string;\n}\n\n/**\n * Result of executing a shell command.\n */\nexport interface ExecResult {\n\tstdout: string;\n\tstderr: string;\n\tcode: number;\n\tkilled: boolean;\n}\n\n/**\n * Execute a shell command and return stdout/stderr/code.\n * Supports timeout and abort signal.\n */\nexport async function execCommand(\n\tcommand: string,\n\targs: string[],\n\tcwd: string,\n\toptions?: ExecOptions,\n): Promise<ExecResult> {\n\treturn new Promise((resolve) => {\n\t\tconst proc = spawn(command, args, {\n\t\t\tcwd,\n\t\t\tshell: false,\n\t\t\t// Pass the environment explicitly. Bun snapshots the process environment\n\t\t\t// at startup for spawns that omit `env`, so an inherited default would\n\t\t\t// still carry values this process deleted from `process.env` — including\n\t\t\t// the interactive-engine control variables and their --api-key. Preserve\n\t\t\t// Atomic's child attribution in the same explicit environment.\n\t\t\tenv: createChildProcessEnvironment(),\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet killed = false;\n\t\tlet timeoutId: NodeJS.Timeout | undefined;\n\n\t\tconst killProcess = () => {\n\t\t\tif (!killed) {\n\t\t\t\tkilled = true;\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\t// Force kill after 5 seconds if SIGTERM doesn't work\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!proc.killed) {\n\t\t\t\t\t\tproc.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t};\n\n\t\t// Handle abort signal\n\t\tif (options?.signal) {\n\t\t\tif (options.signal.aborted) {\n\t\t\t\tkillProcess();\n\t\t\t} else {\n\t\t\t\toptions.signal.addEventListener(\"abort\", killProcess, { once: true });\n\t\t\t}\n\t\t}\n\n\t\t// Handle timeout\n\t\tif (options?.timeout && options.timeout > 0) {\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tkillProcess();\n\t\t\t}, options.timeout);\n\t\t}\n\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\tstderr += data.toString();\n\t\t});\n\n\t\t// Wait for process termination without hanging on inherited stdio handles\n\t\t// held open by detached descendants.\n\t\twaitForChildProcess(proc)\n\t\t\t.then((code) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr, code: code ?? 0, killed });\n\t\t\t})\n\t\t\t.catch((error: Error) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.signal) {\n\t\t\t\t\toptions.signal.removeEventListener(\"abort\", killProcess);\n\t\t\t\t}\n\t\t\t\tresolve({ stdout, stderr: stderr || error.message, code: 1, killed });\n\t\t\t});\n\t});\n}\n"]}
@@ -687,6 +687,15 @@
687
687
  display: block;
688
688
  }
689
689
 
690
+ .system-entry > .message-timestamp {
691
+ padding-left: var(--line-height);
692
+ margin-bottom: 4px;
693
+ }
694
+
695
+ .system-entry > :last-child {
696
+ margin-bottom: 0;
697
+ }
698
+
690
699
  .system-prompt.provider-prompt {
691
700
  border-left: 3px solid var(--warning);
692
701
  }
@@ -98,14 +98,12 @@
98
98
  }
99
99
  }
100
100
 
101
- // Sort children by timestamp
102
- function sortChildren(node) {
101
+ // Sort children by timestamp. Iterative: long sessions form chains deeper than the JS call stack.
102
+ for (const node of nodeMap.values()) {
103
103
  node.children.sort((a, b) =>
104
104
  new Date(a.entry.timestamp).getTime() - new Date(b.entry.timestamp).getTime()
105
105
  );
106
- node.children.forEach(sortChildren);
107
106
  }
108
- roots.forEach(sortChildren);
109
107
 
110
108
  return roots;
111
109
  }
@@ -134,14 +132,14 @@
134
132
  const path = [];
135
133
  let current = byId.get(targetId);
136
134
  while (current) {
137
- path.unshift(current);
135
+ path.push(current);
138
136
  // Stop if no parent or self-referencing (root)
139
137
  if (!current.parentId || current.parentId === current.id) {
140
138
  break;
141
139
  }
142
140
  current = byId.get(current.parentId);
143
141
  }
144
- return path;
142
+ return path.reverse();
145
143
  }
146
144
 
147
145
  // Tree node lookup for finding leaves
@@ -156,12 +154,12 @@
156
154
  // Build tree node map lazily
157
155
  if (!treeNodeMap) {
158
156
  treeNodeMap = new Map();
159
- const tree = buildTree();
160
- function mapNodes(node) {
157
+ const stack = [...buildTree()];
158
+ while (stack.length > 0) {
159
+ const node = stack.pop();
161
160
  treeNodeMap.set(node.entry.id, node);
162
- node.children.forEach(mapNodes);
161
+ for (const child of node.children) stack.push(child);
163
162
  }
164
- tree.forEach(mapNodes);
165
163
  }
166
164
 
167
165
  const node = treeNodeMap.get(nodeId);
@@ -185,16 +183,22 @@
185
183
  const multipleRoots = roots.length > 1;
186
184
 
187
185
  // Mark which subtrees contain the active leaf
186
+ // Iterative post-order: long sessions form chains deeper than the JS call stack.
188
187
  const containsActive = new Map();
189
- function markActive(node) {
190
- let has = activePathIds.has(node.entry.id);
191
- for (const child of node.children) {
192
- if (markActive(child)) has = true;
193
- }
194
- containsActive.set(node, has);
195
- return has;
188
+ const postOrder = [];
189
+ const pending = [...roots];
190
+ while (pending.length > 0) {
191
+ const node = pending.pop();
192
+ postOrder.push(node);
193
+ for (const child of node.children) pending.push(child);
194
+ }
195
+ for (let i = postOrder.length - 1; i >= 0; i--) {
196
+ const node = postOrder[i];
197
+ containsActive.set(
198
+ node,
199
+ activePathIds.has(node.entry.id) || node.children.some(child => containsActive.get(child))
200
+ );
196
201
  }
197
- roots.forEach(markActive);
198
202
 
199
203
  // Stack: [node, indent, justBranched, showConnector, isLast, gutters, isVirtualRootChild]
200
204
  const stack = [];
@@ -313,6 +317,76 @@
313
317
  return '';
314
318
  }
315
319
 
320
+ // ============================================================
321
+ // SYSTEM MESSAGES (pure data)
322
+ // ============================================================
323
+
324
+ function systemContentText(content) {
325
+ if (typeof content === 'string') return content;
326
+ if (Array.isArray(content)) {
327
+ return content.filter(c => c.type === 'text' && c.text).map(c => c.text).join('\n');
328
+ }
329
+ return '';
330
+ }
331
+
332
+ /** Full prompt text of a system message, mirroring getSystemMessageText() in pi-ai. */
333
+ function getSystemMessageText(msg) {
334
+ const parts = [systemContentText(msg.content)];
335
+ for (const value of Object.values(msg.sections || {})) {
336
+ if (value !== null) parts.push(value);
337
+ }
338
+ return parts.filter(part => part.length > 0).join('\n\n');
339
+ }
340
+
341
+ /** Text of a later system message, mirroring renderSystemMessageUpdate() in pi-ai. */
342
+ function renderSystemMessageUpdate(msg) {
343
+ const parts = [];
344
+ const text = systemContentText(msg.content);
345
+ if (text.length > 0) parts.push(text);
346
+ for (const [name, value] of Object.entries(msg.sections || {})) {
347
+ parts.push(value === null
348
+ ? `Removed system prompt section "${name}".`
349
+ : `Updated system prompt section "${name}":\n\n${value}`);
350
+ }
351
+ return parts.join('\n\n');
352
+ }
353
+
354
+ function carriesSystemState(entry) {
355
+ return (entry.type === 'message' && entry.message.role === 'system') ||
356
+ (entry.type === 'compaction' && entry.systemMessage);
357
+ }
358
+
359
+ /**
360
+ * Whether a system entry starts the prompt on its branch. Later system entries
361
+ * patch the prompt, so they render as updates instead of a full prompt.
362
+ */
363
+ function isLeadingSystemEntry(entry) {
364
+ let current = entry.parentId && entry.parentId !== entry.id ? byId.get(entry.parentId) : undefined;
365
+ while (current) {
366
+ if (carriesSystemState(current)) return false;
367
+ if (!current.parentId || current.parentId === current.id) break;
368
+ current = byId.get(current.parentId);
369
+ }
370
+ return true;
371
+ }
372
+
373
+ /** Short description of what a later system message changes, e.g. "project_context, -rules, tools +bash". */
374
+ function describeSystemUpdate(msg) {
375
+ const parts = [];
376
+ if (systemContentText(msg.content).length > 0) parts.push('instructions');
377
+ for (const [name, value] of Object.entries(msg.sections || {})) {
378
+ parts.push(value === null ? `-${name}` : name);
379
+ }
380
+ const toolChanges = [
381
+ ...(msg.toolsAdded || []).map(t => `+${t.name}`),
382
+ ...(msg.toolsRemoved || []).map(t => `-${t.name}`),
383
+ ];
384
+ if (toolChanges.length > 0) parts.push(`tools ${toolChanges.join(' ')}`);
385
+ return parts.join(', ');
386
+ }
387
+
388
+ const hasSystemEntries = entries.some(entry => entry.type === 'message' && entry.message.role === 'system');
389
+
316
390
  /**
317
391
  * Parse a skill block from message text.
318
392
  * Returns null if the text doesn't contain a skill block.
@@ -338,6 +412,13 @@
338
412
  case 'message': {
339
413
  const msg = entry.message;
340
414
  parts.push(msg.role);
415
+ if (msg.role === 'system') {
416
+ parts.push(isLeadingSystemEntry(entry) ? 'system prompt' : 'system update');
417
+ parts.push(getSystemMessageText(msg));
418
+ for (const name of Object.keys(msg.sections || {})) parts.push(name);
419
+ for (const tool of [...(msg.toolsAdded || []), ...(msg.toolsRemoved || [])]) parts.push(tool.name);
420
+ break;
421
+ }
341
422
  if (msg.content) parts.push(extractContent(msg.content));
342
423
  if (msg.role === 'bashExecution' && msg.command) parts.push(msg.command);
343
424
  break;
@@ -679,6 +760,13 @@
679
760
  const cmd = truncate(normalize(msg.command || ''));
680
761
  return labelHtml + `<span class="tree-role-tool">[bash]:</span> ${escapeHtml(cmd)}`;
681
762
  }
763
+ if (msg.role === 'system') {
764
+ if (isLeadingSystemEntry(entry)) {
765
+ return labelHtml + `<span class="tree-muted">[system prompt]</span>`;
766
+ }
767
+ const changes = describeSystemUpdate(msg);
768
+ return labelHtml + `<span class="tree-muted">[system update${changes ? ': ' + escapeHtml(truncate(changes)) : ''}]</span>`;
769
+ }
682
770
  return labelHtml + `<span class="tree-muted">[${escapeHtml(msg.role)}]</span>`;
683
771
  }
684
772
  case 'compaction':
@@ -1317,6 +1405,24 @@
1317
1405
  }
1318
1406
 
1319
1407
  if (msg.role === 'toolResult') return '';
1408
+
1409
+ if (msg.role === 'system') {
1410
+ let html = '';
1411
+ if (isLeadingSystemEntry(entry)) {
1412
+ const text = getSystemMessageText(msg);
1413
+ if (text) html += renderSystemPromptBlock('System Prompt', text);
1414
+ html += renderToolsList('Available Tools', msg.toolsAdded);
1415
+ } else {
1416
+ const text = renderSystemMessageUpdate(msg);
1417
+ const changes = describeSystemUpdate(msg);
1418
+ if (text) html += renderSystemPromptBlock(`System Prompt Update${changes ? ': ' + changes : ''}`, text);
1419
+ html += renderToolsList('Tools Added', msg.toolsAdded);
1420
+ if (msg.toolsRemoved && msg.toolsRemoved.length > 0) {
1421
+ html += `<div class="tools-list"><div class="tools-header">Tools Removed</div><div class="tools-content">${msg.toolsRemoved.map(t => `<div class="tool-item"><span class="tool-item-name">${escapeHtml(t.name)}</span></div>`).join('')}</div></div>`;
1422
+ }
1423
+ }
1424
+ return html ? `<div class="system-entry" id="${entryDomId}">${tsHtml}${html}</div>` : '';
1425
+ }
1320
1426
  }
1321
1427
 
1322
1428
  if (entry.type === 'model_change') {
@@ -1361,7 +1467,7 @@
1361
1467
  let userMessages = 0, assistantMessages = 0, toolResults = 0;
1362
1468
  let customMessages = 0, compactions = 0, branchSummaries = 0, toolCalls = 0;
1363
1469
  const tokens = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
1364
- const cost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
1470
+ const cost = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 };
1365
1471
  const models = new Set();
1366
1472
 
1367
1473
  for (const entry of entryList) {
@@ -1377,10 +1483,18 @@
1377
1483
  tokens.cacheRead += msg.usage.cacheRead || 0;
1378
1484
  tokens.cacheWrite += msg.usage.cacheWrite || 0;
1379
1485
  if (msg.usage.cost) {
1486
+ const componentTotal =
1487
+ (msg.usage.cost.input || 0) +
1488
+ (msg.usage.cost.output || 0) +
1489
+ (msg.usage.cost.cacheRead || 0) +
1490
+ (msg.usage.cost.cacheWrite || 0);
1380
1491
  cost.input += msg.usage.cost.input || 0;
1381
1492
  cost.output += msg.usage.cost.output || 0;
1382
1493
  cost.cacheRead += msg.usage.cost.cacheRead || 0;
1383
1494
  cost.cacheWrite += msg.usage.cost.cacheWrite || 0;
1495
+ // Provider-reported totals can intentionally differ from catalog-estimated components.
1496
+ // Fall back to the component sum for sessions written before cost.total was recorded.
1497
+ cost.total += typeof msg.usage.cost.total === 'number' ? msg.usage.cost.total : componentTotal;
1384
1498
  }
1385
1499
  }
1386
1500
  toolCalls += msg.content.filter(c => c.type === 'toolCall').length;
@@ -1401,7 +1515,7 @@
1401
1515
  const globalStats = computeStats(entries);
1402
1516
 
1403
1517
  function renderHeader() {
1404
- const totalCost = globalStats.cost.input + globalStats.cost.output + globalStats.cost.cacheRead + globalStats.cost.cacheWrite;
1518
+ const totalCost = globalStats.cost.total;
1405
1519
 
1406
1520
  const tokenParts = [];
1407
1521
  if (globalStats.tokens.input) tokenParts.push(`↑${formatTokens(globalStats.tokens.input)}`);
@@ -1439,30 +1553,39 @@
1439
1553
  </div>
1440
1554
  </div>`;
1441
1555
 
1442
- // Render system prompt (user's base prompt, applies to all providers)
1443
- if (systemPrompt) {
1444
- const lines = systemPrompt.split('\n');
1445
- const previewLines = 10;
1446
- if (lines.length > previewLines) {
1447
- const preview = lines.slice(0, previewLines).join('\n');
1448
- const remaining = lines.length - previewLines;
1449
- html += `<div class="system-prompt expandable" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
1450
- <div class="system-prompt-header">System Prompt</div>
1451
- <div class="system-prompt-preview">${escapeHtml(preview)}</div>
1452
- <div class="system-prompt-expand-hint">... (${remaining} more lines, click to expand)</div>
1453
- <div class="system-prompt-full">${escapeHtml(systemPrompt)}</div>
1454
- </div>`;
1455
- } else {
1456
- html += `<div class="system-prompt">
1457
- <div class="system-prompt-header">System Prompt</div>
1458
- <div class="system-prompt-full" style="display: block">${escapeHtml(systemPrompt)}</div>
1459
- </div>`;
1460
- }
1556
+ // Sessions with system entries render the prompt and tools in the transcript, where they
1557
+ // occur. Older sessions have none, so fall back to the exporting agent's current state.
1558
+ if (!hasSystemEntries) {
1559
+ if (systemPrompt) html += renderSystemPromptBlock('System Prompt', systemPrompt);
1560
+ html += renderToolsList('Available Tools', tools);
1461
1561
  }
1462
1562
 
1463
- if (tools && tools.length > 0) {
1464
- html += `<div class="tools-list">
1465
- <div class="tools-header">Available Tools</div>
1563
+ return html;
1564
+ }
1565
+
1566
+ function renderSystemPromptBlock(title, text) {
1567
+ const lines = text.split('\n');
1568
+ const previewLines = 10;
1569
+ if (lines.length > previewLines) {
1570
+ const preview = lines.slice(0, previewLines).join('\n');
1571
+ const remaining = lines.length - previewLines;
1572
+ return `<div class="system-prompt expandable" onclick="if(window.getSelection().toString())return;this.classList.toggle('expanded')">
1573
+ <div class="system-prompt-header">${escapeHtml(title)}</div>
1574
+ <div class="system-prompt-preview">${escapeHtml(preview)}</div>
1575
+ <div class="system-prompt-expand-hint">... (${remaining} more lines, click to expand)</div>
1576
+ <div class="system-prompt-full">${escapeHtml(text)}</div>
1577
+ </div>`;
1578
+ }
1579
+ return `<div class="system-prompt">
1580
+ <div class="system-prompt-header">${escapeHtml(title)}</div>
1581
+ <div class="system-prompt-full" style="display: block">${escapeHtml(text)}</div>
1582
+ </div>`;
1583
+ }
1584
+
1585
+ function renderToolsList(title, tools) {
1586
+ if (!tools || tools.length === 0) return '';
1587
+ return `<div class="tools-list">
1588
+ <div class="tools-header">${escapeHtml(title)}</div>
1466
1589
  <div class="tools-content">
1467
1590
  ${tools.map(t => {
1468
1591
  const hasParams = t.parameters && typeof t.parameters === 'object' && t.parameters.properties && Object.keys(t.parameters.properties).length > 0;
@@ -1487,9 +1610,6 @@
1487
1610
  }).join('')}
1488
1611
  </div>
1489
1612
  </div>`;
1490
- }
1491
-
1492
- return html;
1493
1613
  }
1494
1614
 
1495
1615
  // ============================================================
@@ -7,5 +7,11 @@ export declare const loaderHostModulesTestHooks: {
7
7
  /** Live host modules shared with single-file builds and transformed extension reloads. */
8
8
  export declare function getVirtualModules(): Promise<Record<string, object>>;
9
9
  export declare function getWorkflowHostModules(): Promise<Record<"@bastani/atomic" | "@bastani/atomic/storage" | "@bastani/pi-ai" | "@bastani/pi-ai/providers/all", object>>;
10
+ /**
11
+ * Live host modules for storage adapter modules. Outside single-file builds `@bastani/atomic` resolves lazily through
12
+ * the extension aliases instead, so a process that needs only storage, such as the Intercom broker, never evaluates
13
+ * the whole host package.
14
+ */
15
+ export declare function getStorageAdapterHostModules(): Promise<Record<string, object>>;
10
16
  export {};
11
17
  //# sourceMappingURL=loader-host-modules.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-host-modules.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader-host-modules.ts"],"names":[],"mappings":"AAOA,KAAK,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;AAEvD,iBAAS,yBAAyB,CAAC,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS5G;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0F1E;AAED,eAAO,MAAM,0BAA0B;;CAAgC,CAAC;AAExE,0FAA0F;AAC1F,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAazE;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CACtD,MAAM,CAAC,iBAAiB,GAAG,yBAAyB,GAAG,gBAAgB,GAAG,8BAA8B,EAAE,MAAM,CAAC,CACjH,CAaA"}
1
+ {"version":3,"file":"loader-host-modules.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader-host-modules.ts"],"names":[],"mappings":"AAOA,KAAK,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;AAEvD,iBAAS,yBAAyB,CAAC,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS5G;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0F1E;AAED,eAAO,MAAM,0BAA0B;;CAAgC,CAAC;AAExE,0FAA0F;AAC1F,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAazE;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CACtD,MAAM,CAAC,iBAAiB,GAAG,yBAAyB,GAAG,gBAAgB,GAAG,8BAA8B,EAAE,MAAM,CAAC,CACjH,CAaA;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAIpF"}
@@ -1,5 +1,5 @@
1
1
  import { join } from "node:path";
2
- import { getPackageDir, isBunBinary } from "../../config.js";
2
+ import { getPackageDir, isBunBinary, isBundledBuild } from "../../config.js";
3
3
  import { createModuleRequire } from "../../utils/module-require.js";
4
4
  let virtualModules = null;
5
5
  let virtualModulesPromise = null;
@@ -112,4 +112,15 @@ export async function getWorkflowHostModules() {
112
112
  "@bastani/pi-ai/providers/all": providers,
113
113
  };
114
114
  }
115
+ /**
116
+ * Live host modules for storage adapter modules. Outside single-file builds `@bastani/atomic` resolves lazily through
117
+ * the extension aliases instead, so a process that needs only storage, such as the Intercom broker, never evaluates
118
+ * the whole host package.
119
+ */
120
+ export async function getStorageAdapterHostModules() {
121
+ const storage = await import("../storage/index.js");
122
+ if (!(isBunBinary || isBundledBuild))
123
+ return { "@bastani/atomic/storage": storage };
124
+ return { "@bastani/atomic": await import("../../index.js"), "@bastani/atomic/storage": storage };
125
+ }
115
126
  //# sourceMappingURL=loader-host-modules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader-host-modules.js","sourceRoot":"","sources":["../../../src/core/extensions/loader-host-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { getPackageDir, isBunBinary } from \"../../config.js\";\nimport { createModuleRequire } from \"../../utils/module-require.ts\";\n\nlet virtualModules: Record<string, object> | null = null;\nlet virtualModulesPromise: Promise<Record<string, object>> | null = null;\n\ntype HostModuleRequire = (specifier: string) => object;\n\nfunction loadOptionalAtomicNatives(requireFromHost: HostModuleRequire, specifier: string): object | undefined {\n\ttry {\n\t\treturn requireFromHost(specifier);\n\t} catch {\n\t\t// Keep a missing or unloadable platform binding proportional: only an\n\t\t// extension that imports atomic-natives should fail, not every extension\n\t\t// waiting for the shared host-module map.\n\t\treturn undefined;\n\t}\n}\n\nexport async function loadVirtualModules(): Promise<Record<string, object>> {\n\t// Keep the native binding external to both the app sidecar and extension\n\t// bundles while sharing its process-global control plane through the bridge.\n\t// If the platform package is unavailable, omit only this registration so\n\t// unrelated builtins can still load.\n\tconst requireFromHost = createModuleRequire(import.meta.url);\n\tconst atomicNatives = loadOptionalAtomicNatives(\n\t\trequireFromHost,\n\t\tisBunBinary\n\t\t\t? join(getPackageDir(), \"node_modules\", \"@bastani\", \"atomic-natives\", \"native\", \"index.js\")\n\t\t\t: \"@bastani/atomic-natives\",\n\t);\n\tconst [\n\t\ttypebox,\n\t\ttypeboxCompile,\n\t\ttypeboxValue,\n\t\tpiAgentCore,\n\t\tpiTui,\n\t\tpiTuiLayout,\n\t\tpiTuiLayoutNode,\n\t\tpiAi,\n\t\tpiAiOauth,\n\t\tpiAiModels,\n\t\tpiAiCloudflareGatewayBinding,\n\t\tpiAiProviderEnv,\n\t\tpiAiOauthPage,\n\t\tproperLockfile,\n\t\tpiCodingAgent,\n\t\tstorage,\n\t] = await Promise.all([\n\t\timport(\"typebox\"),\n\t\timport(\"typebox/compile\"),\n\t\timport(\"typebox/value\"),\n\t\timport(\"@earendil-works/pi-agent-core\"),\n\t\timport(\"@earendil-works/pi-tui\"),\n\t\timport(\"@earendil-works/pi-tui/dist/layout.js\"),\n\t\timport(\"@earendil-works/pi-tui/dist/layout-node.js\"),\n\t\t// pi 0.80.2: the old global pi-ai API moved off the root entrypoint onto\n\t\t// `/compat` (a strict superset). Extensions still use the root specifier.\n\t\timport(\"@bastani/pi-ai/compat\"),\n\t\timport(\"@bastani/pi-ai/oauth\"),\n\t\timport(\"@bastani/pi-ai/models\"),\n\t\timport(\"@bastani/pi-ai/api/cloudflare-gateway-binding\"),\n\t\timport(\"@bastani/pi-ai/utils/provider-env\"),\n\t\timport(\"@bastani/pi-ai/utils/oauth-page\"),\n\t\t// Keep proper-lockfile in the compiled host so extensions share its live\n\t\t// CommonJS module state instead of evaluating it through jiti.\n\t\timport(\"proper-lockfile\"),\n\t\t// loader.ts exports are not re-exported from index.ts, avoiding a cycle.\n\t\timport(\"../../index.ts\"),\n\t\timport(\"../storage/index.js\"),\n\t]);\n\n\treturn {\n\t\ttypebox,\n\t\t\"typebox/compile\": typeboxCompile,\n\t\t\"typebox/value\": typeboxValue,\n\t\t\"@sinclair/typebox\": typebox,\n\t\t\"@sinclair/typebox/compile\": typeboxCompile,\n\t\t\"@sinclair/typebox/value\": typeboxValue,\n\t\t\"@earendil-works/pi-agent-core\": piAgentCore,\n\t\t\"@earendil-works/pi-tui\": piTui,\n\t\t\"@earendil-works/pi-tui/dist/layout.js\": piTuiLayout,\n\t\t\"@earendil-works/pi-tui/dist/layout-node.js\": piTuiLayoutNode,\n\t\t\"@bastani/pi-ai\": piAi,\n\t\t\"@bastani/pi-ai/compat\": piAi,\n\t\t\"@bastani/pi-ai/oauth\": piAiOauth,\n\t\t\"@bastani/pi-ai/models\": piAiModels,\n\t\t\"@bastani/pi-ai/api/cloudflare-gateway-binding\": piAiCloudflareGatewayBinding,\n\t\t\"@bastani/pi-ai/utils/provider-env\": piAiProviderEnv,\n\t\t\"@bastani/pi-ai/utils/oauth-page\": piAiOauthPage,\n\t\t\"@earendil-works/pi-ai\": piAi,\n\t\t\"@earendil-works/pi-ai/compat\": piAi,\n\t\t\"@earendil-works/pi-ai/oauth\": piAiOauth,\n\t\t\"@earendil-works/pi-ai/models\": piAiModels,\n\t\t\"@earendil-works/pi-ai/api/cloudflare-gateway-binding\": piAiCloudflareGatewayBinding,\n\t\t\"proper-lockfile\": properLockfile,\n\t\t...(atomicNatives ? { \"@bastani/atomic-natives\": atomicNatives } : {}),\n\t\t\"@bastani/atomic\": piCodingAgent,\n\t\t\"@bastani/atomic/storage\": storage,\n\t\t\"@earendil-works/pi-coding-agent\": piCodingAgent,\n\t\t\"@mariozechner/pi-agent-core\": piAgentCore,\n\t\t\"@mariozechner/pi-tui\": piTui,\n\t\t\"@mariozechner/pi-tui/dist/layout.js\": piTuiLayout,\n\t\t\"@mariozechner/pi-ai\": piAi,\n\t\t\"@mariozechner/pi-ai/compat\": piAi,\n\t\t\"@mariozechner/pi-ai/oauth\": piAiOauth,\n\t\t\"@mariozechner/pi-ai/models\": piAiModels,\n\t\t\"@mariozechner/pi-ai/api/cloudflare-gateway-binding\": piAiCloudflareGatewayBinding,\n\t};\n}\n\nexport const loaderHostModulesTestHooks = { loadOptionalAtomicNatives };\n\n/** Live host modules shared with single-file builds and transformed extension reloads. */\nexport async function getVirtualModules(): Promise<Record<string, object>> {\n\tif (virtualModules) return virtualModules;\n\tvirtualModulesPromise ??= loadVirtualModules().then(\n\t\t(modules) => {\n\t\t\tvirtualModules = modules;\n\t\t\treturn modules;\n\t\t},\n\t\t(error: Error) => {\n\t\t\tvirtualModulesPromise = null;\n\t\t\tthrow error;\n\t\t},\n\t);\n\treturn virtualModulesPromise;\n}\n\nexport async function getWorkflowHostModules(): Promise<\n\tRecord<\"@bastani/atomic\" | \"@bastani/atomic/storage\" | \"@bastani/pi-ai\" | \"@bastani/pi-ai/providers/all\", object>\n> {\n\tconst [atomic, storage, piAi, providers] = await Promise.all([\n\t\timport(\"../../index.ts\"),\n\t\timport(\"../storage/index.js\"),\n\t\timport(\"@bastani/pi-ai/compat\"),\n\t\timport(\"@bastani/pi-ai/providers/all\"),\n\t]);\n\treturn {\n\t\t\"@bastani/atomic\": atomic,\n\t\t\"@bastani/atomic/storage\": storage,\n\t\t\"@bastani/pi-ai\": piAi,\n\t\t\"@bastani/pi-ai/providers/all\": providers,\n\t};\n}\n"]}
1
+ {"version":3,"file":"loader-host-modules.js","sourceRoot":"","sources":["../../../src/core/extensions/loader-host-modules.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { getPackageDir, isBunBinary, isBundledBuild } from \"../../config.js\";\nimport { createModuleRequire } from \"../../utils/module-require.ts\";\n\nlet virtualModules: Record<string, object> | null = null;\nlet virtualModulesPromise: Promise<Record<string, object>> | null = null;\n\ntype HostModuleRequire = (specifier: string) => object;\n\nfunction loadOptionalAtomicNatives(requireFromHost: HostModuleRequire, specifier: string): object | undefined {\n\ttry {\n\t\treturn requireFromHost(specifier);\n\t} catch {\n\t\t// Keep a missing or unloadable platform binding proportional: only an\n\t\t// extension that imports atomic-natives should fail, not every extension\n\t\t// waiting for the shared host-module map.\n\t\treturn undefined;\n\t}\n}\n\nexport async function loadVirtualModules(): Promise<Record<string, object>> {\n\t// Keep the native binding external to both the app sidecar and extension\n\t// bundles while sharing its process-global control plane through the bridge.\n\t// If the platform package is unavailable, omit only this registration so\n\t// unrelated builtins can still load.\n\tconst requireFromHost = createModuleRequire(import.meta.url);\n\tconst atomicNatives = loadOptionalAtomicNatives(\n\t\trequireFromHost,\n\t\tisBunBinary\n\t\t\t? join(getPackageDir(), \"node_modules\", \"@bastani\", \"atomic-natives\", \"native\", \"index.js\")\n\t\t\t: \"@bastani/atomic-natives\",\n\t);\n\tconst [\n\t\ttypebox,\n\t\ttypeboxCompile,\n\t\ttypeboxValue,\n\t\tpiAgentCore,\n\t\tpiTui,\n\t\tpiTuiLayout,\n\t\tpiTuiLayoutNode,\n\t\tpiAi,\n\t\tpiAiOauth,\n\t\tpiAiModels,\n\t\tpiAiCloudflareGatewayBinding,\n\t\tpiAiProviderEnv,\n\t\tpiAiOauthPage,\n\t\tproperLockfile,\n\t\tpiCodingAgent,\n\t\tstorage,\n\t] = await Promise.all([\n\t\timport(\"typebox\"),\n\t\timport(\"typebox/compile\"),\n\t\timport(\"typebox/value\"),\n\t\timport(\"@earendil-works/pi-agent-core\"),\n\t\timport(\"@earendil-works/pi-tui\"),\n\t\timport(\"@earendil-works/pi-tui/dist/layout.js\"),\n\t\timport(\"@earendil-works/pi-tui/dist/layout-node.js\"),\n\t\t// pi 0.80.2: the old global pi-ai API moved off the root entrypoint onto\n\t\t// `/compat` (a strict superset). Extensions still use the root specifier.\n\t\timport(\"@bastani/pi-ai/compat\"),\n\t\timport(\"@bastani/pi-ai/oauth\"),\n\t\timport(\"@bastani/pi-ai/models\"),\n\t\timport(\"@bastani/pi-ai/api/cloudflare-gateway-binding\"),\n\t\timport(\"@bastani/pi-ai/utils/provider-env\"),\n\t\timport(\"@bastani/pi-ai/utils/oauth-page\"),\n\t\t// Keep proper-lockfile in the compiled host so extensions share its live\n\t\t// CommonJS module state instead of evaluating it through jiti.\n\t\timport(\"proper-lockfile\"),\n\t\t// loader.ts exports are not re-exported from index.ts, avoiding a cycle.\n\t\timport(\"../../index.ts\"),\n\t\timport(\"../storage/index.js\"),\n\t]);\n\n\treturn {\n\t\ttypebox,\n\t\t\"typebox/compile\": typeboxCompile,\n\t\t\"typebox/value\": typeboxValue,\n\t\t\"@sinclair/typebox\": typebox,\n\t\t\"@sinclair/typebox/compile\": typeboxCompile,\n\t\t\"@sinclair/typebox/value\": typeboxValue,\n\t\t\"@earendil-works/pi-agent-core\": piAgentCore,\n\t\t\"@earendil-works/pi-tui\": piTui,\n\t\t\"@earendil-works/pi-tui/dist/layout.js\": piTuiLayout,\n\t\t\"@earendil-works/pi-tui/dist/layout-node.js\": piTuiLayoutNode,\n\t\t\"@bastani/pi-ai\": piAi,\n\t\t\"@bastani/pi-ai/compat\": piAi,\n\t\t\"@bastani/pi-ai/oauth\": piAiOauth,\n\t\t\"@bastani/pi-ai/models\": piAiModels,\n\t\t\"@bastani/pi-ai/api/cloudflare-gateway-binding\": piAiCloudflareGatewayBinding,\n\t\t\"@bastani/pi-ai/utils/provider-env\": piAiProviderEnv,\n\t\t\"@bastani/pi-ai/utils/oauth-page\": piAiOauthPage,\n\t\t\"@earendil-works/pi-ai\": piAi,\n\t\t\"@earendil-works/pi-ai/compat\": piAi,\n\t\t\"@earendil-works/pi-ai/oauth\": piAiOauth,\n\t\t\"@earendil-works/pi-ai/models\": piAiModels,\n\t\t\"@earendil-works/pi-ai/api/cloudflare-gateway-binding\": piAiCloudflareGatewayBinding,\n\t\t\"proper-lockfile\": properLockfile,\n\t\t...(atomicNatives ? { \"@bastani/atomic-natives\": atomicNatives } : {}),\n\t\t\"@bastani/atomic\": piCodingAgent,\n\t\t\"@bastani/atomic/storage\": storage,\n\t\t\"@earendil-works/pi-coding-agent\": piCodingAgent,\n\t\t\"@mariozechner/pi-agent-core\": piAgentCore,\n\t\t\"@mariozechner/pi-tui\": piTui,\n\t\t\"@mariozechner/pi-tui/dist/layout.js\": piTuiLayout,\n\t\t\"@mariozechner/pi-ai\": piAi,\n\t\t\"@mariozechner/pi-ai/compat\": piAi,\n\t\t\"@mariozechner/pi-ai/oauth\": piAiOauth,\n\t\t\"@mariozechner/pi-ai/models\": piAiModels,\n\t\t\"@mariozechner/pi-ai/api/cloudflare-gateway-binding\": piAiCloudflareGatewayBinding,\n\t};\n}\n\nexport const loaderHostModulesTestHooks = { loadOptionalAtomicNatives };\n\n/** Live host modules shared with single-file builds and transformed extension reloads. */\nexport async function getVirtualModules(): Promise<Record<string, object>> {\n\tif (virtualModules) return virtualModules;\n\tvirtualModulesPromise ??= loadVirtualModules().then(\n\t\t(modules) => {\n\t\t\tvirtualModules = modules;\n\t\t\treturn modules;\n\t\t},\n\t\t(error: Error) => {\n\t\t\tvirtualModulesPromise = null;\n\t\t\tthrow error;\n\t\t},\n\t);\n\treturn virtualModulesPromise;\n}\n\nexport async function getWorkflowHostModules(): Promise<\n\tRecord<\"@bastani/atomic\" | \"@bastani/atomic/storage\" | \"@bastani/pi-ai\" | \"@bastani/pi-ai/providers/all\", object>\n> {\n\tconst [atomic, storage, piAi, providers] = await Promise.all([\n\t\timport(\"../../index.ts\"),\n\t\timport(\"../storage/index.js\"),\n\t\timport(\"@bastani/pi-ai/compat\"),\n\t\timport(\"@bastani/pi-ai/providers/all\"),\n\t]);\n\treturn {\n\t\t\"@bastani/atomic\": atomic,\n\t\t\"@bastani/atomic/storage\": storage,\n\t\t\"@bastani/pi-ai\": piAi,\n\t\t\"@bastani/pi-ai/providers/all\": providers,\n\t};\n}\n\n/**\n * Live host modules for storage adapter modules. Outside single-file builds `@bastani/atomic` resolves lazily through\n * the extension aliases instead, so a process that needs only storage, such as the Intercom broker, never evaluates\n * the whole host package.\n */\nexport async function getStorageAdapterHostModules(): Promise<Record<string, object>> {\n\tconst storage = await import(\"../storage/index.js\");\n\tif (!(isBunBinary || isBundledBuild)) return { \"@bastani/atomic/storage\": storage };\n\treturn { \"@bastani/atomic\": await import(\"../../index.ts\"), \"@bastani/atomic/storage\": storage };\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { createJiti } from "jiti";
1
2
  import { loadVirtualModules } from "./loader-host-modules.js";
2
3
  import type { ExtensionFactory } from "./types.ts";
3
4
  export { getVirtualModules } from "./loader-host-modules.js";
@@ -42,6 +43,11 @@ declare function findPackageRoot(packageName: string, searchPaths?: string[]): s
42
43
  * In Bun binary mode, virtualModules is used instead.
43
44
  */
44
45
  declare function getAliases(): Record<string, string>;
46
+ /**
47
+ * A jiti loader that resolves host package specifiers the way extensions see them: `virtualModules` share live host
48
+ * instances, and outside single-file builds every other host specifier aliases to the installed host files.
49
+ */
50
+ export declare function createHostModuleJiti(id: string, virtualModules: Record<string, object>, options?: Parameters<typeof createJiti>[1]): Promise<ReturnType<typeof createJiti>>;
45
51
  export declare const extensionLoaderTestHooks: {
46
52
  loadVirtualModules: typeof loadVirtualModules;
47
53
  getAliases: typeof getAliases;
@@ -1 +1 @@
1
- {"version":3,"file":"loader-virtual-modules.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader-virtual-modules.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA0B7D;;;;GAIG;AACH,iBAAS,oBAAoB,IAAI,MAAM,CAMtC;AAiBD;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAWD,iBAAS,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAGxD;AAgFD,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAYpG;AAmHD,iBAAe,gCAAgC,CAC9C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,mBAAmB,GAAG,SAAS,GACzC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAyBvC;AAED,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAOrE;AAiBD;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ5E;AAKD;;;GAGG;AACH,iBAAS,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwG5C;AAED,eAAO,MAAM,wBAAwB;;;;;;;oDAOY,MAAM,eAAe,mBAAmB;oDAExC,MAAM,eAAe,mBAAmB;;6CAG/C,MAAM,KAAG,OAAO;CACzD,CAAC;AAkFF,wBAAsB,mBAAmB,CACxC,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAiCvC"}
1
+ {"version":3,"file":"loader-virtual-modules.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader-virtual-modules.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAMvC,OAAO,EAAqB,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AA0B7D;;;;GAIG;AACH,iBAAS,oBAAoB,IAAI,MAAM,CAMtC;AAiBD;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAWD,iBAAS,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAGxD;AAgFD,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAYpG;AAmHD,iBAAe,gCAAgC,CAC9C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,mBAAmB,GAAG,SAAS,GACzC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAyBvC;AAED,MAAM,WAAW,mBAAmB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAOrE;AAiBD;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ5E;AAKD;;;GAGG;AACH,iBAAS,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4G5C;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,GAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAM,GAC5C,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CASxC;AAED,eAAO,MAAM,wBAAwB;;;;;;;oDAOY,MAAM,eAAe,mBAAmB;oDAExC,MAAM,eAAe,mBAAmB;;6CAG/C,MAAM,KAAG,OAAO;CACzD,CAAC;AAkFF,wBAAsB,mBAAmB,CACxC,aAAa,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAiCvC"}
@@ -386,6 +386,8 @@ function getAliases() {
386
386
  const piAiOpenRouterEntry = resolveWorkspaceOrImport("ai/dist/providers/openrouter.js", "@bastani/pi-ai");
387
387
  const piAiProviderEnvEntry = resolveWorkspaceOrImport("ai/dist/utils/provider-env.js", "@bastani/pi-ai");
388
388
  const piAiRetryEntry = resolveWorkspaceOrImport("ai/dist/utils/retry.js", "@bastani/pi-ai");
389
+ const piAiRequestAdmissionEntry = resolveWorkspaceOrImport("ai/dist/utils/request-admission.js", "@bastani/pi-ai");
390
+ const piAiRetryHintsEntry = resolveWorkspaceOrImport("ai/dist/utils/retry-hints.js", "@bastani/pi-ai");
389
391
  const piAiCompatSchemaEntry = resolveWorkspaceOrImport("ai/dist/providers/compat-schema.js", "@bastani/pi-ai");
390
392
  const piAiModelSchemaEntry = resolveWorkspaceOrImport("ai/dist/providers/model-schema.js", "@bastani/pi-ai");
391
393
  const piAiOauthPageEntry = resolveWorkspaceOrImport("ai/dist/utils/oauth-page.js", "@bastani/pi-ai");
@@ -410,6 +412,8 @@ function getAliases() {
410
412
  "@bastani/pi-ai/providers/model-schema": piAiModelSchemaEntry,
411
413
  "@bastani/pi-ai/utils/provider-env": piAiProviderEnvEntry,
412
414
  "@bastani/pi-ai/utils/oauth-page": piAiOauthPageEntry,
415
+ "@bastani/pi-ai/utils/request-admission": piAiRequestAdmissionEntry,
416
+ "@bastani/pi-ai/utils/retry-hints": piAiRetryHintsEntry,
413
417
  "@bastani/pi-ai/utils/retry": piAiRetryEntry,
414
418
  "@bastani/pi-ai/compat": piAiEntry,
415
419
  "@bastani/pi-ai/api/cloudflare-gateway-binding": piAiGatewayBindingEntry,
@@ -440,6 +444,20 @@ function getAliases() {
440
444
  };
441
445
  return _aliases;
442
446
  }
447
+ /**
448
+ * A jiti loader that resolves host package specifiers the way extensions see them: `virtualModules` share live host
449
+ * instances, and outside single-file builds every other host specifier aliases to the installed host files.
450
+ */
451
+ export async function createHostModuleJiti(id, virtualModules, options = {}) {
452
+ const isSingleFileBuild = isBunBinary || isBundledBuild;
453
+ const createJitiImpl = await getCreateJiti();
454
+ return createJitiImpl(id, {
455
+ ...options,
456
+ // Single-file builds have no host files to alias, so every import must reach the virtual modules.
457
+ ...(isSingleFileBuild ? { tryNative: false } : { alias: getAliases() }),
458
+ virtualModules,
459
+ });
460
+ }
443
461
  export const extensionLoaderTestHooks = {
444
462
  loadVirtualModules,
445
463
  getAliases,