@earendil-works/pi-coding-agent 0.75.2 → 0.75.4

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 (357) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +5 -3
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/cli/args.d.ts +1 -1
  6. package/dist/cli/args.d.ts.map +1 -1
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/cli/config-selector.d.ts +2 -2
  9. package/dist/cli/config-selector.d.ts.map +1 -1
  10. package/dist/cli/config-selector.js.map +1 -1
  11. package/dist/cli/file-processor.d.ts.map +1 -1
  12. package/dist/cli/file-processor.js.map +1 -1
  13. package/dist/cli/initial-message.d.ts +1 -1
  14. package/dist/cli/initial-message.d.ts.map +1 -1
  15. package/dist/cli/initial-message.js.map +1 -1
  16. package/dist/cli/list-models.d.ts +1 -1
  17. package/dist/cli/list-models.d.ts.map +1 -1
  18. package/dist/cli/list-models.js.map +1 -1
  19. package/dist/cli/session-picker.d.ts +1 -1
  20. package/dist/cli/session-picker.d.ts.map +1 -1
  21. package/dist/cli/session-picker.js.map +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +4 -10
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +10 -4
  27. package/dist/config.js.map +1 -1
  28. package/dist/core/agent-session-runtime.d.ts +9 -9
  29. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  30. package/dist/core/agent-session-runtime.js +4 -5
  31. package/dist/core/agent-session-runtime.js.map +1 -1
  32. package/dist/core/agent-session-services.d.ts +7 -7
  33. package/dist/core/agent-session-services.d.ts.map +1 -1
  34. package/dist/core/agent-session-services.js.map +1 -1
  35. package/dist/core/agent-session.d.ts +23 -21
  36. package/dist/core/agent-session.d.ts.map +1 -1
  37. package/dist/core/agent-session.js +96 -135
  38. package/dist/core/agent-session.js.map +1 -1
  39. package/dist/core/auth-guidance.d.ts.map +1 -1
  40. package/dist/core/auth-guidance.js.map +1 -1
  41. package/dist/core/auth-storage.d.ts +1 -1
  42. package/dist/core/auth-storage.d.ts.map +1 -1
  43. package/dist/core/auth-storage.js +1 -1
  44. package/dist/core/auth-storage.js.map +1 -1
  45. package/dist/core/bash-executor.d.ts +1 -1
  46. package/dist/core/bash-executor.d.ts.map +1 -1
  47. package/dist/core/bash-executor.js.map +1 -1
  48. package/dist/core/compaction/branch-summarization.d.ts +3 -3
  49. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  50. package/dist/core/compaction/branch-summarization.js.map +1 -1
  51. package/dist/core/compaction/compaction.d.ts +2 -2
  52. package/dist/core/compaction/compaction.d.ts.map +1 -1
  53. package/dist/core/compaction/compaction.js.map +1 -1
  54. package/dist/core/compaction/index.d.ts +3 -3
  55. package/dist/core/compaction/index.d.ts.map +1 -1
  56. package/dist/core/compaction/index.js.map +1 -1
  57. package/dist/core/exec.d.ts.map +1 -1
  58. package/dist/core/exec.js.map +1 -1
  59. package/dist/core/export-html/index.d.ts +1 -1
  60. package/dist/core/export-html/index.d.ts.map +1 -1
  61. package/dist/core/export-html/index.js.map +1 -1
  62. package/dist/core/export-html/template.js +17 -3
  63. package/dist/core/export-html/tool-renderer.d.ts +2 -2
  64. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  65. package/dist/core/export-html/tool-renderer.js.map +1 -1
  66. package/dist/core/extensions/index.d.ts +8 -8
  67. package/dist/core/extensions/index.d.ts.map +1 -1
  68. package/dist/core/extensions/index.js.map +1 -1
  69. package/dist/core/extensions/loader.d.ts +2 -2
  70. package/dist/core/extensions/loader.d.ts.map +1 -1
  71. package/dist/core/extensions/loader.js.map +1 -1
  72. package/dist/core/extensions/runner.d.ts +6 -6
  73. package/dist/core/extensions/runner.d.ts.map +1 -1
  74. package/dist/core/extensions/runner.js.map +1 -1
  75. package/dist/core/extensions/types.d.ts +19 -19
  76. package/dist/core/extensions/types.d.ts.map +1 -1
  77. package/dist/core/extensions/types.js.map +1 -1
  78. package/dist/core/extensions/wrapper.d.ts +2 -2
  79. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  80. package/dist/core/extensions/wrapper.js.map +1 -1
  81. package/dist/core/footer-data-provider.d.ts.map +1 -1
  82. package/dist/core/footer-data-provider.js.map +1 -1
  83. package/dist/core/http-dispatcher.d.ts +21 -0
  84. package/dist/core/http-dispatcher.d.ts.map +1 -0
  85. package/dist/core/http-dispatcher.js +48 -0
  86. package/dist/core/http-dispatcher.js.map +1 -0
  87. package/dist/core/index.d.ts +8 -8
  88. package/dist/core/index.d.ts.map +1 -1
  89. package/dist/core/index.js.map +1 -1
  90. package/dist/core/keybindings.d.ts.map +1 -1
  91. package/dist/core/keybindings.js.map +1 -1
  92. package/dist/core/model-registry.d.ts +4 -4
  93. package/dist/core/model-registry.d.ts.map +1 -1
  94. package/dist/core/model-registry.js +2 -2
  95. package/dist/core/model-registry.js.map +1 -1
  96. package/dist/core/model-resolver.d.ts +1 -1
  97. package/dist/core/model-resolver.d.ts.map +1 -1
  98. package/dist/core/model-resolver.js.map +1 -1
  99. package/dist/core/package-manager.d.ts +1 -1
  100. package/dist/core/package-manager.d.ts.map +1 -1
  101. package/dist/core/package-manager.js +2 -1
  102. package/dist/core/package-manager.js.map +1 -1
  103. package/dist/core/prompt-templates.d.ts +1 -1
  104. package/dist/core/prompt-templates.d.ts.map +1 -1
  105. package/dist/core/prompt-templates.js.map +1 -1
  106. package/dist/core/resolve-config-value.d.ts.map +1 -1
  107. package/dist/core/resolve-config-value.js.map +1 -1
  108. package/dist/core/resource-loader.d.ts +9 -9
  109. package/dist/core/resource-loader.d.ts.map +1 -1
  110. package/dist/core/resource-loader.js.map +1 -1
  111. package/dist/core/sdk.d.ts +13 -13
  112. package/dist/core/sdk.d.ts.map +1 -1
  113. package/dist/core/sdk.js.map +1 -1
  114. package/dist/core/session-manager.d.ts +1 -1
  115. package/dist/core/session-manager.d.ts.map +1 -1
  116. package/dist/core/session-manager.js.map +1 -1
  117. package/dist/core/settings-manager.d.ts +3 -0
  118. package/dist/core/settings-manager.d.ts.map +1 -1
  119. package/dist/core/settings-manager.js +20 -0
  120. package/dist/core/settings-manager.js.map +1 -1
  121. package/dist/core/skills.d.ts +2 -2
  122. package/dist/core/skills.d.ts.map +1 -1
  123. package/dist/core/skills.js.map +1 -1
  124. package/dist/core/slash-commands.d.ts +1 -1
  125. package/dist/core/slash-commands.d.ts.map +1 -1
  126. package/dist/core/slash-commands.js.map +1 -1
  127. package/dist/core/source-info.d.ts +1 -1
  128. package/dist/core/source-info.d.ts.map +1 -1
  129. package/dist/core/source-info.js.map +1 -1
  130. package/dist/core/system-prompt.d.ts +1 -1
  131. package/dist/core/system-prompt.d.ts.map +1 -1
  132. package/dist/core/system-prompt.js +4 -2
  133. package/dist/core/system-prompt.js.map +1 -1
  134. package/dist/core/telemetry.d.ts +1 -1
  135. package/dist/core/telemetry.d.ts.map +1 -1
  136. package/dist/core/telemetry.js.map +1 -1
  137. package/dist/core/tools/bash.d.ts +2 -2
  138. package/dist/core/tools/bash.d.ts.map +1 -1
  139. package/dist/core/tools/bash.js +1 -0
  140. package/dist/core/tools/bash.js.map +1 -1
  141. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  142. package/dist/core/tools/edit-diff.js.map +1 -1
  143. package/dist/core/tools/edit.d.ts +2 -2
  144. package/dist/core/tools/edit.d.ts.map +1 -1
  145. package/dist/core/tools/edit.js.map +1 -1
  146. package/dist/core/tools/find.d.ts +2 -2
  147. package/dist/core/tools/find.d.ts.map +1 -1
  148. package/dist/core/tools/find.js.map +1 -1
  149. package/dist/core/tools/grep.d.ts +2 -2
  150. package/dist/core/tools/grep.d.ts.map +1 -1
  151. package/dist/core/tools/grep.js.map +1 -1
  152. package/dist/core/tools/index.d.ts +17 -17
  153. package/dist/core/tools/index.d.ts.map +1 -1
  154. package/dist/core/tools/index.js.map +1 -1
  155. package/dist/core/tools/ls.d.ts +2 -2
  156. package/dist/core/tools/ls.d.ts.map +1 -1
  157. package/dist/core/tools/ls.js.map +1 -1
  158. package/dist/core/tools/output-accumulator.d.ts +1 -1
  159. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  160. package/dist/core/tools/output-accumulator.js.map +1 -1
  161. package/dist/core/tools/read.d.ts +2 -2
  162. package/dist/core/tools/read.d.ts.map +1 -1
  163. package/dist/core/tools/read.js.map +1 -1
  164. package/dist/core/tools/render-utils.d.ts.map +1 -1
  165. package/dist/core/tools/render-utils.js.map +1 -1
  166. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  167. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  168. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  169. package/dist/core/tools/write.d.ts +1 -1
  170. package/dist/core/tools/write.d.ts.map +1 -1
  171. package/dist/core/tools/write.js.map +1 -1
  172. package/dist/index.d.ts +28 -27
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.js +1 -0
  175. package/dist/index.js.map +1 -1
  176. package/dist/main.d.ts +1 -1
  177. package/dist/main.d.ts.map +1 -1
  178. package/dist/main.js +2 -0
  179. package/dist/main.js.map +1 -1
  180. package/dist/migrations.d.ts.map +1 -1
  181. package/dist/migrations.js.map +1 -1
  182. package/dist/modes/index.d.ts +5 -5
  183. package/dist/modes/index.d.ts.map +1 -1
  184. package/dist/modes/index.js.map +1 -1
  185. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  186. package/dist/modes/interactive/components/armin.js.map +1 -1
  187. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  188. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  189. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  190. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  191. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  192. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  193. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  194. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  195. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  196. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  198. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  199. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  200. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  201. package/dist/modes/interactive/components/config-selector.d.ts +2 -2
  202. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  204. package/dist/modes/interactive/components/countdown-timer.d.ts +2 -2
  205. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  206. package/dist/modes/interactive/components/countdown-timer.js +2 -2
  207. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  208. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  209. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  210. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/dist/modes/interactive/components/custom-message.d.ts +2 -2
  212. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  213. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  214. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  216. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/diff.js.map +1 -1
  218. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  219. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  220. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  221. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  222. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  223. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  225. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  226. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  227. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  228. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  229. package/dist/modes/interactive/components/footer.d.ts +3 -3
  230. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  231. package/dist/modes/interactive/components/footer.js +2 -2
  232. package/dist/modes/interactive/components/footer.js.map +1 -1
  233. package/dist/modes/interactive/components/index.d.ts +31 -31
  234. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  235. package/dist/modes/interactive/components/index.js.map +1 -1
  236. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  238. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  239. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/login-dialog.js +2 -2
  241. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  242. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  243. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  244. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  245. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  246. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  247. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  248. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  249. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  250. package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
  251. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  253. package/dist/modes/interactive/components/session-selector.d.ts +3 -3
  254. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  255. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  256. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  257. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  258. package/dist/modes/interactive/components/settings-selector.js +15 -0
  259. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  260. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  261. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  262. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  263. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  264. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  265. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  266. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  267. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  269. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  270. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  271. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  272. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  273. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  274. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  275. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  276. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  277. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  278. package/dist/modes/interactive/components/user-message.js.map +1 -1
  279. package/dist/modes/interactive/interactive-mode.d.ts +4 -3
  280. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/dist/modes/interactive/interactive-mode.js +33 -10
  282. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/dist/modes/interactive/theme/dark.json +5 -4
  284. package/dist/modes/interactive/theme/light.json +5 -4
  285. package/dist/modes/interactive/theme/theme.d.ts +22 -3
  286. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  287. package/dist/modes/interactive/theme/theme.js +82 -40
  288. package/dist/modes/interactive/theme/theme.js.map +1 -1
  289. package/dist/modes/print-mode.d.ts +1 -1
  290. package/dist/modes/print-mode.d.ts.map +1 -1
  291. package/dist/modes/print-mode.js.map +1 -1
  292. package/dist/modes/rpc/rpc-client.d.ts +5 -5
  293. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  294. package/dist/modes/rpc/rpc-client.js +1 -1
  295. package/dist/modes/rpc/rpc-client.js.map +1 -1
  296. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  297. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  298. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  299. package/dist/modes/rpc/rpc-types.d.ts +4 -4
  300. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  301. package/dist/modes/rpc/rpc-types.js.map +1 -1
  302. package/dist/package-manager-cli.d.ts.map +1 -1
  303. package/dist/package-manager-cli.js +40 -1
  304. package/dist/package-manager-cli.js.map +1 -1
  305. package/dist/utils/changelog.d.ts +1 -1
  306. package/dist/utils/changelog.d.ts.map +1 -1
  307. package/dist/utils/changelog.js.map +1 -1
  308. package/dist/utils/clipboard-image.d.ts.map +1 -1
  309. package/dist/utils/clipboard-image.js.map +1 -1
  310. package/dist/utils/clipboard.d.ts.map +1 -1
  311. package/dist/utils/clipboard.js.map +1 -1
  312. package/dist/utils/exif-orientation.d.ts +1 -1
  313. package/dist/utils/exif-orientation.d.ts.map +1 -1
  314. package/dist/utils/exif-orientation.js.map +1 -1
  315. package/dist/utils/image-convert.d.ts.map +1 -1
  316. package/dist/utils/image-convert.js.map +1 -1
  317. package/dist/utils/image-resize.d.ts.map +1 -1
  318. package/dist/utils/image-resize.js.map +1 -1
  319. package/dist/utils/paths.d.ts +1 -0
  320. package/dist/utils/paths.d.ts.map +1 -1
  321. package/dist/utils/paths.js +16 -0
  322. package/dist/utils/paths.js.map +1 -1
  323. package/dist/utils/shell.d.ts.map +1 -1
  324. package/dist/utils/shell.js +6 -1
  325. package/dist/utils/shell.js.map +1 -1
  326. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  327. package/dist/utils/syntax-highlight.js.map +1 -1
  328. package/dist/utils/tools-manager.d.ts.map +1 -1
  329. package/dist/utils/tools-manager.js.map +1 -1
  330. package/dist/utils/version-check.d.ts +2 -1
  331. package/dist/utils/version-check.d.ts.map +1 -1
  332. package/dist/utils/version-check.js +9 -4
  333. package/dist/utils/version-check.js.map +1 -1
  334. package/dist/utils/windows-self-update.d.ts.map +1 -1
  335. package/dist/utils/windows-self-update.js.map +1 -1
  336. package/docs/index.md +13 -3
  337. package/docs/packages.md +2 -0
  338. package/docs/quickstart.md +23 -1
  339. package/docs/termux.md +1 -1
  340. package/docs/usage.md +2 -0
  341. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  342. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  343. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  344. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  345. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  346. package/examples/extensions/doom-overlay/index.ts +3 -3
  347. package/examples/extensions/overlay-qa-tests.ts +97 -66
  348. package/examples/extensions/overlay-test.ts +7 -4
  349. package/examples/extensions/plan-mode/index.ts +1 -1
  350. package/examples/extensions/sandbox/package-lock.json +2 -2
  351. package/examples/extensions/sandbox/package.json +2 -2
  352. package/examples/extensions/subagent/README.md +3 -0
  353. package/examples/extensions/subagent/index.ts +42 -20
  354. package/examples/extensions/with-deps/package-lock.json +2 -2
  355. package/examples/extensions/with-deps/package.json +3 -3
  356. package/npm-shrinkwrap.json +1803 -0
  357. package/package.json +32 -31
