@qduc/term2 0.3.1 → 0.5.0

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 (775) hide show
  1. package/dist/agent.d.ts +5 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +54 -7
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agent.lite-mode.test.d.ts +2 -0
  6. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  7. package/dist/agent.lite-mode.test.js +39 -0
  8. package/dist/agent.lite-mode.test.js.map +1 -0
  9. package/dist/agent.test.d.ts +2 -0
  10. package/dist/agent.test.d.ts.map +1 -0
  11. package/dist/agent.test.js +198 -0
  12. package/dist/agent.test.js.map +1 -0
  13. package/dist/app.d.ts +5 -0
  14. package/dist/app.d.ts.map +1 -1
  15. package/dist/app.js +36 -14
  16. package/dist/app.js.map +1 -1
  17. package/dist/app.startup-banner.test.d.ts +2 -0
  18. package/dist/app.startup-banner.test.d.ts.map +1 -0
  19. package/dist/app.startup-banner.test.js +11 -0
  20. package/dist/app.startup-banner.test.js.map +1 -0
  21. package/dist/cli.d.ts +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +18 -3
  24. package/dist/cli.js.map +1 -1
  25. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  26. package/dist/components/ApprovalPrompt.js +13 -12
  27. package/dist/components/ApprovalPrompt.js.map +1 -1
  28. package/dist/components/ApprovalPrompt.test.d.ts +2 -0
  29. package/dist/components/ApprovalPrompt.test.d.ts.map +1 -0
  30. package/dist/components/ApprovalPrompt.test.js +23 -0
  31. package/dist/components/ApprovalPrompt.test.js.map +1 -0
  32. package/dist/components/Banner.js +1 -1
  33. package/dist/components/Banner.js.map +1 -1
  34. package/dist/components/BottomArea.d.ts.map +1 -1
  35. package/dist/components/BottomArea.js +3 -4
  36. package/dist/components/BottomArea.js.map +1 -1
  37. package/dist/components/ChatMessage.d.ts +1 -0
  38. package/dist/components/ChatMessage.d.ts.map +1 -1
  39. package/dist/components/ChatMessage.js +3 -2
  40. package/dist/components/ChatMessage.js.map +1 -1
  41. package/dist/components/CommandMessage.d.ts.map +1 -1
  42. package/dist/components/CommandMessage.js +54 -8
  43. package/dist/components/CommandMessage.js.map +1 -1
  44. package/dist/components/CommandMessage.test.js +90 -0
  45. package/dist/components/CommandMessage.test.js.map +1 -1
  46. package/dist/components/Input/PopupManager.d.ts +3 -0
  47. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  48. package/dist/components/Input/PopupManager.js +2 -2
  49. package/dist/components/Input/PopupManager.js.map +1 -1
  50. package/dist/components/Input/insertions.d.ts.map +1 -1
  51. package/dist/components/Input/insertions.js +2 -2
  52. package/dist/components/Input/insertions.js.map +1 -1
  53. package/dist/components/Input/popup-key-navigation.d.ts +18 -0
  54. package/dist/components/Input/popup-key-navigation.d.ts.map +1 -0
  55. package/dist/components/Input/popup-key-navigation.js +16 -0
  56. package/dist/components/Input/popup-key-navigation.js.map +1 -0
  57. package/dist/components/Input/popup-key-navigation.test.d.ts +2 -0
  58. package/dist/components/Input/popup-key-navigation.test.d.ts.map +1 -0
  59. package/dist/components/Input/popup-key-navigation.test.js +73 -0
  60. package/dist/components/Input/popup-key-navigation.test.js.map +1 -0
  61. package/dist/components/Input/popup-props.d.ts.map +1 -1
  62. package/dist/components/Input/popup-props.js +2 -0
  63. package/dist/components/Input/popup-props.js.map +1 -1
  64. package/dist/components/Input/triggers.d.ts +1 -0
  65. package/dist/components/Input/triggers.d.ts.map +1 -1
  66. package/dist/components/Input/triggers.js +1 -0
  67. package/dist/components/Input/triggers.js.map +1 -1
  68. package/dist/components/InputBox.d.ts.map +1 -1
  69. package/dist/components/InputBox.js +130 -6
  70. package/dist/components/InputBox.js.map +1 -1
  71. package/dist/components/InputBox.test.js +42 -1
  72. package/dist/components/InputBox.test.js.map +1 -1
  73. package/dist/components/LiveResponse.d.ts +1 -3
  74. package/dist/components/LiveResponse.d.ts.map +1 -1
  75. package/dist/components/LiveResponse.js +5 -6
  76. package/dist/components/LiveResponse.js.map +1 -1
  77. package/dist/components/LiveResponse.test.d.ts +2 -0
  78. package/dist/components/LiveResponse.test.d.ts.map +1 -0
  79. package/dist/components/LiveResponse.test.js +13 -0
  80. package/dist/components/LiveResponse.test.js.map +1 -0
  81. package/dist/components/MarkdownRenderer.d.ts +5 -2
  82. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  83. package/dist/components/MarkdownRenderer.js +77 -49
  84. package/dist/components/MarkdownRenderer.js.map +1 -1
  85. package/dist/components/MessageList.d.ts +7 -1
  86. package/dist/components/MessageList.d.ts.map +1 -1
  87. package/dist/components/MessageList.js +150 -23
  88. package/dist/components/MessageList.js.map +1 -1
  89. package/dist/components/MessageList.test.js +289 -4
  90. package/dist/components/MessageList.test.js.map +1 -1
  91. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  92. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
  93. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
  94. package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
  95. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
  96. package/dist/components/ModelSelectionMenu.js +54 -14
  97. package/dist/components/ModelSelectionMenu.js.map +1 -1
  98. package/dist/components/PathSelectionMenu.d.ts +2 -0
  99. package/dist/components/PathSelectionMenu.d.ts.map +1 -1
  100. package/dist/components/PathSelectionMenu.js +31 -12
  101. package/dist/components/PathSelectionMenu.js.map +1 -1
  102. package/dist/components/SettingsSelectionMenu.d.ts +1 -0
  103. package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
  104. package/dist/components/SettingsSelectionMenu.js +32 -23
  105. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  106. package/dist/components/SettingsSelectionMenu.scroll.test.d.ts +2 -0
  107. package/dist/components/SettingsSelectionMenu.scroll.test.d.ts.map +1 -0
  108. package/dist/components/SettingsSelectionMenu.scroll.test.js +23 -0
  109. package/dist/components/SettingsSelectionMenu.scroll.test.js.map +1 -0
  110. package/dist/components/StatusBar.d.ts.map +1 -1
  111. package/dist/components/StatusBar.js +15 -15
  112. package/dist/components/StatusBar.js.map +1 -1
  113. package/dist/components/StatusBar.test.d.ts +2 -0
  114. package/dist/components/StatusBar.test.d.ts.map +1 -0
  115. package/dist/components/StatusBar.test.js +30 -0
  116. package/dist/components/StatusBar.test.js.map +1 -0
  117. package/dist/components/SubagentActivityMessage.d.ts +12 -0
  118. package/dist/components/SubagentActivityMessage.d.ts.map +1 -0
  119. package/dist/components/SubagentActivityMessage.js +15 -0
  120. package/dist/components/SubagentActivityMessage.js.map +1 -0
  121. package/dist/components/TextInput.d.ts +42 -0
  122. package/dist/components/TextInput.d.ts.map +1 -0
  123. package/dist/components/TextInput.js +398 -0
  124. package/dist/components/TextInput.js.map +1 -0
  125. package/dist/components/TextInput.test.d.ts +2 -0
  126. package/dist/components/TextInput.test.d.ts.map +1 -0
  127. package/dist/components/TextInput.test.js +75 -0
  128. package/dist/components/TextInput.test.js.map +1 -0
  129. package/dist/components/theme.d.ts +8 -0
  130. package/dist/components/theme.d.ts.map +1 -0
  131. package/dist/components/theme.js +22 -0
  132. package/dist/components/theme.js.map +1 -0
  133. package/dist/contracts/conversation.d.ts +1 -0
  134. package/dist/contracts/conversation.d.ts.map +1 -1
  135. package/dist/debug_ask_mentor.d.ts +2 -0
  136. package/dist/debug_ask_mentor.d.ts.map +1 -0
  137. package/dist/debug_ask_mentor.js +73 -0
  138. package/dist/debug_ask_mentor.js.map +1 -0
  139. package/dist/env-setup.d.ts +2 -0
  140. package/dist/env-setup.d.ts.map +1 -0
  141. package/dist/env-setup.js +7 -0
  142. package/dist/env-setup.js.map +1 -0
  143. package/dist/env-setup.test.d.ts +2 -0
  144. package/dist/env-setup.test.d.ts.map +1 -0
  145. package/dist/env-setup.test.js +6 -0
  146. package/dist/env-setup.test.js.map +1 -0
  147. package/dist/hooks/path-completion-filter.d.ts +4 -0
  148. package/dist/hooks/path-completion-filter.d.ts.map +1 -0
  149. package/dist/hooks/path-completion-filter.js +27 -0
  150. package/dist/hooks/path-completion-filter.js.map +1 -0
  151. package/dist/hooks/path-completion-filter.test.d.ts +2 -0
  152. package/dist/hooks/path-completion-filter.test.d.ts.map +1 -0
  153. package/dist/hooks/path-completion-filter.test.js +100 -0
  154. package/dist/hooks/path-completion-filter.test.js.map +1 -0
  155. package/dist/hooks/use-app-commands.d.ts +9 -1
  156. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  157. package/dist/hooks/use-app-commands.js +97 -26
  158. package/dist/hooks/use-app-commands.js.map +1 -1
  159. package/dist/hooks/use-app-commands.test.js +53 -3
  160. package/dist/hooks/use-app-commands.test.js.map +1 -1
  161. package/dist/hooks/use-conversation.d.ts +14 -8
  162. package/dist/hooks/use-conversation.d.ts.map +1 -1
  163. package/dist/hooks/use-conversation.js +59 -61
  164. package/dist/hooks/use-conversation.js.map +1 -1
  165. package/dist/hooks/use-mode-handlers.d.ts +3 -1
  166. package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
  167. package/dist/hooks/use-mode-handlers.js +8 -0
  168. package/dist/hooks/use-mode-handlers.js.map +1 -1
  169. package/dist/hooks/use-model-selection.d.ts +1 -1
  170. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  171. package/dist/hooks/use-model-selection.js +31 -16
  172. package/dist/hooks/use-model-selection.js.map +1 -1
  173. package/dist/hooks/use-model-selection.test.js +66 -1
  174. package/dist/hooks/use-model-selection.test.js.map +1 -1
  175. package/dist/hooks/use-path-completion.d.ts +1 -0
  176. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  177. package/dist/hooks/use-path-completion.js +22 -17
  178. package/dist/hooks/use-path-completion.js.map +1 -1
  179. package/dist/hooks/use-settings-completion.d.ts +2 -2
  180. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  181. package/dist/hooks/use-settings-completion.js +53 -18
  182. package/dist/hooks/use-settings-completion.js.map +1 -1
  183. package/dist/hooks/use-settings-completion.scroll.test.d.ts +2 -0
  184. package/dist/hooks/use-settings-completion.scroll.test.d.ts.map +1 -0
  185. package/dist/hooks/use-settings-completion.scroll.test.js +55 -0
  186. package/dist/hooks/use-settings-completion.scroll.test.js.map +1 -0
  187. package/dist/hooks/use-settings-completion.test.js +69 -79
  188. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  189. package/dist/hooks/use-settings-value-completion.d.ts +1 -2
  190. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  191. package/dist/hooks/use-settings-value-completion.js +47 -19
  192. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  193. package/dist/hooks/use-settings-value-completion.test.js +5 -18
  194. package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
  195. package/dist/hooks/use-slash-commands.d.ts +7 -0
  196. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  197. package/dist/hooks/use-slash-commands.js +20 -13
  198. package/dist/hooks/use-slash-commands.js.map +1 -1
  199. package/dist/hooks/use-slash-commands.test.js +52 -1
  200. package/dist/hooks/use-slash-commands.test.js.map +1 -1
  201. package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
  202. package/dist/hooks/use-trigger-detection.js +7 -3
  203. package/dist/hooks/use-trigger-detection.js.map +1 -1
  204. package/dist/hooks/use-trigger-detection.test.d.ts +2 -0
  205. package/dist/hooks/use-trigger-detection.test.d.ts.map +1 -0
  206. package/dist/hooks/use-trigger-detection.test.js +59 -0
  207. package/dist/hooks/use-trigger-detection.test.js.map +1 -0
  208. package/dist/lib/editor-impl.test.js +63 -50
  209. package/dist/lib/editor-impl.test.js.map +1 -1
  210. package/dist/lib/openai-agent-client.d.ts +28 -0
  211. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  212. package/dist/lib/openai-agent-client.js +82 -143
  213. package/dist/lib/openai-agent-client.js.map +1 -1
  214. package/dist/lib/openai-agent-client.test.js +70 -0
  215. package/dist/lib/openai-agent-client.test.js.map +1 -1
  216. package/dist/lib/shell.d.ts +7 -0
  217. package/dist/lib/shell.d.ts.map +1 -0
  218. package/dist/lib/shell.js +56 -0
  219. package/dist/lib/shell.js.map +1 -0
  220. package/dist/lib/tool-invoke.d.ts +3 -2
  221. package/dist/lib/tool-invoke.d.ts.map +1 -1
  222. package/dist/lib/tool-invoke.js +69 -4
  223. package/dist/lib/tool-invoke.js.map +1 -1
  224. package/dist/lib/tool-invoke.test.js +25 -0
  225. package/dist/lib/tool-invoke.test.js.map +1 -1
  226. package/dist/modes/companion/command-index.d.ts +26 -0
  227. package/dist/modes/companion/command-index.d.ts.map +1 -0
  228. package/dist/modes/companion/command-index.js +50 -0
  229. package/dist/modes/companion/command-index.js.map +1 -0
  230. package/dist/modes/companion/command-index.test.d.ts +2 -0
  231. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  232. package/dist/modes/companion/command-index.test.js +86 -0
  233. package/dist/modes/companion/command-index.test.js.map +1 -0
  234. package/dist/modes/companion/companion-app.d.ts +12 -0
  235. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  236. package/dist/modes/companion/companion-app.js +297 -0
  237. package/dist/modes/companion/companion-app.js.map +1 -0
  238. package/dist/modes/companion/companion-session.d.ts +63 -0
  239. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  240. package/dist/modes/companion/companion-session.js +146 -0
  241. package/dist/modes/companion/companion-session.js.map +1 -0
  242. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  243. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  244. package/dist/modes/companion/companion-session.test.js +28 -0
  245. package/dist/modes/companion/companion-session.test.js.map +1 -0
  246. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  247. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  248. package/dist/modes/companion/components/status-bar.js +26 -0
  249. package/dist/modes/companion/components/status-bar.js.map +1 -0
  250. package/dist/modes/companion/context-buffer.d.ts +65 -0
  251. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  252. package/dist/modes/companion/context-buffer.js +156 -0
  253. package/dist/modes/companion/context-buffer.js.map +1 -0
  254. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  255. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  256. package/dist/modes/companion/context-buffer.test.js +154 -0
  257. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  258. package/dist/modes/companion/event-detector.d.ts +46 -0
  259. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  260. package/dist/modes/companion/event-detector.js +169 -0
  261. package/dist/modes/companion/event-detector.js.map +1 -0
  262. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  263. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  264. package/dist/modes/companion/event-detector.test.js +121 -0
  265. package/dist/modes/companion/event-detector.test.js.map +1 -0
  266. package/dist/modes/companion/index.d.ts +33 -0
  267. package/dist/modes/companion/index.d.ts.map +1 -0
  268. package/dist/modes/companion/index.js +21 -0
  269. package/dist/modes/companion/index.js.map +1 -0
  270. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  271. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  272. package/dist/modes/companion/input-key-mapper.js +31 -0
  273. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  274. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  275. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  276. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  277. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  278. package/dist/modes/companion/input-parser.d.ts +53 -0
  279. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  280. package/dist/modes/companion/input-parser.js +114 -0
  281. package/dist/modes/companion/input-parser.js.map +1 -0
  282. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  283. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  284. package/dist/modes/companion/input-parser.test.js +123 -0
  285. package/dist/modes/companion/input-parser.test.js.map +1 -0
  286. package/dist/modes/companion/mode-manager.d.ts +41 -0
  287. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  288. package/dist/modes/companion/mode-manager.js +56 -0
  289. package/dist/modes/companion/mode-manager.js.map +1 -0
  290. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  291. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  292. package/dist/modes/companion/mode-manager.test.js +65 -0
  293. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  294. package/dist/modes/companion/output-classifier.d.ts +15 -0
  295. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  296. package/dist/modes/companion/output-classifier.js +77 -0
  297. package/dist/modes/companion/output-classifier.js.map +1 -0
  298. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  299. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  300. package/dist/modes/companion/output-classifier.test.js +133 -0
  301. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  302. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  303. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  304. package/dist/modes/companion/pty-wrapper.js +143 -0
  305. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  306. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  307. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  308. package/dist/modes/companion/safety-classifier.js +140 -0
  309. package/dist/modes/companion/safety-classifier.js.map +1 -0
  310. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  311. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  312. package/dist/modes/companion/safety-classifier.test.js +151 -0
  313. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  314. package/dist/modes/companion/summarizer.d.ts +24 -0
  315. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  316. package/dist/modes/companion/summarizer.js +132 -0
  317. package/dist/modes/companion/summarizer.js.map +1 -0
  318. package/dist/modes/companion/terminal-history.d.ts +27 -0
  319. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  320. package/dist/modes/companion/terminal-history.js +142 -0
  321. package/dist/modes/companion/terminal-history.js.map +1 -0
  322. package/dist/non-interactive.d.ts.map +1 -1
  323. package/dist/non-interactive.js +3 -0
  324. package/dist/non-interactive.js.map +1 -1
  325. package/dist/prompts/gpt-5-modern.md +66 -0
  326. package/dist/prompts/gpt-5.md +7 -0
  327. package/dist/prompts/lite.md +10 -27
  328. package/dist/prompts/prompt-selector.js +2 -2
  329. package/dist/prompts/prompt-selector.js.map +1 -1
  330. package/dist/prompts/prompt-selector.test.js +7 -2
  331. package/dist/prompts/prompt-selector.test.js.map +1 -1
  332. package/dist/prompts/prompt-selector.test.ts +22 -2
  333. package/dist/prompts/prompt-selector.ts +2 -2
  334. package/dist/prompts/search-via-shell.d.ts +7 -0
  335. package/dist/prompts/search-via-shell.d.ts.map +1 -0
  336. package/dist/prompts/search-via-shell.js +59 -0
  337. package/dist/prompts/search-via-shell.js.map +1 -0
  338. package/dist/prompts/search-via-shell.test.d.ts +2 -0
  339. package/dist/prompts/search-via-shell.test.d.ts.map +1 -0
  340. package/dist/prompts/search-via-shell.test.js +40 -0
  341. package/dist/prompts/search-via-shell.test.js.map +1 -0
  342. package/dist/prompts/search-via-shell.test.ts +47 -0
  343. package/dist/prompts/search-via-shell.ts +71 -0
  344. package/dist/prompts/simple-mentor.md +215 -0
  345. package/dist/prompts/simple.md +40 -186
  346. package/dist/prompts/subagents/explorer.md +42 -0
  347. package/dist/prompts/subagents/mentor.md +16 -0
  348. package/dist/prompts/subagents/researcher.md +40 -0
  349. package/dist/prompts/subagents/worker.md +41 -0
  350. package/dist/providers/ai-sdk-agents-adapter.d.ts +7 -0
  351. package/dist/providers/ai-sdk-agents-adapter.d.ts.map +1 -0
  352. package/dist/providers/ai-sdk-agents-adapter.js +80 -0
  353. package/dist/providers/ai-sdk-agents-adapter.js.map +1 -0
  354. package/dist/providers/ai-sdk-agents-adapter.test.d.ts +2 -0
  355. package/dist/providers/ai-sdk-agents-adapter.test.d.ts.map +1 -0
  356. package/dist/providers/ai-sdk-agents-adapter.test.js +158 -0
  357. package/dist/providers/ai-sdk-agents-adapter.test.js.map +1 -0
  358. package/dist/providers/ai-sdk-anthropic.provider.d.ts +14 -0
  359. package/dist/providers/ai-sdk-anthropic.provider.d.ts.map +1 -0
  360. package/dist/providers/ai-sdk-anthropic.provider.js +18 -0
  361. package/dist/providers/ai-sdk-anthropic.provider.js.map +1 -0
  362. package/dist/providers/ai-sdk-google.provider.d.ts +14 -0
  363. package/dist/providers/ai-sdk-google.provider.d.ts.map +1 -0
  364. package/dist/providers/ai-sdk-google.provider.js +18 -0
  365. package/dist/providers/ai-sdk-google.provider.js.map +1 -0
  366. package/dist/providers/ai-sdk-logging-fetch.d.ts +11 -0
  367. package/dist/providers/ai-sdk-logging-fetch.d.ts.map +1 -0
  368. package/dist/providers/ai-sdk-logging-fetch.js +127 -0
  369. package/dist/providers/ai-sdk-logging-fetch.js.map +1 -0
  370. package/dist/providers/ai-sdk-logging-fetch.test.d.ts +2 -0
  371. package/dist/providers/ai-sdk-logging-fetch.test.d.ts.map +1 -0
  372. package/dist/providers/ai-sdk-logging-fetch.test.js +107 -0
  373. package/dist/providers/ai-sdk-logging-fetch.test.js.map +1 -0
  374. package/dist/providers/ai-sdk-message-normalizer.d.ts +2 -2
  375. package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -1
  376. package/dist/providers/ai-sdk-message-normalizer.js +92 -47
  377. package/dist/providers/ai-sdk-message-normalizer.js.map +1 -1
  378. package/dist/providers/ai-sdk-message-normalizer.test.js +256 -16
  379. package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -1
  380. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +4 -0
  381. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
  382. package/dist/providers/ai-sdk-openai-compatible.provider.js +10 -6
  383. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
  384. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +144 -1
  385. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
  386. package/dist/providers/ai-sdk-openai.provider.d.ts +14 -0
  387. package/dist/providers/ai-sdk-openai.provider.d.ts.map +1 -0
  388. package/dist/providers/ai-sdk-openai.provider.js +18 -0
  389. package/dist/providers/ai-sdk-openai.provider.js.map +1 -0
  390. package/dist/providers/ai-sdk-openrouter.provider.d.ts +1 -1
  391. package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -1
  392. package/dist/providers/ai-sdk-openrouter.provider.js +2 -3
  393. package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -1
  394. package/dist/providers/ai-sdk-openrouter.provider.test.js +23 -0
  395. package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -1
  396. package/dist/providers/common/openai-compatible-messages.d.ts +1 -2
  397. package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -1
  398. package/dist/providers/common/openai-compatible-messages.js +47 -48
  399. package/dist/providers/common/openai-compatible-messages.js.map +1 -1
  400. package/dist/providers/common/openai-compatible-messages.test.js +134 -1
  401. package/dist/providers/common/openai-compatible-messages.test.js.map +1 -1
  402. package/dist/providers/custom-provider-adapter.test.d.ts +2 -0
  403. package/dist/providers/custom-provider-adapter.test.d.ts.map +1 -0
  404. package/dist/providers/custom-provider-adapter.test.js +52 -0
  405. package/dist/providers/custom-provider-adapter.test.js.map +1 -0
  406. package/dist/providers/github-copilot/converters.d.ts +45 -0
  407. package/dist/providers/github-copilot/converters.d.ts.map +1 -0
  408. package/dist/providers/github-copilot/converters.js +118 -0
  409. package/dist/providers/github-copilot/converters.js.map +1 -0
  410. package/dist/providers/github-copilot/converters.test.d.ts +2 -0
  411. package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
  412. package/dist/providers/github-copilot/converters.test.js +162 -0
  413. package/dist/providers/github-copilot/converters.test.js.map +1 -0
  414. package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
  415. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
  416. package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
  417. package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
  418. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
  419. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
  420. package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
  421. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
  422. package/dist/providers/github-copilot/index.d.ts +4 -0
  423. package/dist/providers/github-copilot/index.d.ts.map +1 -0
  424. package/dist/providers/github-copilot/index.js +4 -0
  425. package/dist/providers/github-copilot/index.js.map +1 -0
  426. package/dist/providers/github-copilot/model.d.ts +24 -0
  427. package/dist/providers/github-copilot/model.d.ts.map +1 -0
  428. package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
  429. package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
  430. package/dist/providers/github-copilot/model.delta.test.js +15 -0
  431. package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
  432. package/dist/providers/github-copilot/model.js +498 -0
  433. package/dist/providers/github-copilot/model.js.map +1 -0
  434. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  435. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  436. package/dist/providers/github-copilot/model.test.js +63 -0
  437. package/dist/providers/github-copilot/model.test.js.map +1 -0
  438. package/dist/providers/github-copilot/provider.d.ts +15 -0
  439. package/dist/providers/github-copilot/provider.d.ts.map +1 -0
  440. package/dist/providers/github-copilot/provider.js +25 -0
  441. package/dist/providers/github-copilot/provider.js.map +1 -0
  442. package/dist/providers/github-copilot/provider.test.d.ts +2 -0
  443. package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
  444. package/dist/providers/github-copilot/provider.test.js +52 -0
  445. package/dist/providers/github-copilot/provider.test.js.map +1 -0
  446. package/dist/providers/github-copilot/utils.d.ts +20 -0
  447. package/dist/providers/github-copilot/utils.d.ts.map +1 -0
  448. package/dist/providers/github-copilot/utils.js +142 -0
  449. package/dist/providers/github-copilot/utils.js.map +1 -0
  450. package/dist/providers/github-copilot/utils.test.d.ts +2 -0
  451. package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
  452. package/dist/providers/github-copilot/utils.test.js +21 -0
  453. package/dist/providers/github-copilot/utils.test.js.map +1 -0
  454. package/dist/providers/openai-compatible-behavior-gate.test.d.ts +2 -0
  455. package/dist/providers/openai-compatible-behavior-gate.test.d.ts.map +1 -0
  456. package/dist/providers/openai-compatible-behavior-gate.test.js +257 -0
  457. package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -0
  458. package/dist/providers/openai-compatible.provider.d.ts +10 -1
  459. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  460. package/dist/providers/openai-compatible.provider.js +341 -31
  461. package/dist/providers/openai-compatible.provider.js.map +1 -1
  462. package/dist/providers/openai-compatible.provider.test.d.ts +2 -0
  463. package/dist/providers/openai-compatible.provider.test.d.ts.map +1 -0
  464. package/dist/providers/openai-compatible.provider.test.js +462 -0
  465. package/dist/providers/openai-compatible.provider.test.js.map +1 -0
  466. package/dist/providers/openai.provider.js +2 -1
  467. package/dist/providers/openai.provider.js.map +1 -1
  468. package/dist/providers/openrouter.provider.js +28 -2
  469. package/dist/providers/openrouter.provider.js.map +1 -1
  470. package/dist/safety-checker.js +57 -0
  471. package/dist/scripts/eval-auto-approval/dataset.d.ts +1 -1
  472. package/dist/services/approval-rejection-interceptor.test.js +5 -0
  473. package/dist/services/approval-rejection-interceptor.test.js.map +1 -1
  474. package/dist/services/check_mock.d.ts +2 -0
  475. package/dist/services/check_mock.d.ts.map +1 -0
  476. package/dist/services/check_mock.js +22 -0
  477. package/dist/services/check_mock.js.map +1 -0
  478. package/dist/services/conversation-events.d.ts +28 -1
  479. package/dist/services/conversation-events.d.ts.map +1 -1
  480. package/dist/services/conversation-result-builder.d.ts.map +1 -1
  481. package/dist/services/conversation-result-builder.js +11 -1
  482. package/dist/services/conversation-result-builder.js.map +1 -1
  483. package/dist/services/conversation-result-builder.test.js +72 -0
  484. package/dist/services/conversation-result-builder.test.js.map +1 -1
  485. package/dist/services/conversation-service.test.d.ts +2 -0
  486. package/dist/services/conversation-service.test.d.ts.map +1 -0
  487. package/dist/services/conversation-service.test.js +156 -0
  488. package/dist/services/conversation-service.test.js.map +1 -0
  489. package/dist/services/conversation-session.auto-approval.test.js +52 -0
  490. package/dist/services/conversation-session.auto-approval.test.js.map +1 -1
  491. package/dist/services/conversation-session.d.ts +2 -1
  492. package/dist/services/conversation-session.d.ts.map +1 -1
  493. package/dist/services/conversation-session.js +94 -31
  494. package/dist/services/conversation-session.js.map +1 -1
  495. package/dist/services/file-service.js +1 -1
  496. package/dist/services/file-service.js.map +1 -1
  497. package/dist/services/interruption-info.js +1 -1
  498. package/dist/services/interruption-info.js.map +1 -1
  499. package/dist/services/interruption-info.test.js +12 -0
  500. package/dist/services/interruption-info.test.js.map +1 -1
  501. package/dist/services/logging-contract.d.ts +3 -3
  502. package/dist/services/logging-service.d.ts.map +1 -1
  503. package/dist/services/logging-service.js +18 -1
  504. package/dist/services/logging-service.js.map +1 -1
  505. package/dist/services/model-service.d.ts.map +1 -1
  506. package/dist/services/model-service.js +16 -8
  507. package/dist/services/model-service.js.map +1 -1
  508. package/dist/services/model-service.test.js +67 -1
  509. package/dist/services/model-service.test.js.map +1 -1
  510. package/dist/services/rtk-service.d.ts +23 -0
  511. package/dist/services/rtk-service.d.ts.map +1 -0
  512. package/dist/services/rtk-service.js +260 -0
  513. package/dist/services/rtk-service.js.map +1 -0
  514. package/dist/services/rtk-service.test.d.ts +2 -0
  515. package/dist/services/rtk-service.test.d.ts.map +1 -0
  516. package/dist/services/rtk-service.test.js +274 -0
  517. package/dist/services/rtk-service.test.js.map +1 -0
  518. package/dist/services/settings-persistence.d.ts +1 -0
  519. package/dist/services/settings-persistence.d.ts.map +1 -1
  520. package/dist/services/settings-persistence.js +28 -5
  521. package/dist/services/settings-persistence.js.map +1 -1
  522. package/dist/services/settings-persistence.test.js +55 -3
  523. package/dist/services/settings-persistence.test.js.map +1 -1
  524. package/dist/services/settings-schema.d.ts +55 -16
  525. package/dist/services/settings-schema.d.ts.map +1 -1
  526. package/dist/services/settings-schema.js +35 -4
  527. package/dist/services/settings-schema.js.map +1 -1
  528. package/dist/services/settings-schema.test.d.ts +2 -0
  529. package/dist/services/settings-schema.test.d.ts.map +1 -0
  530. package/dist/services/settings-schema.test.js +77 -0
  531. package/dist/services/settings-schema.test.js.map +1 -0
  532. package/dist/services/settings-service.d.ts.map +1 -1
  533. package/dist/services/settings-service.js +7 -4
  534. package/dist/services/settings-service.js.map +1 -1
  535. package/dist/services/settings-sources.d.ts.map +1 -1
  536. package/dist/services/settings-sources.js +1 -0
  537. package/dist/services/settings-sources.js.map +1 -1
  538. package/dist/services/shell-auto-approval-evaluator.d.ts +1 -1
  539. package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -1
  540. package/dist/services/shell-auto-approval-evaluator.js +8 -2
  541. package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
  542. package/dist/services/stream-event-processor.d.ts.map +1 -1
  543. package/dist/services/stream-event-processor.js +27 -14
  544. package/dist/services/stream-event-processor.js.map +1 -1
  545. package/dist/services/stream-event-processor.test.js +32 -0
  546. package/dist/services/stream-event-processor.test.js.map +1 -1
  547. package/dist/services/subagents/subagent-manager.d.ts +16 -0
  548. package/dist/services/subagents/subagent-manager.d.ts.map +1 -0
  549. package/dist/services/subagents/subagent-manager.js +530 -0
  550. package/dist/services/subagents/subagent-manager.js.map +1 -0
  551. package/dist/services/subagents/subagent-manager.test.d.ts +2 -0
  552. package/dist/services/subagents/subagent-manager.test.d.ts.map +1 -0
  553. package/dist/services/subagents/subagent-manager.test.js +690 -0
  554. package/dist/services/subagents/subagent-manager.test.js.map +1 -0
  555. package/dist/services/subagents/subagent-session.d.ts +26 -0
  556. package/dist/services/subagents/subagent-session.d.ts.map +1 -0
  557. package/dist/services/subagents/subagent-session.js +86 -0
  558. package/dist/services/subagents/subagent-session.js.map +1 -0
  559. package/dist/services/subagents/subagent-session.test.d.ts +2 -0
  560. package/dist/services/subagents/subagent-session.test.d.ts.map +1 -0
  561. package/dist/services/subagents/subagent-session.test.js +118 -0
  562. package/dist/services/subagents/subagent-session.test.js.map +1 -0
  563. package/dist/services/subagents/types.d.ts +35 -0
  564. package/dist/services/subagents/types.d.ts.map +1 -0
  565. package/dist/services/subagents/types.js +2 -0
  566. package/dist/services/subagents/types.js.map +1 -0
  567. package/dist/services/terminal-result-collector.d.ts.map +1 -1
  568. package/dist/services/terminal-result-collector.js +30 -2
  569. package/dist/services/terminal-result-collector.js.map +1 -1
  570. package/dist/services/terminal-result-collector.test.js +103 -0
  571. package/dist/services/terminal-result-collector.test.js.map +1 -1
  572. package/dist/tools/apply-patch.d.ts +14 -6
  573. package/dist/tools/apply-patch.d.ts.map +1 -1
  574. package/dist/tools/apply-patch.js +204 -208
  575. package/dist/tools/apply-patch.js.map +1 -1
  576. package/dist/tools/apply-patch.test.js +44 -0
  577. package/dist/tools/apply-patch.test.js.map +1 -1
  578. package/dist/tools/ask-mentor.d.ts +2 -2
  579. package/dist/tools/ask-mentor.d.ts.map +1 -1
  580. package/dist/tools/ask-mentor.js.map +1 -1
  581. package/dist/tools/bash.d.ts +10 -0
  582. package/dist/tools/bash.d.ts.map +1 -0
  583. package/dist/tools/bash.js +55 -0
  584. package/dist/tools/bash.js.map +1 -0
  585. package/dist/tools/code-context.d.ts +27 -0
  586. package/dist/tools/code-context.d.ts.map +1 -0
  587. package/dist/tools/code-context.js +512 -0
  588. package/dist/tools/code-context.js.map +1 -0
  589. package/dist/tools/code-context.test.d.ts +2 -0
  590. package/dist/tools/code-context.test.d.ts.map +1 -0
  591. package/dist/tools/code-context.test.js +367 -0
  592. package/dist/tools/code-context.test.js.map +1 -0
  593. package/dist/tools/command-message-formatters.d.ts +5 -0
  594. package/dist/tools/command-message-formatters.d.ts.map +1 -0
  595. package/dist/tools/command-message-formatters.js +13 -0
  596. package/dist/tools/command-message-formatters.js.map +1 -0
  597. package/dist/tools/command-message-formatters.test.d.ts +2 -0
  598. package/dist/tools/command-message-formatters.test.d.ts.map +1 -0
  599. package/dist/tools/command-message-formatters.test.js +23 -0
  600. package/dist/tools/command-message-formatters.test.js.map +1 -0
  601. package/dist/tools/create-file.d.ts +2 -2
  602. package/dist/tools/create-file.d.ts.map +1 -1
  603. package/dist/tools/create-file.js +18 -11
  604. package/dist/tools/create-file.js.map +1 -1
  605. package/dist/tools/create-file.test.js +11 -0
  606. package/dist/tools/create-file.test.js.map +1 -1
  607. package/dist/tools/edit-healing.d.ts +4 -3
  608. package/dist/tools/edit-healing.d.ts.map +1 -1
  609. package/dist/tools/edit-healing.js +50 -20
  610. package/dist/tools/edit-healing.js.map +1 -1
  611. package/dist/tools/edit-healing.test.js +62 -0
  612. package/dist/tools/edit-healing.test.js.map +1 -1
  613. package/dist/tools/file-locks.d.ts +3 -0
  614. package/dist/tools/file-locks.d.ts.map +1 -0
  615. package/dist/tools/file-locks.js +37 -0
  616. package/dist/tools/file-locks.js.map +1 -0
  617. package/dist/tools/find-files.d.ts +3 -2
  618. package/dist/tools/find-files.d.ts.map +1 -1
  619. package/dist/tools/find-files.js +59 -139
  620. package/dist/tools/find-files.js.map +1 -1
  621. package/dist/tools/find-files.test.js +6 -12
  622. package/dist/tools/find-files.test.js.map +1 -1
  623. package/dist/tools/grep.d.ts +3 -2
  624. package/dist/tools/grep.d.ts.map +1 -1
  625. package/dist/tools/grep.js +10 -46
  626. package/dist/tools/grep.js.map +1 -1
  627. package/dist/tools/grep.test.d.ts +2 -0
  628. package/dist/tools/grep.test.d.ts.map +1 -0
  629. package/dist/tools/language-providers.d.ts +48 -0
  630. package/dist/tools/language-providers.d.ts.map +1 -0
  631. package/dist/tools/language-providers.js +244 -0
  632. package/dist/tools/language-providers.js.map +1 -0
  633. package/dist/tools/read-file.d.ts +2 -2
  634. package/dist/tools/read-file.d.ts.map +1 -1
  635. package/dist/tools/read-file.js.map +1 -1
  636. package/dist/tools/read-file.test.js +2 -3
  637. package/dist/tools/read-file.test.js.map +1 -1
  638. package/dist/tools/run-subagent.d.ts +14 -0
  639. package/dist/tools/run-subagent.d.ts.map +1 -0
  640. package/dist/tools/run-subagent.js +196 -0
  641. package/dist/tools/run-subagent.js.map +1 -0
  642. package/dist/tools/run-subagent.test.d.ts +2 -0
  643. package/dist/tools/run-subagent.test.d.ts.map +1 -0
  644. package/dist/tools/run-subagent.test.js +159 -0
  645. package/dist/tools/run-subagent.test.js.map +1 -0
  646. package/dist/tools/search-replace.d.ts +7 -4
  647. package/dist/tools/search-replace.d.ts.map +1 -1
  648. package/dist/tools/search-replace.js +248 -110
  649. package/dist/tools/search-replace.js.map +1 -1
  650. package/dist/tools/search-replace.test.js +189 -1
  651. package/dist/tools/search-replace.test.js.map +1 -1
  652. package/dist/tools/search.d.ts.map +1 -1
  653. package/dist/tools/search.js +5 -15
  654. package/dist/tools/search.js.map +1 -1
  655. package/dist/tools/shell.d.ts +4 -2
  656. package/dist/tools/shell.d.ts.map +1 -1
  657. package/dist/tools/shell.js +15 -7
  658. package/dist/tools/shell.js.map +1 -1
  659. package/dist/tools/shell.test.js +154 -0
  660. package/dist/tools/shell.test.js.map +1 -1
  661. package/dist/tools/tool-names.d.ts +3 -0
  662. package/dist/tools/tool-names.d.ts.map +1 -1
  663. package/dist/tools/tool-names.js +3 -0
  664. package/dist/tools/tool-names.js.map +1 -1
  665. package/dist/tools/tool-names.test.js +4 -1
  666. package/dist/tools/tool-names.test.js.map +1 -1
  667. package/dist/tools/tool-parameter-schema.test.js +18 -0
  668. package/dist/tools/tool-parameter-schema.test.js.map +1 -1
  669. package/dist/tools/types.d.ts +2 -1
  670. package/dist/tools/types.d.ts.map +1 -1
  671. package/dist/tools/utils.d.ts.map +1 -1
  672. package/dist/tools/utils.js +11 -1
  673. package/dist/tools/utils.js.map +1 -1
  674. package/dist/tools/utils.test.js +13 -0
  675. package/dist/tools/utils.test.js.map +1 -1
  676. package/dist/tools/web-fetch.d.ts +2 -2
  677. package/dist/tools/web-fetch.d.ts.map +1 -1
  678. package/dist/tools/web-fetch.js.map +1 -1
  679. package/dist/tools/web-search.d.ts +2 -2
  680. package/dist/tools/web-search.d.ts.map +1 -1
  681. package/dist/tools/web-search.js.map +1 -1
  682. package/dist/utils/clipboard.d.ts +2 -2
  683. package/dist/utils/clipboard.d.ts.map +1 -1
  684. package/dist/utils/clipboard.js +58 -22
  685. package/dist/utils/clipboard.js.map +1 -1
  686. package/dist/utils/clipboard.test.js +25 -6
  687. package/dist/utils/clipboard.test.js.map +1 -1
  688. package/dist/utils/command-safety/constants.d.ts.map +1 -1
  689. package/dist/utils/command-safety/constants.js +30 -5
  690. package/dist/utils/command-safety/constants.js.map +1 -1
  691. package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -1
  692. package/dist/utils/command-safety/handlers/sed-handler.js +10 -7
  693. package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -1
  694. package/dist/utils/command-safety/index.d.ts.map +1 -1
  695. package/dist/utils/command-safety/index.js +153 -114
  696. package/dist/utils/command-safety/index.js.map +1 -1
  697. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
  698. package/dist/utils/command-safety/path-analysis.js +14 -2
  699. package/dist/utils/command-safety/path-analysis.js.map +1 -1
  700. package/dist/utils/command-safety/utils.js +2 -2
  701. package/dist/utils/command-safety/utils.js.map +1 -1
  702. package/dist/utils/command-safety.d.ts +21 -0
  703. package/dist/utils/command-safety.d.ts.map +1 -0
  704. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  705. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  706. package/dist/utils/command-safety.devnull.test.js +13 -0
  707. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  708. package/dist/utils/command-safety.find.test.js +1 -1
  709. package/dist/utils/command-safety.find.test.js.map +1 -1
  710. package/dist/utils/command-safety.js +348 -0
  711. package/dist/utils/command-safety.js.map +1 -0
  712. package/dist/utils/command-safety.path.test.js +29 -1
  713. package/dist/utils/command-safety.path.test.js.map +1 -1
  714. package/dist/utils/command-safety.specialized-handlers.test.d.ts +2 -0
  715. package/dist/utils/command-safety.specialized-handlers.test.d.ts.map +1 -0
  716. package/dist/utils/command-safety.specialized-handlers.test.js +20 -0
  717. package/dist/utils/command-safety.specialized-handlers.test.js.map +1 -0
  718. package/dist/utils/conversation-event-handler.d.ts +23 -6
  719. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  720. package/dist/utils/conversation-event-handler.js +262 -46
  721. package/dist/utils/conversation-event-handler.js.map +1 -1
  722. package/dist/utils/conversation-event-handler.test.js +576 -14
  723. package/dist/utils/conversation-event-handler.test.js.map +1 -1
  724. package/dist/utils/conversation-utils.d.ts +3 -0
  725. package/dist/utils/conversation-utils.d.ts.map +1 -1
  726. package/dist/utils/conversation-utils.js +3 -0
  727. package/dist/utils/conversation-utils.js.map +1 -1
  728. package/dist/utils/execute-shell.d.ts +5 -6
  729. package/dist/utils/execute-shell.d.ts.map +1 -1
  730. package/dist/utils/execute-shell.js +21 -11
  731. package/dist/utils/execute-shell.js.map +1 -1
  732. package/dist/utils/execute-shell.test.js +37 -6
  733. package/dist/utils/execute-shell.test.js.map +1 -1
  734. package/dist/utils/extract-command-messages.d.ts.map +1 -1
  735. package/dist/utils/extract-command-messages.js +2 -18
  736. package/dist/utils/extract-command-messages.js.map +1 -1
  737. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  738. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  739. package/dist/utils/flex-service-tier.d.ts +2 -0
  740. package/dist/utils/flex-service-tier.d.ts.map +1 -0
  741. package/dist/utils/flex-service-tier.js +20 -0
  742. package/dist/utils/flex-service-tier.js.map +1 -0
  743. package/dist/utils/flex-service-tier.test.d.ts +2 -0
  744. package/dist/utils/flex-service-tier.test.d.ts.map +1 -0
  745. package/dist/utils/flex-service-tier.test.js +25 -0
  746. package/dist/utils/flex-service-tier.test.js.map +1 -0
  747. package/dist/utils/log-truncation.d.ts +4 -2
  748. package/dist/utils/log-truncation.d.ts.map +1 -1
  749. package/dist/utils/log-truncation.js +143 -41
  750. package/dist/utils/log-truncation.js.map +1 -1
  751. package/dist/utils/log-truncation.test.js +131 -1
  752. package/dist/utils/log-truncation.test.js.map +1 -1
  753. package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
  754. package/dist/utils/provider-traffic-extractor.js +0 -1
  755. package/dist/utils/provider-traffic-extractor.js.map +1 -1
  756. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
  757. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
  758. package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
  759. package/dist/utils/streaming-session-factory.d.ts +1 -3
  760. package/dist/utils/streaming-session-factory.d.ts.map +1 -1
  761. package/dist/utils/streaming-session-factory.js +45 -11
  762. package/dist/utils/streaming-session-factory.js.map +1 -1
  763. package/dist/utils/streaming-session-factory.test.js +89 -15
  764. package/dist/utils/streaming-session-factory.test.js.map +1 -1
  765. package/dist/utils/subsequence-filter.d.ts +8 -0
  766. package/dist/utils/subsequence-filter.d.ts.map +1 -0
  767. package/dist/utils/subsequence-filter.js +47 -0
  768. package/dist/utils/subsequence-filter.js.map +1 -0
  769. package/dist/utils/token-usage.d.ts +26 -1
  770. package/dist/utils/token-usage.d.ts.map +1 -1
  771. package/dist/utils/token-usage.js +210 -28
  772. package/dist/utils/token-usage.js.map +1 -1
  773. package/dist/utils/token-usage.test.js +196 -3
  774. package/dist/utils/token-usage.test.js.map +1 -1
  775. package/package.json +5 -5
