apex-code 0.5.0 → 0.5.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 (509) hide show
  1. package/CHANGELOG.md +257 -5
  2. package/README.md +624 -0
  3. package/dist/bun/cli.d.ts +3 -1
  4. package/dist/bun/cli.d.ts.map +1 -1
  5. package/dist/bun/cli.js +3 -9
  6. package/dist/bun/cli.js.map +1 -1
  7. package/dist/bun/runtime-setup.d.ts +2 -0
  8. package/dist/bun/runtime-setup.d.ts.map +1 -0
  9. package/dist/bun/runtime-setup.js +9 -0
  10. package/dist/bun/runtime-setup.js.map +1 -0
  11. package/dist/bun/sandbox-env-setup.d.ts +2 -0
  12. package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
  13. package/dist/bun/sandbox-env-setup.js +4 -0
  14. package/dist/bun/sandbox-env-setup.js.map +1 -0
  15. package/dist/cli/args.d.ts.map +1 -1
  16. package/dist/cli/args.js +16 -5
  17. package/dist/cli/args.js.map +1 -1
  18. package/dist/cli/config-selector.d.ts.map +1 -1
  19. package/dist/cli/config-selector.js +2 -1
  20. package/dist/cli/config-selector.js.map +1 -1
  21. package/dist/cli/file-processor.d.ts +1 -1
  22. package/dist/cli/file-processor.d.ts.map +1 -1
  23. package/dist/cli/file-processor.js.map +1 -1
  24. package/dist/cli/session-picker.d.ts +1 -1
  25. package/dist/cli/session-picker.d.ts.map +1 -1
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/cli/setup.d.ts +2 -0
  28. package/dist/cli/setup.d.ts.map +1 -0
  29. package/dist/cli/setup.js +13 -0
  30. package/dist/cli/setup.js.map +1 -0
  31. package/dist/config.d.ts +1 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +1 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  36. package/dist/core/agent-session-runtime.js +16 -8
  37. package/dist/core/agent-session-runtime.js.map +1 -1
  38. package/dist/core/agent-session.d.ts +85 -15
  39. package/dist/core/agent-session.d.ts.map +1 -1
  40. package/dist/core/agent-session.js +685 -266
  41. package/dist/core/agent-session.js.map +1 -1
  42. package/dist/core/auth-storage.d.ts +4 -0
  43. package/dist/core/auth-storage.d.ts.map +1 -1
  44. package/dist/core/auth-storage.js +55 -0
  45. package/dist/core/auth-storage.js.map +1 -1
  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 +291 -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 +103 -0
  54. package/dist/core/cache-warmer.d.ts.map +1 -0
  55. package/dist/core/cache-warmer.js +356 -0
  56. package/dist/core/cache-warmer.js.map +1 -0
  57. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  58. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  59. package/dist/core/compaction/branch-summarization.js +4 -3
  60. package/dist/core/compaction/branch-summarization.js.map +1 -1
  61. package/dist/core/compaction/compaction.d.ts +5 -3
  62. package/dist/core/compaction/compaction.d.ts.map +1 -1
  63. package/dist/core/compaction/compaction.js +163 -66
  64. package/dist/core/compaction/compaction.js.map +1 -1
  65. package/dist/core/context/pipeline.d.ts +8 -8
  66. package/dist/core/context/pipeline.d.ts.map +1 -1
  67. package/dist/core/context/pipeline.js +21 -12
  68. package/dist/core/context/pipeline.js.map +1 -1
  69. package/dist/core/crash-log.d.ts +27 -0
  70. package/dist/core/crash-log.d.ts.map +1 -0
  71. package/dist/core/crash-log.js +139 -0
  72. package/dist/core/crash-log.js.map +1 -0
  73. package/dist/core/export-html/template.js +6 -1
  74. package/dist/core/extensions/index.d.ts +1 -1
  75. package/dist/core/extensions/index.d.ts.map +1 -1
  76. package/dist/core/extensions/index.js.map +1 -1
  77. package/dist/core/extensions/jiti-loader.d.ts +2 -0
  78. package/dist/core/extensions/jiti-loader.d.ts.map +1 -0
  79. package/dist/core/extensions/jiti-loader.js +4 -0
  80. package/dist/core/extensions/jiti-loader.js.map +1 -0
  81. package/dist/core/extensions/jiti-static-loader.d.ts +2 -0
  82. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -0
  83. package/dist/core/extensions/jiti-static-loader.js +4 -0
  84. package/dist/core/extensions/jiti-static-loader.js.map +1 -0
  85. package/dist/core/extensions/loader.d.ts.map +1 -1
  86. package/dist/core/extensions/loader.js +40 -59
  87. package/dist/core/extensions/loader.js.map +1 -1
  88. package/dist/core/extensions/runner.d.ts +24 -8
  89. package/dist/core/extensions/runner.d.ts.map +1 -1
  90. package/dist/core/extensions/runner.js +195 -72
  91. package/dist/core/extensions/runner.js.map +1 -1
  92. package/dist/core/extensions/types.d.ts +142 -55
  93. package/dist/core/extensions/types.d.ts.map +1 -1
  94. package/dist/core/extensions/types.js.map +1 -1
  95. package/dist/core/extensions/virtual-modules.d.ts +3 -0
  96. package/dist/core/extensions/virtual-modules.d.ts.map +1 -0
  97. package/dist/core/extensions/virtual-modules.js +41 -0
  98. package/dist/core/extensions/virtual-modules.js.map +1 -0
  99. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  100. package/dist/core/extensions/wrapper.js +1 -20
  101. package/dist/core/extensions/wrapper.js.map +1 -1
  102. package/dist/core/http-dispatcher.d.ts.map +1 -1
  103. package/dist/core/http-dispatcher.js +2 -0
  104. package/dist/core/http-dispatcher.js.map +1 -1
  105. package/dist/core/index.d.ts +2 -1
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js.map +1 -1
  108. package/dist/core/keybindings.d.ts +6 -1
  109. package/dist/core/keybindings.d.ts.map +1 -1
  110. package/dist/core/keybindings.js +5 -1
  111. package/dist/core/keybindings.js.map +1 -1
  112. package/dist/core/messages.d.ts +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 +168 -20
  117. package/dist/core/model-config.d.ts.map +1 -1
  118. package/dist/core/model-config.js +44 -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 +4 -3
  126. package/dist/core/model-resolver.js.map +1 -1
  127. package/dist/core/model-runtime.d.ts +1 -0
  128. package/dist/core/model-runtime.d.ts.map +1 -1
  129. package/dist/core/model-runtime.js +12 -6
  130. package/dist/core/model-runtime.js.map +1 -1
  131. package/dist/core/permissions/store.d.ts.map +1 -1
  132. package/dist/core/permissions/store.js +11 -8
  133. package/dist/core/permissions/store.js.map +1 -1
  134. package/dist/core/prompt-templates.d.ts +6 -1
  135. package/dist/core/prompt-templates.d.ts.map +1 -1
  136. package/dist/core/prompt-templates.js +61 -35
  137. package/dist/core/prompt-templates.js.map +1 -1
  138. package/dist/core/provider-composer.d.ts +4 -2
  139. package/dist/core/provider-composer.d.ts.map +1 -1
  140. package/dist/core/provider-composer.js +29 -2
  141. package/dist/core/provider-composer.js.map +1 -1
  142. package/dist/core/radius.d.ts +3 -0
  143. package/dist/core/radius.d.ts.map +1 -1
  144. package/dist/core/radius.js +6 -0
  145. package/dist/core/radius.js.map +1 -1
  146. package/dist/core/resource-loader.d.ts.map +1 -1
  147. package/dist/core/resource-loader.js +6 -2
  148. package/dist/core/resource-loader.js.map +1 -1
  149. package/dist/core/sdk.d.ts.map +1 -1
  150. package/dist/core/sdk.js +63 -42
  151. package/dist/core/sdk.js.map +1 -1
  152. package/dist/core/session-export.d.ts +6 -2
  153. package/dist/core/session-export.d.ts.map +1 -1
  154. package/dist/core/session-export.js +14 -13
  155. package/dist/core/session-export.js.map +1 -1
  156. package/dist/core/session-manager.d.ts +66 -15
  157. package/dist/core/session-manager.d.ts.map +1 -1
  158. package/dist/core/session-manager.js +295 -115
  159. package/dist/core/session-manager.js.map +1 -1
  160. package/dist/core/settings-manager.d.ts +27 -4
  161. package/dist/core/settings-manager.d.ts.map +1 -1
  162. package/dist/core/settings-manager.js +55 -7
  163. package/dist/core/settings-manager.js.map +1 -1
  164. package/dist/core/skills.d.ts +1 -1
  165. package/dist/core/skills.d.ts.map +1 -1
  166. package/dist/core/skills.js +5 -4
  167. package/dist/core/skills.js.map +1 -1
  168. package/dist/core/slash-commands.d.ts.map +1 -1
  169. package/dist/core/slash-commands.js +1 -0
  170. package/dist/core/slash-commands.js.map +1 -1
  171. package/dist/core/system-prompt.d.ts +49 -6
  172. package/dist/core/system-prompt.d.ts.map +1 -1
  173. package/dist/core/system-prompt.js +140 -79
  174. package/dist/core/system-prompt.js.map +1 -1
  175. package/dist/core/tools/bash.d.ts +7 -8
  176. package/dist/core/tools/bash.d.ts.map +1 -1
  177. package/dist/core/tools/bash.js +20 -115
  178. package/dist/core/tools/bash.js.map +1 -1
  179. package/dist/core/tools/edit.d.ts +1 -12
  180. package/dist/core/tools/edit.d.ts.map +1 -1
  181. package/dist/core/tools/edit.js +6 -204
  182. package/dist/core/tools/edit.js.map +1 -1
  183. package/dist/core/tools/find.d.ts.map +1 -1
  184. package/dist/core/tools/find.js +4 -55
  185. package/dist/core/tools/find.js.map +1 -1
  186. package/dist/core/tools/grep.d.ts.map +1 -1
  187. package/dist/core/tools/grep.js +4 -60
  188. package/dist/core/tools/grep.js.map +1 -1
  189. package/dist/core/tools/ls.d.ts.map +1 -1
  190. package/dist/core/tools/ls.js +4 -49
  191. package/dist/core/tools/ls.js.map +1 -1
  192. package/dist/core/tools/read.d.ts +4 -1
  193. package/dist/core/tools/read.d.ts.map +1 -1
  194. package/dist/core/tools/read.js +10 -125
  195. package/dist/core/tools/read.js.map +1 -1
  196. package/dist/core/tools/renderers/bash.d.ts +18 -0
  197. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  198. package/dist/core/tools/renderers/bash.js +126 -0
  199. package/dist/core/tools/renderers/bash.js.map +1 -0
  200. package/dist/core/tools/renderers/edit.d.ts +23 -0
  201. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  202. package/dist/core/tools/renderers/edit.js +207 -0
  203. package/dist/core/tools/renderers/edit.js.map +1 -0
  204. package/dist/core/tools/renderers/find.d.ts +10 -0
  205. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  206. package/dist/core/tools/renderers/find.js +64 -0
  207. package/dist/core/tools/renderers/find.js.map +1 -0
  208. package/dist/core/tools/renderers/grep.d.ts +10 -0
  209. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  210. package/dist/core/tools/renderers/grep.js +69 -0
  211. package/dist/core/tools/renderers/grep.js.map +1 -0
  212. package/dist/core/tools/renderers/index.d.ts +34 -0
  213. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  214. package/dist/core/tools/renderers/index.js +47 -0
  215. package/dist/core/tools/renderers/index.js.map +1 -0
  216. package/dist/core/tools/renderers/ls.d.ts +10 -0
  217. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  218. package/dist/core/tools/renderers/ls.js +58 -0
  219. package/dist/core/tools/renderers/ls.js.map +1 -0
  220. package/dist/core/tools/renderers/read.d.ts +11 -0
  221. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  222. package/dist/core/tools/renderers/read.js +132 -0
  223. package/dist/core/tools/renderers/read.js.map +1 -0
  224. package/dist/core/tools/renderers/write.d.ts +10 -0
  225. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  226. package/dist/core/tools/renderers/write.js +152 -0
  227. package/dist/core/tools/renderers/write.js.map +1 -0
  228. package/dist/core/tools/write.d.ts.map +1 -1
  229. package/dist/core/tools/write.js +6 -146
  230. package/dist/core/tools/write.js.map +1 -1
  231. package/dist/core/usage-totals.d.ts +1 -1
  232. package/dist/core/usage-totals.d.ts.map +1 -1
  233. package/dist/core/usage-totals.js +5 -1
  234. package/dist/core/usage-totals.js.map +1 -1
  235. package/dist/extensions/llama/client.d.ts +2 -0
  236. package/dist/extensions/llama/client.d.ts.map +1 -1
  237. package/dist/extensions/llama/client.js +7 -3
  238. package/dist/extensions/llama/client.js.map +1 -1
  239. package/dist/extensions/llama/provider.d.ts.map +1 -1
  240. package/dist/extensions/llama/provider.js +20 -5
  241. package/dist/extensions/llama/provider.js.map +1 -1
  242. package/dist/index.d.ts +5 -4
  243. package/dist/index.d.ts.map +1 -1
  244. package/dist/index.js +1 -1
  245. package/dist/index.js.map +1 -1
  246. package/dist/main.d.ts.map +1 -1
  247. package/dist/main.js +21 -13
  248. package/dist/main.js.map +1 -1
  249. package/dist/modes/interactive/bug-report.d.ts +16 -0
  250. package/dist/modes/interactive/bug-report.d.ts.map +1 -0
  251. package/dist/modes/interactive/bug-report.js +167 -0
  252. package/dist/modes/interactive/bug-report.js.map +1 -0
  253. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  254. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  255. package/dist/modes/interactive/chat-viewport.js +28 -0
  256. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  257. package/dist/modes/interactive/components/assistant-message.d.ts +7 -0
  258. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  259. package/dist/modes/interactive/components/assistant-message.js +63 -17
  260. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  261. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  262. package/dist/modes/interactive/components/branch-summary-message.js +12 -5
  263. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  264. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  265. package/dist/modes/interactive/components/compaction-summary-message.js +12 -5
  266. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  267. package/dist/modes/interactive/components/custom-editor.d.ts +12 -0
  268. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  269. package/dist/modes/interactive/components/custom-editor.js +38 -0
  270. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  271. package/dist/modes/interactive/components/error-summary.d.ts +11 -0
  272. package/dist/modes/interactive/components/error-summary.d.ts.map +1 -0
  273. package/dist/modes/interactive/components/error-summary.js +31 -0
  274. package/dist/modes/interactive/components/error-summary.js.map +1 -0
  275. package/dist/modes/interactive/components/extension-editor.d.ts +4 -1
  276. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/extension-editor.js +6 -1
  278. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  279. package/dist/modes/interactive/components/extension-input.d.ts +2 -0
  280. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  281. package/dist/modes/interactive/components/extension-input.js +6 -0
  282. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  283. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  284. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  285. package/dist/modes/interactive/components/extension-selector.js +4 -0
  286. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  287. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  288. package/dist/modes/interactive/components/footer.js +4 -1
  289. package/dist/modes/interactive/components/footer.js.map +1 -1
  290. package/dist/modes/interactive/components/index.d.ts +1 -1
  291. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/index.js.map +1 -1
  293. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  294. package/dist/modes/interactive/components/model-selector.js +3 -3
  295. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  296. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  297. package/dist/modes/interactive/components/scoped-models-selector.js +13 -15
  298. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  299. package/dist/modes/interactive/components/session-selector.d.ts +5 -5
  300. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  301. package/dist/modes/interactive/components/session-selector.js +74 -48
  302. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  303. package/dist/modes/interactive/components/settings-selector.d.ts +5 -1
  304. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/settings-selector.js +35 -10
  306. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  307. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/skill-invocation-message.js +11 -4
  309. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  310. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  311. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  312. package/dist/modes/interactive/components/status-indicator.js +10 -3
  313. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  314. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/thinking-selector.js +6 -6
  316. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  317. package/dist/modes/interactive/components/tool-execution.d.ts +27 -5
  318. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  319. package/dist/modes/interactive/components/tool-execution.js +64 -42
  320. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  321. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  322. package/dist/modes/interactive/components/tree-selector.js +9 -0
  323. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  324. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  325. package/dist/modes/interactive/components/trust-selector.js +2 -2
  326. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  327. package/dist/modes/interactive/interactive-mode.d.ts +43 -29
  328. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  329. package/dist/modes/interactive/interactive-mode.js +431 -166
  330. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  331. package/dist/modes/interactive/theme/dark.json +2 -1
  332. package/dist/modes/interactive/theme/light.json +2 -1
  333. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  334. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  335. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  336. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  337. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  338. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  339. package/dist/modes/interactive/theme/theme-json.js +130 -0
  340. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  341. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  342. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  343. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  344. package/dist/modes/interactive/theme/theme.js +18 -119
  345. package/dist/modes/interactive/theme/theme.js.map +1 -1
  346. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  347. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  348. package/dist/modes/interactive/tui-renderer.js +66 -0
  349. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  350. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  351. package/dist/modes/rpc/rpc-mode.js +2 -2
  352. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  353. package/dist/testing/replay/recorded-provider.d.ts +2 -2
  354. package/dist/testing/replay/recorded-provider.d.ts.map +1 -1
  355. package/dist/testing/replay/recorded-provider.js +2 -5
  356. package/dist/testing/replay/recorded-provider.js.map +1 -1
  357. package/dist/testing/replay/runner.d.ts.map +1 -1
  358. package/dist/testing/replay/runner.js +0 -1
  359. package/dist/testing/replay/runner.js.map +1 -1
  360. package/dist/utils/clipboard-command.d.ts +7 -0
  361. package/dist/utils/clipboard-command.d.ts.map +1 -0
  362. package/dist/utils/clipboard-command.js +45 -0
  363. package/dist/utils/clipboard-command.js.map +1 -0
  364. package/dist/utils/clipboard-image.d.ts.map +1 -1
  365. package/dist/utils/clipboard-image.js +53 -81
  366. package/dist/utils/clipboard-image.js.map +1 -1
  367. package/dist/utils/clipboard.d.ts.map +1 -1
  368. package/dist/utils/clipboard.js +111 -121
  369. package/dist/utils/clipboard.js.map +1 -1
  370. package/dist/utils/exif-orientation.d.ts.map +1 -1
  371. package/dist/utils/exif-orientation.js +2 -3
  372. package/dist/utils/exif-orientation.js.map +1 -1
  373. package/dist/utils/mime.d.ts.map +1 -1
  374. package/dist/utils/mime.js +1 -1
  375. package/dist/utils/mime.js.map +1 -1
  376. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  377. package/dist/utils/syntax-highlight.js +21 -21
  378. package/dist/utils/syntax-highlight.js.map +1 -1
  379. package/dist/utils/tool-result-images.d.ts +3 -1
  380. package/dist/utils/tool-result-images.d.ts.map +1 -1
  381. package/dist/utils/tool-result-images.js +4 -1
  382. package/dist/utils/tool-result-images.js.map +1 -1
  383. package/dist/utils/tools-manager.d.ts.map +1 -1
  384. package/dist/utils/tools-manager.js +11 -2
  385. package/dist/utils/tools-manager.js.map +1 -1
  386. package/dist/utils/wsl.d.ts +3 -0
  387. package/dist/utils/wsl.d.ts.map +1 -0
  388. package/dist/utils/wsl.js +15 -0
  389. package/dist/utils/wsl.js.map +1 -0
  390. package/dist/utils/zip.d.ts +7 -0
  391. package/dist/utils/zip.d.ts.map +1 -0
  392. package/dist/utils/zip.js +60 -0
  393. package/dist/utils/zip.js.map +1 -0
  394. package/docs/cli-integration.md +107 -0
  395. package/docs/cli.md +269 -0
  396. package/docs/compaction.md +73 -24
  397. package/docs/configuration.md +45 -0
  398. package/docs/containerization.md +22 -21
  399. package/docs/custom-provider.md +21 -12
  400. package/docs/development.md +19 -0
  401. package/docs/docs.json +139 -95
  402. package/docs/extensions.md +243 -371
  403. package/docs/how-pi-works.md +49 -0
  404. package/docs/images/interactive-mode.png +0 -0
  405. package/docs/index.md +3 -3
  406. package/docs/json.md +7 -3
  407. package/docs/keybindings.md +57 -54
  408. package/docs/llama-cpp.md +2 -2
  409. package/docs/message-types.md +261 -0
  410. package/docs/models.md +103 -49
  411. package/docs/packages.md +49 -47
  412. package/docs/prompt-templates.md +29 -56
  413. package/docs/providers.md +91 -139
  414. package/docs/quickstart.md +42 -14
  415. package/docs/rpc-commands.md +854 -0
  416. package/docs/rpc-extension-ui.md +200 -0
  417. package/docs/rpc.md +121 -223
  418. package/docs/sdk.md +99 -124
  419. package/docs/security.md +7 -7
  420. package/docs/session-format.md +85 -82
  421. package/docs/sessions.md +41 -57
  422. package/docs/settings.md +94 -87
  423. package/docs/shell-aliases.md +68 -3
  424. package/docs/skills.md +62 -49
  425. package/docs/slash-commands.md +60 -0
  426. package/docs/terminal-setup.md +86 -55
  427. package/docs/termux.md +65 -75
  428. package/docs/themes.md +64 -86
  429. package/docs/tmux.md +29 -7
  430. package/docs/tui.md +67 -122
  431. package/docs/usage.md +31 -42
  432. package/docs/windows.md +41 -13
  433. package/examples/README.md +16 -2
  434. package/examples/extensions/README.md +0 -1
  435. package/examples/extensions/custom-provider-anthropic/index.ts +18 -12
  436. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  437. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  438. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -2
  439. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  440. package/examples/extensions/dynamic-resources/dynamic.json +2 -0
  441. package/examples/extensions/gondolin/package-lock.json +2 -2
  442. package/examples/extensions/gondolin/package.json +1 -1
  443. package/examples/extensions/prompt-customizer.ts +19 -67
  444. package/examples/extensions/sandbox/package-lock.json +2 -2
  445. package/examples/extensions/sandbox/package.json +1 -1
  446. package/examples/extensions/with-deps/package-lock.json +2 -2
  447. package/examples/extensions/with-deps/package.json +1 -1
  448. package/examples/plugins/pi-example-plugin/README.md +38 -0
  449. package/examples/plugins/pi-example-plugin/package.json +10 -0
  450. package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
  451. package/examples/plugins/pi-example-plugin/src/session.ts +24 -0
  452. package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
  453. package/examples/rpc-client.ts +35 -0
  454. package/examples/rpc-extension-ui.ts +25 -5
  455. package/examples/sdk/README.md +1 -1
  456. package/npm-shrinkwrap.json +861 -513
  457. package/package.json +27 -18
  458. package/dist/bun/register-bedrock.d.ts +0 -2
  459. package/dist/bun/register-bedrock.d.ts.map +0 -1
  460. package/dist/bun/register-bedrock.js +0 -4
  461. package/dist/bun/register-bedrock.js.map +0 -1
  462. package/dist/cli/experimental/auth.d.ts +0 -16
  463. package/dist/cli/experimental/auth.d.ts.map +0 -1
  464. package/dist/cli/experimental/auth.js +0 -13
  465. package/dist/cli/experimental/auth.js.map +0 -1
  466. package/dist/cli/experimental/cli.d.ts +0 -6
  467. package/dist/cli/experimental/cli.d.ts.map +0 -1
  468. package/dist/cli/experimental/cli.js +0 -5
  469. package/dist/cli/experimental/cli.js.map +0 -1
  470. package/dist/cli/experimental/command-options.d.ts +0 -17
  471. package/dist/cli/experimental/command-options.d.ts.map +0 -1
  472. package/dist/cli/experimental/command-options.js +0 -35
  473. package/dist/cli/experimental/command-options.js.map +0 -1
  474. package/dist/cli/experimental/command.d.ts +0 -63
  475. package/dist/cli/experimental/command.d.ts.map +0 -1
  476. package/dist/cli/experimental/command.js +0 -130
  477. package/dist/cli/experimental/command.js.map +0 -1
  478. package/dist/cli/experimental/commands/client.d.ts +0 -13
  479. package/dist/cli/experimental/commands/client.d.ts.map +0 -1
  480. package/dist/cli/experimental/commands/client.js +0 -25
  481. package/dist/cli/experimental/commands/client.js.map +0 -1
  482. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  483. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  484. package/dist/cli/experimental/commands/pi.js +0 -28
  485. package/dist/cli/experimental/commands/pi.js.map +0 -1
  486. package/dist/cli/experimental/commands/server.d.ts +0 -13
  487. package/dist/cli/experimental/commands/server.d.ts.map +0 -1
  488. package/dist/cli/experimental/commands/server.js +0 -25
  489. package/dist/cli/experimental/commands/server.js.map +0 -1
  490. package/dist/cli/experimental/transport-address.d.ts +0 -10
  491. package/dist/cli/experimental/transport-address.d.ts.map +0 -1
  492. package/dist/cli/experimental/transport-address.js +0 -38
  493. package/dist/cli/experimental/transport-address.js.map +0 -1
  494. package/dist/client/index.d.ts +0 -3
  495. package/dist/client/index.d.ts.map +0 -1
  496. package/dist/client/index.js +0 -3
  497. package/dist/client/index.js.map +0 -1
  498. package/dist/client/remote-session.d.ts +0 -53
  499. package/dist/client/remote-session.d.ts.map +0 -1
  500. package/dist/client/remote-session.js +0 -340
  501. package/dist/client/remote-session.js.map +0 -1
  502. package/dist/client/transcript.d.ts +0 -12
  503. package/dist/client/transcript.d.ts.map +0 -1
  504. package/dist/client/transcript.js +0 -98
  505. package/dist/client/transcript.js.map +0 -1
  506. package/dist/utils/clipboard-native.d.ts +0 -11
  507. package/dist/utils/clipboard-native.d.ts.map +0 -1
  508. package/dist/utils/clipboard-native.js +0 -20
  509. package/dist/utils/clipboard-native.js.map +0 -1
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Extension runner - executes extensions and manages their lifecycle.
3
3
  */