@@ -64,7 +64,6 @@ export class AgentSession {
64
64
  // Event subscription state
65
65
  _unsubscribeAgent;
66
66
  _eventListeners = [];
67
- _agentEventQueue = Promise.resolve();
68
67
  /** Tracks pending steering messages for UI display. Removed when delivered. */
69
68
  _steeringMessages = [];
70
69
  /** Tracks pending follow-up messages for UI display. Removed when delivered. */
@@ -80,8 +79,6 @@ export class AgentSession {
80
79
  // Retry state
81
80
  _retryAbortController = undefined;
82
81
  _retryAttempt = 0;
83
- _retryPromise = undefined;
84
- _retryResolve = undefined;
85
82
  // Bash execution state
86
83
  _bashAbortController = undefined;
87
84
  _pendingBashMessages = [];
@@ -99,6 +96,7 @@ export class AgentSession {
99
96
  _sessionStartEvent;
100
97
  _extensionUIContext;
101
98
  _extensionCommandContextActions;
99
+ _extensionAbortHandler;
102
100
  _extensionShutdownHandler;
103
101
  _extensionErrorListener;
104
102
  _extensionErrorUnsubscriber;
@@ -179,7 +177,6 @@ export class AgentSession {
179
177
  if (!runner.hasHandlers("tool_call")) {
180
178
  return undefined;
181
179
  }
182
- await this._agentEventQueue;
183
180
  try {
184
181
  return await runner.emitToolCall({
185
182
  type: "tool_call",
@@ -238,43 +235,7 @@ export class AgentSession {
238
235
  // Track last assistant message for auto-compaction check
239
236
  _lastAssistantMessage = undefined;
240
237
  /** Internal handler for agent events - shared by subscribe and reconnect */
241
- _handleAgentEvent = (event) => {
242
- // Create retry promise synchronously before queueing async processing.
243
- // Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()
244
- // as soon as agent.prompt() resolves. If _retryPromise is created only inside
245
- // _processAgentEvent, slow earlier queued events can delay agent_end processing
246
- // and waitForRetry() can miss the in-flight retry.
247
- this._createRetryPromiseForAgentEnd(event);
248
- this._agentEventQueue = this._agentEventQueue.then(() => this._processAgentEvent(event), () => this._processAgentEvent(event));
249
- // Keep queue alive if an event handler fails
250
- this._agentEventQueue.catch(() => { });
251
- };
252
- _createRetryPromiseForAgentEnd(event) {
253
- if (event.type !== "agent_end" || this._retryPromise) {
254
- return;
255
- }
256
- const settings = this.settingsManager.getRetrySettings();
257
- if (!settings.enabled) {
258
- return;
259
- }
260
- const lastAssistant = this._findLastAssistantInMessages(event.messages);
261
- if (!lastAssistant || !this._isRetryableError(lastAssistant)) {
262
- return;
263
- }
264
- this._retryPromise = new Promise((resolve) => {
265
- this._retryResolve = resolve;
266
- });
267
- }
268
- _findLastAssistantInMessages(messages) {
269
- for (let i = messages.length - 1; i >= 0; i--) {
270
- const message = messages[i];
271
- if (message.role === "assistant") {
272
- return message;
273
- }
274
- }
275
- return undefined;
276
- }
277
- async _processAgentEvent(event) {
238
+ _handleAgentEvent = async (event) => {
278
239
  // When a user message starts, check if it's from either queue and remove it BEFORE emitting
279
240
  // This ensures the UI sees the updated queue state
280
241
  if (event.type === "message_start" && event.message.role === "user") {
@@ -300,7 +261,7 @@ export class AgentSession {
300
261
  // Emit to extensions first
301
262
  await this._emitExtensionEvent(event);
302
263
  // Notify all listeners
303
- this._emit(event);
264
+ this._emit(event.type === "agent_end" ? { ...event, willRetry: this._willRetryAfterAgentEnd(event) } : event);
304
265
  // Handle session persistence
305
266
  if (event.type === "message_end") {
306
267
  // Check if this is a custom message from extensions
@@ -334,27 +295,19 @@ export class AgentSession {
334
295
  }
335
296
  }
336
297
  }
337
- // Check auto-retry and auto-compaction after agent completes
338
- if (event.type === "agent_end" && this._lastAssistantMessage) {
339
- const msg = this._lastAssistantMessage;
340
- this._lastAssistantMessage = undefined;
341
- // Check for retryable errors first (overloaded, rate limit, server errors)
342
- if (this._isRetryableError(msg)) {
343
- const didRetry = await this._handleRetryableError(msg);
344
- if (didRetry)
345
- return; // Retry was initiated, don't proceed to compaction
346
- }
347
- this._resolveRetry();
348
- await this._checkCompaction(msg);
298
+ };
299
+ _willRetryAfterAgentEnd(event) {
300
+ const settings = this.settingsManager.getRetrySettings();
301
+ if (!settings.enabled || this._retryAttempt >= settings.maxRetries) {
302
+ return false;
349
303
  }
350
- }
351
- /** Resolve the pending retry promise */
352
- _resolveRetry() {
353
- if (this._retryResolve) {
354
- this._retryResolve();
355
- this._retryResolve = undefined;
356
- this._retryPromise = undefined;
304
+ for (let i = event.messages.length - 1; i >= 0; i--) {
305
+ const message = event.messages[i];
306
+ if (message.role === "assistant") {
307
+ return this._isRetryableError(message);
308
+ }
357
309
  }
310
+ return false;
358
311
  }
359
312
  /** Extract text content from a message */
360
313
  _getUserMessageText(message) {
@@ -379,7 +332,7 @@ export class AgentSession {
379
332
  }
380
333
  _replaceMessageInPlace(target, replacement) {
381
334
  // Agent-core stores the finalized message object in its state before emitting message_end.
382
- // SessionManager persistence happens later in _processAgentEvent() with event.message.
335
+ // SessionManager persistence happens later in _handleAgentEvent() with event.message.
383
336
  // Mutating this object in place keeps agent state, later turn/agent events, listeners,
384
337
  // and the eventual SessionManager.appendMessage(event.message) persistence in sync.
385
338
  if (target === replacement) {
@@ -685,6 +638,37 @@ export class AgentSession {
685
638
  // =========================================================================
686
639
  // Prompting
687
640
  // =========================================================================
641
+ async _runAgentPrompt(messages) {
642
+ try {
643
+ await this.agent.prompt(messages);
644
+ while (await this._handlePostAgentRun()) {
645
+ await this.agent.continue();
646
+ }
647
+ }
648
+ finally {
649
+ this._flushPendingBashMessages();
650
+ }
651
+ }
652
+ async _handlePostAgentRun() {
653
+ const msg = this._lastAssistantMessage;
654
+ this._lastAssistantMessage = undefined;
655
+ if (!msg) {
656
+ return false;
657
+ }
658
+ if (this._isRetryableError(msg) && (await this._prepareRetry(msg))) {
659
+ return true;
660
+ }
661
+ if (msg.stopReason === "error" && this._retryAttempt > 0) {
662
+ this._emit({
663
+ type: "auto_retry_end",
664
+ success: false,
665
+ attempt: this._retryAttempt,
666
+ finalError: msg.errorMessage,
667
+ });
668
+ this._retryAttempt = 0;
669
+ }
670
+ return await this._checkCompaction(msg);
671
+ }
688
672
  /**
689
673
  * Send a prompt to the agent.
690
674
  * - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming
@@ -760,8 +744,16 @@ export class AgentSession {
760
744
  }
761
745
  // Check if we need to compact before sending (catches aborted responses)
762
746
  const lastAssistant = this._findLastAssistantMessage();
763
- if (lastAssistant) {
764
- await this._checkCompaction(lastAssistant, false);
747
+ if (lastAssistant && (await this._checkCompaction(lastAssistant, false))) {
748
+ try {
749
+ await this.agent.continue();
750
+ while (await this._handlePostAgentRun()) {
751
+ await this.agent.continue();
752
+ }
753
+ }
754
+ finally {
755
+ this._flushPendingBashMessages();
756
+ }
765
757
  }
766
758
  // Build messages array (custom message if any, then user message)
767
759
  messages = [];
@@ -812,8 +804,7 @@ export class AgentSession {
812
804
  return;
813
805
  }
814
806
  preflightResult?.(true);
815
- await this.agent.prompt(messages);
816
- await this.waitForRetry();
807
+ await this._runAgentPrompt(messages);
817
808
  }
818
809
  /**
819
810
  * Try to execute an extension command. Returns true if command was found and executed.
@@ -983,7 +974,7 @@ export class AgentSession {
983
974
  }
984
975
  }
985
976
  else if (options?.triggerTurn) {
986
- await this.agent.prompt(appMessage);
977
+ await this._runAgentPrompt(appMessage);
987
978
  }
988
979
  else {
989
980
  this.agent.state.messages.push(appMessage);
@@ -1383,10 +1374,10 @@ export class AgentSession {
1383
1374
  async _checkCompaction(assistantMessage, skipAbortedCheck = true) {
1384
1375
  const settings = this.settingsManager.getCompactionSettings();
1385
1376
  if (!settings.enabled)
1386
- return;
1377
+ return false;
1387
1378
  // Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false
1388
1379
  if (skipAbortedCheck && assistantMessage.stopReason === "aborted")
1389
- return;
1380
+ return false;
1390
1381
  const contextWindow = this.model?.contextWindow ?? 0;
1391
1382
  // Skip overflow check if the message came from a different model.
1392
1383
  // This handles the case where user switched from a smaller-context model (e.g. opus)
@@ -1399,7 +1390,7 @@ export class AgentSession {
1399
1390
  const compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());
1400
1391
  const assistantIsFromBeforeCompaction = compactionEntry !== null && assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();
1401
1392
  if (assistantIsFromBeforeCompaction) {
1402
- return;
1393
+ return false;
1403
1394
  }
1404
1395
  // Case 1: Overflow - LLM returned context overflow error
1405
1396
  if (sameModel && isContextOverflow(assistantMessage, contextWindow)) {
@@ -1412,7 +1403,7 @@ export class AgentSession {
1412
1403
  willRetry: false,
1413
1404
  errorMessage: "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.",
1414
1405
  });
1415
- return;
1406
+ return false;
1416
1407
  }
1417
1408
  this._overflowRecoveryAttempted = true;
1418
1409
  // Remove the error message from agent state (it IS saved to session for history,
@@ -1421,8 +1412,7 @@ export class AgentSession {
1421
1412
  if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1422
1413
  this.agent.state.messages = messages.slice(0, -1);
1423
1414
  }
1424
- await this._runAutoCompaction("overflow", true);
1425
- return;
1415
+ return await this._runAutoCompaction("overflow", true);
1426
1416
  }
1427
1417
  // Case 2: Threshold - context is getting large
1428
1418
  // For error messages (no usage data), estimate from last successful response.
@@ -1432,7 +1422,7 @@ export class AgentSession {
1432
1422
  const messages = this.agent.state.messages;
1433
1423
  const estimate = estimateContextTokens(messages);
1434
1424
  if (estimate.lastUsageIndex === null)
1435
- return; // No usage data at all
1425
+ return false; // No usage data at all
1436
1426
  // Verify the usage source is post-compaction. Kept pre-compaction messages
1437
1427
  // have stale usage reflecting the old (larger) context and would falsely
1438
1428
  // trigger compaction right after one just finished.
@@ -1440,7 +1430,7 @@ export class AgentSession {
1440
1430
  if (compactionEntry &&
1441
1431
  usageMsg.role === "assistant" &&
1442
1432
  usageMsg.timestamp <= new Date(compactionEntry.timestamp).getTime()) {
1443
- return;
1433
+ return false;
1444
1434
  }
1445
1435
  contextTokens = estimate.tokens;
1446
1436
  }
@@ -1448,8 +1438,9 @@ export class AgentSession {
1448
1438
  contextTokens = calculateContextTokens(assistantMessage.usage);
1449
1439
  }
1450
1440
  if (shouldCompact(contextTokens, contextWindow, settings)) {
1451
- await this._runAutoCompaction("threshold", false);
1441
+ return await this._runAutoCompaction("threshold", false);
1452
1442
  }
1443
+ return false;
1453
1444
  }
1454
1445
  /**
1455
1446
  * Internal: Run auto-compaction with events.
@@ -1467,7 +1458,7 @@ export class AgentSession {
1467
1458
  aborted: false,
1468
1459
  willRetry: false,
1469
1460
  });
1470
- return;
1461
+ return false;
1471
1462
  }
1472
1463
  let apiKey;
1473
1464
  let headers;
@@ -1481,7 +1472,7 @@ export class AgentSession {
1481
1472
  aborted: false,
1482
1473
  willRetry: false,
1483
1474
  });
1484
- return;
1475
+ return false;
1485
1476
  }
1486
1477
  apiKey = authResult.apiKey;
1487
1478
  headers = authResult.headers;
@@ -1499,7 +1490,7 @@ export class AgentSession {
1499
1490
  aborted: false,
1500
1491
  willRetry: false,
1501
1492
  });
1502
- return;
1493
+ return false;
1503
1494
  }
1504
1495
  let extensionCompaction;
1505
1496
  let fromExtension = false;
@@ -1519,7 +1510,7 @@ export class AgentSession {
1519
1510
  aborted: true,
1520
1511
  willRetry: false,
1521
1512
  });
1522
- return;
1513
+ return false;
1523
1514
  }
1524
1515
  if (extensionResult?.compaction) {
1525
1516
  extensionCompaction = extensionResult.compaction;
@@ -1553,7 +1544,7 @@ export class AgentSession {
1553
1544
  aborted: true,
1554
1545
  willRetry: false,
1555
1546
  });
1556
- return;
1547
+ return false;
1557
1548
  }
1558
1549
  this.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);
1559
1550
  const newEntries = this.sessionManager.getEntries();
@@ -1581,17 +1572,11 @@ export class AgentSession {
1581
1572
  if (lastMsg?.role === "assistant" && lastMsg.stopReason === "error") {
1582
1573
  this.agent.state.messages = messages.slice(0, -1);
1583
1574
  }
1584
- setTimeout(() => {
1585
- this.agent.continue().catch(() => { });
1586
- }, 100);
1587
- }
1588
- else if (this.agent.hasQueuedMessages()) {
1589
- // Auto-compaction can complete while follow-up/steering/custom messages are waiting.
1590
- // Kick the loop so queued messages are actually delivered.
1591
- setTimeout(() => {
1592
- this.agent.continue().catch(() => { });
1593
- }, 100);
1575
+ return true;
1594
1576
  }
1577
+ // Auto-compaction can complete while follow-up/steering/custom messages are waiting.
1578
+ // Continue once so queued messages are delivered.
1579
+ return this.agent.hasQueuedMessages();
1595
1580
  }
1596
1581
  catch (error) {
1597
1582
  const errorMessage = error instanceof Error ? error.message : "compaction failed";
@@ -1605,6 +1590,7 @@ export class AgentSession {
1605
1590
  ? `Context overflow recovery failed: ${errorMessage}`
1606
1591
  : `Auto-compaction failed: ${errorMessage}`,
1607
1592
  });
1593
+ return false;
1608
1594
  }
1609
1595
  finally {
1610
1596
  this._autoCompactionAbortController = undefined;
@@ -1627,6 +1613,9 @@ export class AgentSession {
1627
1613
  if (bindings.commandContextActions !== undefined) {
1628
1614
  this._extensionCommandContextActions = bindings.commandContextActions;
1629
1615
  }
1616
+ if (bindings.abortHandler !== undefined) {
1617
+ this._extensionAbortHandler = bindings.abortHandler;
1618
+ }
1630
1619
  if (bindings.shutdownHandler !== undefined) {
1631
1620
  this._extensionShutdownHandler = bindings.shutdownHandler;
1632
1621
  }
@@ -1766,7 +1755,13 @@ export class AgentSession {
1766
1755
  getModel: () => this.model,
1767
1756
  isIdle: () => !this.isStreaming,
1768
1757
  getSignal: () => this.agent.signal,
1769
- abort: () => this.abort(),
1758
+ abort: () => {
1759
+ if (this._extensionAbortHandler) {
1760
+ this._extensionAbortHandler();
1761
+ return;
1762
+ }
1763
+ void this.abort();
1764
+ },
1770
1765
  hasPendingMessages: () => this.pendingMessageCount > 0,
1771
1766
  shutdown: () => {
1772
1767
  this._extensionShutdownHandler?.();
@@ -1946,33 +1941,18 @@ export class AgentSession {
1946
1941
  return /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|websocket.?closed|websocket.?error|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|stream ended before message_stop|http2 request did not get a response|timed? out|timeout|terminated|retry delay/i.test(err);
1947
1942
  }
1948
1943
  /**
1949
- * Handle retryable errors with exponential backoff.
1950
- * @returns true if retry was initiated, false if max retries exceeded or disabled
1944
+ * Prepare a retryable error for continuation with exponential backoff.
1945
+ * @returns true if the caller should continue the agent, false otherwise
1951
1946
  */
1952
- async _handleRetryableError(message) {
1947
+ async _prepareRetry(message) {
1953
1948
  const settings = this.settingsManager.getRetrySettings();
1954
1949
  if (!settings.enabled) {
1955
- this._resolveRetry();
1956
1950
  return false;
1957
1951
  }
1958
- // Retry promise is created synchronously in _handleAgentEvent for agent_end.
1959
- // Keep a defensive fallback here in case a future refactor bypasses that path.
1960
- if (!this._retryPromise) {
1961
- this._retryPromise = new Promise((resolve) => {
1962
- this._retryResolve = resolve;
1963
- });
1964
- }
1965
1952
  this._retryAttempt++;
1966
1953
  if (this._retryAttempt > settings.maxRetries) {
1967
- // Max retries exceeded, emit final failure and reset
1968
- this._emit({
1969
- type: "auto_retry_end",
1970
- success: false,
1971
- attempt: this._retryAttempt - 1,
1972
- finalError: message.errorMessage,
1973
- });
1974
- this._retryAttempt = 0;
1975
- this._resolveRetry(); // Resolve so waitForRetry() completes
1954
+ // Preserve the completed attempt count so post-run handling can emit the final failure.
1955
+ this._retryAttempt--;
1976
1956
  return false;
1977
1957
  }
1978
1958
  const delayMs = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);
@@ -1997,23 +1977,17 @@ export class AgentSession {
1997
1977
  // Aborted during sleep - emit end event so UI can clean up
1998
1978
  const attempt = this._retryAttempt;
1999
1979
  this._retryAttempt = 0;
2000
- this._retryAbortController = undefined;
2001
1980
  this._emit({
2002
1981
  type: "auto_retry_end",
2003
1982
  success: false,
2004
1983
  attempt,
2005
1984
  finalError: "Retry cancelled",
2006
1985
  });
2007
- this._resolveRetry();
2008
1986
  return false;
2009
1987
  }
2010
- this._retryAbortController = undefined;
2011
- // Retry via continue() - use setTimeout to break out of event handler chain
2012
- setTimeout(() => {
2013
- this.agent.continue().catch(() => {
2014
- // Retry failed - will be caught by next agent_end
2015
- });
2016
- }, 0);
1988
+ finally {
1989
+ this._retryAbortController = undefined;
1990
+ }
2017
1991
  return true;
2018
1992
  }
2019
1993
  /**
@@ -2021,23 +1995,10 @@ export class AgentSession {
2021
1995
  */
2022
1996
  abortRetry() {
2023
1997
  this._retryAbortController?.abort();
2024
- // Note: _retryAttempt is reset in the catch block of _autoRetry
2025
- this._resolveRetry();
2026
- }
2027
- /**
2028
- * Wait for any in-progress retry to complete.
2029
- * Returns immediately if no retry is in progress.
2030
- */
2031
- async waitForRetry() {
2032
- if (!this._retryPromise) {
2033
- return;
2034
- }
2035
- await this._retryPromise;
2036
- await this.agent.waitForIdle();
2037
1998
  }
2038
1999
  /** Whether auto-retry is currently in progress */
2039
2000
  get isRetrying() {
2040
- return this._retryPromise !== undefined;
2001
+ return this._retryAbortController !== undefined;
2041
2002
  }
2042
2003
  /** Whether auto-retry is enabled */
2043
2004
  get autoRetryEnabled() {