@qduc/term2 0.1.5 → 0.1.7

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 (741) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +4 -24
  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.map +1 -1
  9. package/dist/app.js +11 -32
  10. package/dist/app.js.map +1 -1
  11. package/dist/app.parseInput.test.js +4 -4
  12. package/dist/app.parseInput.test.js.map +1 -1
  13. package/dist/cli.js +44 -29
  14. package/dist/cli.js.map +1 -1
  15. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  16. package/dist/components/ApprovalPrompt.js +14 -11
  17. package/dist/components/ApprovalPrompt.js.map +1 -1
  18. package/dist/components/Banner.d.ts.map +1 -1
  19. package/dist/components/Banner.js +4 -12
  20. package/dist/components/Banner.js.map +1 -1
  21. package/dist/components/BottomArea.d.ts.map +1 -1
  22. package/dist/components/BottomArea.js +4 -7
  23. package/dist/components/BottomArea.js.map +1 -1
  24. package/dist/components/BottomArea.test.js +4 -6
  25. package/dist/components/BottomArea.test.js.map +1 -1
  26. package/dist/components/ChatMessage.d.ts.map +1 -1
  27. package/dist/components/ChatMessage.js.map +1 -1
  28. package/dist/components/CommandMessage.d.ts.map +1 -1
  29. package/dist/components/CommandMessage.js +19 -30
  30. package/dist/components/CommandMessage.js.map +1 -1
  31. package/dist/components/CommandMessage.test.js +2 -2
  32. package/dist/components/CommandMessage.test.js.map +1 -1
  33. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  34. package/dist/components/ErrorBoundary.js +3 -9
  35. package/dist/components/ErrorBoundary.js.map +1 -1
  36. package/dist/components/ErrorBoundary.test.js +2 -2
  37. package/dist/components/ErrorBoundary.test.js.map +1 -1
  38. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  39. package/dist/components/Input/PopupManager.js.map +1 -1
  40. package/dist/components/InputBox.d.ts.map +1 -1
  41. package/dist/components/InputBox.js +15 -33
  42. package/dist/components/InputBox.js.map +1 -1
  43. package/dist/components/InputBox.menu-logic.test.js +6 -7
  44. package/dist/components/InputBox.menu-logic.test.js.map +1 -1
  45. package/dist/components/InputBox.test.js +7 -9
  46. package/dist/components/InputBox.test.js.map +1 -1
  47. package/dist/components/LiveResponse.d.ts.map +1 -1
  48. package/dist/components/LiveResponse.js.map +1 -1
  49. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  50. package/dist/components/MarkdownRenderer.js +12 -12
  51. package/dist/components/MarkdownRenderer.js.map +1 -1
  52. package/dist/components/MessageList.d.ts.map +1 -1
  53. package/dist/components/MessageList.js.map +1 -1
  54. package/dist/components/MessageList.test.js +1 -1
  55. package/dist/components/MessageList.test.js.map +1 -1
  56. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  57. package/dist/components/ModelSelectionMenu.js +11 -16
  58. package/dist/components/ModelSelectionMenu.js.map +1 -1
  59. package/dist/components/ModelSelectionMenu.test.js +9 -9
  60. package/dist/components/ModelSelectionMenu.test.js.map +1 -1
  61. package/dist/components/PathSelectionMenu.d.ts.map +1 -1
  62. package/dist/components/PathSelectionMenu.js +1 -1
  63. package/dist/components/PathSelectionMenu.js.map +1 -1
  64. package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
  65. package/dist/components/SettingsSelectionMenu.js +1 -1
  66. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  67. package/dist/components/SettingsSelectionMenu.test.js +4 -4
  68. package/dist/components/SettingsSelectionMenu.test.js.map +1 -1
  69. package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
  70. package/dist/components/SettingsValueSelectionMenu.js +5 -6
  71. package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
  72. package/dist/components/SettingsValueSelectionMenu.test.js +5 -5
  73. package/dist/components/SettingsValueSelectionMenu.test.js.map +1 -1
  74. package/dist/components/SlashCommandMenu.d.ts.map +1 -1
  75. package/dist/components/SlashCommandMenu.js +1 -1
  76. package/dist/components/SlashCommandMenu.js.map +1 -1
  77. package/dist/components/StatusBar.d.ts.map +1 -1
  78. package/dist/components/StatusBar.js +3 -4
  79. package/dist/components/StatusBar.js.map +1 -1
  80. package/dist/components/TextInput.d.ts.map +1 -1
  81. package/dist/components/TextInput.js +2 -1
  82. package/dist/components/TextInput.js.map +1 -1
  83. package/dist/components/TextInput.test.js.map +1 -1
  84. package/dist/context/InputContext.d.ts.map +1 -1
  85. package/dist/context/InputContext.js.map +1 -1
  86. package/dist/context/InputContext.stability.test.js +1 -1
  87. package/dist/context/InputContext.stability.test.js.map +1 -1
  88. package/dist/context/InputContext.test.js +15 -15
  89. package/dist/context/InputContext.test.js.map +1 -1
  90. package/dist/debug_ask_mentor.d.ts +2 -0
  91. package/dist/debug_ask_mentor.d.ts.map +1 -0
  92. package/dist/debug_ask_mentor.js +73 -0
  93. package/dist/debug_ask_mentor.js.map +1 -0
  94. package/dist/hooks/use-conversation.d.ts +3 -13
  95. package/dist/hooks/use-conversation.d.ts.map +1 -1
  96. package/dist/hooks/use-conversation.js +35 -184
  97. package/dist/hooks/use-conversation.js.map +1 -1
  98. package/dist/hooks/use-input-history.d.ts.map +1 -1
  99. package/dist/hooks/use-input-history.js +1 -3
  100. package/dist/hooks/use-input-history.js.map +1 -1
  101. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  102. package/dist/hooks/use-model-selection.js +8 -10
  103. package/dist/hooks/use-model-selection.js.map +1 -1
  104. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  105. package/dist/hooks/use-path-completion.js +6 -6
  106. package/dist/hooks/use-path-completion.js.map +1 -1
  107. package/dist/hooks/use-setting.d.ts.map +1 -1
  108. package/dist/hooks/use-setting.js +3 -6
  109. package/dist/hooks/use-setting.js.map +1 -1
  110. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  111. package/dist/hooks/use-settings-completion.js +10 -12
  112. package/dist/hooks/use-settings-completion.js.map +1 -1
  113. package/dist/hooks/use-settings-completion.test.js +46 -46
  114. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  115. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  116. package/dist/hooks/use-settings-value-completion.js +13 -43
  117. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  118. package/dist/hooks/use-settings-value-completion.test.js +12 -18
  119. package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
  120. package/dist/hooks/use-slash-commands.d.ts +1 -1
  121. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  122. package/dist/hooks/use-slash-commands.js +6 -11
  123. package/dist/hooks/use-slash-commands.js.map +1 -1
  124. package/dist/hooks/use-slash-commands.test.js +24 -24
  125. package/dist/hooks/use-slash-commands.test.js.map +1 -1
  126. package/dist/lib/editor-impl.d.ts.map +1 -1
  127. package/dist/lib/editor-impl.js +6 -16
  128. package/dist/lib/editor-impl.js.map +1 -1
  129. package/dist/lib/editor-impl.test.js.map +1 -1
  130. package/dist/lib/openai-agent-client.chat.test.js +33 -8
  131. package/dist/lib/openai-agent-client.chat.test.js.map +1 -1
  132. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  133. package/dist/lib/openai-agent-client.flex-tier.test.js +5 -5
  134. package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -1
  135. package/dist/lib/openai-agent-client.js +89 -85
  136. package/dist/lib/openai-agent-client.js.map +1 -1
  137. package/dist/lib/openai-agent-client.public-methods.test.js +186 -12
  138. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
  139. package/dist/lib/openai-agent-client.test.js +17 -17
  140. package/dist/lib/openai-agent-client.test.js.map +1 -1
  141. package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
  142. package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
  143. package/dist/lib/openai-strict-tool-schema.js +39 -0
  144. package/dist/lib/openai-strict-tool-schema.js.map +1 -0
  145. package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
  146. package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
  147. package/dist/lib/openai-strict-tool-schema.test.js +26 -0
  148. package/dist/lib/openai-strict-tool-schema.test.js.map +1 -0
  149. package/dist/lib/tool-invoke.d.ts.map +1 -1
  150. package/dist/lib/tool-invoke.js.map +1 -1
  151. package/dist/lib/tool-invoke.test.js.map +1 -1
  152. package/dist/modes/companion/command-index.d.ts +26 -0
  153. package/dist/modes/companion/command-index.d.ts.map +1 -0
  154. package/dist/modes/companion/command-index.js +50 -0
  155. package/dist/modes/companion/command-index.js.map +1 -0
  156. package/dist/modes/companion/command-index.test.d.ts +2 -0
  157. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  158. package/dist/modes/companion/command-index.test.js +86 -0
  159. package/dist/modes/companion/command-index.test.js.map +1 -0
  160. package/dist/modes/companion/companion-app.d.ts +12 -0
  161. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  162. package/dist/modes/companion/companion-app.js +297 -0
  163. package/dist/modes/companion/companion-app.js.map +1 -0
  164. package/dist/modes/companion/companion-session.d.ts +63 -0
  165. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  166. package/dist/modes/companion/companion-session.js +146 -0
  167. package/dist/modes/companion/companion-session.js.map +1 -0
  168. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  169. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  170. package/dist/modes/companion/companion-session.test.js +28 -0
  171. package/dist/modes/companion/companion-session.test.js.map +1 -0
  172. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  173. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  174. package/dist/modes/companion/components/status-bar.js +26 -0
  175. package/dist/modes/companion/components/status-bar.js.map +1 -0
  176. package/dist/modes/companion/context-buffer.d.ts +65 -0
  177. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  178. package/dist/modes/companion/context-buffer.js +156 -0
  179. package/dist/modes/companion/context-buffer.js.map +1 -0
  180. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  181. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  182. package/dist/modes/companion/context-buffer.test.js +154 -0
  183. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  184. package/dist/modes/companion/event-detector.d.ts +46 -0
  185. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  186. package/dist/modes/companion/event-detector.js +169 -0
  187. package/dist/modes/companion/event-detector.js.map +1 -0
  188. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  189. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  190. package/dist/modes/companion/event-detector.test.js +121 -0
  191. package/dist/modes/companion/event-detector.test.js.map +1 -0
  192. package/dist/modes/companion/index.d.ts +33 -0
  193. package/dist/modes/companion/index.d.ts.map +1 -0
  194. package/dist/modes/companion/index.js +21 -0
  195. package/dist/modes/companion/index.js.map +1 -0
  196. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  197. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  198. package/dist/modes/companion/input-key-mapper.js +31 -0
  199. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  200. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  201. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  202. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  203. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  204. package/dist/modes/companion/input-parser.d.ts +53 -0
  205. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  206. package/dist/modes/companion/input-parser.js +114 -0
  207. package/dist/modes/companion/input-parser.js.map +1 -0
  208. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  209. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  210. package/dist/modes/companion/input-parser.test.js +123 -0
  211. package/dist/modes/companion/input-parser.test.js.map +1 -0
  212. package/dist/modes/companion/mode-manager.d.ts +41 -0
  213. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  214. package/dist/modes/companion/mode-manager.js +56 -0
  215. package/dist/modes/companion/mode-manager.js.map +1 -0
  216. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  217. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  218. package/dist/modes/companion/mode-manager.test.js +65 -0
  219. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  220. package/dist/modes/companion/output-classifier.d.ts +15 -0
  221. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  222. package/dist/modes/companion/output-classifier.js +77 -0
  223. package/dist/modes/companion/output-classifier.js.map +1 -0
  224. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  225. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  226. package/dist/modes/companion/output-classifier.test.js +133 -0
  227. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  228. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  229. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  230. package/dist/modes/companion/pty-wrapper.js +143 -0
  231. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  232. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  233. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  234. package/dist/modes/companion/safety-classifier.js +140 -0
  235. package/dist/modes/companion/safety-classifier.js.map +1 -0
  236. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  237. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  238. package/dist/modes/companion/safety-classifier.test.js +151 -0
  239. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  240. package/dist/modes/companion/summarizer.d.ts +24 -0
  241. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  242. package/dist/modes/companion/summarizer.js +132 -0
  243. package/dist/modes/companion/summarizer.js.map +1 -0
  244. package/dist/modes/companion/terminal-history.d.ts +27 -0
  245. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  246. package/dist/modes/companion/terminal-history.js +142 -0
  247. package/dist/modes/companion/terminal-history.js.map +1 -0
  248. package/dist/no-singleton-imports.test.js +1 -1
  249. package/dist/no-singleton-imports.test.js.map +1 -1
  250. package/dist/non-interactive.d.ts +20 -0
  251. package/dist/non-interactive.d.ts.map +1 -0
  252. package/dist/non-interactive.js +86 -0
  253. package/dist/non-interactive.js.map +1 -0
  254. package/dist/non-interactive.test.d.ts +2 -0
  255. package/dist/non-interactive.test.d.ts.map +1 -0
  256. package/dist/non-interactive.test.js +213 -0
  257. package/dist/non-interactive.test.js.map +1 -0
  258. package/dist/prompts/anthropic.md +11 -11
  259. package/dist/prompts/codex.md +63 -63
  260. package/dist/prompts/gpt-5.md +95 -95
  261. package/dist/prompts/mentor-addon.md +6 -5
  262. package/dist/prompts/prompt-selector.d.ts +8 -0
  263. package/dist/prompts/prompt-selector.d.ts.map +1 -0
  264. package/dist/prompts/prompt-selector.js +21 -0
  265. package/dist/prompts/prompt-selector.js.map +1 -0
  266. package/dist/prompts/prompt-selector.test.d.ts +2 -0
  267. package/dist/prompts/prompt-selector.test.d.ts.map +1 -0
  268. package/dist/prompts/prompt-selector.test.js +21 -0
  269. package/dist/prompts/prompt-selector.test.js.map +1 -0
  270. package/dist/prompts/prompt-selector.test.ts +32 -0
  271. package/dist/prompts/prompt-selector.ts +30 -0
  272. package/dist/prompts/simple-mentor.md +8 -0
  273. package/dist/prompts/simple.md +58 -58
  274. package/dist/providers/github-copilot/model.d.ts.map +1 -1
  275. package/dist/providers/github-copilot/model.js +25 -108
  276. package/dist/providers/github-copilot/model.js.map +1 -1
  277. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  278. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  279. package/dist/providers/github-copilot/model.test.js +63 -0
  280. package/dist/providers/github-copilot/model.test.js.map +1 -0
  281. package/dist/providers/github-copilot/provider.d.ts +0 -5
  282. package/dist/providers/github-copilot/provider.d.ts.map +1 -1
  283. package/dist/providers/github-copilot/provider.js +2 -7
  284. package/dist/providers/github-copilot/provider.js.map +1 -1
  285. package/dist/providers/index.d.ts.map +1 -1
  286. package/dist/providers/index.js.map +1 -1
  287. package/dist/providers/openai-compatible/api.d.ts.map +1 -1
  288. package/dist/providers/openai-compatible/api.js.map +1 -1
  289. package/dist/providers/openai-compatible/model.d.ts.map +1 -1
  290. package/dist/providers/openai-compatible/model.js +22 -56
  291. package/dist/providers/openai-compatible/model.js.map +1 -1
  292. package/dist/providers/openai-compatible/provider.d.ts.map +1 -1
  293. package/dist/providers/openai-compatible/provider.js.map +1 -1
  294. package/dist/providers/openai-compatible/reasoning-content.test.js +72 -2
  295. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  296. package/dist/providers/openai-compatible/utils.d.ts.map +1 -1
  297. package/dist/providers/openai-compatible/utils.js.map +1 -1
  298. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  299. package/dist/providers/openai-compatible.provider.js +5 -1
  300. package/dist/providers/openai-compatible.provider.js.map +1 -1
  301. package/dist/providers/openai.provider.js +4 -0
  302. package/dist/providers/openai.provider.js.map +1 -1
  303. package/dist/providers/openrouter/api.d.ts.map +1 -1
  304. package/dist/providers/openrouter/api.js +5 -13
  305. package/dist/providers/openrouter/api.js.map +1 -1
  306. package/dist/providers/openrouter/converters.d.ts.map +1 -1
  307. package/dist/providers/openrouter/converters.js +9 -28
  308. package/dist/providers/openrouter/converters.js.map +1 -1
  309. package/dist/providers/openrouter/converters.test.js +7 -11
  310. package/dist/providers/openrouter/converters.test.js.map +1 -1
  311. package/dist/providers/openrouter/index.d.ts.map +1 -1
  312. package/dist/providers/openrouter/index.js.map +1 -1
  313. package/dist/providers/openrouter/model.d.ts.map +1 -1
  314. package/dist/providers/openrouter/model.js +22 -58
  315. package/dist/providers/openrouter/model.js.map +1 -1
  316. package/dist/providers/openrouter/provider.d.ts.map +1 -1
  317. package/dist/providers/openrouter/provider.js.map +1 -1
  318. package/dist/providers/openrouter/reasoning-content.test.js +1 -1
  319. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
  320. package/dist/providers/openrouter/utils.d.ts +1 -0
  321. package/dist/providers/openrouter/utils.d.ts.map +1 -1
  322. package/dist/providers/openrouter/utils.js +5 -3
  323. package/dist/providers/openrouter/utils.js.map +1 -1
  324. package/dist/providers/openrouter.api.retry.test.js.map +1 -1
  325. package/dist/providers/openrouter.provider.createRunner.test.js +1 -1
  326. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  327. package/dist/providers/openrouter.provider.js +6 -4
  328. package/dist/providers/openrouter.provider.js.map +1 -1
  329. package/dist/providers/openrouter.test.js +77 -17
  330. package/dist/providers/openrouter.test.js.map +1 -1
  331. package/dist/providers/registry.d.ts +5 -0
  332. package/dist/providers/registry.d.ts.map +1 -1
  333. package/dist/providers/registry.js.map +1 -1
  334. package/dist/providers/registry.test.js +11 -11
  335. package/dist/providers/registry.test.js.map +1 -1
  336. package/dist/providers/web-search/index.d.ts +1 -1
  337. package/dist/providers/web-search/index.d.ts.map +1 -1
  338. package/dist/providers/web-search/index.js.map +1 -1
  339. package/dist/providers/web-search/registry.d.ts.map +1 -1
  340. package/dist/providers/web-search/registry.js.map +1 -1
  341. package/dist/providers/web-search/registry.test.js +14 -14
  342. package/dist/providers/web-search/registry.test.js.map +1 -1
  343. package/dist/providers/web-search/tavily.provider.d.ts.map +1 -1
  344. package/dist/providers/web-search/tavily.provider.js +4 -4
  345. package/dist/providers/web-search/tavily.provider.js.map +1 -1
  346. package/dist/providers/web-search/tavily.provider.test.js +7 -7
  347. package/dist/providers/web-search/tavily.provider.test.js.map +1 -1
  348. package/dist/providers/web-search/types.d.ts.map +1 -1
  349. package/dist/scripts/extract-provider-traffic.d.ts +3 -0
  350. package/dist/scripts/extract-provider-traffic.d.ts.map +1 -0
  351. package/dist/scripts/extract-provider-traffic.js +32 -0
  352. package/dist/scripts/extract-provider-traffic.js.map +1 -0
  353. package/dist/services/approval-state.d.ts +24 -0
  354. package/dist/services/approval-state.d.ts.map +1 -0
  355. package/dist/services/approval-state.js +41 -0
  356. package/dist/services/approval-state.js.map +1 -0
  357. package/dist/services/approval-state.test.d.ts +2 -0
  358. package/dist/services/approval-state.test.d.ts.map +1 -0
  359. package/dist/services/approval-state.test.js +59 -0
  360. package/dist/services/approval-state.test.js.map +1 -0
  361. package/dist/services/check_mock.d.ts +2 -0
  362. package/dist/services/check_mock.d.ts.map +1 -0
  363. package/dist/services/check_mock.js +22 -0
  364. package/dist/services/check_mock.js.map +1 -0
  365. package/dist/services/command-message-streaming.d.ts +12 -0
  366. package/dist/services/command-message-streaming.d.ts.map +1 -0
  367. package/dist/services/command-message-streaming.js +68 -0
  368. package/dist/services/command-message-streaming.js.map +1 -0
  369. package/dist/services/command-message-streaming.test.d.ts +2 -0
  370. package/dist/services/command-message-streaming.test.d.ts.map +1 -0
  371. package/dist/services/command-message-streaming.test.js +78 -0
  372. package/dist/services/command-message-streaming.test.js.map +1 -0
  373. package/dist/services/conversation-events.d.ts +2 -13
  374. package/dist/services/conversation-events.d.ts.map +1 -1
  375. package/dist/services/conversation-integration.test.d.ts +2 -0
  376. package/dist/services/conversation-integration.test.d.ts.map +1 -0
  377. package/dist/services/conversation-integration.test.js +155 -0
  378. package/dist/services/conversation-integration.test.js.map +1 -0
  379. package/dist/services/conversation-service.d.ts +1 -1
  380. package/dist/services/conversation-service.d.ts.map +1 -1
  381. package/dist/services/conversation-service.js.map +1 -1
  382. package/dist/services/conversation-service.test.d.ts +2 -0
  383. package/dist/services/conversation-service.test.d.ts.map +1 -0
  384. package/dist/services/conversation-service.test.js +149 -183
  385. package/dist/services/conversation-service.test.js.map +1 -0
  386. package/dist/services/conversation-session-reasoning.test.js +3 -3
  387. package/dist/services/conversation-session-reasoning.test.js.map +1 -1
  388. package/dist/services/conversation-session.d.ts +5 -17
  389. package/dist/services/conversation-session.d.ts.map +1 -1
  390. package/dist/services/conversation-session.js +164 -275
  391. package/dist/services/conversation-session.js.map +1 -1
  392. package/dist/services/conversation-store.d.ts.map +1 -1
  393. package/dist/services/conversation-store.js +3 -9
  394. package/dist/services/conversation-store.js.map +1 -1
  395. package/dist/services/conversation-store.test.js +17 -14
  396. package/dist/services/conversation-store.test.js.map +1 -1
  397. package/dist/services/execution-context.d.ts.map +1 -1
  398. package/dist/services/execution-context.js.map +1 -1
  399. package/dist/services/execution-context.test.js +7 -7
  400. package/dist/services/execution-context.test.js.map +1 -1
  401. package/dist/services/file-service.d.ts.map +1 -1
  402. package/dist/services/file-service.js +5 -9
  403. package/dist/services/file-service.js.map +1 -1
  404. package/dist/services/history-service.d.ts.map +1 -1
  405. package/dist/services/history-service.js +3 -7
  406. package/dist/services/history-service.js.map +1 -1
  407. package/dist/services/logging-contract.d.ts +74 -0
  408. package/dist/services/logging-contract.d.ts.map +1 -0
  409. package/dist/services/logging-contract.js +157 -0
  410. package/dist/services/logging-contract.js.map +1 -0
  411. package/dist/services/logging-contract.test.d.ts +2 -0
  412. package/dist/services/logging-contract.test.d.ts.map +1 -0
  413. package/dist/services/logging-contract.test.js +66 -0
  414. package/dist/services/logging-contract.test.js.map +1 -0
  415. package/dist/services/logging-service.d.ts +5 -0
  416. package/dist/services/logging-service.d.ts.map +1 -1
  417. package/dist/services/logging-service.js +93 -21
  418. package/dist/services/logging-service.js.map +1 -1
  419. package/dist/services/model-service.d.ts.map +1 -1
  420. package/dist/services/model-service.js +2 -2
  421. package/dist/services/model-service.js.map +1 -1
  422. package/dist/services/model-service.test.js +6 -6
  423. package/dist/services/model-service.test.js.map +1 -1
  424. package/dist/services/service-interfaces.d.ts.map +1 -1
  425. package/dist/services/settings-env.d.ts +9 -0
  426. package/dist/services/settings-env.d.ts.map +1 -0
  427. package/dist/services/settings-env.js +75 -0
  428. package/dist/services/settings-env.js.map +1 -0
  429. package/dist/services/settings-env.test.d.ts +2 -0
  430. package/dist/services/settings-env.test.d.ts.map +1 -0
  431. package/dist/services/settings-env.test.js +32 -0
  432. package/dist/services/settings-env.test.js.map +1 -0
  433. package/dist/services/settings-merger.d.ts +26 -0
  434. package/dist/services/settings-merger.d.ts.map +1 -0
  435. package/dist/services/settings-merger.js +122 -0
  436. package/dist/services/settings-merger.js.map +1 -0
  437. package/dist/services/settings-merger.test.d.ts +2 -0
  438. package/dist/services/settings-merger.test.d.ts.map +1 -0
  439. package/dist/services/settings-merger.test.js +26 -0
  440. package/dist/services/settings-merger.test.js.map +1 -0
  441. package/dist/services/settings-persistence.d.ts +32 -0
  442. package/dist/services/settings-persistence.d.ts.map +1 -0
  443. package/dist/services/settings-persistence.js +134 -0
  444. package/dist/services/settings-persistence.js.map +1 -0
  445. package/dist/services/settings-persistence.test.d.ts +2 -0
  446. package/dist/services/settings-persistence.test.d.ts.map +1 -0
  447. package/dist/services/settings-persistence.test.js +51 -0
  448. package/dist/services/settings-persistence.test.js.map +1 -0
  449. package/dist/services/settings-schema.d.ts +320 -0
  450. package/dist/services/settings-schema.d.ts.map +1 -0
  451. package/dist/services/settings-schema.js +272 -0
  452. package/dist/services/settings-schema.js.map +1 -0
  453. package/dist/services/settings-service.d.ts +4 -248
  454. package/dist/services/settings-service.d.ts.map +1 -1
  455. package/dist/services/settings-service.js +45 -641
  456. package/dist/services/settings-service.js.map +1 -1
  457. package/dist/services/settings-service.mock.d.ts.map +1 -1
  458. package/dist/services/settings-service.mock.js.map +1 -1
  459. package/dist/services/singleton-deprecation.test.js +2 -2
  460. package/dist/services/singleton-deprecation.test.js.map +1 -1
  461. package/dist/services/ssh-service.d.ts.map +1 -1
  462. package/dist/services/ssh-service.js +8 -7
  463. package/dist/services/ssh-service.js.map +1 -1
  464. package/dist/services/ssh-service.test.js +15 -13
  465. package/dist/services/ssh-service.test.js.map +1 -1
  466. package/dist/services/stream-event-parsing.d.ts +4 -0
  467. package/dist/services/stream-event-parsing.d.ts.map +1 -0
  468. package/dist/services/stream-event-parsing.js +76 -0
  469. package/dist/services/stream-event-parsing.js.map +1 -0
  470. package/dist/services/stream-event-parsing.test.d.ts +2 -0
  471. package/dist/services/stream-event-parsing.test.d.ts.map +1 -0
  472. package/dist/services/stream-event-parsing.test.js +59 -0
  473. package/dist/services/stream-event-parsing.test.js.map +1 -0
  474. package/dist/tools/apply-patch.d.ts.map +1 -1
  475. package/dist/tools/apply-patch.js +45 -35
  476. package/dist/tools/apply-patch.js.map +1 -1
  477. package/dist/tools/apply-patch.test.js +23 -0
  478. package/dist/tools/apply-patch.test.js.map +1 -1
  479. package/dist/tools/ask-mentor.d.ts +1 -1
  480. package/dist/tools/ask-mentor.d.ts.map +1 -1
  481. package/dist/tools/ask-mentor.js +5 -15
  482. package/dist/tools/ask-mentor.js.map +1 -1
  483. package/dist/tools/ask-mentor.test.js +10 -4
  484. package/dist/tools/ask-mentor.test.js.map +1 -1
  485. package/dist/tools/create-file.d.ts.map +1 -1
  486. package/dist/tools/create-file.js +2 -2
  487. package/dist/tools/create-file.js.map +1 -1
  488. package/dist/tools/create-file.test.js.map +1 -1
  489. package/dist/tools/edit-healing.d.ts.map +1 -1
  490. package/dist/tools/edit-healing.js +5 -4
  491. package/dist/tools/edit-healing.js.map +1 -1
  492. package/dist/tools/edit-healing.test.js.map +1 -1
  493. package/dist/tools/find-files.d.ts +2 -2
  494. package/dist/tools/find-files.d.ts.map +1 -1
  495. package/dist/tools/find-files.js +10 -27
  496. package/dist/tools/find-files.js.map +1 -1
  497. package/dist/tools/find-files.test.js +8 -21
  498. package/dist/tools/find-files.test.js.map +1 -1
  499. package/dist/tools/format-helpers.d.ts.map +1 -1
  500. package/dist/tools/format-helpers.js +2 -6
  501. package/dist/tools/format-helpers.js.map +1 -1
  502. package/dist/tools/grep.d.ts +2 -2
  503. package/dist/tools/grep.d.ts.map +1 -1
  504. package/dist/tools/grep.js +7 -26
  505. package/dist/tools/grep.js.map +1 -1
  506. package/dist/tools/read-file.d.ts +2 -2
  507. package/dist/tools/read-file.d.ts.map +1 -1
  508. package/dist/tools/read-file.js +5 -11
  509. package/dist/tools/read-file.js.map +1 -1
  510. package/dist/tools/read-file.test.js +7 -13
  511. package/dist/tools/read-file.test.js.map +1 -1
  512. package/dist/tools/search-replace.d.ts +1 -1
  513. package/dist/tools/search-replace.d.ts.map +1 -1
  514. package/dist/tools/search-replace.js +15 -31
  515. package/dist/tools/search-replace.js.map +1 -1
  516. package/dist/tools/search-replace.test.js.map +1 -1
  517. package/dist/tools/search.d.ts +5 -5
  518. package/dist/tools/search.d.ts.map +1 -1
  519. package/dist/tools/search.js +10 -29
  520. package/dist/tools/search.js.map +1 -1
  521. package/dist/tools/shell.d.ts +3 -3
  522. package/dist/tools/shell.d.ts.map +1 -1
  523. package/dist/tools/shell.js +27 -55
  524. package/dist/tools/shell.js.map +1 -1
  525. package/dist/tools/shell.test.d.ts +2 -0
  526. package/dist/tools/shell.test.d.ts.map +1 -0
  527. package/dist/tools/shell.test.js +70 -0
  528. package/dist/tools/shell.test.js.map +1 -0
  529. package/dist/tools/tool-names.d.ts +3 -0
  530. package/dist/tools/tool-names.d.ts.map +1 -0
  531. package/dist/tools/tool-names.js +3 -0
  532. package/dist/tools/tool-names.js.map +1 -0
  533. package/dist/tools/tool-names.test.d.ts +2 -0
  534. package/dist/tools/tool-names.test.d.ts.map +1 -0
  535. package/dist/tools/tool-names.test.js +7 -0
  536. package/dist/tools/tool-names.test.js.map +1 -0
  537. package/dist/tools/tool-parameter-schema.test.d.ts +2 -0
  538. package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
  539. package/dist/tools/tool-parameter-schema.test.js +88 -0
  540. package/dist/tools/tool-parameter-schema.test.js.map +1 -0
  541. package/dist/tools/types.d.ts.map +1 -1
  542. package/dist/tools/utils.d.ts.map +1 -1
  543. package/dist/tools/utils.js +3 -8
  544. package/dist/tools/utils.js.map +1 -1
  545. package/dist/tools/web-fetch.d.ts +3 -3
  546. package/dist/tools/web-fetch.d.ts.map +1 -1
  547. package/dist/tools/web-fetch.js +7 -10
  548. package/dist/tools/web-fetch.js.map +1 -1
  549. package/dist/tools/web-fetch.test.js +3 -3
  550. package/dist/tools/web-fetch.test.js.map +1 -1
  551. package/dist/tools/web-search.d.ts.map +1 -1
  552. package/dist/tools/web-search.js +6 -10
  553. package/dist/tools/web-search.js.map +1 -1
  554. package/dist/tools/web-search.test.js +12 -14
  555. package/dist/tools/web-search.test.js.map +1 -1
  556. package/dist/utils/command-logger.d.ts.map +1 -1
  557. package/dist/utils/command-logger.js.map +1 -1
  558. package/dist/utils/command-safety/constants.d.ts.map +1 -1
  559. package/dist/utils/command-safety/constants.js +1 -9
  560. package/dist/utils/command-safety/constants.js.map +1 -1
  561. package/dist/utils/command-safety/find-helpers.d.ts.map +1 -1
  562. package/dist/utils/command-safety/find-helpers.js +4 -9
  563. package/dist/utils/command-safety/find-helpers.js.map +1 -1
  564. package/dist/utils/command-safety/handlers/find-handler.d.ts.map +1 -1
  565. package/dist/utils/command-safety/handlers/find-handler.js +3 -10
  566. package/dist/utils/command-safety/handlers/find-handler.js.map +1 -1
  567. package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -1
  568. package/dist/utils/command-safety/handlers/git-handler.js +2 -4
  569. package/dist/utils/command-safety/handlers/git-handler.js.map +1 -1
  570. package/dist/utils/command-safety/handlers/index.d.ts +1 -1
  571. package/dist/utils/command-safety/handlers/index.d.ts.map +1 -1
  572. package/dist/utils/command-safety/handlers/index.js.map +1 -1
  573. package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -1
  574. package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -1
  575. package/dist/utils/command-safety/handlers/types.d.ts.map +1 -1
  576. package/dist/utils/command-safety/index.d.ts.map +1 -1
  577. package/dist/utils/command-safety/index.js +4 -10
  578. package/dist/utils/command-safety/index.js.map +1 -1
  579. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
  580. package/dist/utils/command-safety/path-analysis.js +9 -20
  581. package/dist/utils/command-safety/path-analysis.js.map +1 -1
  582. package/dist/utils/command-safety/utils.d.ts.map +1 -1
  583. package/dist/utils/command-safety/utils.js +1 -3
  584. package/dist/utils/command-safety/utils.js.map +1 -1
  585. package/dist/utils/command-safety.d.ts.map +1 -1
  586. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  587. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  588. package/dist/utils/command-safety.devnull.test.js +13 -0
  589. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  590. package/dist/utils/command-safety.find.test.js +44 -87
  591. package/dist/utils/command-safety.find.test.js.map +1 -1
  592. package/dist/utils/command-safety.js +10 -364
  593. package/dist/utils/command-safety.js.map +1 -1
  594. package/dist/utils/command-safety.path.test.js +32 -67
  595. package/dist/utils/command-safety.path.test.js.map +1 -1
  596. package/dist/utils/conversation-event-handler.d.ts +4 -16
  597. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  598. package/dist/utils/conversation-event-handler.js +4 -8
  599. package/dist/utils/conversation-event-handler.js.map +1 -1
  600. package/dist/utils/conversation-event-handler.test.js +16 -18
  601. package/dist/utils/conversation-event-handler.test.js.map +1 -1
  602. package/dist/utils/conversation-utils.d.ts.map +1 -1
  603. package/dist/utils/conversation-utils.js +5 -8
  604. package/dist/utils/conversation-utils.js.map +1 -1
  605. package/dist/utils/conversation-utils.test.js +45 -44
  606. package/dist/utils/conversation-utils.test.js.map +1 -1
  607. package/dist/utils/diff.d.ts.map +1 -1
  608. package/dist/utils/diff.js +2 -4
  609. package/dist/utils/diff.js.map +1 -1
  610. package/dist/utils/diff.test.js +12 -12
  611. package/dist/utils/diff.test.js.map +1 -1
  612. package/dist/utils/error-helpers.d.ts.map +1 -1
  613. package/dist/utils/error-helpers.js +2 -6
  614. package/dist/utils/error-helpers.js.map +1 -1
  615. package/dist/utils/error-helpers.test.js +32 -32
  616. package/dist/utils/error-helpers.test.js.map +1 -1
  617. package/dist/utils/execute-shell.d.ts.map +1 -1
  618. package/dist/utils/execute-shell.js.map +1 -1
  619. package/dist/utils/execute-shell.test.js.map +1 -1
  620. package/dist/utils/extract-command-messages.d.ts.map +1 -1
  621. package/dist/utils/extract-command-messages.js +16 -21
  622. package/dist/utils/extract-command-messages.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/ink-render-options.d.ts.map +1 -1
  628. package/dist/utils/ink-render-options.js.map +1 -1
  629. package/dist/utils/log-viewer-filters.d.ts +29 -0
  630. package/dist/utils/log-viewer-filters.d.ts.map +1 -0
  631. package/dist/utils/log-viewer-filters.js +49 -0
  632. package/dist/utils/log-viewer-filters.js.map +1 -0
  633. package/dist/utils/log-viewer-filters.test.d.ts +2 -0
  634. package/dist/utils/log-viewer-filters.test.d.ts.map +1 -0
  635. package/dist/utils/log-viewer-filters.test.js +48 -0
  636. package/dist/utils/log-viewer-filters.test.js.map +1 -0
  637. package/dist/utils/message-buffer.d.ts.map +1 -1
  638. package/dist/utils/message-buffer.js.map +1 -1
  639. package/dist/utils/message-buffer.test.js +4 -4
  640. package/dist/utils/message-buffer.test.js.map +1 -1
  641. package/dist/utils/output-trim.d.ts.map +1 -1
  642. package/dist/utils/output-trim.js.map +1 -1
  643. package/dist/utils/provider-credentials.d.ts.map +1 -1
  644. package/dist/utils/provider-credentials.js +1 -1
  645. package/dist/utils/provider-credentials.js.map +1 -1
  646. package/dist/utils/provider-traffic-extractor.d.ts +18 -0
  647. package/dist/utils/provider-traffic-extractor.d.ts.map +1 -0
  648. package/dist/utils/provider-traffic-extractor.js +121 -0
  649. package/dist/utils/provider-traffic-extractor.js.map +1 -0
  650. package/dist/utils/provider-traffic-extractor.test.d.ts +2 -0
  651. package/dist/utils/provider-traffic-extractor.test.d.ts.map +1 -0
  652. package/dist/utils/provider-traffic-extractor.test.js +84 -0
  653. package/dist/utils/provider-traffic-extractor.test.js.map +1 -0
  654. package/dist/utils/settings-command.d.ts.map +1 -1
  655. package/dist/utils/settings-command.js +5 -12
  656. package/dist/utils/settings-command.js.map +1 -1
  657. package/dist/utils/ssh-config-parser.d.ts.map +1 -1
  658. package/dist/utils/ssh-config-parser.js.map +1 -1
  659. package/dist/utils/ssh-config-parser.test.js.map +1 -1
  660. package/dist/utils/streaming-session-factory.d.ts +33 -0
  661. package/dist/utils/streaming-session-factory.d.ts.map +1 -0
  662. package/dist/utils/streaming-session-factory.js +75 -0
  663. package/dist/utils/streaming-session-factory.js.map +1 -0
  664. package/dist/utils/streaming-session-factory.test.d.ts +2 -0
  665. package/dist/utils/streaming-session-factory.test.d.ts.map +1 -0
  666. package/dist/utils/streaming-session-factory.test.js +74 -0
  667. package/dist/utils/streaming-session-factory.test.js.map +1 -0
  668. package/dist/utils/streaming-updater.d.ts.map +1 -1
  669. package/dist/utils/streaming-updater.js.map +1 -1
  670. package/dist/utils/throttle.d.ts.map +1 -1
  671. package/dist/utils/throttle.js.map +1 -1
  672. package/dist/utils/token-usage.d.ts.map +1 -1
  673. package/dist/utils/token-usage.js +1 -2
  674. package/dist/utils/token-usage.js.map +1 -1
  675. package/dist/utils/token-usage.test.js +8 -8
  676. package/dist/utils/token-usage.test.js.map +1 -1
  677. package/dist/utils/trim-tool-output.d.ts.map +1 -1
  678. package/dist/utils/trim-tool-output.js +1 -1
  679. package/dist/utils/trim-tool-output.js.map +1 -1
  680. package/package.json +117 -111
  681. package/readme.md +196 -145
  682. package/dist/app.model-command-feedback.test.d.ts +0 -2
  683. package/dist/app.model-command-feedback.test.d.ts.map +0 -1
  684. package/dist/app.model-command-feedback.test.js +0 -19
  685. package/dist/app.model-command-feedback.test.js.map +0 -1
  686. package/dist/components/MentorMode.test.d.ts +0 -2
  687. package/dist/components/MentorMode.test.d.ts.map +0 -1
  688. package/dist/components/MentorMode.test.js.map +0 -1
  689. package/dist/components/StatusBar.test.d.ts +0 -2
  690. package/dist/components/StatusBar.test.d.ts.map +0 -1
  691. package/dist/components/StatusBar.test.js +0 -19
  692. package/dist/components/StatusBar.test.js.map +0 -1
  693. package/dist/debug-schema.d.ts +0 -2
  694. package/dist/debug-schema.d.ts.map +0 -1
  695. package/dist/debug-schema.js +0 -22
  696. package/dist/debug-schema.js.map +0 -1
  697. package/dist/hooks/use-model-selection.test.d.ts +0 -2
  698. package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
  699. package/dist/hooks/use-model-selection.test.js +0 -28
  700. package/dist/hooks/use-model-selection.test.js.map +0 -1
  701. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  702. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  703. package/dist/hooks/use-path-completion.test.js +0 -29
  704. package/dist/hooks/use-path-completion.test.js.map +0 -1
  705. package/dist/prompts/default.md.bak +0 -77
  706. package/dist/providers/github-copilot/model-direct.d.ts +0 -34
  707. package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
  708. package/dist/providers/github-copilot/model-direct.js +0 -443
  709. package/dist/providers/github-copilot/model-direct.js.map +0 -1
  710. package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
  711. package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
  712. package/dist/providers/openrouter/merge-messages.test.js +0 -83
  713. package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
  714. package/dist/providers/openrouter.history.test.d.ts +0 -2
  715. package/dist/providers/openrouter.history.test.d.ts.map +0 -1
  716. package/dist/providers/openrouter.history.test.js +0 -533
  717. package/dist/providers/openrouter.history.test.js.map +0 -1
  718. package/dist/reproduce_issue.test.d.ts +0 -2
  719. package/dist/reproduce_issue.test.d.ts.map +0 -1
  720. package/dist/reproduce_issue.test.js +0 -31
  721. package/dist/reproduce_issue.test.js.map +0 -1
  722. package/dist/services/conversation-session.usage.test.d.ts +0 -2
  723. package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
  724. package/dist/services/conversation-session.usage.test.js +0 -59
  725. package/dist/services/conversation-session.usage.test.js.map +0 -1
  726. package/dist/test-search-tool.d.ts +0 -2
  727. package/dist/test-search-tool.d.ts.map +0 -1
  728. package/dist/test-search-tool.js +0 -36
  729. package/dist/test-search-tool.js.map +0 -1
  730. package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
  731. package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
  732. package/dist/utils/extract-command-messages.repro.test.js +0 -31
  733. package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
  734. package/dist/utils/message-utils.d.ts +0 -17
  735. package/dist/utils/message-utils.d.ts.map +0 -1
  736. package/dist/utils/message-utils.js +0 -52
  737. package/dist/utils/message-utils.js.map +0 -1
  738. package/dist/utils/message-utils.test.d.ts +0 -2
  739. package/dist/utils/message-utils.test.d.ts.map +0 -1
  740. package/dist/utils/message-utils.test.js +0 -48
  741. package/dist/utils/message-utils.test.js.map +0 -1
