@qduc/term2 0.1.8 → 0.3.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 (760) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +5 -3
  3. package/dist/agent.js.map +1 -1
  4. package/dist/agent.lite-mode.test.d.ts +2 -0
  5. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  6. package/dist/agent.lite-mode.test.js +39 -0
  7. package/dist/agent.lite-mode.test.js.map +1 -0
  8. package/dist/app.d.ts +1 -5
  9. package/dist/app.d.ts.map +1 -1
  10. package/dist/app.js +45 -280
  11. package/dist/app.js.map +1 -1
  12. package/dist/app.parseInput.test.js +1 -9
  13. package/dist/app.parseInput.test.js.map +1 -1
  14. package/dist/cli.js +1 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/components/ApprovalPrompt.d.ts +2 -1
  17. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  18. package/dist/components/ApprovalPrompt.js +15 -0
  19. package/dist/components/ApprovalPrompt.js.map +1 -1
  20. package/dist/components/BottomArea.d.ts +4 -3
  21. package/dist/components/BottomArea.d.ts.map +1 -1
  22. package/dist/components/BottomArea.js.map +1 -1
  23. package/dist/components/Input/PopupManager.d.ts +1 -1
  24. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  25. package/dist/components/Input/PopupManager.js.map +1 -1
  26. package/dist/components/Input/determine-active-menu.d.ts +24 -0
  27. package/dist/components/Input/determine-active-menu.d.ts.map +1 -0
  28. package/dist/components/Input/determine-active-menu.js +70 -0
  29. package/dist/components/Input/determine-active-menu.js.map +1 -0
  30. package/dist/components/Input/input-width.d.ts +7 -0
  31. package/dist/components/Input/input-width.d.ts.map +1 -0
  32. package/dist/components/Input/input-width.js +20 -0
  33. package/dist/components/Input/input-width.js.map +1 -0
  34. package/dist/components/Input/insertions.d.ts +34 -0
  35. package/dist/components/Input/insertions.d.ts.map +1 -0
  36. package/dist/components/Input/insertions.js +52 -0
  37. package/dist/components/Input/insertions.js.map +1 -0
  38. package/dist/components/Input/popup-props.d.ts +18 -0
  39. package/dist/components/Input/popup-props.d.ts.map +1 -0
  40. package/dist/components/Input/popup-props.js +42 -0
  41. package/dist/components/Input/popup-props.js.map +1 -0
  42. package/dist/components/Input/triggers.d.ts +9 -0
  43. package/dist/components/Input/triggers.d.ts.map +1 -0
  44. package/dist/components/Input/triggers.js +25 -0
  45. package/dist/components/Input/triggers.js.map +1 -0
  46. package/dist/components/InputBox.d.ts +5 -8
  47. package/dist/components/InputBox.d.ts.map +1 -1
  48. package/dist/components/InputBox.js +152 -405
  49. package/dist/components/InputBox.js.map +1 -1
  50. package/dist/components/InputBox.menu-logic.test.js +126 -103
  51. package/dist/components/InputBox.menu-logic.test.js.map +1 -1
  52. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  53. package/dist/components/MarkdownRenderer.js +126 -41
  54. package/dist/components/MarkdownRenderer.js.map +1 -1
  55. package/dist/components/MessageList.d.ts +8 -0
  56. package/dist/components/MessageList.d.ts.map +1 -1
  57. package/dist/components/MessageList.js +25 -7
  58. package/dist/components/MessageList.js.map +1 -1
  59. package/dist/components/MessageList.test.js +62 -1
  60. package/dist/components/MessageList.test.js.map +1 -1
  61. package/dist/components/SlashCommandMenu.d.ts +1 -6
  62. package/dist/components/SlashCommandMenu.d.ts.map +1 -1
  63. package/dist/components/SlashCommandMenu.js.map +1 -1
  64. package/dist/components/StatusBar.d.ts +1 -1
  65. package/dist/components/StatusBar.d.ts.map +1 -1
  66. package/dist/components/StatusBar.js +49 -38
  67. package/dist/components/StatusBar.js.map +1 -1
  68. package/dist/components/TextInput.d.ts.map +1 -1
  69. package/dist/components/TextInput.js +2 -1
  70. package/dist/components/TextInput.js.map +1 -1
  71. package/dist/components/TextInput.test.js.map +1 -1
  72. package/dist/contracts/conversation.d.ts +9 -0
  73. package/dist/contracts/conversation.d.ts.map +1 -1
  74. package/dist/debug_ask_mentor.d.ts +2 -0
  75. package/dist/debug_ask_mentor.d.ts.map +1 -0
  76. package/dist/debug_ask_mentor.js +73 -0
  77. package/dist/debug_ask_mentor.js.map +1 -0
  78. package/dist/hooks/message-id.d.ts +3 -0
  79. package/dist/hooks/message-id.d.ts.map +1 -0
  80. package/dist/hooks/message-id.js +17 -0
  81. package/dist/hooks/message-id.js.map +1 -0
  82. package/dist/hooks/message-id.test.d.ts +2 -0
  83. package/dist/hooks/message-id.test.d.ts.map +1 -0
  84. package/dist/hooks/message-id.test.js +17 -0
  85. package/dist/hooks/message-id.test.js.map +1 -0
  86. package/dist/hooks/use-app-commands.d.ts +20 -0
  87. package/dist/hooks/use-app-commands.d.ts.map +1 -0
  88. package/dist/hooks/use-app-commands.js +201 -0
  89. package/dist/hooks/use-app-commands.js.map +1 -0
  90. package/dist/hooks/use-app-commands.test.d.ts +2 -0
  91. package/dist/hooks/use-app-commands.test.d.ts.map +1 -0
  92. package/dist/hooks/use-app-commands.test.js +34 -0
  93. package/dist/hooks/use-app-commands.test.js.map +1 -0
  94. package/dist/hooks/use-conversation.d.ts +13 -12
  95. package/dist/hooks/use-conversation.d.ts.map +1 -1
  96. package/dist/hooks/use-conversation.js +19 -14
  97. package/dist/hooks/use-conversation.js.map +1 -1
  98. package/dist/hooks/use-escape-key.d.ts +24 -0
  99. package/dist/hooks/use-escape-key.d.ts.map +1 -0
  100. package/dist/hooks/use-escape-key.js +60 -0
  101. package/dist/hooks/use-escape-key.js.map +1 -0
  102. package/dist/hooks/use-escape-key.test.d.ts +2 -0
  103. package/dist/hooks/use-escape-key.test.d.ts.map +1 -0
  104. package/dist/hooks/use-escape-key.test.js +49 -0
  105. package/dist/hooks/use-escape-key.test.js.map +1 -0
  106. package/dist/hooks/use-mode-handlers.d.ts +35 -0
  107. package/dist/hooks/use-mode-handlers.d.ts.map +1 -0
  108. package/dist/hooks/use-mode-handlers.js +79 -0
  109. package/dist/hooks/use-mode-handlers.js.map +1 -0
  110. package/dist/hooks/use-model-selection.d.ts +6 -3
  111. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  112. package/dist/hooks/use-model-selection.js +19 -16
  113. package/dist/hooks/use-model-selection.js.map +1 -1
  114. package/dist/hooks/use-model-selection.test.d.ts.map +1 -1
  115. package/dist/hooks/use-model-selection.test.js +53 -22
  116. package/dist/hooks/use-model-selection.test.js.map +1 -1
  117. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  118. package/dist/hooks/use-path-completion.js +5 -36
  119. package/dist/hooks/use-path-completion.js.map +1 -1
  120. package/dist/hooks/use-runtime-settings.d.ts +12 -0
  121. package/dist/hooks/use-runtime-settings.d.ts.map +1 -0
  122. package/dist/hooks/use-runtime-settings.js +68 -0
  123. package/dist/hooks/use-runtime-settings.js.map +1 -0
  124. package/dist/hooks/use-selection.d.ts +8 -0
  125. package/dist/hooks/use-selection.d.ts.map +1 -0
  126. package/dist/hooks/use-selection.js +31 -0
  127. package/dist/hooks/use-selection.js.map +1 -0
  128. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  129. package/dist/hooks/use-settings-completion.js +15 -30
  130. package/dist/hooks/use-settings-completion.js.map +1 -1
  131. package/dist/hooks/use-settings-completion.test.js +9 -9
  132. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  133. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  134. package/dist/hooks/use-settings-value-completion.js +30 -28
  135. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  136. package/dist/hooks/use-settings-value-completion.test.js +13 -0
  137. package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
  138. package/dist/hooks/use-shell-mode.d.ts +31 -0
  139. package/dist/hooks/use-shell-mode.d.ts.map +1 -0
  140. package/dist/hooks/use-shell-mode.js +85 -0
  141. package/dist/hooks/use-shell-mode.js.map +1 -0
  142. package/dist/hooks/use-slash-commands.d.ts +2 -1
  143. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  144. package/dist/hooks/use-slash-commands.js +32 -23
  145. package/dist/hooks/use-slash-commands.js.map +1 -1
  146. package/dist/hooks/use-terminal-width.d.ts +7 -0
  147. package/dist/hooks/use-terminal-width.d.ts.map +1 -0
  148. package/dist/hooks/use-terminal-width.js +33 -0
  149. package/dist/hooks/use-terminal-width.js.map +1 -0
  150. package/dist/hooks/use-trigger-detection.d.ts +42 -0
  151. package/dist/hooks/use-trigger-detection.d.ts.map +1 -0
  152. package/dist/hooks/use-trigger-detection.js +45 -0
  153. package/dist/hooks/use-trigger-detection.js.map +1 -0
  154. package/dist/lib/editor-impl.js +6 -6
  155. package/dist/lib/editor-impl.js.map +1 -1
  156. package/dist/lib/openai-agent-client.d.ts +4 -1
  157. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  158. package/dist/lib/openai-agent-client.js +189 -195
  159. package/dist/lib/openai-agent-client.js.map +1 -1
  160. package/dist/lib/openai-agent-client.public-methods.test.js +61 -13
  161. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
  162. package/dist/lib/openai-agent-client.test.js +1 -1
  163. package/dist/lib/openai-agent-client.test.js.map +1 -1
  164. package/dist/lib/retry-executor.d.ts +16 -0
  165. package/dist/lib/retry-executor.d.ts.map +1 -0
  166. package/dist/lib/retry-executor.js +70 -0
  167. package/dist/lib/retry-executor.js.map +1 -0
  168. package/dist/lib/retry-executor.test.d.ts +2 -0
  169. package/dist/lib/retry-executor.test.d.ts.map +1 -0
  170. package/dist/lib/retry-executor.test.js +177 -0
  171. package/dist/lib/retry-executor.test.js.map +1 -0
  172. package/dist/lib/tool-selection-policy.d.ts +14 -0
  173. package/dist/lib/tool-selection-policy.d.ts.map +1 -0
  174. package/dist/lib/tool-selection-policy.js +17 -0
  175. package/dist/lib/tool-selection-policy.js.map +1 -0
  176. package/dist/lib/tool-selection-policy.test.d.ts +2 -0
  177. package/dist/lib/tool-selection-policy.test.d.ts.map +1 -0
  178. package/dist/lib/tool-selection-policy.test.js +69 -0
  179. package/dist/lib/tool-selection-policy.test.js.map +1 -0
  180. package/dist/modes/companion/command-index.d.ts +26 -0
  181. package/dist/modes/companion/command-index.d.ts.map +1 -0
  182. package/dist/modes/companion/command-index.js +50 -0
  183. package/dist/modes/companion/command-index.js.map +1 -0
  184. package/dist/modes/companion/command-index.test.d.ts +2 -0
  185. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  186. package/dist/modes/companion/command-index.test.js +86 -0
  187. package/dist/modes/companion/command-index.test.js.map +1 -0
  188. package/dist/modes/companion/companion-app.d.ts +12 -0
  189. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  190. package/dist/modes/companion/companion-app.js +297 -0
  191. package/dist/modes/companion/companion-app.js.map +1 -0
  192. package/dist/modes/companion/companion-session.d.ts +63 -0
  193. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  194. package/dist/modes/companion/companion-session.js +146 -0
  195. package/dist/modes/companion/companion-session.js.map +1 -0
  196. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  197. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  198. package/dist/modes/companion/companion-session.test.js +28 -0
  199. package/dist/modes/companion/companion-session.test.js.map +1 -0
  200. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  201. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  202. package/dist/modes/companion/components/status-bar.js +26 -0
  203. package/dist/modes/companion/components/status-bar.js.map +1 -0
  204. package/dist/modes/companion/context-buffer.d.ts +65 -0
  205. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  206. package/dist/modes/companion/context-buffer.js +156 -0
  207. package/dist/modes/companion/context-buffer.js.map +1 -0
  208. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  209. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  210. package/dist/modes/companion/context-buffer.test.js +154 -0
  211. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  212. package/dist/modes/companion/event-detector.d.ts +46 -0
  213. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  214. package/dist/modes/companion/event-detector.js +169 -0
  215. package/dist/modes/companion/event-detector.js.map +1 -0
  216. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  217. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  218. package/dist/modes/companion/event-detector.test.js +121 -0
  219. package/dist/modes/companion/event-detector.test.js.map +1 -0
  220. package/dist/modes/companion/index.d.ts +33 -0
  221. package/dist/modes/companion/index.d.ts.map +1 -0
  222. package/dist/modes/companion/index.js +21 -0
  223. package/dist/modes/companion/index.js.map +1 -0
  224. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  225. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  226. package/dist/modes/companion/input-key-mapper.js +31 -0
  227. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  228. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  229. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  230. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  231. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  232. package/dist/modes/companion/input-parser.d.ts +53 -0
  233. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  234. package/dist/modes/companion/input-parser.js +114 -0
  235. package/dist/modes/companion/input-parser.js.map +1 -0
  236. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  237. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  238. package/dist/modes/companion/input-parser.test.js +123 -0
  239. package/dist/modes/companion/input-parser.test.js.map +1 -0
  240. package/dist/modes/companion/mode-manager.d.ts +41 -0
  241. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  242. package/dist/modes/companion/mode-manager.js +56 -0
  243. package/dist/modes/companion/mode-manager.js.map +1 -0
  244. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  245. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  246. package/dist/modes/companion/mode-manager.test.js +65 -0
  247. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  248. package/dist/modes/companion/output-classifier.d.ts +15 -0
  249. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  250. package/dist/modes/companion/output-classifier.js +77 -0
  251. package/dist/modes/companion/output-classifier.js.map +1 -0
  252. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  253. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  254. package/dist/modes/companion/output-classifier.test.js +133 -0
  255. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  256. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  257. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  258. package/dist/modes/companion/pty-wrapper.js +143 -0
  259. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  260. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  261. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  262. package/dist/modes/companion/safety-classifier.js +140 -0
  263. package/dist/modes/companion/safety-classifier.js.map +1 -0
  264. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  265. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  266. package/dist/modes/companion/safety-classifier.test.js +151 -0
  267. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  268. package/dist/modes/companion/summarizer.d.ts +24 -0
  269. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  270. package/dist/modes/companion/summarizer.js +132 -0
  271. package/dist/modes/companion/summarizer.js.map +1 -0
  272. package/dist/modes/companion/terminal-history.d.ts +27 -0
  273. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  274. package/dist/modes/companion/terminal-history.js +142 -0
  275. package/dist/modes/companion/terminal-history.js.map +1 -0
  276. package/dist/prompts/simple-mentor.md +8 -0
  277. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +24 -0
  278. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -0
  279. package/dist/providers/ai-sdk-openai-compatible.provider.js +26 -0
  280. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -0
  281. package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts +2 -0
  282. package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts.map +1 -0
  283. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +68 -0
  284. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -0
  285. package/dist/providers/common/openai-compatible-messages.d.ts +8 -0
  286. package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -0
  287. package/dist/providers/common/openai-compatible-messages.js +356 -0
  288. package/dist/providers/common/openai-compatible-messages.js.map +1 -0
  289. package/dist/providers/common/openai-compatible-messages.test.d.ts +2 -0
  290. package/dist/providers/common/openai-compatible-messages.test.d.ts.map +1 -0
  291. package/dist/providers/common/openai-compatible-messages.test.js +26 -0
  292. package/dist/providers/common/openai-compatible-messages.test.js.map +1 -0
  293. package/dist/providers/common/openai-compatible-utils.d.ts +11 -0
  294. package/dist/providers/common/openai-compatible-utils.d.ts.map +1 -0
  295. package/dist/providers/common/openai-compatible-utils.js +33 -0
  296. package/dist/providers/common/openai-compatible-utils.js.map +1 -0
  297. package/dist/providers/common/provider-errors.d.ts +13 -0
  298. package/dist/providers/common/provider-errors.d.ts.map +1 -0
  299. package/dist/providers/common/provider-errors.js +25 -0
  300. package/dist/providers/common/provider-errors.js.map +1 -0
  301. package/dist/providers/github-copilot/model.d.ts.map +1 -1
  302. package/dist/providers/github-copilot/model.js +25 -108
  303. package/dist/providers/github-copilot/model.js.map +1 -1
  304. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  305. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  306. package/dist/providers/github-copilot/model.test.js +63 -0
  307. package/dist/providers/github-copilot/model.test.js.map +1 -0
  308. package/dist/providers/github-copilot/provider.d.ts +0 -5
  309. package/dist/providers/github-copilot/provider.d.ts.map +1 -1
  310. package/dist/providers/github-copilot/provider.js +2 -7
  311. package/dist/providers/github-copilot/provider.js.map +1 -1
  312. package/dist/providers/index.d.ts +1 -1
  313. package/dist/providers/index.d.ts.map +1 -1
  314. package/dist/providers/index.js +1 -1
  315. package/dist/providers/index.js.map +1 -1
  316. package/dist/providers/openai-compatible/model.d.ts.map +1 -1
  317. package/dist/providers/openai-compatible/model.js +68 -7
  318. package/dist/providers/openai-compatible/model.js.map +1 -1
  319. package/dist/providers/openai-compatible/reasoning-content.test.js +107 -6
  320. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  321. package/dist/providers/openai-compatible.provider.createRunner.test.d.ts +2 -0
  322. package/dist/providers/openai-compatible.provider.createRunner.test.d.ts.map +1 -0
  323. package/dist/providers/openai-compatible.provider.createRunner.test.js +39 -0
  324. package/dist/providers/openai-compatible.provider.createRunner.test.js.map +1 -0
  325. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  326. package/dist/providers/openai-compatible.provider.js +18 -8
  327. package/dist/providers/openai-compatible.provider.js.map +1 -1
  328. package/dist/providers/openai.provider.js +2 -0
  329. package/dist/providers/openai.provider.js.map +1 -1
  330. package/dist/providers/openrouter/converters.d.ts.map +1 -1
  331. package/dist/providers/openrouter/converters.js +8 -6
  332. package/dist/providers/openrouter/converters.js.map +1 -1
  333. package/dist/providers/openrouter/converters.test.js +24 -0
  334. package/dist/providers/openrouter/converters.test.js.map +1 -1
  335. package/dist/providers/openrouter/model.d.ts.map +1 -1
  336. package/dist/providers/openrouter/model.js +13 -5
  337. package/dist/providers/openrouter/model.js.map +1 -1
  338. package/dist/providers/openrouter/reasoning-content.test.js +48 -2
  339. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
  340. package/dist/providers/openrouter.d.ts +1 -1
  341. package/dist/providers/openrouter.d.ts.map +1 -1
  342. package/dist/providers/openrouter.js +1 -3
  343. package/dist/providers/openrouter.js.map +1 -1
  344. package/dist/providers/openrouter.provider.createRunner.test.js +45 -9
  345. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  346. package/dist/providers/openrouter.provider.js +13 -5
  347. package/dist/providers/openrouter.provider.js.map +1 -1
  348. package/dist/providers/openrouter.test.js +0 -2
  349. package/dist/providers/openrouter.test.js.map +1 -1
  350. package/dist/providers/registry.d.ts +17 -8
  351. package/dist/providers/registry.d.ts.map +1 -1
  352. package/dist/providers/registry.js +9 -0
  353. package/dist/providers/registry.js.map +1 -1
  354. package/dist/providers/web-search/exa.provider.d.ts +15 -0
  355. package/dist/providers/web-search/exa.provider.d.ts.map +1 -0
  356. package/dist/providers/web-search/exa.provider.js +82 -0
  357. package/dist/providers/web-search/exa.provider.js.map +1 -0
  358. package/dist/providers/web-search/exa.provider.test.d.ts +2 -0
  359. package/dist/providers/web-search/exa.provider.test.d.ts.map +1 -0
  360. package/dist/providers/web-search/exa.provider.test.js +67 -0
  361. package/dist/providers/web-search/exa.provider.test.js.map +1 -0
  362. package/dist/providers/web-search/index.d.ts +1 -0
  363. package/dist/providers/web-search/index.d.ts.map +1 -1
  364. package/dist/providers/web-search/index.js +1 -0
  365. package/dist/providers/web-search/index.js.map +1 -1
  366. package/dist/scripts/eval-auto-approval/cache.d.ts +9 -0
  367. package/dist/scripts/eval-auto-approval/cache.d.ts.map +1 -0
  368. package/dist/scripts/eval-auto-approval/cache.js +64 -0
  369. package/dist/scripts/eval-auto-approval/cache.js.map +1 -0
  370. package/dist/scripts/eval-auto-approval/dataset.d.ts +45 -0
  371. package/dist/scripts/eval-auto-approval/dataset.d.ts.map +1 -0
  372. package/dist/scripts/eval-auto-approval/dataset.js +65 -0
  373. package/dist/scripts/eval-auto-approval/dataset.js.map +1 -0
  374. package/dist/scripts/eval-auto-approval/dataset.test.d.ts +2 -0
  375. package/dist/scripts/eval-auto-approval/dataset.test.d.ts.map +1 -0
  376. package/dist/scripts/eval-auto-approval/dataset.test.js +88 -0
  377. package/dist/scripts/eval-auto-approval/dataset.test.js.map +1 -0
  378. package/dist/scripts/eval-auto-approval/leaderboard.d.ts +92 -0
  379. package/dist/scripts/eval-auto-approval/leaderboard.d.ts.map +1 -0
  380. package/dist/scripts/eval-auto-approval/leaderboard.js +402 -0
  381. package/dist/scripts/eval-auto-approval/leaderboard.js.map +1 -0
  382. package/dist/scripts/eval-auto-approval/leaderboard.test.d.ts +2 -0
  383. package/dist/scripts/eval-auto-approval/leaderboard.test.d.ts.map +1 -0
  384. package/dist/scripts/eval-auto-approval/leaderboard.test.js +689 -0
  385. package/dist/scripts/eval-auto-approval/leaderboard.test.js.map +1 -0
  386. package/dist/scripts/eval-auto-approval/metrics.d.ts +34 -0
  387. package/dist/scripts/eval-auto-approval/metrics.d.ts.map +1 -0
  388. package/dist/scripts/eval-auto-approval/metrics.js +74 -0
  389. package/dist/scripts/eval-auto-approval/metrics.js.map +1 -0
  390. package/dist/scripts/eval-auto-approval/metrics.test.d.ts +2 -0
  391. package/dist/scripts/eval-auto-approval/metrics.test.d.ts.map +1 -0
  392. package/dist/scripts/eval-auto-approval/metrics.test.js +79 -0
  393. package/dist/scripts/eval-auto-approval/metrics.test.js.map +1 -0
  394. package/dist/scripts/eval-auto-approval/report.d.ts +5 -0
  395. package/dist/scripts/eval-auto-approval/report.d.ts.map +1 -0
  396. package/dist/scripts/eval-auto-approval/report.js +51 -0
  397. package/dist/scripts/eval-auto-approval/report.js.map +1 -0
  398. package/dist/scripts/eval-auto-approval/report.test.d.ts +2 -0
  399. package/dist/scripts/eval-auto-approval/report.test.d.ts.map +1 -0
  400. package/dist/scripts/eval-auto-approval/report.test.js +23 -0
  401. package/dist/scripts/eval-auto-approval/report.test.js.map +1 -0
  402. package/dist/scripts/eval-auto-approval/runner-utils.d.ts +41 -0
  403. package/dist/scripts/eval-auto-approval/runner-utils.d.ts.map +1 -0
  404. package/dist/scripts/eval-auto-approval/runner-utils.js +187 -0
  405. package/dist/scripts/eval-auto-approval/runner-utils.js.map +1 -0
  406. package/dist/scripts/eval-auto-approval/runner-utils.test.d.ts +2 -0
  407. package/dist/scripts/eval-auto-approval/runner-utils.test.d.ts.map +1 -0
  408. package/dist/scripts/eval-auto-approval/runner-utils.test.js +135 -0
  409. package/dist/scripts/eval-auto-approval/runner-utils.test.js.map +1 -0
  410. package/dist/scripts/eval-auto-approval/runner.d.ts +2 -0
  411. package/dist/scripts/eval-auto-approval/runner.d.ts.map +1 -0
  412. package/dist/scripts/eval-auto-approval/runner.js +326 -0
  413. package/dist/scripts/eval-auto-approval/runner.js.map +1 -0
  414. package/dist/services/agent-stream.d.ts +11 -0
  415. package/dist/services/agent-stream.d.ts.map +1 -0
  416. package/dist/services/agent-stream.js +2 -0
  417. package/dist/services/agent-stream.js.map +1 -0
  418. package/dist/services/approval-flow-coordinator.d.ts +43 -0
  419. package/dist/services/approval-flow-coordinator.d.ts.map +1 -0
  420. package/dist/services/approval-flow-coordinator.js +120 -0
  421. package/dist/services/approval-flow-coordinator.js.map +1 -0
  422. package/dist/services/approval-flow-coordinator.test.d.ts +2 -0
  423. package/dist/services/approval-flow-coordinator.test.d.ts.map +1 -0
  424. package/dist/services/approval-flow-coordinator.test.js +168 -0
  425. package/dist/services/approval-flow-coordinator.test.js.map +1 -0
  426. package/dist/services/approval-rejection-interceptor.d.ts +16 -0
  427. package/dist/services/approval-rejection-interceptor.d.ts.map +1 -0
  428. package/dist/services/approval-rejection-interceptor.js +20 -0
  429. package/dist/services/approval-rejection-interceptor.js.map +1 -0
  430. package/dist/services/approval-rejection-interceptor.test.d.ts +2 -0
  431. package/dist/services/approval-rejection-interceptor.test.d.ts.map +1 -0
  432. package/dist/services/approval-rejection-interceptor.test.js +60 -0
  433. package/dist/services/approval-rejection-interceptor.test.js.map +1 -0
  434. package/dist/services/check_mock.d.ts +2 -0
  435. package/dist/services/check_mock.d.ts.map +1 -0
  436. package/dist/services/check_mock.js +22 -0
  437. package/dist/services/check_mock.js.map +1 -0
  438. package/dist/services/conversation-events.d.ts +4 -2
  439. package/dist/services/conversation-events.d.ts.map +1 -1
  440. package/dist/services/conversation-result-builder.d.ts +34 -34
  441. package/dist/services/conversation-result-builder.d.ts.map +1 -1
  442. package/dist/services/conversation-result-builder.js +64 -76
  443. package/dist/services/conversation-result-builder.js.map +1 -1
  444. package/dist/services/conversation-result-builder.test.js +145 -65
  445. package/dist/services/conversation-result-builder.test.js.map +1 -1
  446. package/dist/services/conversation-retry-policy.d.ts +37 -0
  447. package/dist/services/conversation-retry-policy.d.ts.map +1 -0
  448. package/dist/services/conversation-retry-policy.js +51 -0
  449. package/dist/services/conversation-retry-policy.js.map +1 -0
  450. package/dist/services/conversation-retry-policy.test.d.ts +2 -0
  451. package/dist/services/conversation-retry-policy.test.d.ts.map +1 -0
  452. package/dist/services/conversation-retry-policy.test.js +79 -0
  453. package/dist/services/conversation-retry-policy.test.js.map +1 -0
  454. package/dist/services/conversation-service.d.ts +2 -1
  455. package/dist/services/conversation-service.d.ts.map +1 -1
  456. package/dist/services/conversation-service.test.d.ts +2 -0
  457. package/dist/services/conversation-service.test.d.ts.map +1 -0
  458. package/dist/services/conversation-service.test.js +149 -183
  459. package/dist/services/conversation-service.test.js.map +1 -0
  460. package/dist/services/conversation-session.auto-approval.test.d.ts +2 -0
  461. package/dist/services/conversation-session.auto-approval.test.d.ts.map +1 -0
  462. package/dist/services/conversation-session.auto-approval.test.js +617 -0
  463. package/dist/services/conversation-session.auto-approval.test.js.map +1 -0
  464. package/dist/services/conversation-session.d.ts +9 -5
  465. package/dist/services/conversation-session.d.ts.map +1 -1
  466. package/dist/services/conversation-session.js +174 -700
  467. package/dist/services/conversation-session.js.map +1 -1
  468. package/dist/services/conversation-store.d.ts +2 -0
  469. package/dist/services/conversation-store.d.ts.map +1 -1
  470. package/dist/services/conversation-store.js +27 -0
  471. package/dist/services/conversation-store.js.map +1 -1
  472. package/dist/services/conversation-store.test.js +34 -0
  473. package/dist/services/conversation-store.test.js.map +1 -1
  474. package/dist/services/interruption-info.d.ts +13 -0
  475. package/dist/services/interruption-info.d.ts.map +1 -0
  476. package/dist/services/interruption-info.js +89 -0
  477. package/dist/services/interruption-info.js.map +1 -0
  478. package/dist/services/interruption-info.test.d.ts +2 -0
  479. package/dist/services/interruption-info.test.d.ts.map +1 -0
  480. package/dist/services/interruption-info.test.js +84 -0
  481. package/dist/services/interruption-info.test.js.map +1 -0
  482. package/dist/services/logging-contract.d.ts +4 -4
  483. package/dist/services/logging-service.d.ts +6 -2
  484. package/dist/services/logging-service.d.ts.map +1 -1
  485. package/dist/services/logging-service.js +53 -92
  486. package/dist/services/logging-service.js.map +1 -1
  487. package/dist/services/model-service.test.js +1 -5
  488. package/dist/services/model-service.test.js.map +1 -1
  489. package/dist/services/settings-env.d.ts.map +1 -1
  490. package/dist/services/settings-env.js +3 -0
  491. package/dist/services/settings-env.js.map +1 -1
  492. package/dist/services/settings-schema.d.ts +46 -8
  493. package/dist/services/settings-schema.d.ts.map +1 -1
  494. package/dist/services/settings-schema.js +46 -0
  495. package/dist/services/settings-schema.js.map +1 -1
  496. package/dist/services/settings-service.d.ts.map +1 -1
  497. package/dist/services/settings-service.js +12 -166
  498. package/dist/services/settings-service.js.map +1 -1
  499. package/dist/services/settings-sources.d.ts +5 -0
  500. package/dist/services/settings-sources.d.ts.map +1 -0
  501. package/dist/services/settings-sources.js +92 -0
  502. package/dist/services/settings-sources.js.map +1 -0
  503. package/dist/services/settings-sources.test.d.ts +2 -0
  504. package/dist/services/settings-sources.test.d.ts.map +1 -0
  505. package/dist/services/settings-sources.test.js +34 -0
  506. package/dist/services/settings-sources.test.js.map +1 -0
  507. package/dist/services/shell-auto-approval-evaluator.d.ts +19 -0
  508. package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -0
  509. package/dist/services/shell-auto-approval-evaluator.js +207 -0
  510. package/dist/services/shell-auto-approval-evaluator.js.map +1 -0
  511. package/dist/services/shell-auto-approval-evaluator.test.d.ts +2 -0
  512. package/dist/services/shell-auto-approval-evaluator.test.d.ts.map +1 -0
  513. package/dist/services/shell-auto-approval-evaluator.test.js +211 -0
  514. package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -0
  515. package/dist/services/shell-auto-approval-resolver.d.ts +24 -0
  516. package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -0
  517. package/dist/services/shell-auto-approval-resolver.js +59 -0
  518. package/dist/services/shell-auto-approval-resolver.js.map +1 -0
  519. package/dist/services/shell-auto-approval-resolver.test.d.ts +2 -0
  520. package/dist/services/shell-auto-approval-resolver.test.d.ts.map +1 -0
  521. package/dist/services/shell-auto-approval-resolver.test.js +110 -0
  522. package/dist/services/shell-auto-approval-resolver.test.js.map +1 -0
  523. package/dist/services/ssh-service.test.js +2 -2
  524. package/dist/services/ssh-service.test.js.map +1 -1
  525. package/dist/services/stream-event-processor.d.ts +18 -23
  526. package/dist/services/stream-event-processor.d.ts.map +1 -1
  527. package/dist/services/stream-event-processor.js +186 -325
  528. package/dist/services/stream-event-processor.js.map +1 -1
  529. package/dist/services/stream-event-processor.test.js +143 -90
  530. package/dist/services/stream-event-processor.test.js.map +1 -1
  531. package/dist/services/terminal-result-collector.d.ts +12 -0
  532. package/dist/services/terminal-result-collector.d.ts.map +1 -0
  533. package/dist/services/terminal-result-collector.js +64 -0
  534. package/dist/services/terminal-result-collector.js.map +1 -0
  535. package/dist/services/terminal-result-collector.test.d.ts +2 -0
  536. package/dist/services/terminal-result-collector.test.d.ts.map +1 -0
  537. package/dist/services/terminal-result-collector.test.js +93 -0
  538. package/dist/services/terminal-result-collector.test.js.map +1 -0
  539. package/dist/slash-commands.d.ts +20 -0
  540. package/dist/slash-commands.d.ts.map +1 -0
  541. package/dist/slash-commands.js +2 -0
  542. package/dist/slash-commands.js.map +1 -0
  543. package/dist/tools/apply-patch.js +5 -5
  544. package/dist/tools/apply-patch.js.map +1 -1
  545. package/dist/tools/create-file.js +2 -2
  546. package/dist/tools/create-file.js.map +1 -1
  547. package/dist/tools/edit-healing.d.ts.map +1 -1
  548. package/dist/tools/edit-healing.js +4 -1
  549. package/dist/tools/edit-healing.js.map +1 -1
  550. package/dist/tools/edit-healing.test.js +22 -0
  551. package/dist/tools/edit-healing.test.js.map +1 -1
  552. package/dist/tools/search-replace.d.ts.map +1 -1
  553. package/dist/tools/search-replace.js +114 -194
  554. package/dist/tools/search-replace.js.map +1 -1
  555. package/dist/tools/search-replace.test.js +38 -0
  556. package/dist/tools/search-replace.test.js.map +1 -1
  557. package/dist/tools/shell.js +2 -2
  558. package/dist/tools/shell.js.map +1 -1
  559. package/dist/tools/shell.test.js +0 -5
  560. package/dist/tools/shell.test.js.map +1 -1
  561. package/dist/tools/web-fetch.test.js +3 -3
  562. package/dist/tools/web-fetch.test.js.map +1 -1
  563. package/dist/types/user-turn.d.ts +16 -0
  564. package/dist/types/user-turn.d.ts.map +1 -0
  565. package/dist/types/user-turn.js +27 -0
  566. package/dist/types/user-turn.js.map +1 -0
  567. package/dist/types/user-turn.test.d.ts +2 -0
  568. package/dist/types/user-turn.test.d.ts.map +1 -0
  569. package/dist/types/user-turn.test.js +32 -0
  570. package/dist/types/user-turn.test.js.map +1 -0
  571. package/dist/utils/clipboard.d.ts +16 -0
  572. package/dist/utils/clipboard.d.ts.map +1 -0
  573. package/dist/utils/clipboard.js +55 -0
  574. package/dist/utils/clipboard.js.map +1 -0
  575. package/dist/utils/clipboard.test.d.ts +2 -0
  576. package/dist/utils/clipboard.test.d.ts.map +1 -0
  577. package/dist/utils/clipboard.test.js +59 -0
  578. package/dist/utils/clipboard.test.js.map +1 -0
  579. package/dist/utils/command-safety/constants.d.ts.map +1 -1
  580. package/dist/utils/command-safety/constants.js +3 -21
  581. package/dist/utils/command-safety/constants.js.map +1 -1
  582. package/dist/utils/command-safety/find-helpers.d.ts.map +1 -1
  583. package/dist/utils/command-safety/find-helpers.js +13 -95
  584. package/dist/utils/command-safety/find-helpers.js.map +1 -1
  585. package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -1
  586. package/dist/utils/command-safety/handlers/sed-handler.js +2 -4
  587. package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -1
  588. package/dist/utils/command-safety/index.d.ts +9 -0
  589. package/dist/utils/command-safety/index.d.ts.map +1 -1
  590. package/dist/utils/command-safety/index.js +12 -2
  591. package/dist/utils/command-safety/index.js.map +1 -1
  592. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
  593. package/dist/utils/command-safety/path-analysis.js +7 -6
  594. package/dist/utils/command-safety/path-analysis.js.map +1 -1
  595. package/dist/utils/command-safety.d.ts.map +1 -1
  596. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  597. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  598. package/dist/utils/command-safety.devnull.test.js +13 -0
  599. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  600. package/dist/utils/command-safety.find.test.js +56 -39
  601. package/dist/utils/command-safety.find.test.js.map +1 -1
  602. package/dist/utils/command-safety.js +10 -364
  603. package/dist/utils/command-safety.js.map +1 -1
  604. package/dist/utils/command-safety.path.test.js +7 -7
  605. package/dist/utils/command-safety.path.test.js.map +1 -1
  606. package/dist/utils/command-safety.red-yellow-policy.test.d.ts +2 -0
  607. package/dist/utils/command-safety.red-yellow-policy.test.d.ts.map +1 -0
  608. package/dist/utils/command-safety.red-yellow-policy.test.js +36 -0
  609. package/dist/utils/command-safety.red-yellow-policy.test.js.map +1 -0
  610. package/dist/utils/conversation-event-handler.d.ts +4 -3
  611. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  612. package/dist/utils/conversation-event-handler.js +15 -5
  613. package/dist/utils/conversation-event-handler.js.map +1 -1
  614. package/dist/utils/conversation-event-handler.test.js +24 -0
  615. package/dist/utils/conversation-event-handler.test.js.map +1 -1
  616. package/dist/utils/conversation-utils.d.ts +1 -1
  617. package/dist/utils/execute-shell.d.ts +10 -0
  618. package/dist/utils/execute-shell.d.ts.map +1 -1
  619. package/dist/utils/execute-shell.js +3 -3
  620. package/dist/utils/execute-shell.js.map +1 -1
  621. package/dist/utils/execute-shell.test.js +19 -3
  622. package/dist/utils/execute-shell.test.js.map +1 -1
  623. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  624. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  625. package/dist/utils/extract-command-messages.test.js +58 -51
  626. package/dist/utils/extract-command-messages.test.js.map +1 -0
  627. package/dist/utils/input-parser.d.ts +13 -0
  628. package/dist/utils/input-parser.d.ts.map +1 -0
  629. package/dist/utils/input-parser.js +10 -0
  630. package/dist/utils/input-parser.js.map +1 -0
  631. package/dist/utils/log-truncation.d.ts +7 -0
  632. package/dist/utils/log-truncation.d.ts.map +1 -0
  633. package/dist/utils/log-truncation.js +66 -0
  634. package/dist/utils/log-truncation.js.map +1 -0
  635. package/dist/utils/log-truncation.test.d.ts +2 -0
  636. package/dist/utils/log-truncation.test.d.ts.map +1 -0
  637. package/dist/utils/log-truncation.test.js +44 -0
  638. package/dist/utils/log-truncation.test.js.map +1 -0
  639. package/dist/utils/model-provider-arg.d.ts +5 -0
  640. package/dist/utils/model-provider-arg.d.ts.map +1 -0
  641. package/dist/utils/model-provider-arg.js +15 -0
  642. package/dist/utils/model-provider-arg.js.map +1 -0
  643. package/dist/utils/model-provider-arg.test.d.ts +2 -0
  644. package/dist/utils/model-provider-arg.test.d.ts.map +1 -0
  645. package/dist/utils/model-provider-arg.test.js +21 -0
  646. package/dist/utils/model-provider-arg.test.js.map +1 -0
  647. package/dist/utils/model-settings.d.ts +12 -0
  648. package/dist/utils/model-settings.d.ts.map +1 -0
  649. package/dist/utils/model-settings.js +35 -0
  650. package/dist/utils/model-settings.js.map +1 -0
  651. package/dist/utils/provider-traffic-extractor.d.ts +1 -0
  652. package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
  653. package/dist/utils/provider-traffic-extractor.js +90 -5
  654. package/dist/utils/provider-traffic-extractor.js.map +1 -1
  655. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
  656. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
  657. package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
  658. package/dist/utils/settings-command.d.ts +1 -1
  659. package/dist/utils/settings-command.d.ts.map +1 -1
  660. package/dist/utils/settings-command.js +12 -8
  661. package/dist/utils/settings-command.js.map +1 -1
  662. package/dist/utils/streaming-session-factory.d.ts +1 -1
  663. package/dist/utils/streaming-session-factory.d.ts.map +1 -1
  664. package/dist/utils/streaming-session-factory.js +5 -2
  665. package/dist/utils/streaming-session-factory.js.map +1 -1
  666. package/dist/utils/streaming-session-factory.test.js +2 -2
  667. package/dist/utils/streaming-session-factory.test.js.map +1 -1
  668. package/dist/utils/streaming-updater.d.ts +2 -1
  669. package/dist/utils/streaming-updater.d.ts.map +1 -1
  670. package/dist/utils/streaming-updater.js +2 -2
  671. package/dist/utils/streaming-updater.js.map +1 -1
  672. package/dist/utils/throttle.d.ts +6 -1
  673. package/dist/utils/throttle.d.ts.map +1 -1
  674. package/dist/utils/throttle.js +11 -6
  675. package/dist/utils/throttle.js.map +1 -1
  676. package/dist/utils/viewport.d.ts +6 -0
  677. package/dist/utils/viewport.d.ts.map +1 -0
  678. package/dist/utils/viewport.js +20 -0
  679. package/dist/utils/viewport.js.map +1 -0
  680. package/dist/utils/viewport.test.d.ts +2 -0
  681. package/dist/utils/viewport.test.d.ts.map +1 -0
  682. package/dist/utils/viewport.test.js +43 -0
  683. package/dist/utils/viewport.test.js.map +1 -0
  684. package/package.json +8 -4
  685. package/dist/app.model-command-feedback.test.d.ts +0 -2
  686. package/dist/app.model-command-feedback.test.d.ts.map +0 -1
  687. package/dist/app.model-command-feedback.test.js +0 -19
  688. package/dist/app.model-command-feedback.test.js.map +0 -1
  689. package/dist/components/MentorMode.test.d.ts +0 -2
  690. package/dist/components/MentorMode.test.d.ts.map +0 -1
  691. package/dist/components/MentorMode.test.js.map +0 -1
  692. package/dist/components/StatusBar.test.d.ts +0 -2
  693. package/dist/components/StatusBar.test.d.ts.map +0 -1
  694. package/dist/components/StatusBar.test.js +0 -19
  695. package/dist/components/StatusBar.test.js.map +0 -1
  696. package/dist/debug-schema.d.ts +0 -2
  697. package/dist/debug-schema.d.ts.map +0 -1
  698. package/dist/debug-schema.js +0 -22
  699. package/dist/debug-schema.js.map +0 -1
  700. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  701. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  702. package/dist/hooks/use-path-completion.test.js +0 -29
  703. package/dist/hooks/use-path-completion.test.js.map +0 -1
  704. package/dist/lib/mentor-client.d.ts +0 -41
  705. package/dist/lib/mentor-client.d.ts.map +0 -1
  706. package/dist/lib/mentor-client.js +0 -146
  707. package/dist/lib/mentor-client.js.map +0 -1
  708. package/dist/lib/mentor-client.test.d.ts +0 -2
  709. package/dist/lib/mentor-client.test.d.ts.map +0 -1
  710. package/dist/lib/mentor-client.test.js +0 -440
  711. package/dist/lib/mentor-client.test.js.map +0 -1
  712. package/dist/lib/retry-strategy.d.ts +0 -43
  713. package/dist/lib/retry-strategy.d.ts.map +0 -1
  714. package/dist/lib/retry-strategy.js +0 -93
  715. package/dist/lib/retry-strategy.js.map +0 -1
  716. package/dist/lib/retry-strategy.test.d.ts +0 -2
  717. package/dist/lib/retry-strategy.test.d.ts.map +0 -1
  718. package/dist/lib/retry-strategy.test.js +0 -200
  719. package/dist/lib/retry-strategy.test.js.map +0 -1
  720. package/dist/prompts/default.md.bak +0 -77
  721. package/dist/providers/github-copilot/model-direct.d.ts +0 -34
  722. package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
  723. package/dist/providers/github-copilot/model-direct.js +0 -443
  724. package/dist/providers/github-copilot/model-direct.js.map +0 -1
  725. package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
  726. package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
  727. package/dist/providers/openrouter/merge-messages.test.js +0 -83
  728. package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
  729. package/dist/providers/openrouter.history.test.d.ts +0 -2
  730. package/dist/providers/openrouter.history.test.d.ts.map +0 -1
  731. package/dist/providers/openrouter.history.test.js +0 -533
  732. package/dist/providers/openrouter.history.test.js.map +0 -1
  733. package/dist/reproduce_issue.test.d.ts +0 -2
  734. package/dist/reproduce_issue.test.d.ts.map +0 -1
  735. package/dist/reproduce_issue.test.js +0 -31
  736. package/dist/reproduce_issue.test.js.map +0 -1
  737. package/dist/services/conversation-session.usage.test.d.ts +0 -2
  738. package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
  739. package/dist/services/conversation-session.usage.test.js +0 -59
  740. package/dist/services/conversation-session.usage.test.js.map +0 -1
  741. package/dist/test-search-tool.d.ts +0 -2
  742. package/dist/test-search-tool.d.ts.map +0 -1
  743. package/dist/test-search-tool.js +0 -36
  744. package/dist/test-search-tool.js.map +0 -1
  745. package/dist/types/messages.d.ts +0 -29
  746. package/dist/types/messages.d.ts.map +0 -1
  747. package/dist/types/messages.js +0 -2
  748. package/dist/types/messages.js.map +0 -1
  749. package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
  750. package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
  751. package/dist/utils/extract-command-messages.repro.test.js +0 -31
  752. package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
  753. package/dist/utils/message-utils.d.ts +0 -17
  754. package/dist/utils/message-utils.d.ts.map +0 -1
  755. package/dist/utils/message-utils.js +0 -52
  756. package/dist/utils/message-utils.js.map +0 -1
  757. package/dist/utils/message-utils.test.d.ts +0 -2
  758. package/dist/utils/message-utils.test.d.ts.map +0 -1
  759. package/dist/utils/message-utils.test.js +0 -48
  760. package/dist/utils/message-utils.test.js.map +0 -1
