@astralyn/pi 0.85.3 → 0.86.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 (335) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/bundle/chunks/anthropic-messages-R2LYJUDD.js +6 -0
  3. package/dist/bundle/chunks/azure-openai-responses-HS35BQV6.js +2 -0
  4. package/dist/bundle/chunks/bedrock-converse-stream.js +36 -32
  5. package/dist/bundle/chunks/{chunk-S2DJQQI2.js → chunk-2IO5GDBS.js} +10 -1
  6. package/dist/bundle/chunks/chunk-DAEM5JIZ.js +2 -0
  7. package/dist/bundle/chunks/{chunk-LB4P77SH.js → chunk-GTBMYBFG.js} +777 -762
  8. package/dist/bundle/chunks/{chunk-7LO5Z4WE.js → chunk-I5IVW2WS.js} +1 -1
  9. package/dist/bundle/chunks/chunk-JI4WGISU.js +2 -0
  10. package/dist/bundle/chunks/chunk-LPQCB2VJ.js +44 -0
  11. package/dist/bundle/chunks/chunk-NW5FIDD7.js +11 -0
  12. package/dist/bundle/chunks/chunk-PJVFYVHE.js +42 -0
  13. package/dist/bundle/chunks/github-copilot.js +1 -1
  14. package/dist/bundle/chunks/google-generative-ai-NOVAJBFC.js +2 -0
  15. package/dist/bundle/chunks/google-vertex-4VHCZJV5.js +2 -0
  16. package/dist/bundle/chunks/https-proxy-agent-JOOPB4RE.js +16 -0
  17. package/dist/bundle/chunks/jiti-loader-BFSSLU7G.js +21 -0
  18. package/dist/bundle/chunks/jiti-static-loader-CLT3YR3B.js +2 -0
  19. package/dist/bundle/chunks/mistral-conversations-WC6A2WCJ.js +5 -0
  20. package/dist/bundle/chunks/{node-G4XOIDPH.js → node-CXWYTK2I.js} +1 -1
  21. package/dist/bundle/chunks/openai-codex-responses-XCDG75W2.js +10 -0
  22. package/dist/bundle/chunks/openai-completions-6SMWQWQN.js +7 -0
  23. package/dist/bundle/chunks/openai-responses-UT6XFKC7.js +2 -0
  24. package/dist/bundle/chunks/{pi-messages-PE6B42TG.js → pi-messages-MQMPIPNC.js} +1 -1
  25. package/dist/bundle/chunks/virtual-modules-OHUZ2T7X.js +2 -0
  26. package/dist/bundle/cli.js +1 -1
  27. package/dist/bundle/index.js +1 -1
  28. package/dist/bundle/rpc-entry.js +1 -1
  29. package/dist/cli/args.d.ts.map +1 -1
  30. package/dist/cli/args.js +1 -0
  31. package/dist/cli/args.js.map +1 -1
  32. package/dist/cli/session-picker.d.ts +1 -1
  33. package/dist/cli/session-picker.d.ts.map +1 -1
  34. package/dist/cli/session-picker.js +13 -11
  35. package/dist/cli/session-picker.js.map +1 -1
  36. package/dist/config.js +1 -1
  37. package/dist/config.js.map +1 -1
  38. package/dist/core/agent-session.d.ts +56 -14
  39. package/dist/core/agent-session.d.ts.map +1 -1
  40. package/dist/core/agent-session.js +305 -176
  41. package/dist/core/agent-session.js.map +1 -1
  42. package/dist/core/bug-report-upload.d.ts +12 -0
  43. package/dist/core/bug-report-upload.d.ts.map +1 -0
  44. package/dist/core/bug-report-upload.js +22 -0
  45. package/dist/core/bug-report-upload.js.map +1 -0
  46. package/dist/core/bug-report.d.ts +176 -0
  47. package/dist/core/bug-report.d.ts.map +1 -0
  48. package/dist/core/bug-report.js +292 -0
  49. package/dist/core/bug-report.js.map +1 -0
  50. package/dist/core/cache-stats.d.ts.map +1 -1
  51. package/dist/core/cache-stats.js +12 -1
  52. package/dist/core/cache-stats.js.map +1 -1
  53. package/dist/core/cache-warmer.d.ts +102 -0
  54. package/dist/core/cache-warmer.d.ts.map +1 -0
  55. package/dist/core/cache-warmer.js +333 -0
  56. package/dist/core/cache-warmer.js.map +1 -0
  57. package/dist/core/compaction/branch-summarization.js +2 -2
  58. package/dist/core/compaction/branch-summarization.js.map +1 -1
  59. package/dist/core/compaction/compaction.d.ts +14 -9
  60. package/dist/core/compaction/compaction.d.ts.map +1 -1
  61. package/dist/core/compaction/compaction.js +30 -23
  62. package/dist/core/compaction/compaction.js.map +1 -1
  63. package/dist/core/compaction/settings.d.ts +17 -20
  64. package/dist/core/compaction/settings.d.ts.map +1 -1
  65. package/dist/core/compaction/settings.js +19 -26
  66. package/dist/core/compaction/settings.js.map +1 -1
  67. package/dist/core/context-snapshot.d.ts +16 -5
  68. package/dist/core/context-snapshot.d.ts.map +1 -1
  69. package/dist/core/context-snapshot.js +20 -10
  70. package/dist/core/context-snapshot.js.map +1 -1
  71. package/dist/core/crash-log.d.ts +22 -0
  72. package/dist/core/crash-log.d.ts.map +1 -0
  73. package/dist/core/crash-log.js +71 -0
  74. package/dist/core/crash-log.js.map +1 -0
  75. package/dist/core/experimental.d.ts +0 -4
  76. package/dist/core/experimental.d.ts.map +1 -1
  77. package/dist/core/experimental.js +0 -4
  78. package/dist/core/experimental.js.map +1 -1
  79. package/dist/core/extensions/index.d.ts +1 -1
  80. package/dist/core/extensions/index.d.ts.map +1 -1
  81. package/dist/core/extensions/index.js.map +1 -1
  82. package/dist/core/extensions/jiti-loader.d.ts +2 -0
  83. package/dist/core/extensions/jiti-loader.d.ts.map +1 -0
  84. package/dist/core/extensions/jiti-loader.js +4 -0
  85. package/dist/core/extensions/jiti-loader.js.map +1 -0
  86. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  87. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  88. package/dist/core/extensions/jiti-static-loader.js +4 -0
  89. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  90. package/dist/core/extensions/loader.d.ts.map +1 -1
  91. package/dist/core/extensions/loader.js +38 -51
  92. package/dist/core/extensions/loader.js.map +1 -1
  93. package/dist/core/extensions/runner.d.ts +10 -7
  94. package/dist/core/extensions/runner.d.ts.map +1 -1
  95. package/dist/core/extensions/runner.js +85 -67
  96. package/dist/core/extensions/runner.js.map +1 -1
  97. package/dist/core/extensions/types.d.ts +60 -50
  98. package/dist/core/extensions/types.d.ts.map +1 -1
  99. package/dist/core/extensions/types.js.map +1 -1
  100. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  101. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  102. package/dist/core/extensions/virtual-modules.js +39 -0
  103. package/dist/core/extensions/virtual-modules.js.map +1 -0
  104. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  105. package/dist/core/extensions/wrapper.js +1 -20
  106. package/dist/core/extensions/wrapper.js.map +1 -1
  107. package/dist/core/index.d.ts +2 -1
  108. package/dist/core/index.d.ts.map +1 -1
  109. package/dist/core/index.js.map +1 -1
  110. package/dist/core/keybindings.d.ts +1 -1
  111. package/dist/core/keybindings.js +1 -1
  112. package/dist/core/keybindings.js.map +1 -1
  113. package/dist/core/messages.d.ts.map +1 -1
  114. package/dist/core/messages.js +1 -0
  115. package/dist/core/messages.js.map +1 -1
  116. package/dist/core/model-config.d.ts +101 -20
  117. package/dist/core/model-config.d.ts.map +1 -1
  118. package/dist/core/model-config.js +25 -18
  119. package/dist/core/model-config.js.map +1 -1
  120. package/dist/core/model-registry.d.ts +5 -1
  121. package/dist/core/model-registry.d.ts.map +1 -1
  122. package/dist/core/model-registry.js +8 -0
  123. package/dist/core/model-registry.js.map +1 -1
  124. package/dist/core/model-resolver.d.ts.map +1 -1
  125. package/dist/core/model-resolver.js +2 -1
  126. package/dist/core/model-resolver.js.map +1 -1
  127. package/dist/core/model-runtime.d.ts.map +1 -1
  128. package/dist/core/model-runtime.js +5 -3
  129. package/dist/core/model-runtime.js.map +1 -1
  130. package/dist/core/provider-composer.d.ts +3 -2
  131. package/dist/core/provider-composer.d.ts.map +1 -1
  132. package/dist/core/provider-composer.js +2 -0
  133. package/dist/core/provider-composer.js.map +1 -1
  134. package/dist/core/radius.d.ts +3 -0
  135. package/dist/core/radius.d.ts.map +1 -1
  136. package/dist/core/radius.js +6 -0
  137. package/dist/core/radius.js.map +1 -1
  138. package/dist/core/sdk.d.ts.map +1 -1
  139. package/dist/core/sdk.js +46 -18
  140. package/dist/core/sdk.js.map +1 -1
  141. package/dist/core/session-export.d.ts +6 -2
  142. package/dist/core/session-export.d.ts.map +1 -1
  143. package/dist/core/session-export.js +14 -13
  144. package/dist/core/session-export.js.map +1 -1
  145. package/dist/core/session-manager.d.ts +29 -6
  146. package/dist/core/session-manager.d.ts.map +1 -1
  147. package/dist/core/session-manager.js +159 -96
  148. package/dist/core/session-manager.js.map +1 -1
  149. package/dist/core/settings-manager.d.ts +31 -4
  150. package/dist/core/settings-manager.d.ts.map +1 -1
  151. package/dist/core/settings-manager.js +65 -8
  152. package/dist/core/settings-manager.js.map +1 -1
  153. package/dist/core/slash-commands.d.ts.map +1 -1
  154. package/dist/core/slash-commands.js +1 -0
  155. package/dist/core/slash-commands.js.map +1 -1
  156. package/dist/core/system-prompt.d.ts +49 -6
  157. package/dist/core/system-prompt.d.ts.map +1 -1
  158. package/dist/core/system-prompt.js +121 -92
  159. package/dist/core/system-prompt.js.map +1 -1
  160. package/dist/core/tools/bash.d.ts +2 -1
  161. package/dist/core/tools/bash.d.ts.map +1 -1
  162. package/dist/core/tools/bash.js +6 -3
  163. package/dist/core/tools/bash.js.map +1 -1
  164. package/dist/core/tools/edit.d.ts.map +1 -1
  165. package/dist/core/tools/edit.js +1 -2
  166. package/dist/core/tools/edit.js.map +1 -1
  167. package/dist/core/tools/read.d.ts.map +1 -1
  168. package/dist/core/tools/read.js +1 -2
  169. package/dist/core/tools/read.js.map +1 -1
  170. package/dist/core/tools/shell-execution.js +2 -2
  171. package/dist/core/tools/shell-execution.js.map +1 -1
  172. package/dist/core/tools/write.d.ts.map +1 -1
  173. package/dist/core/tools/write.js +1 -2
  174. package/dist/core/tools/write.js.map +1 -1
  175. package/dist/core/usage-totals.d.ts +1 -1
  176. package/dist/core/usage-totals.d.ts.map +1 -1
  177. package/dist/core/usage-totals.js +4 -1
  178. package/dist/core/usage-totals.js.map +1 -1
  179. package/dist/extensions/background/schema.d.ts +1 -1
  180. package/dist/extensions/btw/agent.d.ts.map +1 -1
  181. package/dist/extensions/btw/agent.js +3 -2
  182. package/dist/extensions/btw/agent.js.map +1 -1
  183. package/dist/extensions/llama/client.d.ts +2 -0
  184. package/dist/extensions/llama/client.d.ts.map +1 -1
  185. package/dist/extensions/llama/client.js +7 -3
  186. package/dist/extensions/llama/client.js.map +1 -1
  187. package/dist/extensions/llama/provider.d.ts.map +1 -1
  188. package/dist/extensions/llama/provider.js +20 -5
  189. package/dist/extensions/llama/provider.js.map +1 -1
  190. package/dist/extensions/provider/compat-fields.d.ts.map +1 -1
  191. package/dist/extensions/provider/compat-fields.js +5 -2
  192. package/dist/extensions/provider/compat-fields.js.map +1 -1
  193. package/dist/extensions/provider/ui/app.js +2 -2
  194. package/dist/extensions/provider/ui/app.js.map +1 -1
  195. package/dist/extensions/todo/schema.d.ts +1 -1
  196. package/dist/index.d.ts +3 -2
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js.map +1 -1
  199. package/dist/main.d.ts.map +1 -1
  200. package/dist/main.js +13 -9
  201. package/dist/main.js.map +1 -1
  202. package/dist/migrations.d.ts.map +1 -1
  203. package/dist/migrations.js +2 -2
  204. package/dist/migrations.js.map +1 -1
  205. package/dist/modes/interactive/bug-report.d.ts +16 -0
  206. package/dist/modes/interactive/bug-report.d.ts.map +1 -0
  207. package/dist/modes/interactive/bug-report.js +206 -0
  208. package/dist/modes/interactive/bug-report.js.map +1 -0
  209. package/dist/modes/interactive/chat-viewport.js +1 -1
  210. package/dist/modes/interactive/chat-viewport.js.map +1 -1
  211. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  212. package/dist/modes/interactive/components/armin.js +0 -5
  213. package/dist/modes/interactive/components/armin.js.map +1 -1
  214. package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
  215. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  216. package/dist/modes/interactive/components/bash-execution.js +2 -3
  217. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  218. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  219. package/dist/modes/interactive/components/branch-summary-message.js +12 -5
  220. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  221. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  222. package/dist/modes/interactive/components/compaction-summary-message.js +12 -5
  223. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  224. package/dist/modes/interactive/components/countdown-timer.d.ts +6 -13
  225. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  226. package/dist/modes/interactive/components/countdown-timer.js +15 -51
  227. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  228. package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
  229. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  230. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  231. package/dist/modes/interactive/components/extension-editor.d.ts +4 -1
  232. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  233. package/dist/modes/interactive/components/extension-editor.js +7 -2
  234. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  235. package/dist/modes/interactive/components/extension-input.d.ts +2 -0
  236. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/extension-input.js +6 -0
  238. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  239. package/dist/modes/interactive/components/extension-selector.d.ts +1 -2
  240. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  241. package/dist/modes/interactive/components/extension-selector.js +4 -2
  242. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  243. package/dist/modes/interactive/components/session-selector.d.ts +5 -8
  244. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  245. package/dist/modes/interactive/components/session-selector.js +72 -95
  246. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  247. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  248. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  249. package/dist/modes/interactive/components/settings-selector.js +11 -0
  250. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  251. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/skill-invocation-message.js +11 -4
  253. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  254. package/dist/modes/interactive/components/status-indicator.d.ts +2 -2
  255. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/status-indicator.js +7 -7
  257. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  258. package/dist/modes/interactive/components/tool-chrome.d.ts.map +1 -1
  259. package/dist/modes/interactive/components/tool-chrome.js +4 -1
  260. package/dist/modes/interactive/components/tool-chrome.js.map +1 -1
  261. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  262. package/dist/modes/interactive/components/tool-execution.js +4 -3
  263. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  264. package/dist/modes/interactive/components/tree-selector.d.ts +1 -10
  265. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  266. package/dist/modes/interactive/components/tree-selector.js +4 -51
  267. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  268. package/dist/modes/interactive/interactive-mode.d.ts +15 -2
  269. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  270. package/dist/modes/interactive/interactive-mode.js +234 -91
  271. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  272. package/dist/modes/interactive/session-share.d.ts +2 -0
  273. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  274. package/dist/modes/interactive/session-share.js +8 -4
  275. package/dist/modes/interactive/session-share.js.map +1 -1
  276. package/dist/modes/interactive/tui-renderer.js +2 -2
  277. package/dist/modes/interactive/tui-renderer.js.map +1 -1
  278. package/dist/modes/rpc/rpc-mode.js +2 -2
  279. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  280. package/dist/utils/clipboard-command.d.ts +7 -0
  281. package/dist/utils/clipboard-command.d.ts.map +1 -0
  282. package/dist/utils/clipboard-command.js +45 -0
  283. package/dist/utils/clipboard-command.js.map +1 -0
  284. package/dist/utils/clipboard-image.d.ts.map +1 -1
  285. package/dist/utils/clipboard-image.js +53 -81
  286. package/dist/utils/clipboard-image.js.map +1 -1
  287. package/dist/utils/clipboard.d.ts.map +1 -1
  288. package/dist/utils/clipboard.js +111 -121
  289. package/dist/utils/clipboard.js.map +1 -1
  290. package/dist/utils/wsl.d.ts +3 -0
  291. package/dist/utils/wsl.d.ts.map +1 -0
  292. package/dist/utils/wsl.js +15 -0
  293. package/dist/utils/wsl.js.map +1 -0
  294. package/dist/utils/zip.d.ts +7 -0
  295. package/dist/utils/zip.d.ts.map +1 -0
  296. package/dist/utils/zip.js +60 -0
  297. package/dist/utils/zip.js.map +1 -0
  298. package/docs/compaction.md +32 -11
  299. package/docs/custom-provider.md +19 -8
  300. package/docs/environment-variables.md +1 -0
  301. package/docs/extensions.md +50 -34
  302. package/docs/models.md +38 -3
  303. package/docs/providers.md +9 -1
  304. package/docs/sdk.md +4 -2
  305. package/docs/session-format.md +63 -24
  306. package/docs/sessions.md +28 -1
  307. package/docs/settings.md +58 -4
  308. package/docs/termux.md +0 -1
  309. package/docs/tui.md +2 -0
  310. package/docs/usage.md +1 -0
  311. package/examples/extensions/README.md +0 -1
  312. package/examples/extensions/custom-provider-anthropic/index.ts +18 -12
  313. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  314. package/examples/extensions/prompt-customizer.ts +19 -67
  315. package/npm-shrinkwrap.json +275 -1028
  316. package/package.json +17 -23
  317. package/dist/bundle/chunks/anthropic-messages-IHRRITCV.js +0 -6
  318. package/dist/bundle/chunks/azure-openai-responses-QXBIDYXO.js +0 -2
  319. package/dist/bundle/chunks/chunk-JSJPY26N.js +0 -2
  320. package/dist/bundle/chunks/chunk-KI6LC764.js +0 -42
  321. package/dist/bundle/chunks/chunk-OWESLY5T.js +0 -11
  322. package/dist/bundle/chunks/chunk-RRBI7OUG.js +0 -50
  323. package/dist/bundle/chunks/chunk-YZJWMPUI.js +0 -2
  324. package/dist/bundle/chunks/google-generative-ai-NBOR3IQR.js +0 -2
  325. package/dist/bundle/chunks/google-vertex-VTHX3SUB.js +0 -2
  326. package/dist/bundle/chunks/https-proxy-agent-2VXB7436.js +0 -13
  327. package/dist/bundle/chunks/mistral-conversations-NO4ANAA5.js +0 -5
  328. package/dist/bundle/chunks/openai-codex-responses-5S3T3HMA.js +0 -10
  329. package/dist/bundle/chunks/openai-completions-CXRRTRWE.js +0 -7
  330. package/dist/bundle/chunks/openai-responses-CV3MH6VP.js +0 -2
  331. package/dist/utils/clipboard-native.d.ts +0 -11
  332. package/dist/utils/clipboard-native.d.ts.map +0 -1
  333. package/dist/utils/clipboard-native.js +0 -20
  334. package/dist/utils/clipboard-native.js.map +0 -1
  335. package/examples/extensions/kimi-deferred-tools.ts +0 -61
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { theme } from "../../modes/interactive/theme/theme.js";
5
5
  import { BackgroundService } from "../background/service.js";