@@ -1,7 +1,12 @@
1
- import { extractCommandMessages, markToolCallAsApprovalRejection, } from '../utils/extract-command-messages.js';
1
+ import { extractCommandMessages, markToolCallAsApprovalRejection } from '../utils/extract-command-messages.js';
2
2
  import { ConversationStore } from './conversation-store.js';
3
3
  import { ModelBehaviorError } from '@openai/agents';
4
4
  import { extractUsage } from '../utils/token-usage.js';
5
+ 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
+ import { ApprovalState } from './approval-state.js';
9
+ import { createInvalidToolCallDiagnostic } from './logging-contract.js';
5
10
  const getCommandFromArgs = (args) => {
6
11
  if (!args) {
7
12
  return '';
@@ -63,19 +68,23 @@ const isToolHallucinationError = (error) => {
63
68
  const message = error.message.toLowerCase();
64
69
  return message.includes('tool') && message.includes('not found');
65
70
  };
71
+ const supportsConversationChaining = (providerId) => {
72
+ const providerDef = getProvider(providerId);
73
+ return providerDef?.capabilities?.supportsConversationChaining ?? false;
74
+ };
66
75
  export class ConversationSession {
67
76
  id;
68
77
  agentClient;
69
78
  logger;
70
79
  conversationStore;
71
80
  previousResponseId = null;
72
- pendingApprovalContext = null;
73
- abortedApprovalContext = null;
81
+ approvalState = new ApprovalState();
74
82
  textDeltaCount = 0;
75
83
  reasoningDeltaCount = 0;
76
84
  toolCallArgumentsById = new Map();
77
85
  lastEventType = null;
78
86
  eventTypeCount = 0;
87
+ emittedInvalidToolCallPackets = new Set();
79
88
  // private logStreamEvent = (eventType: string, eventData: any) => {
80
89
  // if (eventData.item) {
81
90
  // eventType = eventData.item.type;
@@ -112,7 +121,7 @@ export class ConversationSession {
112
121
  this.lastEventType = null;
113
122
  this.eventTypeCount = 0;
114
123
  };
115
- constructor(id, { agentClient, deps, }) {
124
+ constructor(id, { agentClient, deps }) {
116
125
  this.id = id;
117
126
  this.agentClient = agentClient;
118
127
  this.logger = deps.logger;
@@ -121,8 +130,8 @@ export class ConversationSession {
121
130
  reset() {
122
131
  this.previousResponseId = null;
123
132
  this.conversationStore.clear();
124
- this.pendingApprovalContext = null;
125
- this.abortedApprovalContext = null;
133
+ this.approvalState.clearPending();
134
+ this.approvalState.consumeAborted();
126
135
  this.toolCallArgumentsById.clear();
127
136
  if (typeof this.agentClient.clearConversations === 'function') {
128
137
  this.agentClient.clearConversations();
@@ -160,10 +169,14 @@ export class ConversationSession {
160
169
  abort() {
161
170
  this.agentClient.abort();
162
171
  // Save pending approval context so we can handle it in the next message
163
- if (this.pendingApprovalContext) {
164
- this.abortedApprovalContext = this.pendingApprovalContext;
165
- this.pendingApprovalContext = null;
166
- this.logger.debug('Aborted approval - will handle rejection on next message');
172
+ if (this.approvalState.abortPending()) {
173
+ this.logger.debug('Aborted approval - will handle rejection on next message', {
174
+ eventType: 'approval.aborted',
175
+ category: 'approval',
176
+ phase: 'abort',
177
+ sessionId: this.id,
178
+ traceId: this.logger.getCorrelationId(),
179
+ });
167
180
  }
168
181
  }
169
182
  /**
@@ -174,35 +187,40 @@ export class ConversationSession {
174
187
  async *run(text, { hallucinationRetryCount = 0, skipUserMessage = false, } = {}) {
175
188
  let stream = null;
176
189
  try {
177
- const shouldAddUserMessage = !skipUserMessage && !this.abortedApprovalContext;
190
+ this.logger.info('Conversation stream start', {
191
+ eventType: 'stream.started',
192
+ category: 'stream',
193
+ phase: 'request_start',
194
+ sessionId: this.id,
195
+ traceId: this.logger.getCorrelationId(),
196
+ });
197
+ const abortedContext = this.approvalState.consumeAborted();
198
+ const shouldAddUserMessage = !skipUserMessage && !abortedContext;
178
199
  // Maintain canonical local history regardless of provider.
179
200
  if (shouldAddUserMessage) {
180
201
  this.conversationStore.addUserMessage(text);
181
202
  }
182
203
  // If there's an aborted approval, we need to resolve it first.
183
204
  // The user's message is a new input, but the agent is stuck waiting for tool output.
184
- if (this.abortedApprovalContext) {
205
+ if (abortedContext) {
185
206
  this.logger.debug('Resolving aborted approval with fake execution', {
186
207
  message: text,
187
208
  });
188
- const { state, interruption, emittedCommandIds, toolCallArgumentsById, } = this.abortedApprovalContext;
189
- this.abortedApprovalContext = null;
209
+ const { state, interruption, emittedCommandIds, toolCallArgumentsById } = abortedContext;
190
210
  // Restore cached tool-call arguments captured before abort so continuation can attach them
191
211
  this.toolCallArgumentsById.clear();
192
212
  if (toolCallArgumentsById?.size) {
193
- for (const [key, value,] of toolCallArgumentsById.entries()) {
213
+ for (const [key, value] of toolCallArgumentsById.entries()) {
194
214
  this.toolCallArgumentsById.set(key, value);
195
215
  }
196
216
  }
197
217
  // Add interceptor for this tool execution
198
218
  const toolName = interruption.name ?? 'unknown';
199
- const expectedCallId = interruption.rawItem?.callId ??
200
- interruption.callId;
219
+ const expectedCallId = interruption.rawItem?.callId ?? interruption.callId;
201
220
  const rejectionMessage = `Tool execution was not approved. User provided new input instead: ${text}`;
202
221
  const removeInterceptor = this.agentClient.addToolInterceptor(async (name, _params, toolCallId) => {
203
222
  // Match both tool name and call ID for stricter matching
204
- if (name === toolName &&
205
- (!expectedCallId || toolCallId === expectedCallId)) {
223
+ if (name === toolName && (!expectedCallId || toolCallId === expectedCallId)) {
206
224
  markToolCallAsApprovalRejection(toolCallId ?? expectedCallId);
207
225
  return rejectionMessage;
208
226
  }
@@ -225,8 +243,7 @@ export class ConversationSession {
225
243
  this.previousResponseId = stream.lastResponseId;
226
244
  this.conversationStore.updateFromResult(stream);
227
245
  // Check if another interruption occurred
228
- if (stream.interruptions &&
229
- stream.interruptions.length > 0) {
246
+ if (stream.interruptions && stream.interruptions.length > 0) {
230
247
  this.logger.warn('Another interruption occurred after fake execution - handling as approval');
231
248
  // Let the normal flow handle this
232
249
  const result = this.#buildResult(stream, acc.finalOutput, acc.reasoningOutput, acc.emittedCommandIds, acc.latestUsage);
@@ -253,12 +270,8 @@ export class ConversationSession {
253
270
  yield {
254
271
  type: 'final',
255
272
  finalText: result.finalText,
256
- ...(result.reasoningText
257
- ? { reasoningText: result.reasoningText }
258
- : {}),
259
- ...(result.commandMessages?.length
260
- ? { commandMessages: result.commandMessages }
261
- : {}),
273
+ ...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
274
+ ...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
262
275
  ...(result.usage ? { usage: result.usage } : {}),
263
276
  };
264
277
  }
@@ -289,12 +302,8 @@ export class ConversationSession {
289
302
  yield {
290
303
  type: 'final',
291
304
  finalText: result.finalText,
292
- ...(result.reasoningText
293
- ? { reasoningText: result.reasoningText }
294
- : {}),
295
- ...(result.commandMessages?.length
296
- ? { commandMessages: result.commandMessages }
297
- : {}),
305
+ ...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
306
+ ...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
298
307
  ...(result.usage ? { usage: result.usage } : {}),
299
308
  };
300
309
  }
@@ -302,9 +311,7 @@ export class ConversationSession {
302
311
  }
303
312
  catch (error) {
304
313
  this.logger.warn('Error resolving aborted approval with fake execution', {
305
- error: error instanceof Error
306
- ? error.message
307
- : String(error),
314
+ error: error instanceof Error ? error.message : String(error),
308
315
  });
309
316
  // Fall through to normal message flow
310
317
  }
@@ -317,11 +324,8 @@ export class ConversationSession {
317
324
  const provider = typeof this.agentClient.getProvider === 'function'
318
325
  ? this.agentClient.getProvider()
319
326
  : 'openai';
320
- // Only OpenAI uses server-side conversation management via previousResponseId.
321
- // All other providers (OpenRouter, openai-compatible) need full history.
322
- stream = await this.agentClient.startStream(provider !== 'openai'
323
- ? this.conversationStore.getHistory()
324
- : text, {
327
+ const supportsChaining = supportsConversationChaining(provider);
328
+ stream = await this.agentClient.startStream(supportsChaining ? text : this.conversationStore.getHistory(), {
325
329
  previousResponseId: this.previousResponseId,
326
330
  });
327
331
  const acc = {
@@ -338,6 +342,14 @@ export class ConversationSession {
338
342
  // Build terminal event (approval_required or final)
339
343
  const result = this.#buildResult(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
340
344
  if (result.type === 'approval_required') {
345
+ this.logger.info('Tool approval required', {
346
+ eventType: 'approval.required',
347
+ category: 'approval',
348
+ phase: 'approval',
349
+ sessionId: this.id,
350
+ traceId: this.logger.getCorrelationId(),
351
+ toolName: result.approval.toolName,
352
+ });
341
353
  const interruption = result.approval.rawInterruption;
342
354
  const callId = interruption?.rawItem?.callId ??
343
355
  interruption?.callId ??
@@ -359,27 +371,26 @@ export class ConversationSession {
359
371
  yield {
360
372
  type: 'final',
361
373
  finalText: result.finalText,
362
- ...(result.reasoningText
363
- ? { reasoningText: result.reasoningText }
364
- : {}),
365
- ...(result.commandMessages?.length
366
- ? { commandMessages: result.commandMessages }
367
- : {}),
374
+ ...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
375
+ ...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
368
376
  ...(result.usage ? { usage: result.usage } : {}),
369
377
  };
370
378
  }
371
379
  catch (error) {
372
380
  // Handle tool hallucination: model called a non-existent tool
373
- if (isToolHallucinationError(error) &&
374
- hallucinationRetryCount < MAX_HALLUCINATION_RETRIES) {
375
- const toolName = error instanceof Error
376
- ? error.message.match(/Tool (\S+) not found/)?.[1] ||
377
- 'unknown'
378
- : 'unknown';
381
+ if (isToolHallucinationError(error) && hallucinationRetryCount < MAX_HALLUCINATION_RETRIES) {
382
+ const toolName = error instanceof Error ? error.message.match(/Tool (\S+) not found/)?.[1] || 'unknown' : 'unknown';
379
383
  this.logger.warn('Tool hallucination detected, retrying', {
384
+ eventType: 'retry.hallucination',
385
+ category: 'retry',
386
+ phase: 'retry',
380
387
  toolName,
388
+ retryType: 'hallucination',
389
+ retryAttempt: hallucinationRetryCount + 1,
381
390
  attempt: hallucinationRetryCount + 1,
382
391
  maxRetries: MAX_HALLUCINATION_RETRIES,
392
+ sessionId: this.id,
393
+ traceId: this.logger.getCorrelationId(),
383
394
  errorMessage: error instanceof Error ? error.message : String(error),
384
395
  });
385
396
  yield {
@@ -412,6 +423,14 @@ export class ConversationSession {
412
423
  type: 'error',
413
424
  message: error instanceof Error ? error.message : String(error),
414
425
  };
426
+ this.logger.error('Conversation stream error', {
427
+ eventType: 'stream.failed',
428
+ category: 'stream',
429
+ phase: 'abort',
430
+ sessionId: this.id,
431
+ traceId: this.logger.getCorrelationId(),
432
+ errorMessage: error instanceof Error ? error.message : String(error),
433
+ });
415
434
  throw error;
416
435
  }
417
436
  }
@@ -421,25 +440,31 @@ export class ConversationSession {
421
440
  * Named as a string-literal because `continue` is a keyword.
422
441
  */
423
442
  async *['continue']({ answer, rejectionReason, }) {
424
- if (!this.pendingApprovalContext) {
443
+ const pendingApprovalContext = this.approvalState.getPending();
444
+ if (!pendingApprovalContext) {
425
445
  return;
426
446
  }
427
- const { state, interruption, emittedCommandIds: previouslyEmittedIds, toolCallArgumentsById, } = this.pendingApprovalContext;
447
+ const { state, interruption, emittedCommandIds: previouslyEmittedIds, toolCallArgumentsById, } = pendingApprovalContext;
428
448
  let removeInterceptor = null;
429
449
  if (answer === 'y') {
450
+ this.logger.info('Tool approval granted', {
451
+ eventType: 'approval.granted',
452
+ category: 'approval',
453
+ phase: 'approval',
454
+ sessionId: this.id,
455
+ traceId: this.logger.getCorrelationId(),
456
+ });
430
457
  state.approve(interruption);
431
458
  }
432
459
  else {
433
460
  const toolName = interruption.name ?? 'unknown';
434
- const expectedCallId = interruption.rawItem?.callId ??
435
- interruption.callId;
461
+ const expectedCallId = interruption.rawItem?.callId ?? interruption.callId;
436
462
  const rejectionMessage = rejectionReason
437
463
  ? `Tool execution was not approved. User's reason: ${rejectionReason}`
438
464
  : 'Tool execution was not approved.';
439
465
  if (typeof this.agentClient.addToolInterceptor === 'function') {
440
466
  const removeInterceptor = this.agentClient.addToolInterceptor(async (name, _params, toolCallId) => {
441
- if (name === toolName &&
442
- (!expectedCallId || toolCallId === expectedCallId)) {
467
+ if (name === toolName && (!expectedCallId || toolCallId === expectedCallId)) {
443
468
  markToolCallAsApprovalRejection(toolCallId ?? expectedCallId);
444
469
  return rejectionMessage;
445
470
  }
@@ -448,18 +473,21 @@ export class ConversationSession {
448
473
  // Approve to continue but interceptor will return rejection message
449
474
  state.approve(interruption);
450
475
  // Store interceptor cleanup for after stream
451
- this.pendingApprovalContext = {
452
- ...this.pendingApprovalContext,
453
- removeInterceptor,
454
- };
476
+ this.approvalState.setPendingRemoveInterceptor(removeInterceptor);
455
477
  }
456
478
  else {
457
479
  // Fallback for clients without tool interceptors
458
480
  state.reject(interruption);
459
481
  }
482
+ this.logger.info('Tool approval rejected', {
483
+ eventType: 'approval.rejected',
484
+ category: 'approval',
485
+ phase: 'approval',
486
+ sessionId: this.id,
487
+ traceId: this.logger.getCorrelationId(),
488
+ });
460
489
  }
461
- removeInterceptor =
462
- this.pendingApprovalContext?.removeInterceptor ?? null;
490
+ removeInterceptor = this.approvalState.getPending()?.removeInterceptor ?? null;
463
491
  // Restore cached tool-call arguments so continuation outputs can attach them
464
492
  this.toolCallArgumentsById.clear();
465
493
  if (toolCallArgumentsById?.size) {
@@ -484,12 +512,17 @@ export class ConversationSession {
484
512
  this.conversationStore.updateFromResult(stream);
485
513
  // Merge previously emitted command IDs with newly emitted ones
486
514
  // This prevents duplicates when result.history contains commands from the initial stream
487
- const allEmittedIds = new Set([
488
- ...previouslyEmittedIds,
489
- ...acc.emittedCommandIds,
490
- ]);
515
+ const allEmittedIds = new Set([...previouslyEmittedIds, ...acc.emittedCommandIds]);
491
516
  const result = this.#buildResult(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, allEmittedIds, acc.latestUsage);
492
517
  if (result.type === 'approval_required') {
518
+ this.logger.info('Tool approval required', {
519
+ eventType: 'approval.required',
520
+ category: 'approval',
521
+ phase: 'approval',
522
+ sessionId: this.id,
523
+ traceId: this.logger.getCorrelationId(),
524
+ toolName: result.approval.toolName,
525
+ });
493
526
  const interruption = result.approval.rawInterruption;
494
527
  const callId = interruption?.rawItem?.callId ??
495
528
  interruption?.callId ??
@@ -511,12 +544,8 @@ export class ConversationSession {
511
544
  yield {
512
545
  type: 'final',
513
546
  finalText: result.finalText,
514
- ...(result.reasoningText
515
- ? { reasoningText: result.reasoningText }
516
- : {}),
517
- ...(result.commandMessages?.length
518
- ? { commandMessages: result.commandMessages }
519
- : {}),
547
+ ...(result.reasoningText ? { reasoningText: result.reasoningText } : {}),
548
+ ...(result.commandMessages?.length ? { commandMessages: result.commandMessages } : {}),
520
549
  ...(result.usage ? { usage: result.usage } : {}),
521
550
  };
522
551
  }
@@ -558,7 +587,7 @@ export class ConversationSession {
558
587
  case 'approval_required': {
559
588
  sawTerminalEvent = event;
560
589
  // pendingApprovalContext is set inside #buildResult during run()
561
- const rawInterruption = this.pendingApprovalContext?.interruption;
590
+ const rawInterruption = this.approvalState.getPending()?.interruption;
562
591
  return {
563
592
  type: 'approval_required',
564
593
  approval: {
@@ -613,7 +642,7 @@ export class ConversationSession {
613
642
  return response;
614
643
  }
615
644
  async handleApprovalDecision(answer, rejectionReason, { onTextChunk, onReasoningChunk, onCommandMessage, onEvent, } = {}) {
616
- if (!this.pendingApprovalContext) {
645
+ if (!this.approvalState.getPending()) {
617
646
  return null;
618
647
  }
619
648
  let finalText = '';
@@ -640,7 +669,7 @@ export class ConversationSession {
640
669
  }
641
670
  case 'approval_required': {
642
671
  sawTerminalEvent = event;
643
- const rawInterruption = this.pendingApprovalContext?.interruption;
672
+ const rawInterruption = this.approvalState.getPending()?.interruption;
644
673
  return {
645
674
  type: 'approval_required',
646
675
  approval: {
@@ -748,14 +777,14 @@ export class ConversationSession {
748
777
  });
749
778
  }
750
779
  // Log event type with deduplication for ordering understanding
751
- const delta1 = this.#extractTextDelta(event);
780
+ const delta1 = extractTextDelta(event);
752
781
  if (delta1) {
753
782
  const e = emitText(delta1);
754
783
  if (e)
755
784
  yield e;
756
785
  }
757
786
  if (event?.data) {
758
- const delta2 = this.#extractTextDelta(event.data);
787
+ const delta2 = extractTextDelta(event.data);
759
788
  if (delta2) {
760
789
  const e = emitText(delta2);
761
790
  if (e)
@@ -763,71 +792,25 @@ export class ConversationSession {
763
792
  }
764
793
  }
765
794
  // Handle reasoning items
766
- const reasoningDelta = (() => {
767
- // OpenAI style
768
- const data = event?.data;
769
- if (data &&
770
- typeof data === 'object' &&
771
- data.type === 'model') {
772
- const eventDetail = data.event;
773
- if (eventDetail &&
774
- typeof eventDetail === 'object' &&
775
- eventDetail.type ===
776
- 'response.reasoning_summary_text.delta') {
777
- return eventDetail.delta ?? '';
778
- }
779
- }
780
- // OpenRouter style
781
- const choices = event?.data?.event?.choices;
782
- if (!choices)
783
- return '';
784
- if (Array.isArray(choices)) {
785
- return choices[0]?.delta?.reasoning ?? choices[0]?.delta?.reasoning_content ?? '';
786
- }
787
- if (typeof choices === 'object') {
788
- const byZero = choices['0'];
789
- const first = byZero ?? choices[Object.keys(choices)[0]];
790
- return first?.delta?.reasoning ?? first?.delta?.reasoning_content ?? '';
791
- }
792
- return '';
793
- })();
795
+ const reasoningDelta = extractReasoningDelta(event);
794
796
  if (reasoningDelta) {
795
797
  const e = emitReasoning(reasoningDelta);
796
798
  if (e)
797
799
  yield e;
798
800
  }
799
- const maybeEmitCommandMessagesFromItems = (items) => {
800
- this.#attachCachedArguments(items, toolCallArgumentsById);
801
- const commandMessages = extractCommandMessages(items);
802
- const out = [];
803
- for (const cmdMsg of commandMessages) {
804
- if (acc.emittedCommandIds.has(cmdMsg.id)) {
805
- continue;
806
- }
807
- if (cmdMsg.isApprovalRejection) {
808
- continue;
809
- }
810
- acc.emittedCommandIds.add(cmdMsg.id);
811
- out.push({ type: 'command_message', message: cmdMsg });
812
- }
813
- return out;
814
- };
801
+ const maybeEmitCommandMessagesFromItems = (items) => emitCommandMessagesFromItems(items, {
802
+ toolCallArgumentsById,
803
+ emittedCommandIds: acc.emittedCommandIds,
804
+ });
815
805
  if (event?.type === 'run_item_stream_event') {
816
- this.#captureToolCallArguments(event.item, toolCallArgumentsById);
806
+ captureToolCallArguments(event.item, toolCallArgumentsById);
817
807
  // Emit tool_started event when a function_call is detected
818
808
  const rawItem = event.item?.rawItem ?? event.item;
819
809
  if (rawItem?.type === 'function_call') {
820
- const callId = rawItem.callId ??
821
- rawItem.call_id ??
822
- rawItem.tool_call_id ??
823
- rawItem.toolCallId ??
824
- rawItem.id;
810
+ const callId = rawItem.callId ?? rawItem.call_id ?? rawItem.tool_call_id ?? rawItem.toolCallId ?? rawItem.id;
825
811
  if (callId) {
826
812
  const toolName = rawItem.name ?? event.item?.name;
827
- const args = rawItem.arguments ??
828
- rawItem.args ??
829
- event.item?.arguments ??
830
- event.item?.args;
813
+ const args = rawItem.arguments ?? rawItem.args ?? event.item?.arguments ?? event.item?.args;
831
814
  // Providers sometimes surface arguments as a JSON string.
832
815
  // Normalize here so downstream UI (pending/running display)
833
816
  // can reliably render parameters.
@@ -843,6 +826,30 @@ export class ConversationSession {
843
826
  return JSON.parse(trimmed);
844
827
  }
845
828
  catch {
829
+ if ((trimmed.startsWith('{') || trimmed.startsWith('[')) &&
830
+ !this.emittedInvalidToolCallPackets.has(String(callId))) {
831
+ this.emittedInvalidToolCallPackets.add(String(callId));
832
+ const diagnostic = createInvalidToolCallDiagnostic({
833
+ toolName: toolName ?? 'unknown',
834
+ toolCallId: String(callId),
835
+ rawPayload: trimmed,
836
+ normalizedToolCall: {
837
+ toolName: toolName ?? 'unknown',
838
+ toolCallId: String(callId),
839
+ arguments: args,
840
+ },
841
+ validationErrors: ['arguments must be valid JSON'],
842
+ traceId: this.logger.getCorrelationId() ?? 'trace-unknown',
843
+ retryContext: {
844
+ sessionId: this.id,
845
+ },
846
+ });
847
+ this.logger.error('Invalid tool call argument payload', {
848
+ ...diagnostic,
849
+ sessionId: this.id,
850
+ messageId: String(callId),
851
+ });
852
+ }
846
853
  return args;
847
854
  }
848
855
  })();
@@ -852,26 +859,31 @@ export class ConversationSession {
852
859
  toolName: toolName ?? 'unknown',
853
860
  arguments: normalizedArgs,
854
861
  };
862
+ this.logger.info('Tool execution started', {
863
+ eventType: 'tool_call.execution_started',
864
+ category: 'tool',
865
+ phase: 'execution',
866
+ sessionId: this.id,
867
+ traceId: this.logger.getCorrelationId(),
868
+ toolName: toolName ?? 'unknown',
869
+ toolCallId: String(callId),
870
+ messageId: String(callId),
871
+ });
855
872
  }
856
873
  }
857
- for (const e of maybeEmitCommandMessagesFromItems([
858
- event.item,
859
- ])) {
874
+ for (const e of maybeEmitCommandMessagesFromItems([event.item])) {
860
875
  yield e;
861
876
  }
862
877
  }
863
- else if (event?.type === 'tool_call_output_item' ||
864
- event?.rawItem?.type === 'function_call_output') {
865
- this.#captureToolCallArguments(event, toolCallArgumentsById);
878
+ else if (event?.type === 'tool_call_output_item' || event?.rawItem?.type === 'function_call_output') {
879
+ captureToolCallArguments(event, toolCallArgumentsById);
866
880
  for (const e of maybeEmitCommandMessagesFromItems([event])) {
867
881
  yield e;
868
882
  }
869
883
  }
870
884
  }
871
885
  const completedResult = await stream.completed;
872
- const rawResponses = Array.isArray(stream?.rawResponses)
873
- ? stream.rawResponses
874
- : [];
886
+ const rawResponses = Array.isArray(stream?.rawResponses) ? stream.rawResponses : [];
875
887
  let usageFromRawResponses;
876
888
  for (let i = rawResponses.length - 1; i >= 0; i--) {
877
889
  const candidate = extractUsage(rawResponses[i]);
@@ -880,9 +892,7 @@ export class ConversationSession {
880
892
  break;
881
893
  }
882
894
  }
883
- const finalUsage = extractUsage(completedResult) ||
884
- extractUsage(stream) ||
885
- usageFromRawResponses;
895
+ const finalUsage = extractUsage(completedResult) || extractUsage(stream) || usageFromRawResponses;
886
896
  if (finalUsage) {
887
897
  acc.latestUsage = finalUsage;
888
898
  const usageSource = extractUsage(completedResult)
@@ -898,9 +908,7 @@ export class ConversationSession {
898
908
  });
899
909
  }
900
910
  else {
901
- const completedResultRecord = completedResult &&
902
- typeof completedResult === 'object' &&
903
- !Array.isArray(completedResult)
911
+ const completedResultRecord = completedResult && typeof completedResult === 'object' && !Array.isArray(completedResult)
904
912
  ? completedResult
905
913
  : undefined;
906
914
  const streamRecord = stream && typeof stream === 'object' && !Array.isArray(stream)
@@ -909,14 +917,8 @@ export class ConversationSession {
909
917
  this.logger.debug('No usage found in stream completion', {
910
918
  sessionId: this.id,
911
919
  source: 'stream_completed',
912
- completedResultType: completedResult === null
913
- ? 'null'
914
- : Array.isArray(completedResult)
915
- ? 'array'
916
- : typeof completedResult,
917
- completedResultKeys: completedResultRecord
918
- ? Object.keys(completedResultRecord)
919
- : [],
920
+ completedResultType: completedResult === null ? 'null' : Array.isArray(completedResult) ? 'array' : typeof completedResult,
921
+ completedResultKeys: completedResultRecord ? Object.keys(completedResultRecord) : [],
920
922
  streamKeys: streamRecord ? Object.keys(streamRecord) : [],
921
923
  completedResultHasUsagePath: {
922
924
  usage: Boolean(completedResultRecord?.usage),
@@ -928,128 +930,15 @@ export class ConversationSession {
928
930
  }
929
931
  this.flushStreamEventLog();
930
932
  }
931
- #captureToolCallArguments(item, toolCallArgumentsById) {
932
- const rawItem = item?.rawItem ?? item;
933
- if (!rawItem) {
934
- return;
935
- }
936
- if (rawItem?.type !== 'function_call') {
937
- return;
938
- }
939
- const callId = rawItem.callId ??
940
- rawItem.call_id ??
941
- rawItem.tool_call_id ??
942
- rawItem.toolCallId ??
943
- rawItem.id;
944
- if (!callId) {
945
- return;
946
- }
947
- const args = rawItem.arguments ?? rawItem.args ?? item?.arguments ?? item?.args;
948
- if (!args) {
949
- return;
950
- }
951
- toolCallArgumentsById.set(callId, args);
952
- }
953
- #attachCachedArguments(items = [], toolCallArgumentsById) {
954
- if (!items?.length) {
955
- return;
956
- }
957
- for (const item of items) {
958
- if (!item) {
959
- continue;
960
- }
961
- if (item.arguments ||
962
- item.args ||
963
- item?.rawItem?.arguments ||
964
- item?.rawItem?.args) {
965
- continue;
966
- }
967
- const rawItem = item?.rawItem ?? item;
968
- const callId = rawItem?.callId ??
969
- rawItem?.call_id ??
970
- rawItem?.tool_call_id ??
971
- rawItem?.toolCallId ??
972
- rawItem?.id ??
973
- item?.callId ??
974
- item?.call_id ??
975
- item?.tool_call_id ??
976
- item?.toolCallId ??
977
- item?.id;
978
- if (!callId) {
979
- continue;
980
- }
981
- const args = toolCallArgumentsById.get(callId);
982
- if (!args) {
983
- continue;
984
- }
985
- item.arguments = args;
986
- }
987
- }
988
- #extractTextDelta(payload) {
989
- if (payload === null || payload === undefined) {
990
- return null;
991
- }
992
- if (typeof payload === 'string') {
993
- return payload || null;
994
- }
995
- if (typeof payload !== 'object') {
996
- return null;
997
- }
998
- const type = typeof payload.type === 'string' ? payload.type : '';
999
- const looksLikeOutput = typeof type === 'string' && type.includes('output_text');
1000
- const hasOutputProperties = Boolean(payload.delta ??
1001
- payload.output_text ??
1002
- payload.text ??
1003
- payload.content);
1004
- if (!looksLikeOutput && !hasOutputProperties) {
1005
- return null;
1006
- }
1007
- const deltaCandidate = payload.delta ??
1008
- payload.output_text ??
1009
- payload.text ??
1010
- payload.content;
1011
- const text = this.#coerceToText(deltaCandidate);
1012
- return text || null;
1013
- }
1014
- #coerceToText(value) {
1015
- if (value === null || value === undefined) {
1016
- return '';
1017
- }
1018
- if (typeof value === 'string') {
1019
- return value;
1020
- }
1021
- if (typeof value === 'number' || typeof value === 'boolean') {
1022
- return String(value);
1023
- }
1024
- if (Array.isArray(value)) {
1025
- return value
1026
- .map(entry => this.#coerceToText(entry))
1027
- .filter(Boolean)
1028
- .join('');
1029
- }
1030
- if (typeof value === 'object') {
1031
- const record = value;
1032
- const candidates = ['text', 'value', 'content', 'delta'];
1033
- for (const field of candidates) {
1034
- if (field in record) {
1035
- const text = this.#coerceToText(record[field]);
1036
- if (text) {
1037
- return text;
1038
- }
1039
- }
1040
- }
1041
- }
1042
- return '';
1043
- }
1044
933
  #buildResult(result, finalOutputOverride, reasoningOutputOverride, emittedCommandIds, usage) {
1045
934
  if (result.interruptions && result.interruptions.length > 0) {
1046
935
  const interruption = result.interruptions[0];
1047
- this.pendingApprovalContext = {
936
+ this.approvalState.setPending({
1048
937
  state: result.state,
1049
938
  interruption,
1050
939
  emittedCommandIds: emittedCommandIds ?? new Set(),
1051
940
  toolCallArgumentsById: new Map(this.toolCallArgumentsById),
1052
- };
941
+ });
1053
942
  let argumentsText = '';
1054
943
  const toolName = interruption.name;
1055
944
  // For shell_call (built-in shell tool), extract commands from action
@@ -1081,13 +970,13 @@ export class ConversationSession {
1081
970
  },
1082
971
  };
1083
972
  }
1084
- this.pendingApprovalContext = null;
973
+ this.approvalState.clearPending();
1085
974
  const allCommandMessages = extractCommandMessages(result.newItems || result.history || []);
1086
975
  // Filter out commands that were already emitted in real-time
1087
976
  const commandMessages = emittedCommandIds
1088
- ? allCommandMessages.filter(msg => !emittedCommandIds.has(msg.id))
977
+ ? allCommandMessages.filter((msg) => !emittedCommandIds.has(msg.id))
1089
978
  : allCommandMessages;
1090
- const visibleCommandMessages = commandMessages.filter(msg => !msg.isApprovalRejection);
979
+ const visibleCommandMessages = commandMessages.filter((msg) => !msg.isApprovalRejection);
1091
980
  const response = {
1092
981
  type: 'response',
1093
982
  commandMessages: visibleCommandMessages,