@hyperspaceng/neural-coding-agent 0.62.1 → 0.63.2

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 (374) hide show
  1. package/CHANGELOG.md +143 -0
  2. package/README.md +10 -0
  3. package/dist/bun/register-bedrock.d.ts.map +1 -1
  4. package/dist/bun/register-bedrock.js +2 -2
  5. package/dist/bun/register-bedrock.js.map +1 -1
  6. package/dist/cli/args.d.ts +1 -1
  7. package/dist/cli/args.d.ts.map +1 -1
  8. package/dist/cli/args.js.map +1 -1
  9. package/dist/cli/config-selector.d.ts.map +1 -1
  10. package/dist/cli/config-selector.js +1 -1
  11. package/dist/cli/config-selector.js.map +1 -1
  12. package/dist/cli/file-processor.d.ts +1 -1
  13. package/dist/cli/file-processor.d.ts.map +1 -1
  14. package/dist/cli/file-processor.js +4 -0
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js +1 -1
  21. package/dist/cli/list-models.js.map +1 -1
  22. package/dist/cli/session-picker.d.ts.map +1 -1
  23. package/dist/cli/session-picker.js +1 -1
  24. package/dist/cli/session-picker.js.map +1 -1
  25. package/dist/core/agent-session.d.ts +21 -11
  26. package/dist/core/agent-session.d.ts.map +1 -1
  27. package/dist/core/agent-session.js +159 -101
  28. package/dist/core/agent-session.js.map +1 -1
  29. package/dist/core/auth-storage.d.ts +5 -3
  30. package/dist/core/auth-storage.d.ts.map +1 -1
  31. package/dist/core/auth-storage.js +7 -4
  32. package/dist/core/auth-storage.js.map +1 -1
  33. package/dist/core/compaction/branch-summarization.d.ts +4 -2
  34. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  35. package/dist/core/compaction/branch-summarization.js +3 -3
  36. package/dist/core/compaction/branch-summarization.js.map +1 -1
  37. package/dist/core/compaction/compaction.d.ts +5 -5
  38. package/dist/core/compaction/compaction.d.ts.map +1 -1
  39. package/dist/core/compaction/compaction.js +28 -27
  40. package/dist/core/compaction/compaction.js.map +1 -1
  41. package/dist/core/compaction/utils.d.ts +2 -2
  42. package/dist/core/compaction/utils.d.ts.map +1 -1
  43. package/dist/core/compaction/utils.js.map +1 -1
  44. package/dist/core/defaults.d.ts +1 -1
  45. package/dist/core/defaults.d.ts.map +1 -1
  46. package/dist/core/defaults.js.map +1 -1
  47. package/dist/core/export-html/index.d.ts +3 -3
  48. package/dist/core/export-html/index.d.ts.map +1 -1
  49. package/dist/core/export-html/index.js +7 -6
  50. package/dist/core/export-html/index.js.map +1 -1
  51. package/dist/core/export-html/tool-renderer.d.ts +2 -2
  52. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  53. package/dist/core/export-html/tool-renderer.js +41 -16
  54. package/dist/core/export-html/tool-renderer.js.map +1 -1
  55. package/dist/core/extensions/index.d.ts +3 -2
  56. package/dist/core/extensions/index.d.ts.map +1 -1
  57. package/dist/core/extensions/index.js.map +1 -1
  58. package/dist/core/extensions/loader.d.ts.map +1 -1
  59. package/dist/core/extensions/loader.js +27 -17
  60. package/dist/core/extensions/loader.js.map +1 -1
  61. package/dist/core/extensions/runner.d.ts +7 -10
  62. package/dist/core/extensions/runner.d.ts.map +1 -1
  63. package/dist/core/extensions/runner.js +27 -38
  64. package/dist/core/extensions/runner.js.map +1 -1
  65. package/dist/core/extensions/types.d.ts +56 -15
  66. package/dist/core/extensions/types.d.ts.map +1 -1
  67. package/dist/core/extensions/types.js.map +1 -1
  68. package/dist/core/extensions/wrapper.d.ts +1 -1
  69. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  70. package/dist/core/extensions/wrapper.js +2 -8
  71. package/dist/core/extensions/wrapper.js.map +1 -1
  72. package/dist/core/index.d.ts +2 -1
  73. package/dist/core/index.d.ts.map +1 -1
  74. package/dist/core/index.js +1 -0
  75. package/dist/core/index.js.map +1 -1
  76. package/dist/core/keybindings.d.ts +2 -2
  77. package/dist/core/keybindings.d.ts.map +1 -1
  78. package/dist/core/keybindings.js +1 -1
  79. package/dist/core/keybindings.js.map +1 -1
  80. package/dist/core/messages.d.ts +3 -3
  81. package/dist/core/messages.d.ts.map +1 -1
  82. package/dist/core/messages.js.map +1 -1
  83. package/dist/core/model-registry.d.ts +19 -3
  84. package/dist/core/model-registry.d.ts.map +1 -1
  85. package/dist/core/model-registry.js +85 -71
  86. package/dist/core/model-registry.js.map +1 -1
  87. package/dist/core/model-resolver.d.ts +2 -2
  88. package/dist/core/model-resolver.d.ts.map +1 -1
  89. package/dist/core/model-resolver.js +5 -5
  90. package/dist/core/model-resolver.js.map +1 -1
  91. package/dist/core/output-guard.d.ts +6 -0
  92. package/dist/core/output-guard.d.ts.map +1 -0
  93. package/dist/core/output-guard.js +59 -0
  94. package/dist/core/output-guard.js.map +1 -0
  95. package/dist/core/package-manager.d.ts +3 -0
  96. package/dist/core/package-manager.d.ts.map +1 -1
  97. package/dist/core/package-manager.js +153 -29
  98. package/dist/core/package-manager.js.map +1 -1
  99. package/dist/core/prompt-templates.d.ts +2 -1
  100. package/dist/core/prompt-templates.d.ts.map +1 -1
  101. package/dist/core/prompt-templates.js +30 -32
  102. package/dist/core/prompt-templates.js.map +1 -1
  103. package/dist/core/resolve-config-value.d.ts +6 -0
  104. package/dist/core/resolve-config-value.d.ts.map +1 -1
  105. package/dist/core/resolve-config-value.js +37 -5
  106. package/dist/core/resolve-config-value.js.map +1 -1
  107. package/dist/core/resource-loader.d.ts +6 -5
  108. package/dist/core/resource-loader.d.ts.map +1 -1
  109. package/dist/core/resource-loader.js +136 -108
  110. package/dist/core/resource-loader.js.map +1 -1
  111. package/dist/core/sdk.d.ts +4 -4
  112. package/dist/core/sdk.d.ts.map +1 -1
  113. package/dist/core/sdk.js +15 -24
  114. package/dist/core/sdk.js.map +1 -1
  115. package/dist/core/session-manager.d.ts +2 -2
  116. package/dist/core/session-manager.d.ts.map +1 -1
  117. package/dist/core/session-manager.js.map +1 -1
  118. package/dist/core/settings-manager.d.ts +3 -1
  119. package/dist/core/settings-manager.d.ts.map +1 -1
  120. package/dist/core/settings-manager.js +3 -0
  121. package/dist/core/settings-manager.js.map +1 -1
  122. package/dist/core/skills.d.ts +2 -1
  123. package/dist/core/skills.d.ts.map +1 -1
  124. package/dist/core/skills.js +25 -1
  125. package/dist/core/skills.js.map +1 -1
  126. package/dist/core/slash-commands.d.ts +2 -3
  127. package/dist/core/slash-commands.d.ts.map +1 -1
  128. package/dist/core/slash-commands.js.map +1 -1
  129. package/dist/core/source-info.d.ts +18 -0
  130. package/dist/core/source-info.d.ts.map +1 -0
  131. package/dist/core/source-info.js +19 -0
  132. package/dist/core/source-info.js.map +1 -0
  133. package/dist/core/system-prompt.d.ts.map +1 -1
  134. package/dist/core/system-prompt.js +3 -38
  135. package/dist/core/system-prompt.js.map +1 -1
  136. package/dist/core/timings.d.ts +1 -0
  137. package/dist/core/timings.d.ts.map +1 -1
  138. package/dist/core/timings.js +6 -0
  139. package/dist/core/timings.js.map +1 -1
  140. package/dist/core/tools/bash.d.ts +20 -10
  141. package/dist/core/tools/bash.d.ts.map +1 -1
  142. package/dist/core/tools/bash.js +151 -59
  143. package/dist/core/tools/bash.js.map +1 -1
  144. package/dist/core/tools/edit-diff.d.ts +23 -1
  145. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  146. package/dist/core/tools/edit-diff.js +150 -57
  147. package/dist/core/tools/edit-diff.js.map +1 -1
  148. package/dist/core/tools/edit.d.ts +31 -7
  149. package/dist/core/tools/edit.d.ts.map +1 -1
  150. package/dist/core/tools/edit.js +179 -59
  151. package/dist/core/tools/edit.js.map +1 -1
  152. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  153. package/dist/core/tools/file-mutation-queue.js +4 -4
  154. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  155. package/dist/core/tools/find.d.ts +12 -5
  156. package/dist/core/tools/find.d.ts.map +1 -1
  157. package/dist/core/tools/find.js +76 -27
  158. package/dist/core/tools/find.js.map +1 -1
  159. package/dist/core/tools/grep.d.ts +16 -5
  160. package/dist/core/tools/grep.d.ts.map +1 -1
  161. package/dist/core/tools/grep.js +83 -29
  162. package/dist/core/tools/grep.js.map +1 -1
  163. package/dist/core/tools/index.d.ts +68 -22
  164. package/dist/core/tools/index.d.ts.map +1 -1
  165. package/dist/core/tools/index.js +50 -26
  166. package/dist/core/tools/index.js.map +1 -1
  167. package/dist/core/tools/ls.d.ts +10 -4
  168. package/dist/core/tools/ls.d.ts.map +1 -1
  169. package/dist/core/tools/ls.js +67 -13
  170. package/dist/core/tools/ls.js.map +1 -1
  171. package/dist/core/tools/read.d.ts +11 -4
  172. package/dist/core/tools/read.d.ts.map +1 -1
  173. package/dist/core/tools/read.js +110 -51
  174. package/dist/core/tools/read.js.map +1 -1
  175. package/dist/core/tools/render-utils.d.ts +21 -0
  176. package/dist/core/tools/render-utils.d.ts.map +1 -0
  177. package/dist/core/tools/render-utils.js +49 -0
  178. package/dist/core/tools/render-utils.js.map +1 -0
  179. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  180. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  181. package/dist/core/tools/tool-definition-wrapper.js +30 -0
  182. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  183. package/dist/core/tools/write.d.ts +10 -4
  184. package/dist/core/tools/write.d.ts.map +1 -1
  185. package/dist/core/tools/write.js +162 -27
  186. package/dist/core/tools/write.js.map +1 -1
  187. package/dist/index.d.ts +3 -2
  188. package/dist/index.d.ts.map +1 -1
  189. package/dist/index.js +2 -1
  190. package/dist/index.js.map +1 -1
  191. package/dist/main.d.ts.map +1 -1
  192. package/dist/main.js +57 -19
  193. package/dist/main.js.map +1 -1
  194. package/dist/modes/interactive/components/armin.d.ts +1 -1
  195. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  196. package/dist/modes/interactive/components/armin.js.map +1 -1
  197. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  198. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/assistant-message.js +1 -1
  200. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  201. package/dist/modes/interactive/components/bash-execution.d.ts +1 -2
  202. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/bash-execution.js +19 -6
  204. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  205. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  206. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  208. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  209. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  210. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  212. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  213. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  214. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  216. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  217. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  218. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  219. package/dist/modes/interactive/components/config-selector.js +1 -1
  220. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  221. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  222. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  223. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  224. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  225. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  226. package/dist/modes/interactive/components/custom-editor.js +1 -1
  227. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  228. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  229. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  230. package/dist/modes/interactive/components/custom-message.js +1 -1
  231. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  232. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  233. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  234. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  235. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  236. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  237. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  238. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  239. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  240. package/dist/modes/interactive/components/extension-editor.js +1 -1
  241. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  242. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  243. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  244. package/dist/modes/interactive/components/extension-input.js +1 -1
  245. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  246. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  247. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  248. package/dist/modes/interactive/components/extension-selector.js +1 -1
  249. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  250. package/dist/modes/interactive/components/footer.d.ts +1 -1
  251. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  252. package/dist/modes/interactive/components/footer.js +1 -1
  253. package/dist/modes/interactive/components/footer.js.map +1 -1
  254. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  255. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  257. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  258. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  259. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/login-dialog.js +2 -2
  261. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  262. package/dist/modes/interactive/components/model-selector.d.ts +2 -2
  263. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  264. package/dist/modes/interactive/components/model-selector.js +2 -2
  265. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  266. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  267. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/oauth-selector.js +2 -2
  269. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  270. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  271. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  272. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  273. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  274. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  275. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  276. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  277. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  278. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  279. package/dist/modes/interactive/components/session-selector.js +1 -1
  280. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  281. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  282. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  283. package/dist/modes/interactive/components/settings-selector.js +1 -1
  284. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  285. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  286. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  287. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  288. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  289. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  290. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  291. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  292. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  293. package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
  294. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  295. package/dist/modes/interactive/components/theme-selector.js +1 -1
  296. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  297. package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
  298. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  299. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  300. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  301. package/dist/modes/interactive/components/tool-execution.d.ts +15 -41
  302. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  303. package/dist/modes/interactive/components/tool-execution.js +121 -679
  304. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  305. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  306. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  307. package/dist/modes/interactive/components/tree-selector.js +1 -1
  308. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  309. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  310. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  311. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  312. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  313. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  314. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  315. package/dist/modes/interactive/components/user-message.js +1 -1
  316. package/dist/modes/interactive/components/user-message.js.map +1 -1
  317. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  318. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  319. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  320. package/dist/modes/interactive/interactive-mode.d.ts +5 -13
  321. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  322. package/dist/modes/interactive/interactive-mode.js +175 -160
  323. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  324. package/dist/modes/interactive/theme/theme.d.ts +5 -2
  325. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  326. package/dist/modes/interactive/theme/theme.js +15 -1
  327. package/dist/modes/interactive/theme/theme.js.map +1 -1
  328. package/dist/modes/print-mode.d.ts +2 -2
  329. package/dist/modes/print-mode.d.ts.map +1 -1
  330. package/dist/modes/print-mode.js +84 -78
  331. package/dist/modes/print-mode.js.map +1 -1
  332. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  333. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  334. package/dist/modes/rpc/rpc-client.js.map +1 -1
  335. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  336. package/dist/modes/rpc/rpc-mode.js +27 -20
  337. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  338. package/dist/modes/rpc/rpc-types.d.ts +5 -6
  339. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  340. package/dist/modes/rpc/rpc-types.js.map +1 -1
  341. package/dist/utils/image-resize.d.ts +6 -6
  342. package/dist/utils/image-resize.d.ts.map +1 -1
  343. package/dist/utils/image-resize.js +45 -94
  344. package/dist/utils/image-resize.js.map +1 -1
  345. package/docs/development.md +3 -1
  346. package/docs/extensions.md +85 -34
  347. package/docs/models.md +6 -0
  348. package/docs/rpc.md +11 -2
  349. package/docs/settings.md +12 -0
  350. package/docs/skills.md +3 -2
  351. package/docs/tui.md +2 -2
  352. package/examples/extensions/built-in-tool-renderer.ts +8 -8
  353. package/examples/extensions/commands.ts +3 -3
  354. package/examples/extensions/custom-compaction.ts +17 -4
  355. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  356. package/examples/extensions/custom-provider-anthropic/package.json +17 -17
  357. package/examples/extensions/custom-provider-gitlab-duo/package.json +14 -14
  358. package/examples/extensions/custom-provider-qwen-cli/package.json +14 -14
  359. package/examples/extensions/handoff.ts +5 -2
  360. package/examples/extensions/minimal-mode.ts +14 -14
  361. package/examples/extensions/qna.ts +5 -2
  362. package/examples/extensions/question.ts +2 -2
  363. package/examples/extensions/questionnaire.ts +2 -2
  364. package/examples/extensions/subagent/index.ts +23 -3
  365. package/examples/extensions/summarize.ts +15 -4
  366. package/examples/extensions/todo.ts +2 -2
  367. package/examples/extensions/trigger-compact.ts +11 -1
  368. package/examples/extensions/truncated-tool.ts +2 -2
  369. package/examples/extensions/with-deps/package-lock.json +2 -2
  370. package/examples/extensions/with-deps/package.json +20 -20
  371. package/examples/sdk/04-skills.ts +8 -2
  372. package/examples/sdk/08-prompt-templates.ts +2 -1
  373. package/examples/sdk/12-full-control.ts +0 -1
  374. package/package.json +5 -4
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
16
  import { basename, dirname, join, resolve } from "node:path";