6
+ import { buildSystemPrompt, normalizeBuildSystemPromptOptions, } from "../system-prompt.js";
6
7
  // Extension shortcuts compete with canonical keybinding ids from keybindings.json.
7
8
  // Only editor-global shortcuts are reserved here. Picker-specific bindings are not.
8
9
  const RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS = [
@@ -48,6 +49,31 @@ const buildBuiltinKeybindings = (resolvedKeybindings) => {
48
49
  }
49
50
  return builtinKeybindings;
50
51
  };
52
+ function isUserBashEventResult(value) {
53
+ if (typeof value !== "object" || value === null)
54
+ return false;
55
+ const candidate = value;
56
+ const hasOperations = candidate.operations !== undefined;
57
+ const hasResult = candidate.result !== undefined;
58
+ if (hasOperations === hasResult)
59
+ return false;
60
+ if (hasOperations) {
61
+ const operations = candidate.operations;
62
+ if (typeof operations !== "object" || operations === null)
63
+ return false;
64
+ return typeof operations.exec === "function";
65
+ }
66
+ const result = candidate.result;
67
+ if (typeof result !== "object" || result === null)
68
+ return false;
69
+ const resultRecord = result;
70
+ return (typeof resultRecord.output === "string" &&
71
+ "exitCode" in resultRecord &&
72
+ (resultRecord.exitCode === undefined || typeof resultRecord.exitCode === "number") &&
73
+ typeof resultRecord.cancelled === "boolean" &&
74
+ typeof resultRecord.truncated === "boolean" &&
75
+ (resultRecord.fullOutputPath === undefined || typeof resultRecord.fullOutputPath === "string"));
76
+ }
51
77
  /**
52
78
  * Helper function to emit session_shutdown event to extensions.
53
79
  * Returns true if the event was emitted, false if there were no handlers.
@@ -59,14 +85,14 @@ export async function emitSessionShutdownEvent(extensionRunner, event) {
59
85
  }
60
86
  return false;
61
87
  }
88
+ function snapshotEventHandlers(extensions, event) {
89
+ return extensions.map((ext) => ({ ext, handlers: ext.handlers.get(event)?.slice() ?? [] }));
90
+ }
62
91
  export async function emitProjectTrustEvent(extensionsResult, event, ctx) {
63
92
  const errors = [];
64
- for (const ext of extensionsResult.extensions) {
93
+ for (const { ext, handlers } of snapshotEventHandlers(extensionsResult.extensions, "project_trust")) {
65
94
  // A single extension may register multiple handlers for the same event.
66
95
  // The first project_trust handler that returns yes/no wins; undecided falls through.
67
- const handlers = ext.handlers.get("project_trust");
68
- if (!handlers || handlers.length === 0)
69
- continue;
70
96
  for (const handler of handlers) {
71
97
  try {
72
98
  const handlerResult = (await handler(event, ctx));
@@ -141,7 +167,7 @@ export class ExtensionRunner {
141
167
  };
142
168
  this.compactFn = () => { };
143
169
  this.getSystemPromptFn = () => "";
144
- this.getSystemPromptOptionsFn = () => ({ cwd: this.cwd });
170
+ this.getSystemPromptOptionsFn = () => normalizeBuildSystemPromptOptions({ cwd: this.cwd });
145
171
  this.newSessionHandler = async () => ({ cancelled: false });
146
172
  this.forkHandler = async () => ({ cancelled: false });
147
173
  this.navigateTreeHandler = async () => ({ cancelled: false });
@@ -189,7 +215,8 @@ export class ExtensionRunner {
189
215
  this.getContextSnapshotFn = contextActions.getContextSnapshot;
190
216
  this.compactFn = contextActions.compact;
191
217
  this.getSystemPromptFn = contextActions.getSystemPrompt;
192
- this.getSystemPromptOptionsFn = contextActions.getSystemPromptOptions ?? (() => ({ cwd: this.cwd }));
218
+ this.getSystemPromptOptionsFn =
219
+ contextActions.getSystemPromptOptions ?? (() => normalizeBuildSystemPromptOptions({ cwd: this.cwd }));
193
220
  // Flush provider registrations queued during extension loading
194
221
  for (const { name, config, extensionPath } of this.runtime.pendingProviderRegistrations) {
195
222
  try {
@@ -640,10 +667,7 @@ export class ExtensionRunner {
640
667
  async emit(event) {
641
668
  const ctx = this.createContext();
642
669
  let result;
643
- for (const ext of this.extensions) {
644
- const handlers = ext.handlers.get(event.type);
645
- if (!handlers || handlers.length === 0)
646
- continue;
670
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, event.type)) {
647
671
  for (const handler of handlers) {
648
672
  try {
649
673
  const handlerResult = await handler(event, ctx);
@@ -668,14 +692,34 @@ export class ExtensionRunner {
668
692
  }
669
693
  return result;
670
694
  }
695
+ /** Returns the event's own action unless a handler overrides it; the last override wins. */
696
+ async emitCacheWarmingDecision(event) {
697
+ const ctx = this.createContext();
698
+ let action = event.action;
699
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, event.type)) {
700
+ for (const handler of handlers) {
701
+ try {
702
+ const result = (await handler(event, ctx));
703
+ if (result?.action !== undefined)
704
+ action = result.action;
705
+ }
706
+ catch (err) {
707
+ this.emitError({
708
+ extensionPath: ext.path,
709
+ event: event.type,
710
+ error: err instanceof Error ? err.message : String(err),
711
+ stack: err instanceof Error ? err.stack : undefined,
712
+ });
713
+ }
714
+ }
715
+ }
716
+ return action;
717
+ }
671
718
  async emitMessageEnd(event) {
672
719
  const ctx = this.createContext();
673
720
  let currentMessage = event.message;
674
721
  let modified = false;
675
- for (const ext of this.extensions) {
676
- const handlers = ext.handlers.get("message_end");
677
- if (!handlers || handlers.length === 0)
678
- continue;
722
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "message_end")) {
679
723
  for (const handler of handlers) {
680
724
  try {
681
725
  const currentEvent = { ...event, message: currentMessage };
@@ -711,10 +755,7 @@ export class ExtensionRunner {
711
755
  const ctx = this.createContext();
712
756
  const currentEvent = { ...event };
713
757
  let modified = false;
714
- for (const ext of this.extensions) {
715
- const handlers = ext.handlers.get("tool_result");
716
- if (!handlers || handlers.length === 0)
717
- continue;
758
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "tool_result")) {
718
759
  for (const handler of handlers) {
719
760
  try {
720
761
  const handlerResult = (await handler(currentEvent, ctx));
@@ -762,10 +803,7 @@ export class ExtensionRunner {
762
803
  async emitToolCall(event) {
763
804
  const ctx = this.createContext();
764
805
  let result;
765
- for (const ext of this.extensions) {
766
- const handlers = ext.handlers.get("tool_call");
767
- if (!handlers || handlers.length === 0)
768
- continue;
806
+ for (const { handlers } of snapshotEventHandlers(this.extensions, "tool_call")) {
769
807
  for (const handler of handlers) {
770
808
  const handlerResult = await handler(event, ctx);
771
809
  if (handlerResult) {
@@ -780,16 +818,16 @@ export class ExtensionRunner {
780
818
  }
781
819
  async emitUserBash(event) {
782
820
  const ctx = this.createContext();
783
- for (const ext of this.extensions) {
784
- const handlers = ext.handlers.get("user_bash");
785
- if (!handlers || handlers.length === 0)
786
- continue;
821
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "user_bash")) {
787
822
  for (const handler of handlers) {
788
823
  try {
789
824
  const handlerResult = await handler(event, ctx);
790
- if (handlerResult) {
791
- return handlerResult;
825
+ if (handlerResult === undefined)
826
+ continue;
827
+ if (!isUserBashEventResult(handlerResult)) {
828
+ throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");
792
829
  }
830
+ return handlerResult;
793
831
  }
794
832
  catch (err) {
795
833
  const message = err instanceof Error ? err.message : String(err);
@@ -800,6 +838,7 @@ export class ExtensionRunner {
800
838
  error: message,
801
839
  stack,
802
840
  });
841
+ throw err;
803
842
  }
804
843
  }
805
844
  }
@@ -808,10 +847,7 @@ export class ExtensionRunner {
808
847
  async emitContext(messages) {
809
848
  const ctx = this.createContext();
810
849
  let currentMessages = structuredClone(messages);
811
- for (const ext of this.extensions) {
812
- const handlers = ext.handlers.get("context");
813
- if (!handlers || handlers.length === 0)
814
- continue;
850
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "context")) {
815
851
  for (const handler of handlers) {
816
852
  try {
817
853
  const event = { type: "context", messages: currentMessages };
@@ -837,10 +873,7 @@ export class ExtensionRunner {
837
873
  async emitBeforeProviderRequest(payload) {
838
874
  const ctx = this.createContext();
839
875
  let currentPayload = payload;
840
- for (const ext of this.extensions) {
841
- const handlers = ext.handlers.get("before_provider_request");
842
- if (!handlers || handlers.length === 0)
843
- continue;
876
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "before_provider_request")) {
844
877
  for (const handler of handlers) {
845
878
  try {
846
879
  const event = {
@@ -868,10 +901,7 @@ export class ExtensionRunner {
868
901
  }
869
902
  async emitBeforeProviderHeaders(headers) {
870
903
  const ctx = this.createContext();
871
- for (const ext of this.extensions) {
872
- const handlers = ext.handlers.get("before_provider_headers");
873
- if (!handlers || handlers.length === 0)
874
- continue;
904
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "before_provider_headers")) {
875
905
  for (const handler of handlers) {
876
906
  try {
877
907
  // Handlers mutate `headers` in place; the return value is ignored.
@@ -895,37 +925,34 @@ export class ExtensionRunner {
895
925
  }
896
926
  return headers;
897
927
  }
898
- async emitBeforeAgentStart(prompt, images, systemPrompt, systemPromptOptions) {
899
- let currentSystemPrompt = systemPrompt;
928
+ async emitBeforeAgentStart(prompt, images, systemPromptOptions) {
929
+ const currentOptions = normalizeBuildSystemPromptOptions(systemPromptOptions);
930
+ const renderCurrentSystemPrompt = () => buildSystemPrompt(currentOptions);
900
931
  const ctx = Object.defineProperties({}, Object.getOwnPropertyDescriptors(this.createContext()));
901
932
  ctx.getSystemPrompt = () => {
902
933
  this.assertActive();
903
- return currentSystemPrompt;
934
+ return renderCurrentSystemPrompt();
904
935
  };
905
936
  const messages = [];
906
- let systemPromptModified = false;
907
- for (const ext of this.extensions) {
908
- const handlers = ext.handlers.get("before_agent_start");
909
- if (!handlers || handlers.length === 0)
910
- continue;
937
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "before_agent_start")) {
911
938
  for (const handler of handlers) {
912
939
  try {
913
940
  const event = {
914
941
  type: "before_agent_start",
915
942
  prompt,
916
943
  images,
917
- systemPrompt: currentSystemPrompt,
918
- systemPromptOptions,
944
+ get systemPrompt() {
945
+ return renderCurrentSystemPrompt();
946
+ },
947
+ systemPromptOptions: currentOptions,
919
948
  };
920
949
  const handlerResult = await handler(event, ctx);
921
950
  if (handlerResult) {
922
951
  const result = handlerResult;
923
- if (result.message) {
952
+ if (result.message)
924
953
  messages.push(result.message);
925
- }
926
954
  if (result.systemPrompt !== undefined) {
927
- currentSystemPrompt = result.systemPrompt;
928
- systemPromptModified = true;
955
+ currentOptions.forceSystemPrompt = result.systemPrompt;
929
956
  }
930
957
  }
931
958
  }
@@ -941,23 +968,14 @@ export class ExtensionRunner {
941
968
  }
942
969
  }
943
970
  }
944
- if (messages.length > 0 || systemPromptModified) {
945
- return {
946
- messages: messages.length > 0 ? messages : undefined,
947
- systemPrompt: systemPromptModified ? currentSystemPrompt : undefined,
948
- };
949
- }
950
- return undefined;
971
+ return { messages, systemPromptOptions: currentOptions };
951
972
  }
952
973
  async emitResourcesDiscover(cwd, reason) {
953
974
  const ctx = this.createContext();
954
975
  const skillPaths = [];
955
976
  const promptPaths = [];
956
977
  const themePaths = [];
957
- for (const ext of this.extensions) {
958
- const handlers = ext.handlers.get("resources_discover");
959
- if (!handlers || handlers.length === 0)
960
- continue;
978
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "resources_discover")) {
961
979
  for (const handler of handlers) {
962
980
  try {
963
981
  const event = { type: "resources_discover", cwd, reason };
@@ -992,8 +1010,8 @@ export class ExtensionRunner {
992
1010
  const ctx = this.createContext();
993
1011
  let currentText = text;
994
1012
  let currentImages = images;
995
- for (const ext of this.extensions) {
996
- for (const handler of ext.handlers.get("input") ?? []) {
1013
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "input")) {
1014
+ for (const handler of handlers) {
997
1015
  try {
998
1016
  const event = {
999
1017
  type: "input",