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