@@ -1,104 +1,14 @@
1
- import { extractCommandMessages, markToolCallAsApprovalRejection } from '../utils/extract-command-messages.js';
2
1
  import { ConversationStore } from './conversation-store.js';
3
- import { ModelBehaviorError } from '@openai/agents';
4
- import { extractUsage } from '../utils/token-usage.js';
2
+ import { decideRetry, MAX_HALLUCINATION_RETRIES } from './conversation-retry-policy.js';
5
3
  import { getProvider } from '../providers/index.js';
6
- import { extractReasoningDelta, extractTextDelta } from './stream-event-parsing.js';
7
- import { captureToolCallArguments, emitCommandMessagesFromItems } from './command-message-streaming.js';
8
4
  import { ApprovalState } from './approval-state.js';
9
- import { createInvalidToolCallDiagnostic } from './logging-contract.js';
10
- const asRecord = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
11
- const getString = (record, key) => {
12
- const value = record?.[key];
13
- return typeof value === 'string' ? value : undefined;
14
- };
15
- const getMethod = (target, key) => {
16
- const record = asRecord(target);
17
- const candidate = record?.[key];
18
- return typeof candidate === 'function' ? candidate : null;
19
- };
20
- const getCallIdFromObject = (value) => {
21
- const record = asRecord(value);
22
- const callId = getString(record, 'callId') ??
23
- getString(record, 'call_id') ??
24
- getString(record, 'tool_call_id') ??
25
- getString(record, 'toolCallId') ??
26
- getString(record, 'id');
27
- if (callId) {
28
- return callId;
29
- }
30
- const rawItem = asRecord(record?.rawItem);
31
- return (getString(rawItem, 'callId') ??
32
- getString(rawItem, 'call_id') ??
33
- getString(rawItem, 'tool_call_id') ??
34
- getString(rawItem, 'toolCallId') ??
35
- getString(rawItem, 'id'));
36
- };
37
- const getCommandFromArgs = (args) => {
38
- if (!args) {
39
- return '';
40
- }
41
- if (typeof args === 'string') {
42
- try {
43
- const parsed = JSON.parse(args);
44
- // Handle shell tool's command parameter
45
- if (parsed?.command) {
46
- return parsed.command;
47
- }
48
- // Fallback for old 'commands' array format
49
- if (Array.isArray(parsed?.commands)) {
50
- return parsed.commands.join('\n');
51
- }
52
- return JSON.stringify(parsed);
53
- }
54
- catch {
55
- return args;
56
- }
57
- }
58
- if (typeof args === 'object') {
59
- const argsRecord = asRecord(args);
60
- // Handle shell tool's command parameter
61
- const cmdFromObject = argsRecord?.command !== undefined ? String(argsRecord.command) : undefined;
62
- // Fallback for old 'commands' array format
63
- if (Array.isArray(argsRecord?.commands)) {
64
- return argsRecord.commands.join('\n');
65
- }
66
- let argsFromObject;
67
- if (argsRecord?.arguments !== undefined) {
68
- const rawArguments = argsRecord.arguments;
69
- if (typeof rawArguments === 'string') {
70
- try {
71
- argsFromObject = JSON.stringify(JSON.parse(rawArguments));
72
- }
73
- catch {
74
- argsFromObject = String(rawArguments);
75
- }
76
- }
77
- else if (rawArguments !== undefined) {
78
- argsFromObject = String(rawArguments);
79
- }
80
- }
81
- return cmdFromObject ?? argsFromObject ?? JSON.stringify(args);
82
- }
83
- return String(args);
84
- };
85
- /**
86
- * Maximum number of retries when the model hallucinates a tool
87
- */
88
- const MAX_HALLUCINATION_RETRIES = 2;
89
- /**
90
- * Check if an error is a recoverable model behavior error (hallucination, parsing error, etc.)
91
- */
92
- const isRecoverableModelError = (error) => {
93
- if (!(error instanceof ModelBehaviorError)) {
94
- return false;
95
- }
96
- const message = error.message.toLowerCase();
97
- return ((message.includes('tool') && message.includes('not found')) || // Hallucination
98
- message.includes('model did not produce a final response') || // Give up/exhausted
99
- message.includes('parsing tool arguments') || // Bad JSON
100
- message.includes('valid json'));
101
- };
5
+ import { collectTerminalResult } from './terminal-result-collector.js';
6
+ import { getMethod } from './interruption-info.js';
7
+ import { createStreamAccumulator, processStreamEvents } from './stream-event-processor.js';
8
+ import { ShellAutoApprovalResolver } from './shell-auto-approval-resolver.js';
9
+ import { ApprovalFlowCoordinator } from './approval-flow-coordinator.js';
10
+ import { buildConversationResult, toTerminalEvent } from './conversation-result-builder.js';
11
+ import { normalizeUserTurn } from '../types/user-turn.js';
102
12
  const supportsConversationChaining = (providerId) => {
103
13
  const providerDef = getProvider(providerId);
104
14
  return providerDef?.capabilities?.supportsConversationChaining ?? false;
@@ -110,15 +20,29 @@ export class ConversationSession {
110
20
  conversationStore;
111
21
  previousResponseId = null;
112
22
  approvalState = new ApprovalState();
113
- textDeltaCount = 0;
114
- reasoningDeltaCount = 0;
115
23
  toolCallArgumentsById = new Map();
116
24
  emittedInvalidToolCallPackets = new Set();
117
- constructor(id, { agentClient, deps }) {
25
+ shellAutoApproval;
26
+ approvalFlow;
27
+ settingsService;
28
+ constructor(id, { agentClient, deps, }) {
118
29
  this.id = id;
119
30
  this.agentClient = agentClient;
120
31
  this.logger = deps.logger;
32
+ this.settingsService = deps.settingsService;
121
33
  this.conversationStore = new ConversationStore();
34
+ this.shellAutoApproval = new ShellAutoApprovalResolver({
35
+ conversationStore: this.conversationStore,
36
+ agentClient: this.agentClient,
37
+ logger: this.logger,
38
+ settingsService: this.settingsService,
39
+ });
40
+ this.approvalFlow = new ApprovalFlowCoordinator({
41
+ agentClient: this.agentClient,
42
+ approvalState: this.approvalState,
43
+ logger: this.logger,
44
+ sessionId: this.id,
45
+ });
122
46
  }
123
47
  reset() {
124
48
  this.previousResponseId = null;
@@ -126,6 +50,7 @@ export class ConversationSession {
126
50
  this.approvalState.clearPending();
127
51
  this.approvalState.consumeAborted();
128
52
  this.toolCallArgumentsById.clear();
53
+ this.shellAutoApproval.clearCache();
129
54
  const clearConversations = getMethod(this.agentClient, 'clearConversations');
130
55
  clearConversations?.call(this.agentClient);
131
56
  }
@@ -156,38 +81,30 @@ export class ConversationSession {
156
81
  * Abort the current running operation
157
82
  */
158
83
  abort() {
159
- this.agentClient.abort();
160
- // Save pending approval context so we can handle it in the next message
161
- if (this.approvalState.abortPending()) {
162
- this.logger.debug('Aborted approval - will handle rejection on next message', {
163
- eventType: 'approval.aborted',
164
- category: 'approval',
165
- phase: 'abort',
166
- sessionId: this.id,
167
- traceId: this.logger.getCorrelationId(),
168
- });
169
- }
84
+ this.approvalFlow.abort();
170
85
  }
171
86
  /**
172
87
  * Phase 4: stream conversation events as an async iterator.
173
88
  *
174
89
  * This is the transport-friendly primitive that can later be bridged to SSE/WebSockets.
175
90
  */
176
- async *run(text, { hallucinationRetryCount = 0, skipUserMessage = false, } = {}) {
91
+ async *run(input, { hallucinationRetryCount = 0, skipUserMessage = false, } = {}) {
177
92
  let stream = null;
93
+ const turn = normalizeUserTurn(input);
94
+ const text = turn.text;
178
95
  try {
179
- this.logger.info('Conversation stream start', {
96
+ this.logger.debug('Conversation stream start', {
180
97
  eventType: 'stream.started',
181
98
  category: 'stream',
182
99
  phase: 'request_start',
183
100
  sessionId: this.id,
184
101
  traceId: this.logger.getCorrelationId(),
185
102
  });
186
- const abortedContext = this.approvalState.consumeAborted();
103
+ const abortedContext = this.approvalFlow.consumeAborted();
187
104
  const shouldAddUserMessage = !skipUserMessage && !abortedContext;
188
105
  // Maintain canonical local history regardless of provider.
189
106
  if (shouldAddUserMessage) {
190
- this.conversationStore.addUserMessage(text);
107
+ this.conversationStore.addUserTurn(turn);
191
108
  }
192
109
  // If there's an aborted approval, we need to resolve it first.
193
110
  // The user's message is a new input, but the agent is stuck waiting for tool output.
@@ -195,56 +112,39 @@ export class ConversationSession {
195
112
  this.logger.debug('Resolving aborted approval with fake execution', {
196
113
  message: text,
197
114
  });
198
- const { state, interruption, emittedCommandIds, toolCallArgumentsById } = abortedContext;
199
- const interruptionRecord = asRecord(interruption);
200
115
  // Restore cached tool-call arguments captured before abort so continuation can attach them
201
116
  this.toolCallArgumentsById.clear();
202
- if (toolCallArgumentsById?.size) {
203
- for (const [key, value] of toolCallArgumentsById.entries()) {
117
+ if (abortedContext.toolCallArgumentsById?.size) {
118
+ for (const [key, value] of abortedContext.toolCallArgumentsById.entries()) {
204
119
  this.toolCallArgumentsById.set(key, value);
205
120
  }
206
121
  }
207
- // Add interceptor for this tool execution
208
- const toolName = getString(interruptionRecord, 'name') ?? 'unknown';
209
- const expectedCallId = getCallIdFromObject(interruption);
210
- const rejectionMessage = `Tool execution was not approved. User provided new input instead: ${text}`;
211
- const removeInterceptor = this.agentClient.addToolInterceptor(async (name, _params, toolCallId) => {
212
- // Match both tool name and call ID for stricter matching
213
- if (name === toolName && (!expectedCallId || toolCallId === expectedCallId)) {
214
- markToolCallAsApprovalRejection(toolCallId ?? expectedCallId);
215
- return rejectionMessage;
216
- }
217
- return null;
218
- });
219
- const approve = getMethod(state, 'approve');
220
- approve?.call(state, interruption);
122
+ const { removeInterceptor } = this.approvalFlow.prepareAbortResolution(abortedContext, text);
221
123
  try {
222
- const continuedStream = (await this.agentClient.continueRunStream(state, {
124
+ const continuedStream = (await this.agentClient.continueRunStream(abortedContext.state, {
223
125
  previousResponseId: this.previousResponseId,
224
126
  }));
225
- const acc = {
226
- finalOutput: '',
227
- reasoningOutput: '',
228
- emittedCommandIds: new Set(emittedCommandIds),
229
- latestUsage: undefined,
230
- };
231
- yield* this.#streamEvents(continuedStream, acc, {
127
+ const acc = createStreamAccumulator();
128
+ acc.emittedCommandIds = new Set(abortedContext.emittedCommandIds);
129
+ yield* processStreamEvents(continuedStream, acc, {
130
+ toolCallArgumentsById: this.toolCallArgumentsById,
131
+ emittedInvalidToolCallPackets: this.emittedInvalidToolCallPackets,
232
132
  preserveExistingToolArgs: true,
233
- });
133
+ }, { logger: this.logger, sessionId: this.id });
234
134
  this.previousResponseId = continuedStream.lastResponseId ?? null;
235
135
  this.conversationStore.updateFromResult(continuedStream);
236
136
  // Check if another interruption occurred
237
137
  if (continuedStream.interruptions && continuedStream.interruptions.length > 0) {
238
138
  this.logger.warn('Another interruption occurred after fake execution - handling as approval');
239
139
  // Let the normal flow handle this
240
- const result = this.#buildResult(continuedStream, acc.finalOutput, acc.reasoningOutput, acc.emittedCommandIds, acc.latestUsage);
241
- yield this.#toTerminalEvent(result);
140
+ const resolvedResult = yield* this.#buildAndResolve(continuedStream, acc.finalOutput, acc.reasoningOutput, acc.emittedCommandIds, acc.latestUsage);
141
+ yield toTerminalEvent(resolvedResult);
242
142
  return;
243
143
  }
244
144
  // Successfully resolved - agent should now have processed the fake rejection
245
145
  this.logger.debug('Fake execution completed, agent received rejection message');
246
- const result = this.#buildResult(continuedStream, acc.finalOutput, acc.reasoningOutput, acc.emittedCommandIds, acc.latestUsage);
247
- yield this.#toTerminalEvent(result);
146
+ const resolvedResult = yield* this.#buildAndResolve(continuedStream, acc.finalOutput, acc.reasoningOutput, acc.emittedCommandIds, acc.latestUsage);
147
+ yield toTerminalEvent(resolvedResult);
248
148
  return;
249
149
  }
250
150
  catch (error) {
@@ -262,86 +162,63 @@ export class ConversationSession {
262
162
  const getProvider = getMethod(this.agentClient, 'getProvider');
263
163
  const provider = getProvider ? getProvider.call(this.agentClient) : 'openai';
264
164
  const supportsChaining = supportsConversationChaining(provider);
265
- stream = (await this.agentClient.startStream(supportsChaining ? text : this.conversationStore.getHistory(), {
165
+ const history = this.conversationStore.getHistory();
166
+ const latestInput = history[history.length - 1] ?? text;
167
+ const chainedInput = turn.images?.length ? latestInput : text;
168
+ stream = (await this.agentClient.startStream(supportsChaining ? chainedInput : history, {
266
169
  previousResponseId: this.previousResponseId,
267
170
  }));
268
- const acc = {
269
- finalOutput: '',
270
- reasoningOutput: '',
271
- emittedCommandIds: new Set(),
272
- latestUsage: undefined,
273
- };
274
- yield* this.#streamEvents(stream, acc, {
171
+ const acc = createStreamAccumulator();
172
+ yield* processStreamEvents(stream, acc, {
173
+ toolCallArgumentsById: this.toolCallArgumentsById,
174
+ emittedInvalidToolCallPackets: this.emittedInvalidToolCallPackets,
275
175
  preserveExistingToolArgs: false,
276
- });
176
+ }, { logger: this.logger, sessionId: this.id });
277
177
  this.previousResponseId = stream.lastResponseId ?? null;
278
178
  this.conversationStore.updateFromResult(stream);
279
- // Build terminal event (approval_required or final)
280
- const result = this.#buildResult(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
281
- if (result.type === 'approval_required') {
282
- this.logger.info('Tool approval required', {
179
+ const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
180
+ if (resolvedResult.type === 'approval_required') {
181
+ this.logger.debug('Tool approval required', {
283
182
  eventType: 'approval.required',
284
183
  category: 'approval',
285
184
  phase: 'approval',
286
185
  sessionId: this.id,
287
186
  traceId: this.logger.getCorrelationId(),
288
- toolName: result.approval.toolName,
187
+ toolName: resolvedResult.approval.toolName,
289
188
  });
290
- yield this.#toTerminalEvent(result);
189
+ yield toTerminalEvent(resolvedResult);
291
190
  return;
292
191
  }
293
- yield this.#toTerminalEvent(result);
192
+ yield toTerminalEvent(resolvedResult);
294
193
  }
295
194
  catch (error) {
296
- // Handle recoverable model errors (hallucination, parsing error, etc.)
297
- if (isRecoverableModelError(error) && hallucinationRetryCount < MAX_HALLUCINATION_RETRIES) {
298
- const message = error instanceof Error ? error.message : String(error);
299
- const isHallucination = message.toLowerCase().includes('not found');
300
- const isParsingError = message.toLowerCase().includes('parsing tool arguments') || message.toLowerCase().includes('valid json');
301
- const toolName = isHallucination ? message.match(/Tool (\S+) not found/)?.[1] || 'unknown' : 'unknown';
195
+ const streamHistoryLength = Array.isArray(stream?.history) ? stream.history.length : 0;
196
+ const decision = decideRetry(error, hallucinationRetryCount, Boolean(stream), streamHistoryLength);
197
+ if (decision.kind === 'retry') {
302
198
  this.logger.warn('Recoverable model error detected, retrying', {
303
199
  eventType: 'retry.model_error',
304
200
  category: 'retry',
305
201
  phase: 'retry',
306
- toolName,
307
- retryType: isHallucination ? 'hallucination' : isParsingError ? 'parsing_error' : 'behavior',
308
- retryAttempt: hallucinationRetryCount + 1,
309
- attempt: hallucinationRetryCount + 1,
202
+ toolName: decision.logPayload.toolName,
203
+ retryType: decision.logPayload.retryType,
204
+ retryAttempt: decision.attempt,
205
+ attempt: decision.attempt,
310
206
  maxRetries: MAX_HALLUCINATION_RETRIES,
311
207
  sessionId: this.id,
312
208
  traceId: this.logger.getCorrelationId(),
313
- errorMessage: message,
209
+ errorMessage: decision.message,
314
210
  });
315
- yield {
316
- type: 'retry',
317
- toolName: isHallucination ? toolName : 'model',
318
- attempt: hallucinationRetryCount + 1,
319
- maxRetries: MAX_HALLUCINATION_RETRIES,
320
- errorMessage: message,
321
- };
322
- if (stream) {
323
- // Update conversation store with partial results (including the parse error output if it was yielded)
211
+ yield decision.retryEvent;
212
+ if (decision.hadStream && stream) {
324
213
  this.conversationStore.updateFromResult(stream);
325
- // If stream produced no usable history, inject error context so the
326
- // model has explicit feedback about the failure on retry.
327
- const streamHistory = Array.isArray(stream.history) ? stream.history : [];
328
- if (streamHistory.length === 0) {
329
- this.conversationStore.addErrorContext(`[System: Previous attempt failed with error: ${message}. Please retry with corrected output.]`);
214
+ if (decision.shouldInjectErrorContext) {
215
+ this.conversationStore.addErrorContext(decision.errorContextMessage);
330
216
  }
331
- // Retry from current state without re-adding user message
332
- yield* this.run(text, {
333
- hallucinationRetryCount: hallucinationRetryCount + 1,
334
- skipUserMessage: true,
335
- });
336
217
  }
337
218
  else {
338
- // Failed to start stream at all - clean slate retry
339
219
  this.conversationStore.removeLastUserMessage();
340
- yield* this.run(text, {
341
- hallucinationRetryCount: hallucinationRetryCount + 1,
342
- // skipUserMessage defaults to false, so user message is re-added
343
- });
344
220
  }
221
+ yield* this.run(turn, decision.nextRunOptions);
345
222
  return;
346
223
  }
347
224
  yield {
@@ -365,58 +242,14 @@ export class ConversationSession {
365
242
  * Named as a string-literal because `continue` is a keyword.
366
243
  */
367
244
  async *['continue']({ answer, rejectionReason, }) {
368
- const pendingApprovalContext = this.approvalState.getPending();
369
- if (!pendingApprovalContext) {
245
+ const plan = this.approvalFlow.prepareContinuation(answer, rejectionReason);
246
+ if (!plan) {
370
247
  return;
371
248
  }
372
- const { state, interruption, emittedCommandIds: previouslyEmittedIds, toolCallArgumentsById, } = pendingApprovalContext;
373
- const interruptionRecord = asRecord(interruption);
374
- let removeInterceptor = null;
375
- if (answer === 'y') {
376
- this.logger.info('Tool approval granted', {
377
- eventType: 'approval.granted',
378
- category: 'approval',
379
- phase: 'approval',
380
- sessionId: this.id,
381
- traceId: this.logger.getCorrelationId(),
382
- });
383
- const approve = getMethod(state, 'approve');
384
- approve?.call(state, interruption);
385
- }
386
- else {
387
- const toolName = getString(interruptionRecord, 'name') ?? 'unknown';
388
- const expectedCallId = getCallIdFromObject(interruption);
389
- const rejectionMessage = rejectionReason
390
- ? `Tool execution was not approved. User's reason: ${rejectionReason}`
391
- : 'Tool execution was not approved.';
392
- if (typeof this.agentClient.addToolInterceptor === 'function') {
393
- const removeInterceptor = this.agentClient.addToolInterceptor(async (name, _params, toolCallId) => {
394
- if (name === toolName && (!expectedCallId || toolCallId === expectedCallId)) {
395
- markToolCallAsApprovalRejection(toolCallId ?? expectedCallId);
396
- return rejectionMessage;
397
- }
398
- return null;
399
- });
400
- // Approve to continue but interceptor will return rejection message
401
- const approve = getMethod(state, 'approve');
402
- approve?.call(state, interruption);
403
- // Store interceptor cleanup for after stream
404
- this.approvalState.setPendingRemoveInterceptor(removeInterceptor);
405
- }
406
- else {
407
- // Fallback for clients without tool interceptors
408
- const reject = getMethod(state, 'reject');
409
- reject?.call(state, interruption);
410
- }
411
- this.logger.info('Tool approval rejected', {
412
- eventType: 'approval.rejected',
413
- category: 'approval',
414
- phase: 'approval',
415
- sessionId: this.id,
416
- traceId: this.logger.getCorrelationId(),
417
- });
249
+ const { pendingApprovalContext: { state, toolCallArgumentsById, emittedCommandIds: previouslyEmittedIds }, toolStartedEvent, removeInterceptor, } = plan;
250
+ if (toolStartedEvent) {
251
+ yield toolStartedEvent;
418
252
  }
419
- removeInterceptor = this.approvalState.getPending()?.removeInterceptor ?? null;
420
253
  // Restore cached tool-call arguments so continuation outputs can attach them
421
254
  this.toolCallArgumentsById.clear();
422
255
  if (toolCallArgumentsById?.size) {
@@ -428,34 +261,31 @@ export class ConversationSession {
428
261
  const stream = (await this.agentClient.continueRunStream(state, {
429
262
  previousResponseId: this.previousResponseId,
430
263
  }));
431
- const acc = {
432
- finalOutput: '',
433
- reasoningOutput: '',
434
- emittedCommandIds: new Set(),
435
- latestUsage: undefined,
436
- };
437
- yield* this.#streamEvents(stream, acc, {
264
+ const acc = createStreamAccumulator();
265
+ yield* processStreamEvents(stream, acc, {
266
+ toolCallArgumentsById: this.toolCallArgumentsById,
267
+ emittedInvalidToolCallPackets: this.emittedInvalidToolCallPackets,
438
268
  preserveExistingToolArgs: true,
439
- });
269
+ }, { logger: this.logger, sessionId: this.id });
440
270
  this.previousResponseId = stream.lastResponseId ?? null;
441
271
  this.conversationStore.updateFromResult(stream);
442
272
  // Merge previously emitted command IDs with newly emitted ones
443
273
  // This prevents duplicates when result.history contains commands from the initial stream
444
274
  const allEmittedIds = new Set([...previouslyEmittedIds, ...acc.emittedCommandIds]);
445
- const result = this.#buildResult(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, allEmittedIds, acc.latestUsage);
446
- if (result.type === 'approval_required') {
447
- this.logger.info('Tool approval required', {
275
+ const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, allEmittedIds, acc.latestUsage);
276
+ if (resolvedResult.type === 'approval_required') {
277
+ this.logger.debug('Tool approval required', {
448
278
  eventType: 'approval.required',
449
279
  category: 'approval',
450
280
  phase: 'approval',
451
281
  sessionId: this.id,
452
282
  traceId: this.logger.getCorrelationId(),
453
- toolName: result.approval.toolName,
283
+ toolName: resolvedResult.approval.toolName,
454
284
  });
455
- yield this.#toTerminalEvent(result);
285
+ yield toTerminalEvent(resolvedResult);
456
286
  return;
457
287
  }
458
- yield this.#toTerminalEvent(result);
288
+ yield toTerminalEvent(resolvedResult);
459
289
  }
460
290
  catch (error) {
461
291
  yield {
@@ -466,468 +296,112 @@ export class ConversationSession {
466
296
  }
467
297
  finally {
468
298
  // Clean up interceptor if one was added for rejection reason
469
- removeInterceptor?.();
299
+ removeInterceptor();
470
300
  }
471
301
  }
472
- async sendMessage(text, { onTextChunk, onReasoningChunk, onCommandMessage, onEvent, hallucinationRetryCount = 0, } = {}) {
473
- let finalText = '';
474
- let reasoningText = '';
475
- const commandMessages = [];
476
- let usage;
477
- let sawTerminalEvent = null;
478
- for await (const event of this.run(text, { hallucinationRetryCount })) {
479
- onEvent?.(event);
480
- switch (event.type) {
481
- case 'text_delta': {
482
- const full = event.fullText ?? '';
483
- onTextChunk?.(full, event.delta);
484
- break;
485
- }
486
- case 'reasoning_delta': {
487
- const full = event.fullText ?? '';
488
- onReasoningChunk?.(full, event.delta);
489
- break;
490
- }
491
- case 'command_message': {
492
- onCommandMessage?.(event.message);
493
- break;
494
- }
495
- case 'approval_required': {
496
- sawTerminalEvent = event;
497
- // pendingApprovalContext is set inside #buildResult during run()
498
- const rawInterruption = this.approvalState.getPending()?.interruption;
499
- return {
500
- type: 'approval_required',
501
- approval: {
502
- agentName: event.approval.agentName,
503
- toolName: event.approval.toolName,
504
- argumentsText: event.approval.argumentsText,
505
- rawInterruption,
506
- callId: event.approval.callId,
507
- },
508
- };
509
- }
510
- case 'final': {
511
- sawTerminalEvent = event;
512
- finalText = event.finalText;
513
- reasoningText = event.reasoningText ?? '';
514
- usage = event.usage;
515
- this.logger.debug('sendMessage received final event', {
516
- sessionId: this.id,
517
- hasUsage: Boolean(event.usage),
518
- usage: event.usage,
519
- });
520
- if (event.commandMessages?.length) {
521
- for (const msg of event.commandMessages) {
522
- commandMessages.push(msg);
523
- }
524
- }
525
- break;
526
- }
527
- case 'error': {
528
- // Preserve legacy behavior (throwing) by throwing after the stream ends.
529
- break;
530
- }
531
- default:
532
- break;
533
- }
534
- }
535
- // If we didn't see a terminal event, fall back to the legacy default.
536
- if (!sawTerminalEvent) {
537
- finalText = finalText || 'Done.';
538
- }
539
- const response = {
540
- type: 'response',
541
- commandMessages,
542
- finalText: finalText || 'Done.',
543
- ...(reasoningText ? { reasoningText } : {}),
544
- ...(usage ? { usage } : {}),
545
- };
546
- this.logger.debug('sendMessage returning response', {
547
- sessionId: this.id,
548
- hasUsage: Boolean(usage),
549
- usage,
302
+ async sendMessage(input, { onTextChunk, onReasoningChunk, onCommandMessage, onEvent, hallucinationRetryCount = 0, } = {}) {
303
+ const result = await collectTerminalResult(this.run(input, { hallucinationRetryCount }), {
304
+ onTextChunk,
305
+ onReasoningChunk,
306
+ onCommandMessage,
307
+ onEvent,
308
+ getRawInterruption: () => this.approvalFlow.getPendingInterruption(),
309
+ onFinalEvent: (event) => {
310
+ this.logger.debug('sendMessage received final event', {
311
+ sessionId: this.id,
312
+ hasUsage: Boolean(event.usage),
313
+ usage: event.usage,
314
+ });
315
+ },
550
316
  });
551
- return response;
317
+ if (result.type === 'response') {
318
+ this.logger.debug('sendMessage returning response', {
319
+ sessionId: this.id,
320
+ hasUsage: Boolean(result.usage),
321
+ usage: result.usage,
322
+ });
323
+ }
324
+ return result;
552
325
  }
553
326
  async handleApprovalDecision(answer, rejectionReason, { onTextChunk, onReasoningChunk, onCommandMessage, onEvent, } = {}) {
554
- if (!this.approvalState.getPending()) {
327
+ if (!this.approvalFlow.getPending()) {
555
328
  return null;
556
329
  }
557
- let finalText = '';
558
- let reasoningText = '';
559
- const commandMessages = [];
560
- let usage;
561
- let sawTerminalEvent = null;
562
- for await (const event of this['continue']({ answer, rejectionReason })) {
563
- onEvent?.(event);
564
- switch (event.type) {
565
- case 'text_delta': {
566
- const full = event.fullText ?? '';
567
- onTextChunk?.(full, event.delta);
568
- break;
569
- }
570
- case 'reasoning_delta': {
571
- const full = event.fullText ?? '';
572
- onReasoningChunk?.(full, event.delta);
573
- break;
574
- }
575
- case 'command_message': {
576
- onCommandMessage?.(event.message);
577
- break;
578
- }
579
- case 'approval_required': {
580
- sawTerminalEvent = event;
581
- const rawInterruption = this.approvalState.getPending()?.interruption;
582
- return {
583
- type: 'approval_required',
584
- approval: {
585
- agentName: event.approval.agentName,
586
- toolName: event.approval.toolName,
587
- argumentsText: event.approval.argumentsText,
588
- rawInterruption,
589
- callId: event.approval.callId,
590
- },
591
- };
592
- }
593
- case 'final': {
594
- sawTerminalEvent = event;
595
- finalText = event.finalText;
596
- reasoningText = event.reasoningText ?? '';
597
- usage = event.usage;
598
- this.logger.debug('handleApprovalDecision received final event', {
599
- sessionId: this.id,
600
- hasUsage: Boolean(event.usage),
601
- usage: event.usage,
602
- });
603
- if (event.commandMessages?.length) {
604
- for (const msg of event.commandMessages) {
605
- commandMessages.push(msg);
606
- }
607
- }
608
- break;
609
- }
610
- case 'error': {
611
- break;
612
- }
613
- default:
614
- break;
615
- }
616
- }
617
- if (!sawTerminalEvent) {
618
- const response = {
619
- type: 'response',
620
- commandMessages,
621
- finalText: finalText || 'Done.',
622
- ...(reasoningText ? { reasoningText } : {}),
623
- ...(usage ? { usage } : {}),
624
- };
330
+ const result = await collectTerminalResult(this['continue']({ answer, rejectionReason }), {
331
+ onTextChunk,
332
+ onReasoningChunk,
333
+ onCommandMessage,
334
+ onEvent,
335
+ getRawInterruption: () => this.approvalFlow.getPendingInterruption(),
336
+ onFinalEvent: (event) => {
337
+ this.logger.debug('handleApprovalDecision received final event', {
338
+ sessionId: this.id,
339
+ hasUsage: Boolean(event.usage),
340
+ usage: event.usage,
341
+ });
342
+ },
343
+ });
344
+ if (result.type === 'response') {
625
345
  this.logger.debug('handleApprovalDecision returning response', {
626
346
  sessionId: this.id,
627
- hasUsage: Boolean(usage),
628
- usage,
347
+ hasUsage: Boolean(result.usage),
348
+ usage: result.usage,
629
349
  });
630
- return response;
631
350
  }
632
- const response = {
633
- type: 'response',
634
- commandMessages,
635
- finalText: finalText || 'Done.',
636
- ...(reasoningText ? { reasoningText } : {}),
637
- ...(usage ? { usage } : {}),
638
- };
639
- this.logger.debug('handleApprovalDecision returning response', {
640
- sessionId: this.id,
641
- hasUsage: Boolean(usage),
351
+ return result;
352
+ }
353
+ async *#buildAndResolve(result, finalOutputOverride, reasoningOutputOverride, emittedCommandIds, usage) {
354
+ const outcome = await buildConversationResult({
355
+ result,
356
+ finalOutputOverride,
357
+ reasoningOutputOverride,
358
+ emittedCommandIds,
642
359
  usage,
360
+ toolCallArgumentsById: this.toolCallArgumentsById,
361
+ }, {
362
+ approvalFlow: this.approvalFlow,
363
+ shellAutoApproval: this.shellAutoApproval,
364
+ logger: this.logger,
365
+ sessionId: this.id,
643
366
  });
644
- return response;
645
- }
646
- async *#streamEvents(stream, acc, { preserveExistingToolArgs }) {
647
- const toolCallArgumentsById = this.toolCallArgumentsById;
648
- if (!preserveExistingToolArgs) {
649
- toolCallArgumentsById.clear();
367
+ if (outcome.kind !== 'auto_approve') {
368
+ return outcome.result;
650
369
  }
651
- this.textDeltaCount = 0;
652
- this.reasoningDeltaCount = 0;
653
- const emitText = (delta) => {
654
- if (!delta) {
655
- return null;
656
- }
657
- acc.finalOutput += delta;
658
- this.textDeltaCount++;
659
- return {
660
- type: 'text_delta',
661
- delta,
662
- fullText: acc.finalOutput,
663
- };
664
- };
665
- const emitReasoning = (delta) => {
666
- if (!delta || delta.replaceAll('\n', '') === '') {
667
- return null;
668
- }
669
- acc.reasoningOutput += delta;
670
- this.reasoningDeltaCount++;
671
- return {
672
- type: 'reasoning_delta',
673
- delta,
674
- fullText: acc.reasoningOutput,
675
- };
676
- };
677
- for await (const rawEvent of stream) {
678
- const event = asRecord(rawEvent);
679
- const eventData = asRecord(event?.data);
680
- const eventType = getString(event, 'type');
681
- // Extract usage if present in any of the common locations.
682
- // Check both the top-level event and event.data, since raw_model_stream_event
683
- // nests response data (including usage) under .data (e.g. data.response.usage).
684
- const usage = extractUsage(rawEvent) ?? (eventData ? extractUsage(eventData) : undefined);
685
- if (usage) {
686
- acc.latestUsage = usage;
687
- this.logger.debug('Usage extracted from stream event', {
688
- sessionId: this.id,
689
- source: 'stream_event',
690
- eventType: eventType ?? getString(eventData, 'type') ?? 'unknown',
691
- usage,
692
- });
693
- // Emit usage update event for real-time token tracking
694
- yield {
695
- type: 'usage_update',
696
- usage,
370
+ let finalText = '';
371
+ let reasoningText = '';
372
+ let finalUsage;
373
+ const commandMessages = [];
374
+ let approvalRequiredResult;
375
+ for await (const event of this['continue']({ answer: 'y' })) {
376
+ yield event;
377
+ if (event.type === 'approval_required') {
378
+ approvalRequiredResult = {
379
+ type: 'approval_required',
380
+ approval: {
381
+ ...event.approval,
382
+ rawInterruption: this.approvalFlow.getPendingInterruption(),
383
+ },
697
384
  };
698
385
  }
699
- // Log event type with deduplication for ordering understanding
700
- const delta1 = extractTextDelta(rawEvent);
701
- if (delta1) {
702
- const e = emitText(delta1);
703
- if (e)
704
- yield e;
705
- }
706
- if (eventData) {
707
- const delta2 = extractTextDelta(eventData);
708
- if (delta2) {
709
- const e = emitText(delta2);
710
- if (e)
711
- yield e;
712
- }
713
- }
714
- // Handle reasoning items
715
- const reasoningDelta = extractReasoningDelta(rawEvent);
716
- if (reasoningDelta) {
717
- const e = emitReasoning(reasoningDelta);
718
- if (e)
719
- yield e;
720
- }
721
- const maybeEmitCommandMessagesFromItems = (items) => emitCommandMessagesFromItems(items, {
722
- toolCallArgumentsById,
723
- emittedCommandIds: acc.emittedCommandIds,
724
- });
725
- if (eventType === 'run_item_stream_event') {
726
- const eventItem = event?.item;
727
- const eventItemRecord = asRecord(eventItem);
728
- captureToolCallArguments(eventItem, toolCallArgumentsById);
729
- // Emit tool_started event when a function_call is detected
730
- const rawItem = asRecord(eventItemRecord?.rawItem) ?? eventItemRecord;
731
- if (getString(rawItem, 'type') === 'function_call') {
732
- const callId = getString(rawItem, 'callId') ??
733
- getString(rawItem, 'call_id') ??
734
- getString(rawItem, 'tool_call_id') ??
735
- getString(rawItem, 'toolCallId') ??
736
- getString(rawItem, 'id');
737
- if (callId) {
738
- const toolName = getString(rawItem, 'name') ?? getString(eventItemRecord, 'name');
739
- const args = rawItem?.arguments ?? rawItem?.args ?? eventItemRecord?.arguments ?? eventItemRecord?.args;
740
- // Providers sometimes surface arguments as a JSON string.
741
- // Normalize here so downstream UI (pending/running display)
742
- // can reliably render parameters.
743
- const normalizedArgs = (() => {
744
- if (typeof args !== 'string') {
745
- return args;
746
- }
747
- const trimmed = args.trim();
748
- if (!trimmed) {
749
- return args;
750
- }
751
- try {
752
- return JSON.parse(trimmed);
753
- }
754
- catch {
755
- if ((trimmed.startsWith('{') || trimmed.startsWith('[')) &&
756
- !this.emittedInvalidToolCallPackets.has(String(callId))) {
757
- this.emittedInvalidToolCallPackets.add(String(callId));
758
- const diagnostic = createInvalidToolCallDiagnostic({
759
- toolName: toolName ?? 'unknown',
760
- toolCallId: String(callId),
761
- rawPayload: trimmed,
762
- normalizedToolCall: {
763
- toolName: toolName ?? 'unknown',
764
- toolCallId: String(callId),
765
- arguments: args,
766
- },
767
- validationErrors: ['arguments must be valid JSON'],
768
- traceId: this.logger.getCorrelationId() ?? 'trace-unknown',
769
- retryContext: {
770
- sessionId: this.id,
771
- },
772
- });
773
- this.logger.error('Invalid tool call argument payload', {
774
- ...diagnostic,
775
- sessionId: this.id,
776
- messageId: String(callId),
777
- });
778
- }
779
- return args;
780
- }
781
- })();
782
- yield {
783
- type: 'tool_started',
784
- toolCallId: callId,
785
- toolName: toolName ?? 'unknown',
786
- arguments: normalizedArgs,
787
- };
788
- this.logger.info('Tool execution started', {
789
- eventType: 'tool_call.execution_started',
790
- category: 'tool',
791
- phase: 'execution',
792
- sessionId: this.id,
793
- traceId: this.logger.getCorrelationId(),
794
- toolName: toolName ?? 'unknown',
795
- toolCallId: String(callId),
796
- messageId: String(callId),
797
- });
798
- }
799
- }
800
- for (const e of maybeEmitCommandMessagesFromItems([eventItem])) {
801
- yield e;
802
- }
803
- }
804
- else if (eventType === 'tool_call_output_item' ||
805
- getString(asRecord(event?.rawItem), 'type') === 'function_call_output') {
806
- captureToolCallArguments(rawEvent, toolCallArgumentsById);
807
- for (const e of maybeEmitCommandMessagesFromItems([rawEvent])) {
808
- yield e;
386
+ else if (event.type === 'final') {
387
+ finalText = event.finalText;
388
+ reasoningText = event.reasoningText ?? '';
389
+ finalUsage = event.usage;
390
+ if (event.commandMessages) {
391
+ commandMessages.push(...event.commandMessages);
809
392
  }
810
393
  }
811
394
  }
812
- const completedResult = await stream.completed;
813
- const rawResponses = Array.isArray(stream?.rawResponses) ? stream.rawResponses : [];
814
- let usageFromRawResponses;
815
- for (let i = rawResponses.length - 1; i >= 0; i--) {
816
- const candidate = extractUsage(rawResponses[i]);
817
- if (candidate) {
818
- usageFromRawResponses = candidate;
819
- break;
820
- }
821
- }
822
- const finalUsage = extractUsage(completedResult) || extractUsage(stream) || usageFromRawResponses;
823
- if (finalUsage) {
824
- acc.latestUsage = finalUsage;
825
- const usageSource = extractUsage(completedResult)
826
- ? 'completed_result'
827
- : extractUsage(stream)
828
- ? 'stream_object'
829
- : 'stream_raw_responses';
830
- this.logger.debug('Usage extracted from stream completion', {
831
- sessionId: this.id,
832
- source: 'stream_completed',
833
- usageSource,
834
- usage: finalUsage,
835
- });
836
- }
837
- else {
838
- const completedResultRecord = completedResult && typeof completedResult === 'object' && !Array.isArray(completedResult)
839
- ? completedResult
840
- : undefined;
841
- const streamRecord = stream && typeof stream === 'object' && !Array.isArray(stream)
842
- ? stream
843
- : undefined;
844
- this.logger.debug('No usage found in stream completion', {
845
- sessionId: this.id,
846
- source: 'stream_completed',
847
- completedResultType: completedResult === null ? 'null' : Array.isArray(completedResult) ? 'array' : typeof completedResult,
848
- completedResultKeys: completedResultRecord ? Object.keys(completedResultRecord) : [],
849
- streamKeys: streamRecord ? Object.keys(streamRecord) : [],
850
- completedResultHasUsagePath: {
851
- usage: Boolean(completedResultRecord?.usage),
852
- usageMetadata: Boolean(completedResultRecord?.usageMetadata),
853
- usage_metadata: Boolean(completedResultRecord?.usage_metadata),
854
- responseUsage: Boolean(asRecord(completedResultRecord?.response)?.usage),
855
- },
856
- });
857
- }
858
- }
859
- #toTerminalEvent(result) {
860
- if (result.type === 'approval_required') {
861
- return {
862
- type: 'approval_required',
863
- approval: {
864
- agentName: result.approval.agentName,
865
- toolName: result.approval.toolName,
866
- argumentsText: result.approval.argumentsText,
867
- ...(result.approval.callId ? { callId: result.approval.callId } : {}),
868
- },
869
- };
395
+ if (approvalRequiredResult) {
396
+ return approvalRequiredResult;
870
397
  }
871
398
  return {
872
- type: 'final',
873
- finalText: result.finalText,
874
- ...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
875
- ...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
876
- ...(result.usage ? { usage: result.usage } : {}),
877
- };
878
- }
879
- #buildResult(result, finalOutputOverride, reasoningOutputOverride, emittedCommandIds, usage) {
880
- if (result.interruptions && result.interruptions.length > 0) {
881
- const interruption = result.interruptions[0];
882
- this.approvalState.setPending({
883
- state: result.state,
884
- interruption,
885
- emittedCommandIds: emittedCommandIds ?? new Set(),
886
- toolCallArgumentsById: new Map(this.toolCallArgumentsById),
887
- });
888
- let argumentsText = '';
889
- const interruptionRecord = asRecord(interruption);
890
- const toolName = getString(interruptionRecord, 'name');
891
- // For shell_call (built-in shell tool), extract commands from action
892
- // For function tools (bash, shell), extract from arguments
893
- if (getString(interruptionRecord, 'type') === 'shell_call') {
894
- const action = asRecord(interruptionRecord?.action);
895
- const actionCommands = action?.commands;
896
- if (actionCommands) {
897
- argumentsText = Array.isArray(actionCommands) ? actionCommands.join('\n') : String(actionCommands);
898
- }
899
- }
900
- else {
901
- argumentsText = getCommandFromArgs(interruptionRecord?.arguments);
902
- }
903
- const agent = asRecord(interruptionRecord?.agent);
904
- const callId = getCallIdFromObject(interruption);
905
- return {
906
- type: 'approval_required',
907
- approval: {
908
- agentName: getString(agent, 'name') ?? 'Agent',
909
- toolName: toolName ?? 'Unknown Tool',
910
- argumentsText,
911
- rawInterruption: interruption,
912
- ...(callId ? { callId: String(callId) } : {}),
913
- },
914
- };
915
- }
916
- this.approvalState.clearPending();
917
- const allCommandMessages = extractCommandMessages(result.newItems || result.history || []);
918
- // Filter out commands that were already emitted in real-time
919
- const commandMessages = emittedCommandIds
920
- ? allCommandMessages.filter((msg) => !emittedCommandIds.has(msg.id))
921
- : allCommandMessages;
922
- const visibleCommandMessages = commandMessages.filter((msg) => !msg.isApprovalRejection);
923
- const response = {
924
399
  type: 'response',
925
- commandMessages: visibleCommandMessages,
926
- finalText: finalOutputOverride ?? result.finalOutput ?? 'Done.',
927
- reasoningText: reasoningOutputOverride,
928
- usage: usage ?? extractUsage(result),
400
+ commandMessages,
401
+ finalText: finalText || 'Done.',
402
+ ...(reasoningText ? { reasoningText } : {}),
403
+ ...(finalUsage ? { usage: finalUsage } : {}),
929
404
  };
930
- return response;
931
405
  }
932
406
  }
933
407
  //# sourceMappingURL=conversation-session.js.map