@@ -1,16 +1,16 @@
1
1
  import test from 'ava';
2
- import { createConversationEventHandler } from './conversation-event-handler.js';
2
+ import { createConversationEventHandler, findLastSafeBoundary, } from './conversation-event-handler.js';
3
3
  import { createStreamingState } from './conversation-utils.js';
4
4
  function createMockDeps() {
5
5
  const calls = {
6
- liveResponsePushes: [],
7
- liveResponseCancelled: false,
8
- liveResponseFlushed: false,
6
+ botResponsePushes: [],
7
+ botResponseCancelled: false,
8
+ botResponseFlushed: false,
9
9
  reasoningPushes: [],
10
10
  reasoningFlushed: false,
11
+ reasoningCancelled: false,
11
12
  appendedMessages: [],
12
13
  setMessagesCalls: [],
13
- liveResponses: [],
14
14
  };
15
15
  return {
16
16
  calls,
@@ -18,32 +18,73 @@ function createMockDeps() {
18
18
  let seq = 0;
19
19
  return () => `msg-${seq++}`;
20
20
  })(),
21
- liveResponseUpdater: {
22
- push: (text) => calls.liveResponsePushes.push(text),
21
+ botResponseUpdater: {
22
+ push: (text) => calls.botResponsePushes.push(text),
23
23
  cancel: () => {
24
- calls.liveResponseCancelled = true;
24
+ calls.botResponseCancelled = true;
25
25
  },
26
26
  flush: () => {
27
- calls.liveResponseFlushed = true;
27
+ calls.botResponseFlushed = true;
28
28
  },
29
29
  },
30
30
  reasoningUpdater: {
31
31
  push: (text) => calls.reasoningPushes.push(text),
32
- cancel: () => { },
32
+ cancel: () => {
33
+ calls.reasoningCancelled = true;
34
+ },
33
35
  flush: () => {
34
36
  calls.reasoningFlushed = true;
35
37
  },
36
38
  },
37
39
  appendMessages: (messages) => calls.appendedMessages.push(messages),
38
40
  setMessages: (updater) => calls.setMessagesCalls.push(updater),
39
- setLiveResponse: (response) => calls.liveResponses.push(response),
40
41
  trimMessages: (messages) => messages,
41
42
  annotateCommandMessage: (msg) => ({ ...msg, annotated: true }),
42
43
  };
43
44
  }