17
- import { isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from "@mariozechner/pi-ai";
17
+ import { isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from "@hyperspaceng/neural-ai";
18
18
  import { getDocsPath } from "../config.js";
19
19
  import { theme } from "../modes/interactive/theme/theme.js";
20
20
  import { stripFrontmatter } from "../utils/frontmatter.js";
@@ -27,9 +27,10 @@ import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
27
27
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
28
28
  import { expandPromptTemplate } from "./prompt-templates.js";
29
29
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
30
- import { BUILTIN_SLASH_COMMANDS } from "./slash-commands.js";
30
+ import { createSyntheticSourceInfo } from "./source-info.js";
31
31
  import { buildSystemPrompt } from "./system-prompt.js";
32
- import { createAllTools } from "./tools/index.js";
32
+ import { createAllToolDefinitions } from "./tools/index.js";
33
+ import { createToolDefinitionFromAgentTool, wrapToolDefinition } from "./tools/tool-definition-wrapper.js";
33
34
  /**
34
35
  * Parse a skill block from message text.
35
36
  * Returns null if the text doesn't contain a skill block.
@@ -89,7 +90,7 @@ export class AgentSession {
89
90
  _turnIndex = 0;
90
91
  _resourceLoader;
91
92
  _customTools;
92
- _baseToolRegistry = new Map();
93
+ _baseToolDefinitions = new Map();
93
94
  _cwd;
94
95
  _extensionRunnerRef;
95
96
  _initialActiveToolNames;
@@ -103,6 +104,7 @@ export class AgentSession {
103
104
  _modelRegistry;
104
105
  // Tool registry for extension getTools/setTools
105
106
  _toolRegistry = new Map();
107
+ _toolDefinitions = new Map();
106
108
  _toolPromptSnippets = new Map();
107
109
  _toolPromptGuidelines = new Map();
108
110
  // Base system prompt (without extension appends) - used to apply fresh appends each turn
@@ -132,6 +134,23 @@ export class AgentSession {
132
134
  get modelRegistry() {
133
135
  return this._modelRegistry;
134
136
  }
137
+ async _getRequiredRequestAuth(model) {
138
+ const result = await this._modelRegistry.getApiKeyAndHeaders(model);
139
+ if (!result.ok) {
140
+ throw new Error(result.error);
141
+ }
142
+ if (result.apiKey) {
143
+ return { apiKey: result.apiKey, headers: result.headers };
144
+ }
145
+ const isOAuth = this._modelRegistry.isUsingOAuth(model);
146
+ if (isOAuth) {
147
+ throw new Error(`Authentication failed for "${model.provider}". ` +
148
+ `Credentials may have expired or network is unavailable. ` +
149
+ `Run '/login ${model.provider}' to re-authenticate.`);
150
+ }
151
+ throw new Error(`No API key found for ${model.provider}.\n\n` +
152
+ `Use /login or set an API key environment variable. See ${join(getDocsPath(), "providers.md")}`);
153
+ }
135
154
  /**
136
155
  * Install tool hooks once on the Agent instance.
137
156
  *
@@ -493,15 +512,19 @@ export class AgentSession {
493
512
  return this.agent.state.tools.map((t) => t.name);
494
513
  }
495
514
  /**
496
- * Get all configured tools with name, description, and parameter schema.
515
+ * Get all configured tools with name, description, parameter schema, and source metadata.
497
516
  */
498
517
  getAllTools() {
499
- return Array.from(this._toolRegistry.values()).map((t) => ({
500
- name: t.name,
501
- description: t.description,
502
- parameters: t.parameters,
518
+ return Array.from(this._toolDefinitions.values()).map(({ definition, sourceInfo }) => ({
519
+ name: definition.name,
520
+ description: definition.description,
521
+ parameters: definition.parameters,
522
+ sourceInfo,
503
523
  }));
504
524
  }
525
+ getToolDefinition(name) {
526
+ return this._toolDefinitions.get(name)?.definition;
527
+ }
505
528
  /**
506
529
  * Set active tools by name.
507
530
  * Only tools in the registry can be enabled. Unknown tool names are ignored.
@@ -680,9 +703,7 @@ export class AgentSession {
680
703
  `Use /login or set an API key environment variable. See ${join(getDocsPath(), "providers.md")}\n\n` +
681
704
  "Then use /model to select a model.");
682
705
  }
683
- // Validate API key
684
- const apiKey = await this._modelRegistry.getApiKey(this.model);
685
- if (!apiKey) {
706
+ if (!this._modelRegistry.hasConfiguredAuth(this.model)) {
686
707
  const isOAuth = this._modelRegistry.isUsingOAuth(this.model);
687
708
  if (isOAuth) {
688
709
  throw new Error(`Authentication failed for "${this.model.provider}". ` +
@@ -1059,12 +1080,11 @@ export class AgentSession {
1059
1080
  }
1060
1081
  /**
1061
1082
  * Set model directly.
1062
- * Validates API key, saves to session and settings.
1063
- * @throws Error if no API key available for the model
1083
+ * Validates that auth is configured, saves to session and settings.
1084
+ * @throws Error if no auth is configured for the model
1064
1085
  */
1065
1086
  async setModel(model) {
1066
- const apiKey = await this._modelRegistry.getApiKey(model);
1067
- if (!apiKey) {
1087
+ if (!this._modelRegistry.hasConfiguredAuth(model)) {
1068
1088
  throw new Error(`No API key for ${model.provider}/${model.id}`);
1069
1089
  }
1070
1090
  const previousModel = this.model;
@@ -1088,27 +1108,11 @@ export class AgentSession {
1088
1108
  }
1089
1109
  return this._cycleAvailableModel(direction);
1090
1110
  }
1091
- async _getScopedModelsWithApiKey() {
1092
- const apiKeysByProvider = new Map();
1093
- const result = [];
1094
- for (const scoped of this._scopedModels) {
1095
- const provider = scoped.model.provider;
1096
- let apiKey;
1097
- if (apiKeysByProvider.has(provider)) {
1098
- apiKey = apiKeysByProvider.get(provider);
1099
- }
1100
- else {
1101
- apiKey = await this._modelRegistry.getApiKeyForProvider(provider);
1102
- apiKeysByProvider.set(provider, apiKey);
1103
- }
1104
- if (apiKey) {
1105
- result.push(scoped);
1106
- }
1107
- }
1108
- return result;
1111
+ _getScopedModelsWithAuth() {
1112
+ return this._scopedModels.filter((scoped) => this._modelRegistry.hasConfiguredAuth(scoped.model));
1109
1113
  }
1110
1114
  async _cycleScopedModel(direction) {
1111
- const scopedModels = await this._getScopedModelsWithApiKey();
1115
+ const scopedModels = this._getScopedModelsWithAuth();
1112
1116
  if (scopedModels.length <= 1)
1113
1117
  return undefined;
1114
1118
  const currentModel = this.model;
@@ -1142,10 +1146,6 @@ export class AgentSession {
1142
1146
  const len = availableModels.length;
1143
1147
  const nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
1144
1148
  const nextModel = availableModels[nextIndex];
1145
- const apiKey = await this._modelRegistry.getApiKey(nextModel);
1146
- if (!apiKey) {
1147
- throw new Error(`No API key for ${nextModel.provider}/${nextModel.id}`);
1148
- }
1149
1149
  const thinkingLevel = this._getThinkingLevelForModelSwitch();
1150
1150
  this.agent.setModel(nextModel);
1151
1151
  this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);
@@ -1270,14 +1270,12 @@ export class AgentSession {
1270
1270
  this._disconnectFromAgent();
1271
1271
  await this.abort();
1272
1272
  this._compactionAbortController = new AbortController();
1273
+ this._emit({ type: "compaction_start", reason: "manual" });
1273
1274
  try {
1274
1275
  if (!this.model) {
1275
1276
  throw new Error("No model selected");
1276
1277
  }
1277
- const apiKey = await this._modelRegistry.getApiKey(this.model);
1278
- if (!apiKey) {
1279
- throw new Error(`No API key for ${this.model.provider}`);
1280
- }
1278
+ const { apiKey, headers } = await this._getRequiredRequestAuth(this.model);
1281
1279
  const pathEntries = this.sessionManager.getBranch();
1282
1280
  const settings = this.settingsManager.getCompactionSettings();
1283
1281
  const preparation = prepareCompaction(pathEntries, settings);
@@ -1320,7 +1318,7 @@ export class AgentSession {
1320
1318
  }
1321
1319
  else {
1322
1320
  // Generate compaction result
1323
- const result = await compact(preparation, this.model, apiKey, customInstructions, this._compactionAbortController.signal);
1321
+ const result = await compact(preparation, this.model, apiKey, headers, customInstructions, this._compactionAbortController.signal);
1324
1322
  summary = result.summary;
1325
1323
  firstKeptEntryId = result.firstKeptEntryId;
1326
1324
  tokensBefore = result.tokensBefore;
@@ -1342,12 +1340,33 @@ export class AgentSession {
1342
1340
  fromExtension,
1343
1341
  });
1344
1342
  }
1345
- return {
1343
+ const compactionResult = {
1346
1344
  summary,
1347
1345
  firstKeptEntryId,
1348
1346
  tokensBefore,
1349
1347
  details,
1350
1348
  };
1349
+ this._emit({
1350
+ type: "compaction_end",
1351
+ reason: "manual",
1352
+ result: compactionResult,
1353
+ aborted: false,
1354
+ willRetry: false,
1355
+ });
1356
+ return compactionResult;
1357
+ }
1358
+ catch (error) {
1359
+ const message = error instanceof Error ? error.message : String(error);
1360
+ const aborted = message === "Compaction cancelled" || (error instanceof Error && error.name === "AbortError");
1361
+ this._emit({
1362
+ type: "compaction_end",
1363
+ reason: "manual",
1364
+ result: undefined,
1365
+ aborted,
1366
+ willRetry: false,
1367
+ errorMessage: aborted ? undefined : `Compaction failed: ${message}`,
1368
+ });
1369
+ throw error;
1351
1370
  }
1352
1371
  finally {
1353
1372
  this._compactionAbortController = undefined;
@@ -1403,7 +1422,8 @@ export class AgentSession {
1403
1422
  if (sameModel && isContextOverflow(assistantMessage, contextWindow)) {
1404
1423
  if (this._overflowRecoveryAttempted) {
1405
1424
  this._emit({
1406
- type: "auto_compaction_end",
1425
+ type: "compaction_end",
1426
+ reason: "overflow",
1407
1427
  result: undefined,
1408
1428
  aborted: false,
1409
1429
  willRetry: false,
@@ -1453,22 +1473,41 @@ export class AgentSession {
1453
1473
  */
1454
1474
  async _runAutoCompaction(reason, willRetry) {
1455
1475
  const settings = this.settingsManager.getCompactionSettings();
1456
- this._emit({ type: "auto_compaction_start", reason });
1476
+ this._emit({ type: "compaction_start", reason });
1457
1477
  this._autoCompactionAbortController = new AbortController();
1458
1478
  try {
1459
1479
  if (!this.model) {
1460
- this._emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
1480
+ this._emit({
1481
+ type: "compaction_end",
1482
+ reason,
1483
+ result: undefined,
1484
+ aborted: false,
1485
+ willRetry: false,
1486
+ });
1461
1487
  return;
1462
1488
  }
1463
- const apiKey = await this._modelRegistry.getApiKey(this.model);
1464
- if (!apiKey) {
1465
- this._emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
1489
+ const authResult = await this._modelRegistry.getApiKeyAndHeaders(this.model);
1490
+ if (!authResult.ok || !authResult.apiKey) {
1491
+ this._emit({
1492
+ type: "compaction_end",
1493
+ reason,
1494
+ result: undefined,
1495
+ aborted: false,
1496
+ willRetry: false,
1497
+ });
1466
1498
  return;
1467
1499
  }
1500
+ const { apiKey, headers } = authResult;
1468
1501
  const pathEntries = this.sessionManager.getBranch();
1469
1502
  const preparation = prepareCompaction(pathEntries, settings);
1470
1503
  if (!preparation) {
1471
- this._emit({ type: "auto_compaction_end", result: undefined, aborted: false, willRetry: false });
1504
+ this._emit({
1505
+ type: "compaction_end",
1506
+ reason,
1507
+ result: undefined,
1508
+ aborted: false,
1509
+ willRetry: false,
1510
+ });
1472
1511
  return;
1473
1512
  }
1474
1513
  let extensionCompaction;
@@ -1482,7 +1521,13 @@ export class AgentSession {
1482
1521
  signal: this._autoCompactionAbortController.signal,
1483
1522
  }));
1484
1523
  if (extensionResult?.cancel) {
1485
- this._emit({ type: "auto_compaction_end", result: undefined, aborted: true, willRetry: false });
1524
+ this._emit({
1525
+ type: "compaction_end",
1526
+ reason,
1527
+ result: undefined,
1528
+ aborted: true,
1529
+ willRetry: false,
1530
+ });
1486
1531
  return;
1487
1532
  }
1488
1533
  if (extensionResult?.compaction) {
@@ -1503,14 +1548,20 @@ export class AgentSession {
1503
1548
  }
1504
1549
  else {
1505
1550
  // Generate compaction result
1506
- const compactResult = await compact(preparation, this.model, apiKey, undefined, this._autoCompactionAbortController.signal);
1551
+ const compactResult = await compact(preparation, this.model, apiKey, headers, undefined, this._autoCompactionAbortController.signal);
1507
1552
  summary = compactResult.summary;
1508
1553
  firstKeptEntryId = compactResult.firstKeptEntryId;
1509
1554
  tokensBefore = compactResult.tokensBefore;
1510
1555
  details = compactResult.details;
1511
1556
  }
1512
1557
  if (this._autoCompactionAbortController.signal.aborted) {
1513
- this._emit({ type: "auto_compaction_end", result: undefined, aborted: true, willRetry: false });
1558
+ this._emit({
1559
+ type: "compaction_end",
1560
+ reason,
1561
+ result: undefined,
1562
+ aborted: true,
1563
+ willRetry: false,
1564
+ });
1514
1565
  return;
1515
1566
  }
1516
1567
  this.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);
@@ -1532,7 +1583,7 @@ export class AgentSession {
1532
1583
  tokensBefore,
1533
1584
  details,
1534
1585
  };
1535
- this._emit({ type: "auto_compaction_end", result, aborted: false, willRetry });
1586
+ this._emit({ type: "compaction_end", reason, result, aborted: false, willRetry });
1536
1587
  if (willRetry) {
1537
1588
  const messages = this.agent.state.messages;
1538
1589
  const lastMsg = messages[messages.length - 1];
@@ -1554,7 +1605,8 @@ export class AgentSession {
1554
1605
  catch (error) {
1555
1606
  const errorMessage = error instanceof Error ? error.message : "compaction failed";
1556
1607
  this._emit({
1557
- type: "auto_compaction_end",
1608
+ type: "compaction_end",
1609
+ reason,
1558
1610
  result: undefined,
1559
1611
  aborted: false,
1560
1612
  willRetry: false,
@@ -1656,36 +1708,24 @@ export class AgentSession {
1656
1708
  this.agent.setModel(refreshedModel);
1657
1709
  }
1658
1710
  _bindExtensionCore(runner) {
1659
- const normalizeLocation = (source) => {
1660
- if (source === "user" || source === "project" || source === "path") {
1661
- return source;
1662
- }
1663
- return undefined;
1664
- };
1665
- const reservedBuiltins = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));
1666
1711
  const getCommands = () => {
1667
- const extensionCommands = runner
1668
- .getRegisteredCommandsWithPaths()
1669
- .filter(({ command }) => !reservedBuiltins.has(command.name))
1670
- .map(({ command, extensionPath }) => ({
1671
- name: command.name,
1712
+ const extensionCommands = runner.getRegisteredCommands().map((command) => ({
1713
+ name: command.invocationName,
1672
1714
  description: command.description,
1673
1715
  source: "extension",
1674
- path: extensionPath,
1716
+ sourceInfo: command.sourceInfo,
1675
1717
  }));
1676
1718
  const templates = this.promptTemplates.map((template) => ({
1677
1719
  name: template.name,
1678
1720
  description: template.description,
1679
1721
  source: "prompt",
1680
- location: normalizeLocation(template.source),
1681
- path: template.filePath,
1722
+ sourceInfo: template.sourceInfo,
1682
1723
  }));
1683
1724
  const skills = this._resourceLoader.getSkills().skills.map((skill) => ({
1684
1725
  name: `skill:${skill.name}`,
1685
1726
  description: skill.description,
1686
1727
  source: "skill",
1687
- location: normalizeLocation(skill.source),
1688
- path: skill.filePath,
1728
+ sourceInfo: skill.sourceInfo,
1689
1729
  }));
1690
1730
  return [...extensionCommands, ...templates, ...skills];
1691
1731
  };
@@ -1726,8 +1766,7 @@ export class AgentSession {
1726
1766
  refreshTools: () => this._refreshToolRegistry(),
1727
1767
  getCommands,
1728
1768
  setModel: async (model) => {
1729
- const key = await this.modelRegistry.getApiKey(model);
1730
- if (!key)
1769
+ if (!this.modelRegistry.hasConfiguredAuth(model))
1731
1770
  return false;
1732
1771
  await this.setModel(model);
1733
1772
  return true;
@@ -1773,24 +1812,44 @@ export class AgentSession {
1773
1812
  const registeredTools = this._extensionRunner?.getAllRegisteredTools() ?? [];
1774
1813
  const allCustomTools = [
1775
1814
  ...registeredTools,
1776
- ...this._customTools.map((def) => ({ definition: def, extensionPath: "<sdk>" })),
1815
+ ...this._customTools.map((definition) => ({
1816
+ definition,
1817
+ sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }),
1818
+ })),
1777
1819
  ];
1778
- this._toolPromptSnippets = new Map(allCustomTools
1779
- .map((registeredTool) => {
1780
- const snippet = this._normalizePromptSnippet(registeredTool.definition.promptSnippet);
1781
- return snippet ? [registeredTool.definition.name, snippet] : undefined;
1820
+ const definitionRegistry = new Map(Array.from(this._baseToolDefinitions.entries()).map(([name, definition]) => [
1821
+ name,
1822
+ {
1823
+ definition,
1824
+ sourceInfo: createSyntheticSourceInfo(`<builtin:${name}>`, { source: "builtin" }),
1825
+ },
1826
+ ]));
1827
+ for (const tool of allCustomTools) {
1828
+ definitionRegistry.set(tool.definition.name, {
1829
+ definition: tool.definition,
1830
+ sourceInfo: tool.sourceInfo,
1831
+ });
1832
+ }
1833
+ this._toolDefinitions = definitionRegistry;
1834
+ this._toolPromptSnippets = new Map(Array.from(definitionRegistry.values())
1835
+ .map(({ definition }) => {
1836
+ const snippet = this._normalizePromptSnippet(definition.promptSnippet);
1837
+ return snippet ? [definition.name, snippet] : undefined;
1782
1838
  })
1783
1839
  .filter((entry) => entry !== undefined));
1784
- this._toolPromptGuidelines = new Map(allCustomTools
1785
- .map((registeredTool) => {
1786
- const guidelines = this._normalizePromptGuidelines(registeredTool.definition.promptGuidelines);
1787
- return guidelines.length > 0 ? [registeredTool.definition.name, guidelines] : undefined;
1840
+ this._toolPromptGuidelines = new Map(Array.from(definitionRegistry.values())
1841
+ .map(({ definition }) => {
1842
+ const guidelines = this._normalizePromptGuidelines(definition.promptGuidelines);
1843
+ return guidelines.length > 0 ? [definition.name, guidelines] : undefined;
1788
1844
  })
1789
1845
  .filter((entry) => entry !== undefined));
1790
1846
  const wrappedExtensionTools = this._extensionRunner
1791
1847
  ? wrapRegisteredTools(allCustomTools, this._extensionRunner)
1792
1848
  : [];
1793
- const toolRegistry = new Map(this._baseToolRegistry);
1849
+ const toolRegistry = new Map(Array.from(this._baseToolDefinitions.values()).map((definition) => [
1850
+ definition.name,
1851
+ wrapToolDefinition(definition),
1852
+ ]));
1794
1853
  for (const tool of wrappedExtensionTools) {
1795
1854
  toolRegistry.set(tool.name, tool);
1796
1855
  }
@@ -1815,13 +1874,16 @@ export class AgentSession {
1815
1874
  _buildRuntime(options) {
1816
1875
  const autoResizeImages = this.settingsManager.getImageAutoResize();
1817
1876
  const shellCommandPrefix = this.settingsManager.getShellCommandPrefix();
1818
- const baseTools = this._baseToolsOverride
1819
- ? this._baseToolsOverride
1820
- : createAllTools(this._cwd, {
1877
+ const baseToolDefinitions = this._baseToolsOverride
1878
+ ? Object.fromEntries(Object.entries(this._baseToolsOverride).map(([name, tool]) => [
1879
+ name,
1880
+ createToolDefinitionFromAgentTool(tool),
1881
+ ]))
1882
+ : createAllToolDefinitions(this._cwd, {
1821
1883
  read: { autoResizeImages },
1822
1884
  bash: { commandPrefix: shellCommandPrefix },
1823
1885
  });
1824
- this._baseToolRegistry = new Map(Object.entries(baseTools).map(([name, tool]) => [name, tool]));
1886
+ this._baseToolDefinitions = new Map(Object.entries(baseToolDefinitions).map(([name, tool]) => [name, tool]));
1825
1887
  const extensionsResult = this._resourceLoader.getExtensions();
1826
1888
  if (options.flagValues) {
1827
1889
  for (const [name, value] of options.flagValues) {
@@ -2285,14 +2347,12 @@ export class AgentSession {
2285
2347
  let summaryDetails;
2286
2348
  if (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {
2287
2349
  const model = this.model;
2288
- const apiKey = await this._modelRegistry.getApiKey(model);
2289
- if (!apiKey) {
2290
- throw new Error(`No API key for ${model.provider}`);
2291
- }
2350
+ const { apiKey, headers } = await this._getRequiredRequestAuth(model);
2292
2351
  const branchSummarySettings = this.settingsManager.getBranchSummarySettings();
2293
2352
  const result = await generateBranchSummary(entriesToSummarize, {
2294
2353
  model,
2295
2354
  apiKey,
2355
+ headers,
2296
2356
  signal: this._branchSummaryAbortController.signal,
2297
2357
  customInstructions,
2298
2358
  replaceInstructions,
@@ -2449,6 +2509,7 @@ export class AgentSession {
2449
2509
  total: totalInput + totalOutput + totalCacheRead + totalCacheWrite,
2450
2510
  },
2451
2511
  cost: totalCost,
2512
+ contextUsage: this.getContextUsage(),
2452
2513
  };
2453
2514
  }
2454
2515
  getContextUsage() {
@@ -2500,13 +2561,10 @@ export class AgentSession {
2500
2561
  async exportToHtml(outputPath) {
2501
2562
  const themeName = this.settingsManager.getTheme();
2502
2563
  // Create tool renderer if we have an extension runner (for custom tool HTML rendering)
2503
- let toolRenderer;
2504
- if (this._extensionRunner) {
2505
- toolRenderer = createToolHtmlRenderer({
2506
- getToolDefinition: (name) => this._extensionRunner.getToolDefinition(name),
2507
- theme,
2508
- });
2509
- }
2564
+ const toolRenderer = createToolHtmlRenderer({
2565
+ getToolDefinition: (name) => this.getToolDefinition(name),
2566
+ theme,
2567
+ });
2510
2568
  return await exportSessionToHtml(this.sessionManager, this.state, {
2511
2569
  outputPath,
2512
2570
  themeName,