4
+ import { getCurrentSystemMessage, } from "@earendil-works/pi-ai";
4
5
  import { theme } from "../../modes/interactive/theme/theme.js";
6
+ import { buildSystemPrompt, normalizeBuildSystemPromptOptions, } from "../system-prompt.js";
5
7
  // Extension shortcuts compete with canonical keybinding ids from keybindings.json.
6
8
  // Only editor-global shortcuts are reserved here. Picker-specific bindings are not.
7
9
  const RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS = [
@@ -46,6 +48,31 @@ const buildBuiltinKeybindings = (resolvedKeybindings) => {
46
48
  }
47
49
  return builtinKeybindings;
48
50
  };
51
+ function isUserBashEventResult(value) {
52
+ if (typeof value !== "object" || value === null)
53
+ return false;
54
+ const candidate = value;
55
+ const hasOperations = candidate.operations !== undefined;
56
+ const hasResult = candidate.result !== undefined;
57
+ if (hasOperations === hasResult)
58
+ return false;
59
+ if (hasOperations) {
60
+ const operations = candidate.operations;
61
+ if (typeof operations !== "object" || operations === null)
62
+ return false;
63
+ return typeof operations.exec === "function";
64
+ }
65
+ const result = candidate.result;
66
+ if (typeof result !== "object" || result === null)
67
+ return false;
68
+ const resultRecord = result;
69
+ return (typeof resultRecord.output === "string" &&
70
+ "exitCode" in resultRecord &&
71
+ (resultRecord.exitCode === undefined || typeof resultRecord.exitCode === "number") &&
72
+ typeof resultRecord.cancelled === "boolean" &&
73
+ typeof resultRecord.truncated === "boolean" &&
74
+ (resultRecord.fullOutputPath === undefined || typeof resultRecord.fullOutputPath === "string"));
75
+ }
49
76
  /**
50
77
  * Helper function to emit session_shutdown event to extensions.
51
78
  * Returns true if the event was emitted, false if there were no handlers.
@@ -57,14 +84,31 @@ export async function emitSessionShutdownEvent(extensionRunner, event) {
57
84
  }
58
85
  return false;
59
86
  }
87
+ function snapshotEventHandlers(extensions, event) {
88
+ return extensions.map((ext) => ({ ext, handlers: ext.handlers.get(event)?.slice() ?? [] }));
89
+ }
90
+ function sameMessages(left, right) {
91
+ return left.length === right.length && left.every((message, index) => message === right[index]);
92
+ }
93
+ /**
94
+ * Re-attach the prompt and tool state after a `context` handler. Handlers only see the
95
+ * conversation; the system messages belong to Pi. An unchanged conversation keeps every
96
+ * system message in place, so models with mid-conversation support keep their cached
97
+ * prefix. A changed one gets the replayed prompt sections and tool declarations as one
98
+ * leading system message, so pruning, windowing, or slicing from a compaction summary
99
+ * cannot drop them.
100
+ */
101
+ function restoreSystemMessages(current, visible, returned) {
102
+ if (sameMessages(returned, visible))
103
+ return current;
104
+ const head = getCurrentSystemMessage(current);
105
+ return head ? [head, ...returned] : returned;
106
+ }
60
107
  export async function emitProjectTrustEvent(extensionsResult, event, ctx) {
61
108
  const errors = [];
62
- for (const ext of extensionsResult.extensions) {
109
+ for (const { ext, handlers } of snapshotEventHandlers(extensionsResult.extensions, "project_trust")) {
63
110
  // A single extension may register multiple handlers for the same event.
64
111
  // The first project_trust handler that returns yes/no wins; undecided falls through.
65
- const handlers = ext.handlers.get("project_trust");
66
- if (!handlers || handlers.length === 0)
67
- continue;
68
112
  for (const handler of handlers) {
69
113
  try {
70
114
  const handlerResult = (await handler(event, ctx));
@@ -137,7 +181,7 @@ export class ExtensionRunner {
137
181
  getContextUsageFn = () => undefined;
138
182
  compactFn = () => { };
139
183
  getSystemPromptFn = () => "";
140
- getSystemPromptOptionsFn = () => ({ cwd: this.cwd });
184
+ getSystemPromptOptionsFn = () => normalizeBuildSystemPromptOptions({ cwd: this.cwd });
141
185
  newSessionHandler = async () => ({ cancelled: false });
142
186
  forkHandler = async () => ({ cancelled: false });
143
187
  navigateTreeHandler = async () => ({ cancelled: false });
@@ -185,7 +229,8 @@ export class ExtensionRunner {
185
229
  this.getContextUsageFn = contextActions.getContextUsage;
186
230
  this.compactFn = contextActions.compact;
187
231
  this.getSystemPromptFn = contextActions.getSystemPrompt;
188
- this.getSystemPromptOptionsFn = contextActions.getSystemPromptOptions ?? (() => ({ cwd: this.cwd }));
232
+ this.getSystemPromptOptionsFn =
233
+ contextActions.getSystemPromptOptions ?? (() => normalizeBuildSystemPromptOptions({ cwd: this.cwd }));
189
234
  // Flush provider registrations queued during extension loading
190
235
  for (const { name, config, extensionPath } of this.runtime.pendingProviderRegistrations) {
191
236
  try {
@@ -614,6 +659,54 @@ export class ExtensionRunner {
614
659
  };
615
660
  return context;
616
661
  }
662
+ async emitBoundary(baseEvent, buildContext) {
663
+ const ctx = this.createContext();
664
+ let entries = [];
665
+ let shouldContinue = false;
666
+ let context = await buildContext(entries);
667
+ let valid = true;
668
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, baseEvent.type)) {
669
+ for (const handler of handlers) {
670
+ const event = {
671
+ ...baseEvent,
672
+ entries,
673
+ continue: shouldContinue,
674
+ context,
675
+ };
676
+ try {
677
+ const handlerResult = (await handler(event, ctx));
678
+ if (handlerResult?.entries !== undefined)
679
+ entries = handlerResult.entries;
680
+ if (handlerResult?.continue !== undefined)
681
+ shouldContinue = handlerResult.continue;
682
+ }
683
+ catch (err) {
684
+ this.emitError({
685
+ extensionPath: ext.path,
686
+ event: baseEvent.type,
687
+ error: err instanceof Error ? err.message : String(err),
688
+ stack: err instanceof Error ? err.stack : undefined,
689
+ });
690
+ }
691
+ try {
692
+ context = await buildContext(entries);
693
+ valid = true;
694
+ }
695
+ catch (err) {
696
+ valid = false;
697
+ this.emitError({
698
+ extensionPath: ext.path,
699
+ event: baseEvent.type,
700
+ error: `Invalid boundary entries: ${err instanceof Error ? err.message : String(err)}`,
701
+ stack: err instanceof Error ? err.stack : undefined,
702
+ });
703
+ }
704
+ }
705
+ }
706
+ return valid
707
+ ? { entries, continue: shouldContinue, context, valid: true }
708
+ : { entries: [], continue: false, context, valid: false };
709
+ }
617
710
  isSessionBeforeEvent(event) {
618
711
  return (event.type === "session_before_switch" ||
619
712
  event.type === "session_before_fork" ||
@@ -623,10 +716,7 @@ export class ExtensionRunner {
623
716
  async emit(event) {
624
717
  const ctx = this.createContext();
625
718
  let result;
626
- for (const ext of this.extensions) {
627
- const handlers = ext.handlers.get(event.type);
628
- if (!handlers || handlers.length === 0)
629
- continue;
719
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, event.type)) {
630
720
  for (const handler of handlers) {
631
721
  try {
632
722
  const handlerResult = await handler(event, ctx);
@@ -651,14 +741,34 @@ export class ExtensionRunner {
651
741
  }
652
742
  return result;
653
743
  }
744
+ /** Returns the event's own action unless a handler overrides it; the last override wins. */
745
+ async emitCacheWarmingDecision(event) {
746
+ const ctx = this.createContext();
747
+ let action = event.action;
748
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, event.type)) {
749
+ for (const handler of handlers) {
750
+ try {
751
+ const result = (await handler(event, ctx));
752
+ if (result?.action !== undefined)
753
+ action = result.action;
754
+ }
755
+ catch (err) {
756
+ this.emitError({
757
+ extensionPath: ext.path,
758
+ event: event.type,
759
+ error: err instanceof Error ? err.message : String(err),
760
+ stack: err instanceof Error ? err.stack : undefined,
761
+ });
762
+ }
763
+ }
764
+ }
765
+ return action;
766
+ }
654
767
  async emitMessageEnd(event) {
655
768
  const ctx = this.createContext();
656
769
  let currentMessage = event.message;
657
770
  let modified = false;
658
- for (const ext of this.extensions) {
659
- const handlers = ext.handlers.get("message_end");
660
- if (!handlers || handlers.length === 0)
661
- continue;
771
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "message_end")) {
662
772
  for (const handler of handlers) {
663
773
  try {
664
774
  const currentEvent = { ...event, message: currentMessage };
@@ -694,10 +804,7 @@ export class ExtensionRunner {
694
804
  const ctx = this.createContext();
695
805
  const currentEvent = { ...event };
696
806
  let modified = false;
697
- for (const ext of this.extensions) {
698
- const handlers = ext.handlers.get("tool_result");
699
- if (!handlers || handlers.length === 0)
700
- continue;
807
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "tool_result")) {
701
808
  for (const handler of handlers) {
702
809
  try {
703
810
  const handlerResult = (await handler(currentEvent, ctx));
@@ -745,10 +852,7 @@ export class ExtensionRunner {
745
852
  async emitToolCall(event) {
746
853
  const ctx = this.createContext();
747
854
  let result;
748
- for (const ext of this.extensions) {
749
- const handlers = ext.handlers.get("tool_call");
750
- if (!handlers || handlers.length === 0)
751
- continue;
855
+ for (const { handlers } of snapshotEventHandlers(this.extensions, "tool_call")) {
752
856
  for (const handler of handlers) {
753
857
  const handlerResult = await handler(event, ctx);
754
858
  if (handlerResult) {
@@ -763,16 +867,16 @@ export class ExtensionRunner {
763
867
  }
764
868
  async emitUserBash(event) {
765
869
  const ctx = this.createContext();
766
- for (const ext of this.extensions) {
767
- const handlers = ext.handlers.get("user_bash");
768
- if (!handlers || handlers.length === 0)
769
- continue;
870
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "user_bash")) {
770
871
  for (const handler of handlers) {
771
872
  try {
772
873
  const handlerResult = await handler(event, ctx);
773
- if (handlerResult) {
774
- return handlerResult;
874
+ if (handlerResult === undefined)
875
+ continue;
876
+ if (!isUserBashEventResult(handlerResult)) {
877
+ throw new Error("Invalid user_bash handler result: return undefined for local execution or exactly one valid { operations } or { result } object");
775
878
  }
879
+ return handlerResult;
776
880
  }
777
881
  catch (err) {
778
882
  const message = err instanceof Error ? err.message : String(err);
@@ -783,25 +887,33 @@ export class ExtensionRunner {
783
887
  error: message,
784
888
  stack,
785
889
  });
890
+ throw err;
786
891
  }
787
892
  }
788
893
  }
789
894
  return undefined;
790
895
  }
896
+ /**
897
+ * Run the request-time transforms in two phases. `context` handlers see the conversation
898
+ * only and Pi restores the prompt and tool state after each; `context_with_system`
899
+ * handlers then see the full transcript and their output is used as returned.
900
+ */
791
901
  async emitContext(messages) {
792
902
  const ctx = this.createContext();
793
903
  let currentMessages = structuredClone(messages);
794
- for (const ext of this.extensions) {
795
- const handlers = ext.handlers.get("context");
796
- if (!handlers || handlers.length === 0)
797
- continue;
904
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "context")) {
798
905
  for (const handler of handlers) {
799
906
  try {
800
- const event = { type: "context", messages: currentMessages };
801
- const handlerResult = await handler(event, ctx);
802
- if (handlerResult && handlerResult.messages) {
803
- currentMessages = handlerResult.messages;
804
- }
907
+ const visibleMessages = currentMessages.filter((message) => message.role !== "system");
908
+ const visibleSnapshot = visibleMessages.slice();
909
+ const event = { type: "context", messages: visibleMessages };
910
+ const handlerResult = (await handler(event, ctx));
911
+ // Handlers may return a new list or edit event.messages in place.
912
+ const returned = handlerResult?.messages ??
913
+ (sameMessages(visibleMessages, visibleSnapshot) ? undefined : visibleMessages);
914
+ if (!returned)
915
+ continue;
916
+ currentMessages = restoreSystemMessages(currentMessages, visibleSnapshot, returned);
805
917
  }
806
918
  catch (err) {
807
919
  const message = err instanceof Error ? err.message : String(err);
@@ -815,15 +927,41 @@ export class ExtensionRunner {
815
927
  }
816
928
  }
817
929
  }
930
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "context_with_system")) {
931
+ for (const handler of handlers) {
932
+ try {
933
+ const hadLeadingSystemMessage = currentMessages[0]?.role === "system";
934
+ const event = { type: "context_with_system", messages: currentMessages };
935
+ const handlerResult = (await handler(event, ctx));
936
+ currentMessages = handlerResult?.messages ?? currentMessages;
937
+ // Providers read the prompt and initial tools from the leading system message.
938
+ // Losing it is never intended; report it but honor the handler's output.
939
+ if (hadLeadingSystemMessage && currentMessages[0]?.role !== "system") {
940
+ this.emitError({
941
+ extensionPath: ext.path,
942
+ event: "context_with_system",
943
+ error: "Handler removed the leading system message; the request has no prompt or initial tool declarations. Keep it at index 0 or replace a dropped prefix with getCurrentSystemMessage().",
944
+ });
945
+ }
946
+ }
947
+ catch (err) {
948
+ const message = err instanceof Error ? err.message : String(err);
949
+ const stack = err instanceof Error ? err.stack : undefined;
950
+ this.emitError({
951
+ extensionPath: ext.path,
952
+ event: "context_with_system",
953
+ error: message,
954
+ stack,
955
+ });
956
+ }
957
+ }
958
+ }
818
959
  return currentMessages;
819
960
  }
820
961
  async emitBeforeProviderRequest(payload) {
821
962
  const ctx = this.createContext();
822
963
  let currentPayload = payload;
823
- for (const ext of this.extensions) {
824
- const handlers = ext.handlers.get("before_provider_request");
825
- if (!handlers || handlers.length === 0)
826
- continue;
964
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "before_provider_request")) {
827
965
  for (const handler of handlers) {
828
966
  try {
829
967
  const event = {
@@ -851,10 +989,7 @@ export class ExtensionRunner {
851
989
  }
852
990
  async emitBeforeProviderHeaders(headers) {
853
991
  const ctx = this.createContext();
854
- for (const ext of this.extensions) {
855
- const handlers = ext.handlers.get("before_provider_headers");
856
- if (!handlers || handlers.length === 0)
857
- continue;
992
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "before_provider_headers")) {
858
993
  for (const handler of handlers) {
859
994
  try {
860
995
  // Handlers mutate `headers` in place; the return value is ignored.
@@ -878,37 +1013,34 @@ export class ExtensionRunner {
878
1013
  }
879
1014
  return headers;
880
1015
  }
881
- async emitBeforeAgentStart(prompt, images, systemPrompt, systemPromptOptions) {
882
- let currentSystemPrompt = systemPrompt;
1016
+ async emitBeforeAgentStart(prompt, images, systemPromptOptions) {
1017
+ const currentOptions = normalizeBuildSystemPromptOptions(systemPromptOptions);
1018
+ const renderCurrentSystemPrompt = () => buildSystemPrompt(currentOptions);
883
1019
  const ctx = Object.defineProperties({}, Object.getOwnPropertyDescriptors(this.createContext()));
884
1020
  ctx.getSystemPrompt = () => {
885
1021
  this.assertActive();
886
- return currentSystemPrompt;
1022
+ return renderCurrentSystemPrompt();
887
1023
  };
888
1024
  const messages = [];
889
- let systemPromptModified = false;
890
- for (const ext of this.extensions) {
891
- const handlers = ext.handlers.get("before_agent_start");
892
- if (!handlers || handlers.length === 0)
893
- continue;
1025
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "before_agent_start")) {
894
1026
  for (const handler of handlers) {
895
1027
  try {
896
1028
  const event = {
897
1029
  type: "before_agent_start",
898
1030
  prompt,
899
1031
  images,
900
- systemPrompt: currentSystemPrompt,
901
- systemPromptOptions,
1032
+ get systemPrompt() {
1033
+ return renderCurrentSystemPrompt();
1034
+ },
1035
+ systemPromptOptions: currentOptions,
902
1036
  };
903
1037
  const handlerResult = await handler(event, ctx);
904
1038
  if (handlerResult) {
905
1039
  const result = handlerResult;
906
- if (result.message) {
1040
+ if (result.message)
907
1041
  messages.push(result.message);
908
- }
909
1042
  if (result.systemPrompt !== undefined) {
910
- currentSystemPrompt = result.systemPrompt;
911
- systemPromptModified = true;
1043
+ currentOptions.forceSystemPrompt = result.systemPrompt;
912
1044
  }
913
1045
  }
914
1046
  }
@@ -924,23 +1056,14 @@ export class ExtensionRunner {
924
1056
  }
925
1057
  }
926
1058
  }
927
- if (messages.length > 0 || systemPromptModified) {
928
- return {
929
- messages: messages.length > 0 ? messages : undefined,
930
- systemPrompt: systemPromptModified ? currentSystemPrompt : undefined,
931
- };
932
- }
933
- return undefined;
1059
+ return { messages, systemPromptOptions: currentOptions };
934
1060
  }
935
1061
  async emitResourcesDiscover(cwd, reason) {
936
1062
  const ctx = this.createContext();
937
1063
  const skillPaths = [];
938
1064
  const promptPaths = [];
939
1065
  const themePaths = [];
940
- for (const ext of this.extensions) {
941
- const handlers = ext.handlers.get("resources_discover");
942
- if (!handlers || handlers.length === 0)
943
- continue;
1066
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "resources_discover")) {
944
1067
  for (const handler of handlers) {
945
1068
  try {
946
1069
  const event = { type: "resources_discover", cwd, reason };
@@ -975,8 +1098,8 @@ export class ExtensionRunner {
975
1098
  const ctx = this.createContext();
976
1099
  let currentText = text;
977
1100
  let currentImages = images;
978
- for (const ext of this.extensions) {
979
- for (const handler of ext.handlers.get("input") ?? []) {
1101
+ for (const { ext, handlers } of snapshotEventHandlers(this.extensions, "input")) {
1102
+ for (const handler of handlers) {
980
1103
  try {
981
1104
  const event = {
982
1105
  type: "input",