44
45
  // =============================================================================
46
+ // findLastSafeBoundary tests
47
+ // =============================================================================
48
+ test('findLastSafeBoundary: splits on paragraph boundary', (t) => {
49
+ const text = 'Paragraph 1\n\nParagraph 2';
50
+ t.is(findLastSafeBoundary(text, 0), 13);
51
+ });
52
+ test('findLastSafeBoundary: ignores paragraph boundaries inside code blocks', (t) => {
53
+ const text = '```javascript\nconst a = 1;\n\nconst b = 2;\n```\nMore text';
54
+ const expectedBoundary = text.indexOf('```\nMore text') + 4; // after \n```\n
55
+ t.is(findLastSafeBoundary(text, 0), expectedBoundary);
56
+ });
57
+ test('findLastSafeBoundary: splits at closing code blocks', (t) => {
58
+ const text = 'Here is code:\n```javascript\ncode\n```\nTail';
59
+ const expectedBoundary = text.indexOf('```\nTail') + 4;
60
+ t.is(findLastSafeBoundary(text, 0), expectedBoundary);
61
+ });
62
+ test('findLastSafeBoundary: splits before headings', (t) => {
63
+ const text = 'Paragraph 1\n# Heading 1';
64
+ const expectedBoundary = text.indexOf('#'); // Split right before #
65
+ t.is(findLastSafeBoundary(text, 0), expectedBoundary);
66
+ });
67
+ test('findLastSafeBoundary: splits on thematic breaks', (t) => {
68
+ const text = 'Paragraph 1\n---\nParagraph 2';
69
+ const expectedBoundary = text.indexOf('Paragraph 2'); // after \n---\n
70
+ t.is(findLastSafeBoundary(text, 0), expectedBoundary);
71
+ });
72
+ // =============================================================================
45
73
  // text_delta tests
46
74
  // =============================================================================
75
+ test('text_delta: avoids splitting inside a code block and splits after it closes', (t) => {
76
+ const deps = createMockDeps();
77
+ const state = createStreamingState();
78
+ const handler = createConversationEventHandler(deps, state);
79
+ handler({
80
+ type: 'text_delta',
81
+ delta: 'Here is code:\n```javascript\nconst a = 1;\n\nconst b = 2;\n```\nTail',
82
+ });
83
+ t.is(deps.calls.appendedMessages.length, 1);
84
+ t.is(deps.calls.appendedMessages[0][0].text, 'Here is code:\n```javascript\nconst a = 1;\n\nconst b = 2;\n```\n');
85
+ t.is(state.accumulatedText, 'Here is code:\n```javascript\nconst a = 1;\n\nconst b = 2;\n```\nTail');
86
+ t.is(state.flushedTextLength, 'Here is code:\n```javascript\nconst a = 1;\n\nconst b = 2;\n```\n'.length);
87
+ });
47
88
  test('text_delta: accumulates text and pushes to live response', (t) => {
48
89
  const deps = createMockDeps();
49
90
  const state = createStreamingState();
@@ -51,7 +92,104 @@ test('text_delta: accumulates text and pushes to live response', (t) => {
51
92
  handler({ type: 'text_delta', delta: 'Hello ' });
52
93
  handler({ type: 'text_delta', delta: 'world!' });
53
94
  t.is(state.accumulatedText, 'Hello world!');
54
- t.deepEqual(deps.calls.liveResponsePushes, ['Hello ', 'Hello world!']);
95
+ t.deepEqual(deps.calls.botResponsePushes, ['Hello ', 'Hello world!']);
96
+ });
97
+ test('text_delta: finalizes stable paragraphs and streams only the unfinished tail', (t) => {
98
+ const deps = createMockDeps();
99
+ const state = createStreamingState();
100
+ const handler = createConversationEventHandler(deps, state);
101
+ // Single delta that contains two complete paragraphs followed by an unfinished tail.
102
+ // The handler should flush the completed paragraphs as a finalized message and
103
+ // push only the tail to the live updater.
104
+ handler({
105
+ type: 'text_delta',
106
+ delta: 'First paragraph.\n\nSecond paragraph.\n\nCurrent tail',
107
+ });
108
+ t.is(deps.calls.appendedMessages.length, 1);
109
+ t.deepEqual(deps.calls.appendedMessages[0], [
110
+ {
111
+ id: 'msg-0',
112
+ sender: 'bot',
113
+ status: 'finalized',
114
+ text: 'First paragraph.\n\nSecond paragraph.\n\n',
115
+ },
116
+ ]);
117
+ t.is(state.flushedTextLength, 'First paragraph.\n\nSecond paragraph.\n\n'.length);
118
+ t.deepEqual(deps.calls.botResponsePushes, ['Current tail']);
119
+ t.true(deps.calls.botResponseCancelled);
120
+ });
121
+ test('text_delta: does not finalize until a paragraph boundary exists', (t) => {
122
+ const deps = createMockDeps();
123
+ const state = createStreamingState();
124
+ const handler = createConversationEventHandler(deps, state);
125
+ handler({ type: 'text_delta', delta: 'Single paragraph still growing' });
126
+ t.deepEqual(deps.calls.appendedMessages, []);
127
+ t.is(state.flushedTextLength, 0);
128
+ t.is(state.accumulatedText, 'Single paragraph still growing');
129
+ t.deepEqual(deps.calls.botResponsePushes, ['Single paragraph still growing']);
130
+ });
131
+ test('text_delta: finalizes an existing live bot message in place before streaming a new tail', (t) => {
132
+ const deps = createMockDeps();
133
+ const state = createStreamingState();
134
+ state.currentBotMessageId = 'active-bot';
135
+ const handler = createConversationEventHandler(deps, state);
136
+ // Arrive with a delta that completes the first paragraph and starts a new tail.
137
+ // The handler should update the existing 'active-bot' message with the finalized
138
+ // paragraph text and push the new tail to the live updater.
139
+ handler({
140
+ type: 'text_delta',
141
+ delta: 'Old tail now complete.\n\nNew tail',
142
+ });
143
+ t.deepEqual(deps.calls.appendedMessages, []);
144
+ t.is(deps.calls.setMessagesCalls.length, 1);
145
+ const next = deps.calls.setMessagesCalls[0]([
146
+ {
147
+ id: 'active-bot',
148
+ sender: 'bot',
149
+ text: 'Old tail',
150
+ },
151
+ ]);
152
+ t.deepEqual(next, [
153
+ {
154
+ id: 'active-bot',
155
+ sender: 'bot',
156
+ status: 'finalized',
157
+ text: 'Old tail now complete.\n\n',
158
+ },
159
+ ]);
160
+ t.true(state.currentBotMessageId === null);
161
+ t.is(state.flushedTextLength, 'Old tail now complete.\n\n'.length);
162
+ t.deepEqual(deps.calls.botResponsePushes, ['New tail']);
163
+ t.true(deps.calls.botResponseCancelled);
164
+ });
165
+ test('text_delta: cancels pending live bot update when paragraph boundary leaves no tail', (t) => {
166
+ const deps = createMockDeps();
167
+ const state = createStreamingState();
168
+ state.currentBotMessageId = 'active-bot';
169
+ const handler = createConversationEventHandler(deps, state);
170
+ handler({
171
+ type: 'text_delta',
172
+ delta: 'Finished paragraph.\n\n',
173
+ });
174
+ t.is(deps.calls.setMessagesCalls.length, 1);
175
+ const next = deps.calls.setMessagesCalls[0]([
176
+ {
177
+ id: 'active-bot',
178
+ sender: 'bot',
179
+ status: 'streaming',
180
+ text: 'Finished paragraph.',
181
+ },
182
+ ]);
183
+ t.deepEqual(next, [
184
+ {
185
+ id: 'active-bot',
186
+ sender: 'bot',
187
+ status: 'finalized',
188
+ text: 'Finished paragraph.\n\n',
189
+ },
190
+ ]);
191
+ t.deepEqual(deps.calls.botResponsePushes, []);
192
+ t.true(deps.calls.botResponseCancelled);
55
193
  });
56
194
  // =============================================================================
57
195
  // reasoning_delta tests
@@ -93,6 +231,106 @@ test('reasoning_delta: ignores empty reasoning', (t) => {
93
231
  t.is(state.accumulatedReasoningText, ' ');
94
232
  t.deepEqual(deps.calls.reasoningPushes, []);
95
233
  });
234
+ test('reasoning_delta: finalizes stable paragraphs and streams only the unfinished tail', (t) => {
235
+ const deps = createMockDeps();
236
+ const state = createStreamingState();
237
+ const handler = createConversationEventHandler(deps, state);
238
+ handler({
239
+ type: 'reasoning_delta',
240
+ delta: 'tail',
241
+ fullText: 'First paragraph.\n\nSecond paragraph.\n\nCurrent tail',
242
+ });
243
+ t.is(deps.calls.appendedMessages.length, 1);
244
+ t.deepEqual(deps.calls.appendedMessages[0], [
245
+ {
246
+ id: 'msg-0',
247
+ sender: 'reasoning',
248
+ status: 'finalized',
249
+ text: 'First paragraph.\n\nSecond paragraph.\n\n',
250
+ },
251
+ ]);
252
+ t.is(state.flushedReasoningLength, 'First paragraph.\n\nSecond paragraph.\n\n'.length);
253
+ t.is(state.accumulatedReasoningText, 'Current tail');
254
+ t.deepEqual(deps.calls.reasoningPushes, ['Current tail']);
255
+ });
256
+ test('reasoning_delta: does not finalize until a paragraph boundary exists', (t) => {
257
+ const deps = createMockDeps();
258
+ const state = createStreamingState();
259
+ const handler = createConversationEventHandler(deps, state);
260
+ handler({
261
+ type: 'reasoning_delta',
262
+ delta: 'tail',
263
+ fullText: 'Single paragraph still growing',
264
+ });
265
+ t.deepEqual(deps.calls.appendedMessages, []);
266
+ t.is(state.flushedReasoningLength, 0);
267
+ t.is(state.accumulatedReasoningText, 'Single paragraph still growing');
268
+ t.deepEqual(deps.calls.reasoningPushes, ['Single paragraph still growing']);
269
+ });
270
+ test('reasoning_delta: finalizes an existing live reasoning message in place before streaming a new tail', (t) => {
271
+ const deps = createMockDeps();
272
+ const state = createStreamingState();
273
+ state.currentReasoningMessageId = 'active-reasoning';
274
+ const handler = createConversationEventHandler(deps, state);
275
+ handler({
276
+ type: 'reasoning_delta',
277
+ delta: 'tail',
278
+ fullText: 'Old tail now complete.\n\nNew tail',
279
+ });
280
+ t.deepEqual(deps.calls.appendedMessages, []);
281
+ t.is(deps.calls.setMessagesCalls.length, 1);
282
+ const next = deps.calls.setMessagesCalls[0]([
283
+ {
284
+ id: 'active-reasoning',
285
+ sender: 'reasoning',
286
+ text: 'Old tail',
287
+ },
288
+ ]);
289
+ t.deepEqual(next, [
290
+ {
291
+ id: 'active-reasoning',
292
+ sender: 'reasoning',
293
+ status: 'finalized',
294
+ text: 'Old tail now complete.\n\n',
295
+ },
296
+ ]);
297
+ t.true(state.currentReasoningMessageId === null);
298
+ t.is(state.flushedReasoningLength, 'Old tail now complete.\n\n'.length);
299
+ t.is(state.accumulatedReasoningText, 'New tail');
300
+ t.deepEqual(deps.calls.reasoningPushes, ['New tail']);
301
+ t.true(deps.calls.reasoningCancelled);
302
+ });
303
+ test('reasoning_delta: cancels pending live reasoning update when paragraph boundary leaves no tail', (t) => {
304
+ const deps = createMockDeps();
305
+ const state = createStreamingState();
306
+ state.currentReasoningMessageId = 'active-reasoning';
307
+ const handler = createConversationEventHandler(deps, state);
308
+ handler({
309
+ type: 'reasoning_delta',
310
+ delta: '\n\n',
311
+ fullText: 'Finished reasoning paragraph.\n\n',
312
+ });
313
+ t.is(deps.calls.setMessagesCalls.length, 1);
314
+ const next = deps.calls.setMessagesCalls[0]([
315
+ {
316
+ id: 'active-reasoning',
317
+ sender: 'reasoning',
318
+ text: 'Finished reasoning paragraph.',
319
+ },
320
+ ]);
321
+ t.deepEqual(next, [
322
+ {
323
+ id: 'active-reasoning',
324
+ sender: 'reasoning',
325
+ status: 'finalized',
326
+ text: 'Finished reasoning paragraph.\n\n',
327
+ },
328
+ ]);
329
+ t.true(deps.calls.reasoningCancelled);
330
+ t.deepEqual(deps.calls.reasoningPushes, []);
331
+ t.is(state.accumulatedReasoningText, '');
332
+ t.true(state.currentReasoningMessageId === null);
333
+ });
96
334
  // =============================================================================
97
335
  // tool_started tests
98
336
  // =============================================================================
@@ -109,10 +347,11 @@ test('tool_started: flushes accumulated text before showing tool', (t) => {
109
347
  });
110
348
  t.is(state.accumulatedText, '');
111
349
  t.is(state.textWasFlushed, true);
112
- t.true(deps.calls.liveResponseCancelled);
350
+ t.true(deps.calls.botResponseCancelled);
113
351
  // Should append text message and command message
114
352
  t.is(deps.calls.appendedMessages.length, 2);
115
353
  t.is(deps.calls.appendedMessages[0][0].sender, 'bot');
354
+ t.is(deps.calls.appendedMessages[0][0].status, 'finalized');
116
355
  t.is(deps.calls.appendedMessages[0][0].text, 'Some text before tool');
117
356
  });
118
357
  test('tool_started: flushes accumulated reasoning before showing tool', (t) => {
@@ -129,7 +368,63 @@ test('tool_started: flushes accumulated reasoning before showing tool', (t) => {
129
368
  t.true(deps.calls.reasoningFlushed);
130
369
  t.is(state.accumulatedReasoningText, '');
131
370
  t.is(state.flushedReasoningLength, 14); // 'Some reasoning'.length
132
- t.is(state.currentReasoningMessageId, null);
371
+ t.true(state.currentReasoningMessageId === null);
372
+ });
373
+ test('tool_started: finalizes live reasoning text before clearing it', (t) => {
374
+ const deps = createMockDeps();
375
+ const state = createStreamingState();
376
+ state.currentReasoningMessageId = 'active-reasoning';
377
+ state.accumulatedReasoningText = 'Reasoning before the tool';
378
+ const handler = createConversationEventHandler(deps, state);
379
+ handler({
380
+ type: 'tool_started',
381
+ toolCallId: 'call-1',
382
+ toolName: 'shell',
383
+ arguments: { command: 'ls' },
384
+ });
385
+ t.true(deps.calls.reasoningFlushed);
386
+ t.is(deps.calls.setMessagesCalls.length, 1);
387
+ const next = deps.calls.setMessagesCalls[0]([
388
+ {
389
+ id: 'active-reasoning',
390
+ sender: 'reasoning',
391
+ text: 'Reasoning before the tool',
392
+ },
393
+ ]);
394
+ t.deepEqual(next, [
395
+ {
396
+ id: 'active-reasoning',
397
+ sender: 'reasoning',
398
+ status: 'finalized',
399
+ text: 'Reasoning before the tool',
400
+ },
401
+ ]);
402
+ t.is(state.accumulatedReasoningText, '');
403
+ t.is(state.flushedReasoningLength, 'Reasoning before the tool'.length);
404
+ t.true(state.currentReasoningMessageId === null);
405
+ });
406
+ test('reasoning_delta: does not drop prefix when reasoning restarts after a tool', (t) => {
407
+ const deps = createMockDeps();
408
+ const state = createStreamingState();
409
+ const handler = createConversationEventHandler(deps, state);
410
+ handler({
411
+ type: 'reasoning_delta',
412
+ delta: 'Before tool',
413
+ fullText: 'Before tool',
414
+ });
415
+ handler({
416
+ type: 'tool_started',
417
+ toolCallId: 'call-1',
418
+ toolName: 'shell',
419
+ arguments: { command: 'ls' },
420
+ });
421
+ handler({
422
+ type: 'reasoning_delta',
423
+ delta: 'After tool reasoning',
424
+ fullText: 'After tool reasoning',
425
+ });
426
+ t.is(state.accumulatedReasoningText, 'After tool reasoning');
427
+ t.deepEqual(deps.calls.reasoningPushes, ['Before tool', 'After tool reasoning']);
133
428
  });
134
429
  test('tool_started: creates pending command message with shell command', (t) => {
135
430
  const deps = createMockDeps();
@@ -264,9 +559,118 @@ test('command_message: flushes accumulated text before adding', (t) => {
264
559
  t.is(state.accumulatedText, '');
265
560
  t.is(state.textWasFlushed, true);
266
561
  t.is(deps.calls.appendedMessages.length, 1);
562
+ t.is(deps.calls.appendedMessages[0][0].status, 'finalized');
267
563
  t.is(deps.calls.appendedMessages[0][0].text, 'Partial response');
268
564
  });
269
565
  // =============================================================================
566
+ // subagent activity tests
567
+ // =============================================================================
568
+ test('subagent events: maintains a live peek with the last three tools', (t) => {
569
+ const deps = createMockDeps();
570
+ const state = createStreamingState();
571
+ const handler = createConversationEventHandler(deps, state);
572
+ handler({
573
+ type: 'subagent_started',
574
+ agentId: 'agent-1',
575
+ role: 'explorer',
576
+ task: 'inspect the command message rendering flow and report findings',
577
+ });
578
+ t.deepEqual(deps.calls.appendedMessages[0], [
579
+ {
580
+ id: 'subagent-agent-1',
581
+ sender: 'subagent',
582
+ status: 'running',
583
+ agentId: 'agent-1',
584
+ role: 'explorer',
585
+ task: 'inspect the command message rendering flow and report findings',
586
+ tools: [],
587
+ },
588
+ ]);
589
+ handler({
590
+ type: 'subagent_tool_started',
591
+ agentId: 'agent-1',
592
+ role: 'explorer',
593
+ toolName: 'find_files',
594
+ commandMessages: [{ id: 'find', sender: 'command', status: 'running', command: 'find_files "*.ts"', output: '' }],
595
+ });
596
+ handler({
597
+ type: 'subagent_tool_started',
598
+ agentId: 'agent-1',
599
+ role: 'explorer',
600
+ toolName: 'grep',
601
+ commandMessages: [
602
+ { id: 'grep', sender: 'command', status: 'running', command: 'grep "needle" "source"', output: '' },
603
+ ],
604
+ });
605
+ handler({
606
+ type: 'subagent_tool_started',
607
+ agentId: 'agent-1',
608
+ role: 'explorer',
609
+ toolName: 'read_file',
610
+ commandMessages: [
611
+ { id: 'read', sender: 'command', status: 'running', command: 'read_file "source/app.tsx"', output: '' },
612
+ ],
613
+ });
614
+ handler({
615
+ type: 'subagent_tool_started',
616
+ agentId: 'agent-1',
617
+ role: 'explorer',
618
+ toolName: 'read_code_outline',
619
+ commandMessages: [
620
+ {
621
+ id: 'outline',
622
+ sender: 'command',
623
+ status: 'running',
624
+ command: 'read_code_outline "source/app.tsx"',
625
+ output: '',
626
+ },
627
+ ],
628
+ });
629
+ let messages = deps.calls.appendedMessages[0];
630
+ for (const update of deps.calls.setMessagesCalls) {
631
+ messages = update(messages);
632
+ }
633
+ t.deepEqual(messages, [
634
+ {
635
+ id: 'subagent-agent-1',
636
+ sender: 'subagent',
637
+ status: 'running',
638
+ agentId: 'agent-1',
639
+ role: 'explorer',
640
+ task: 'inspect the command message rendering flow and report findings',
641
+ tools: ['grep "needle" "source"', 'read_file "source/app.tsx"', 'read_code_outline "source/app.tsx"'],
642
+ },
643
+ ]);
644
+ });
645
+ test('subagent_completed removes the live peek', (t) => {
646
+ const deps = createMockDeps();
647
+ const state = createStreamingState();
648
+ const handler = createConversationEventHandler(deps, state);
649
+ handler({
650
+ type: 'subagent_completed',
651
+ result: {
652
+ agentId: 'agent-1',
653
+ role: 'worker',
654
+ status: 'completed',
655
+ finalText: 'done',
656
+ filesChanged: [],
657
+ toolsUsed: [],
658
+ },
659
+ });
660
+ const result = deps.calls.setMessagesCalls[0]([
661
+ {
662
+ id: 'subagent-agent-1',
663
+ sender: 'subagent',
664
+ status: 'running',
665
+ agentId: 'agent-1',
666
+ role: 'worker',
667
+ task: 'make the change',
668
+ tools: ['apply_patch'],
669
+ },
670
+ ]);
671
+ t.deepEqual(result, []);
672
+ });
673
+ // =============================================================================
270
674
  // retry tests
271
675
  // =============================================================================
272
676
  test('retry: adds system message about hallucination retry', (t) => {
@@ -288,6 +692,73 @@ test('retry: adds system message about hallucination retry', (t) => {
288
692
  t.true(result[0].text.includes('shell'));
289
693
  t.true(result[0].text.includes('1/2'));
290
694
  });
695
+ test('retry: adds system message about flex service tier fallback', (t) => {
696
+ const deps = createMockDeps();
697
+ const state = createStreamingState();
698
+ const handler = createConversationEventHandler(deps, state);
699
+ handler({
700
+ type: 'retry',
701
+ toolName: 'service_tier',
702
+ attempt: 1,
703
+ maxRetries: 1,
704
+ errorMessage: 'Flex service tier timed out',
705
+ retryType: 'flex_service_tier',
706
+ });
707
+ const updater = deps.calls.setMessagesCalls[0];
708
+ const result = updater([]);
709
+ t.is(result.length, 1);
710
+ t.is(result[0].sender, 'system');
711
+ t.true(result[0].text.includes('Flex service tier timed out'));
712
+ t.true(result[0].text.includes('standard service tier'));
713
+ });
714
+ // =============================================================================
715
+ // final event tests
716
+ // =============================================================================
717
+ test('final: finalizes trailing reasoning message that was never followed by a tool call', (t) => {
718
+ const deps = createMockDeps();
719
+ const state = createStreamingState();
720
+ state.currentReasoningMessageId = 'active-reasoning';
721
+ state.accumulatedReasoningText = 'Trailing reasoning with no tool call';
722
+ const handler = createConversationEventHandler(deps, state);
723
+ handler({ type: 'final', finalText: '' });
724
+ t.true(deps.calls.reasoningFlushed);
725
+ t.is(state.accumulatedReasoningText, '');
726
+ t.true(state.currentReasoningMessageId === null);
727
+ // markCurrentReasoningFinalized sets status via setMessages
728
+ t.is(deps.calls.setMessagesCalls.length, 1);
729
+ const next = deps.calls.setMessagesCalls[0]([
730
+ { id: 'active-reasoning', sender: 'reasoning', text: 'Trailing reasoning with no tool call' },
731
+ ]);
732
+ t.deepEqual(next, [
733
+ { id: 'active-reasoning', sender: 'reasoning', status: 'finalized', text: 'Trailing reasoning with no tool call' },
734
+ ]);
735
+ });
736
+ test('final: appends missing final text after already flushed streamed text', (t) => {
737
+ const deps = createMockDeps();
738
+ const state = createStreamingState();
739
+ const handler = createConversationEventHandler(deps, state);
740
+ handler({ type: 'text_delta', delta: 'Intro\n\n' });
741
+ handler({ type: 'final', finalText: 'Intro\n\n## Missing Header\n\nBody' });
742
+ t.is(state.accumulatedText, 'Intro\n\n## Missing Header\n\nBody');
743
+ t.is(deps.calls.appendedMessages.length, 2);
744
+ t.deepEqual(deps.calls.appendedMessages[1], [
745
+ {
746
+ id: 'msg-1',
747
+ sender: 'bot',
748
+ status: 'finalized',
749
+ text: '## Missing Header\n\nBody',
750
+ },
751
+ ]);
752
+ });
753
+ test('final: is a no-op when there is no pending reasoning', (t) => {
754
+ const deps = createMockDeps();
755
+ const state = createStreamingState();
756
+ const handler = createConversationEventHandler(deps, state);
757
+ handler({ type: 'final', finalText: '' });
758
+ t.false(deps.calls.reasoningFlushed);
759
+ t.is(deps.calls.setMessagesCalls.length, 0);
760
+ t.is(deps.calls.appendedMessages.length, 0);
761
+ });
291
762
  // =============================================================================
292
763
  // unknown event tests
293
764
  // =============================================================================
@@ -300,4 +771,95 @@ test('unknown event: is ignored without error', (t) => {
300
771
  t.is(deps.calls.appendedMessages.length, 0);
301
772
  t.is(deps.calls.setMessagesCalls.length, 0);
302
773
  });
774
+ // =============================================================================
775
+ // Bug: final event silently ignores corrections when finalText.length <= accumulatedText.length
776
+ // =============================================================================
777
+ test('final: ignores corrected finalText when it is the same length as accumulated streamed text', (t) => {
778
+ const deps = createMockDeps();
779
+ const state = createStreamingState();
780
+ // Simulate streaming that produced a typo whose length matches the correct text
781
+ state.accumulatedText = 'Hello wrold';
782
+ state.flushedTextLength = 0;
783
+ const handler = createConversationEventHandler(deps, state);
784
+ handler({ type: 'final', finalText: 'Hello world' });
785
+ // The guard `finalText.length > accumulatedText.length` is false for equal-length strings.
786
+ // accumulatedText is never updated, so the typo is what gets flushed.
787
+ t.is(deps.calls.appendedMessages.length, 1);
788
+ const flushedMsg = deps.calls.appendedMessages[0][0];
789
+ // Fails: actual is 'Hello wrold' (the typo) — correction from finalText is silently lost
790
+ t.is(flushedMsg.text, 'Hello world');
791
+ });
792
+ test('final: flushes over-accumulated streamed content when finalText is shorter than accumulated', (t) => {
793
+ const deps = createMockDeps();
794
+ const state = createStreamingState();
795
+ // Simulate streaming that over-shot the authoritative answer
796
+ state.accumulatedText = 'The answer is 42. Extra hallucinated sentence.';
797
+ state.flushedTextLength = 0;
798
+ const handler = createConversationEventHandler(deps, state);
799
+ handler({ type: 'final', finalText: 'The answer is 42.' });
800
+ // The guard `finalText.length > accumulatedText.length` is false when final is shorter.
801
+ // accumulatedText is not corrected, so the hallucinated tail is included in the flush.
802
+ t.is(deps.calls.appendedMessages.length, 1);
803
+ const flushedMsg = deps.calls.appendedMessages[0][0];
804
+ // Fails: actual is the full over-accumulated string including ' Extra hallucinated sentence.'
805
+ t.is(flushedMsg.text, 'The answer is 42.');
806
+ });
807
+ // =============================================================================
808
+ // Bug: whitespace-only content before a paragraph boundary is permanently dropped
809
+ // =============================================================================
810
+ test('text_delta: whitespace-only content before first paragraph boundary is silently dropped', (t) => {
811
+ const deps = createMockDeps();
812
+ const state = createStreamingState();
813
+ const handler = createConversationEventHandler(deps, state);
814
+ // Response begins with whitespace before the paragraph boundary
815
+ handler({ type: 'text_delta', delta: ' \n\nActual content' });
816
+ // flushedTextLength is NOT advanced — whitespace content is kept in the unflushed window
817
+ t.is(state.flushedTextLength, 0);
818
+ t.is(deps.calls.appendedMessages.length, 0);
819
+ // The live updater only received 'Actual content' — the leading spaces are gone
820
+ t.deepEqual(deps.calls.botResponsePushes, ['Actual content']);
821
+ // After final, only 'Actual content' is written; the three leading spaces are permanently lost
822
+ handler({ type: 'final', finalText: ' \n\nActual content' });
823
+ t.is(deps.calls.appendedMessages.length, 1);
824
+ // Fails: actual is 'Actual content' — ' ' is not recoverable
825
+ t.is(deps.calls.appendedMessages[0][0].text, ' \n\nActual content');
826
+ });
827
+ // =============================================================================
828
+ // Bug: command_message without callId leaves the running message stranded
829
+ // =============================================================================
830
+ test('command_message: leaves stale running message when no callId is present on either side', (t) => {
831
+ const deps = createMockDeps();
832
+ const state = createStreamingState();
833
+ const handler = createConversationEventHandler(deps, state);
834
+ // tool_started with no callId appends a running message with no way to match it later
835
+ handler({
836
+ type: 'tool_started',
837
+ toolCallId: undefined,
838
+ toolName: 'shell',
839
+ arguments: { command: 'ls' },
840
+ });
841
+ const runningMsg = deps.calls.appendedMessages[0][0];
842
+ t.is(runningMsg.status, 'running');
843
+ t.is(runningMsg.callId, undefined);
844
+ // command_message also has no callId, so pendingIndex is immediately -1
845
+ // and the completed message is appended rather than replacing the running one
846
+ handler({
847
+ type: 'command_message',
848
+ message: {
849
+ id: 'result-1',
850
+ sender: 'command',
851
+ status: 'completed',
852
+ command: 'ls',
853
+ output: 'file.txt',
854
+ callId: undefined,
855
+ toolName: 'shell',
856
+ },
857
+ });
858
+ const updater = deps.calls.setMessagesCalls[0];
859
+ const result = updater([runningMsg]);
860
+ // Fails: result has 2 messages — the stale 'running' + the new 'completed'
861
+ // Expected: 1 message, the running entry replaced by the completed one
862
+ t.is(result.length, 1);
863
+ t.is(result[0].status, 'completed');
864
+ });
303
865
  //# sourceMappingURL=conversation-event-handler.test.js.map