@qduc/term2 0.6.1 → 0.7.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 (798) hide show
  1. package/dist/agent.d.ts +9 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +138 -69
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agent.test.js +165 -15
  6. package/dist/agent.test.js.map +1 -1
  7. package/dist/app.d.ts +14 -3
  8. package/dist/app.d.ts.map +1 -1
  9. package/dist/app.js +168 -28
  10. package/dist/app.js.map +1 -1
  11. package/dist/app.large-uncached-warning.test.d.ts +2 -0
  12. package/dist/app.large-uncached-warning.test.d.ts.map +1 -0
  13. package/dist/app.large-uncached-warning.test.js +15 -0
  14. package/dist/app.large-uncached-warning.test.js.map +1 -0
  15. package/dist/app.startup-banner.test.js +3 -19
  16. package/dist/app.startup-banner.test.js.map +1 -1
  17. package/dist/cli.js +139 -69
  18. package/dist/cli.js.map +1 -1
  19. package/dist/components/Banner.d.ts.map +1 -1
  20. package/dist/components/Banner.js +35 -17
  21. package/dist/components/Banner.js.map +1 -1
  22. package/dist/components/BottomArea.d.ts +7 -1
  23. package/dist/components/BottomArea.d.ts.map +1 -1
  24. package/dist/components/BottomArea.js +8 -6
  25. package/dist/components/BottomArea.js.map +1 -1
  26. package/dist/components/BottomArea.test.js +14 -1
  27. package/dist/components/BottomArea.test.js.map +1 -1
  28. package/dist/components/CommandMessage.d.ts.map +1 -1
  29. package/dist/components/CommandMessage.js +31 -1
  30. package/dist/components/CommandMessage.js.map +1 -1
  31. package/dist/components/CommandMessage.test.js +150 -31
  32. package/dist/components/CommandMessage.test.js.map +1 -1
  33. package/dist/components/Common/MenuContainer.d.ts +20 -0
  34. package/dist/components/Common/MenuContainer.d.ts.map +1 -0
  35. package/dist/components/Common/MenuContainer.js +52 -0
  36. package/dist/components/Common/MenuContainer.js.map +1 -0
  37. package/dist/components/Common/ScrollableTabBar.d.ts +26 -0
  38. package/dist/components/Common/ScrollableTabBar.d.ts.map +1 -0
  39. package/dist/components/Common/ScrollableTabBar.js +26 -0
  40. package/dist/components/Common/ScrollableTabBar.js.map +1 -0
  41. package/dist/components/Common/compute-visible-tabs.d.ts +16 -0
  42. package/dist/components/Common/compute-visible-tabs.d.ts.map +1 -0
  43. package/dist/components/Common/compute-visible-tabs.js +53 -0
  44. package/dist/components/Common/compute-visible-tabs.js.map +1 -0
  45. package/dist/components/Common/compute-visible-tabs.test.d.ts +2 -0
  46. package/dist/components/Common/compute-visible-tabs.test.d.ts.map +1 -0
  47. package/dist/components/Common/compute-visible-tabs.test.js +97 -0
  48. package/dist/components/Common/compute-visible-tabs.test.js.map +1 -0
  49. package/dist/components/HandoffConfirmationPrompt.d.ts +9 -0
  50. package/dist/components/HandoffConfirmationPrompt.d.ts.map +1 -0
  51. package/dist/components/HandoffConfirmationPrompt.js +38 -0
  52. package/dist/components/HandoffConfirmationPrompt.js.map +1 -0
  53. package/dist/components/HandoffConfirmationPrompt.test.d.ts +2 -0
  54. package/dist/components/HandoffConfirmationPrompt.test.d.ts.map +1 -0
  55. package/dist/components/HandoffConfirmationPrompt.test.js +12 -0
  56. package/dist/components/HandoffConfirmationPrompt.test.js.map +1 -0
  57. package/dist/components/Input/PopupManager.d.ts +5 -1
  58. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  59. package/dist/components/Input/PopupManager.js +2 -2
  60. package/dist/components/Input/PopupManager.js.map +1 -1
  61. package/dist/components/Input/popup-key-navigation.js +2 -2
  62. package/dist/components/Input/popup-key-navigation.js.map +1 -1
  63. package/dist/components/Input/popup-key-navigation.test.js +5 -3
  64. package/dist/components/Input/popup-key-navigation.test.js.map +1 -1
  65. package/dist/components/Input/popup-props.d.ts.map +1 -1
  66. package/dist/components/Input/popup-props.js +4 -0
  67. package/dist/components/Input/popup-props.js.map +1 -1
  68. package/dist/components/Input/popup-props.test.d.ts +2 -0
  69. package/dist/components/Input/popup-props.test.d.ts.map +1 -0
  70. package/dist/components/Input/popup-props.test.js +70 -0
  71. package/dist/components/Input/popup-props.test.js.map +1 -0
  72. package/dist/components/InputBox.d.ts +0 -1
  73. package/dist/components/InputBox.d.ts.map +1 -1
  74. package/dist/components/InputBox.js +66 -14
  75. package/dist/components/InputBox.js.map +1 -1
  76. package/dist/components/InputBox.test.js +192 -12
  77. package/dist/components/InputBox.test.js.map +1 -1
  78. package/dist/components/MessageList.d.ts +1 -0
  79. package/dist/components/MessageList.d.ts.map +1 -1
  80. package/dist/components/MessageList.js.map +1 -1
  81. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  82. package/dist/components/ModelSelectionMenu.debug.test.d.ts +2 -0
  83. package/dist/components/ModelSelectionMenu.debug.test.d.ts.map +1 -0
  84. package/dist/components/ModelSelectionMenu.debug.test.js.map +1 -0
  85. package/dist/components/ModelSelectionMenu.js +29 -125
  86. package/dist/components/ModelSelectionMenu.js.map +1 -1
  87. package/dist/components/ModelSelectionMenu.test.js +9 -5
  88. package/dist/components/ModelSelectionMenu.test.js.map +1 -1
  89. package/dist/components/PathSelectionMenu.d.ts.map +1 -1
  90. package/dist/components/PathSelectionMenu.js +15 -55
  91. package/dist/components/PathSelectionMenu.js.map +1 -1
  92. package/dist/components/SettingsSelectionMenu.d.ts +4 -1
  93. package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
  94. package/dist/components/SettingsSelectionMenu.js +48 -104
  95. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  96. package/dist/components/SettingsSelectionMenu.scroll.test.js +140 -0
  97. package/dist/components/SettingsSelectionMenu.scroll.test.js.map +1 -1
  98. package/dist/components/SettingsSelectionMenu.test.js +38 -5
  99. package/dist/components/SettingsSelectionMenu.test.js.map +1 -1
  100. package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -1
  101. package/dist/components/SettingsValueSelectionMenu.js +24 -51
  102. package/dist/components/SettingsValueSelectionMenu.js.map +1 -1
  103. package/dist/components/SlashCommandMenu.d.ts +1 -0
  104. package/dist/components/SlashCommandMenu.d.ts.map +1 -1
  105. package/dist/components/SlashCommandMenu.js +11 -14
  106. package/dist/components/SlashCommandMenu.js.map +1 -1
  107. package/dist/components/StatusBar.d.ts +2 -0
  108. package/dist/components/StatusBar.d.ts.map +1 -1
  109. package/dist/components/StatusBar.js +35 -2
  110. package/dist/components/StatusBar.js.map +1 -1
  111. package/dist/components/StatusBar.test.js +32 -0
  112. package/dist/components/StatusBar.test.js.map +1 -1
  113. package/dist/components/UndoSelectionMenu.d.ts.map +1 -1
  114. package/dist/components/UndoSelectionMenu.js +6 -33
  115. package/dist/components/UndoSelectionMenu.js.map +1 -1
  116. package/dist/context/InputContext.stability.test.js +9 -7
  117. package/dist/context/InputContext.stability.test.js.map +1 -1
  118. package/dist/env-setup.js +1 -0
  119. package/dist/env-setup.js.map +1 -1
  120. package/dist/hooks/use-app-commands.d.ts +22 -2
  121. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  122. package/dist/hooks/use-app-commands.js +43 -3
  123. package/dist/hooks/use-app-commands.js.map +1 -1
  124. package/dist/hooks/use-app-commands.test.js +135 -1
  125. package/dist/hooks/use-app-commands.test.js.map +1 -1
  126. package/dist/hooks/use-conversation.clear.test.js +12 -7
  127. package/dist/hooks/use-conversation.clear.test.js.map +1 -1
  128. package/dist/hooks/use-conversation.d.ts +21 -1
  129. package/dist/hooks/use-conversation.d.ts.map +1 -1
  130. package/dist/hooks/use-conversation.js +81 -9
  131. package/dist/hooks/use-conversation.js.map +1 -1
  132. package/dist/hooks/use-escape-key.d.ts +8 -1
  133. package/dist/hooks/use-escape-key.d.ts.map +1 -1
  134. package/dist/hooks/use-escape-key.js +15 -4
  135. package/dist/hooks/use-escape-key.js.map +1 -1
  136. package/dist/hooks/use-escape-key.test.js +135 -28
  137. package/dist/hooks/use-escape-key.test.js.map +1 -1
  138. package/dist/hooks/use-input-history.test.js +14 -8
  139. package/dist/hooks/use-input-history.test.js.map +1 -1
  140. package/dist/hooks/use-mode-handlers.d.ts +12 -1
  141. package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
  142. package/dist/hooks/use-mode-handlers.js +31 -1
  143. package/dist/hooks/use-mode-handlers.js.map +1 -1
  144. package/dist/hooks/use-model-selection.d.ts +6 -1
  145. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  146. package/dist/hooks/use-model-selection.js +50 -8
  147. package/dist/hooks/use-model-selection.js.map +1 -1
  148. package/dist/hooks/use-model-selection.test.js +306 -50
  149. package/dist/hooks/use-model-selection.test.js.map +1 -1
  150. package/dist/hooks/use-path-completion.d.ts +4 -0
  151. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  152. package/dist/hooks/use-path-completion.js +23 -17
  153. package/dist/hooks/use-path-completion.js.map +1 -1
  154. package/dist/hooks/use-path-completion.test.d.ts +2 -0
  155. package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
  156. package/dist/hooks/use-path-completion.test.js +54 -0
  157. package/dist/hooks/use-path-completion.test.js.map +1 -0
  158. package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
  159. package/dist/hooks/use-runtime-settings.js +7 -2
  160. package/dist/hooks/use-runtime-settings.js.map +1 -1
  161. package/dist/hooks/use-runtime-settings.test.d.ts +2 -0
  162. package/dist/hooks/use-runtime-settings.test.d.ts.map +1 -0
  163. package/dist/hooks/use-runtime-settings.test.js +45 -0
  164. package/dist/hooks/use-runtime-settings.test.js.map +1 -0
  165. package/dist/hooks/use-selection.d.ts +6 -2
  166. package/dist/hooks/use-selection.d.ts.map +1 -1
  167. package/dist/hooks/use-selection.js +53 -16
  168. package/dist/hooks/use-selection.js.map +1 -1
  169. package/dist/hooks/use-selection.test.d.ts +2 -0
  170. package/dist/hooks/use-selection.test.d.ts.map +1 -0
  171. package/dist/hooks/use-selection.test.js +132 -0
  172. package/dist/hooks/use-selection.test.js.map +1 -0
  173. package/dist/hooks/use-settings-completion.d.ts +19 -0
  174. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  175. package/dist/hooks/use-settings-completion.js +106 -18
  176. package/dist/hooks/use-settings-completion.js.map +1 -1
  177. package/dist/hooks/use-settings-completion.scroll.test.js +68 -29
  178. package/dist/hooks/use-settings-completion.scroll.test.js.map +1 -1
  179. package/dist/hooks/use-settings-completion.test.js +36 -1
  180. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  181. package/dist/hooks/use-settings-value-completion.d.ts +7 -1
  182. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  183. package/dist/hooks/use-settings-value-completion.js +18 -7
  184. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  185. package/dist/hooks/use-slash-commands.d.ts +5 -0
  186. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  187. package/dist/hooks/use-slash-commands.js +22 -2
  188. package/dist/hooks/use-slash-commands.js.map +1 -1
  189. package/dist/hooks/use-trigger-detection.test.js +9 -6
  190. package/dist/hooks/use-trigger-detection.test.js.map +1 -1
  191. package/dist/hooks/use-undo-selection.d.ts +4 -0
  192. package/dist/hooks/use-undo-selection.d.ts.map +1 -1
  193. package/dist/hooks/use-undo-selection.js +18 -1
  194. package/dist/hooks/use-undo-selection.js.map +1 -1
  195. package/dist/inspect_zod.d.ts +2 -0
  196. package/dist/inspect_zod.d.ts.map +1 -0
  197. package/dist/inspect_zod.js +16 -0
  198. package/dist/inspect_zod.js.map +1 -0
  199. package/dist/lib/openai-agent-client.d.ts +10 -3
  200. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  201. package/dist/lib/openai-agent-client.js +191 -37
  202. package/dist/lib/openai-agent-client.js.map +1 -1
  203. package/dist/lib/openai-agent-client.public-methods.test.js +193 -0
  204. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
  205. package/dist/lib/openai-agent-client.test.js +71 -1
  206. package/dist/lib/openai-agent-client.test.js.map +1 -1
  207. package/dist/lib/tool-invoke.d.ts +3 -2
  208. package/dist/lib/tool-invoke.d.ts.map +1 -1
  209. package/dist/lib/tool-invoke.js +213 -10
  210. package/dist/lib/tool-invoke.js.map +1 -1
  211. package/dist/lib/tool-invoke.test.js +103 -0
  212. package/dist/lib/tool-invoke.test.js.map +1 -1
  213. package/dist/prompts/codex.md +105 -97
  214. package/dist/prompts/fragments/gpt-5.3-codex.md +7 -0
  215. package/dist/prompts/fragments/gpt-5.4-small.md +6 -0
  216. package/dist/prompts/fragments/gpt-5.4.md +7 -0
  217. package/dist/prompts/fragments/gpt-5.5.md +7 -0
  218. package/dist/prompts/gpt-5-modern.md +96 -54
  219. package/dist/prompts/gpt-5.md +7 -4
  220. package/dist/prompts/plan-mode-info.md +14 -3
  221. package/dist/prompts/prompt-constructor.d.ts +19 -0
  222. package/dist/prompts/prompt-constructor.d.ts.map +1 -0
  223. package/dist/prompts/prompt-constructor.js +53 -0
  224. package/dist/prompts/prompt-constructor.js.map +1 -0
  225. package/dist/prompts/prompt-constructor.test.d.ts +2 -0
  226. package/dist/prompts/prompt-constructor.test.d.ts.map +1 -0
  227. package/dist/prompts/prompt-constructor.test.js +99 -0
  228. package/dist/prompts/prompt-constructor.test.js.map +1 -0
  229. package/dist/prompts/prompt-constructor.test.ts +112 -0
  230. package/dist/prompts/prompt-constructor.ts +91 -0
  231. package/dist/prompts/prompt-profiles.d.ts +17 -0
  232. package/dist/prompts/prompt-profiles.d.ts.map +1 -0
  233. package/dist/prompts/prompt-profiles.js +61 -0
  234. package/dist/prompts/prompt-profiles.js.map +1 -0
  235. package/dist/prompts/prompt-profiles.ts +77 -0
  236. package/dist/prompts/prompt-selector.d.ts.map +1 -1
  237. package/dist/prompts/prompt-selector.js +3 -21
  238. package/dist/prompts/prompt-selector.js.map +1 -1
  239. package/dist/prompts/prompt-selector.ts +3 -25
  240. package/dist/prompts/reasoning-efficiency.d.ts.map +1 -1
  241. package/dist/prompts/reasoning-efficiency.js +2 -0
  242. package/dist/prompts/reasoning-efficiency.js.map +1 -1
  243. package/dist/prompts/reasoning-efficiency.test.d.ts +2 -0
  244. package/dist/prompts/reasoning-efficiency.test.d.ts.map +1 -0
  245. package/dist/prompts/reasoning-efficiency.test.js +11 -0
  246. package/dist/prompts/reasoning-efficiency.test.js.map +1 -0
  247. package/dist/prompts/reasoning-efficiency.test.ts +12 -0
  248. package/dist/prompts/reasoning-efficiency.ts +2 -0
  249. package/dist/prompts/search-via-shell.test.js +19 -16
  250. package/dist/prompts/search-via-shell.test.js.map +1 -1
  251. package/dist/prompts/search-via-shell.test.ts +20 -16
  252. package/dist/prompts/subagent-delegation.test.js +12 -10
  253. package/dist/prompts/subagent-delegation.test.js.map +1 -1
  254. package/dist/prompts/subagent-delegation.test.ts +13 -10
  255. package/dist/prompts/worktree-hygiene.md +9 -0
  256. package/dist/providers/ai-sdk-logging-fetch.d.ts.map +1 -1
  257. package/dist/providers/ai-sdk-logging-fetch.js +78 -3
  258. package/dist/providers/ai-sdk-logging-fetch.js.map +1 -1
  259. package/dist/providers/ai-sdk-logging-fetch.test.js +143 -0
  260. package/dist/providers/ai-sdk-logging-fetch.test.js.map +1 -1
  261. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +0 -2
  262. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
  263. package/dist/providers/ai-sdk-openai-compatible.provider.js +4 -8
  264. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
  265. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +1 -119
  266. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
  267. package/dist/providers/codex-responses-model.d.ts +20 -0
  268. package/dist/providers/codex-responses-model.d.ts.map +1 -0
  269. package/dist/providers/codex-responses-model.js +170 -0
  270. package/dist/providers/codex-responses-model.js.map +1 -0
  271. package/dist/providers/codex-responses-model.test.d.ts +2 -0
  272. package/dist/providers/codex-responses-model.test.d.ts.map +1 -0
  273. package/dist/providers/codex-responses-model.test.js +240 -0
  274. package/dist/providers/codex-responses-model.test.js.map +1 -0
  275. package/dist/providers/codex.provider.d.ts +29 -0
  276. package/dist/providers/codex.provider.d.ts.map +1 -0
  277. package/dist/providers/codex.provider.js +486 -0
  278. package/dist/providers/codex.provider.js.map +1 -0
  279. package/dist/providers/codex.provider.test.d.ts +2 -0
  280. package/dist/providers/codex.provider.test.d.ts.map +1 -0
  281. package/dist/providers/codex.provider.test.js +634 -0
  282. package/dist/providers/codex.provider.test.js.map +1 -0
  283. package/dist/providers/custom-provider-adapter.test.js +56 -0
  284. package/dist/providers/custom-provider-adapter.test.js.map +1 -1
  285. package/dist/providers/fallback-responses-model.d.ts +20 -0
  286. package/dist/providers/fallback-responses-model.d.ts.map +1 -0
  287. package/dist/providers/fallback-responses-model.js +277 -0
  288. package/dist/providers/fallback-responses-model.js.map +1 -0
  289. package/dist/providers/fallback-responses-model.test.d.ts +2 -0
  290. package/dist/providers/fallback-responses-model.test.d.ts.map +1 -0
  291. package/dist/providers/fallback-responses-model.test.js +279 -0
  292. package/dist/providers/fallback-responses-model.test.js.map +1 -0
  293. package/dist/providers/fetch/compose.d.ts +7 -0
  294. package/dist/providers/fetch/compose.d.ts.map +1 -0
  295. package/dist/providers/fetch/compose.js +20 -0
  296. package/dist/providers/fetch/compose.js.map +1 -0
  297. package/dist/providers/fetch/composer.d.ts +13 -0
  298. package/dist/providers/fetch/composer.d.ts.map +1 -0
  299. package/dist/providers/fetch/composer.js +15 -0
  300. package/dist/providers/fetch/composer.js.map +1 -0
  301. package/dist/providers/fetch/composer.test.d.ts +2 -0
  302. package/dist/providers/fetch/composer.test.d.ts.map +1 -0
  303. package/dist/providers/fetch/composer.test.js +448 -0
  304. package/dist/providers/fetch/composer.test.js.map +1 -0
  305. package/dist/providers/fetch/logging-middleware.d.ts +16 -0
  306. package/dist/providers/fetch/logging-middleware.d.ts.map +1 -0
  307. package/dist/providers/fetch/logging-middleware.js +214 -0
  308. package/dist/providers/fetch/logging-middleware.js.map +1 -0
  309. package/dist/providers/index.d.ts +1 -0
  310. package/dist/providers/index.d.ts.map +1 -1
  311. package/dist/providers/index.js +1 -0
  312. package/dist/providers/index.js.map +1 -1
  313. package/dist/providers/llama-cpp.provider.d.ts +3 -0
  314. package/dist/providers/llama-cpp.provider.d.ts.map +1 -0
  315. package/dist/providers/llama-cpp.provider.js +34 -0
  316. package/dist/providers/llama-cpp.provider.js.map +1 -0
  317. package/dist/providers/openai-compatible-behavior-gate.test.js +1 -42
  318. package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -1
  319. package/dist/providers/openai-compatible-middleware.d.ts +7 -0
  320. package/dist/providers/openai-compatible-middleware.d.ts.map +1 -0
  321. package/dist/providers/openai-compatible-middleware.js +133 -0
  322. package/dist/providers/openai-compatible-middleware.js.map +1 -0
  323. package/dist/providers/openai-compatible-models.d.ts +6 -0
  324. package/dist/providers/openai-compatible-models.d.ts.map +1 -0
  325. package/dist/providers/openai-compatible-models.js +17 -0
  326. package/dist/providers/openai-compatible-models.js.map +1 -0
  327. package/dist/providers/openai-compatible-response-normalizer.d.ts +7 -0
  328. package/dist/providers/openai-compatible-response-normalizer.d.ts.map +1 -0
  329. package/dist/providers/openai-compatible-response-normalizer.js +58 -0
  330. package/dist/providers/openai-compatible-response-normalizer.js.map +1 -0
  331. package/dist/providers/openai-compatible.provider.d.ts +4 -1
  332. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  333. package/dist/providers/openai-compatible.provider.js +68 -324
  334. package/dist/providers/openai-compatible.provider.js.map +1 -1
  335. package/dist/providers/openai-compatible.provider.test.js +106 -1
  336. package/dist/providers/openai-compatible.provider.test.js.map +1 -1
  337. package/dist/providers/openai.provider.js +42 -10
  338. package/dist/providers/openai.provider.js.map +1 -1
  339. package/dist/providers/openai.provider.test.d.ts +2 -0
  340. package/dist/providers/openai.provider.test.d.ts.map +1 -0
  341. package/dist/providers/openai.provider.test.js +22 -0
  342. package/dist/providers/openai.provider.test.js.map +1 -0
  343. package/dist/providers/opencode.provider.d.ts +19 -0
  344. package/dist/providers/opencode.provider.d.ts.map +1 -0
  345. package/dist/providers/opencode.provider.js +45 -0
  346. package/dist/providers/opencode.provider.js.map +1 -0
  347. package/dist/providers/openrouter.provider.d.ts +2 -3
  348. package/dist/providers/openrouter.provider.d.ts.map +1 -1
  349. package/dist/providers/openrouter.provider.js +23 -24
  350. package/dist/providers/openrouter.provider.js.map +1 -1
  351. package/dist/providers/openrouter.provider.request-preprocessing.test.js +12 -9
  352. package/dist/providers/openrouter.provider.request-preprocessing.test.js.map +1 -1
  353. package/dist/providers/registry.d.ts +1 -0
  354. package/dist/providers/registry.d.ts.map +1 -1
  355. package/dist/providers/registry.js.map +1 -1
  356. package/dist/providers/registry.test.js +6 -22
  357. package/dist/providers/registry.test.js.map +1 -1
  358. package/dist/scripts/eval-auto-approval/dataset.d.ts +2 -2
  359. package/dist/services/approval-flow-coordinator.d.ts.map +1 -1
  360. package/dist/services/approval-flow-coordinator.js +17 -1
  361. package/dist/services/approval-flow-coordinator.js.map +1 -1
  362. package/dist/services/approval-flow-coordinator.test.js +22 -0
  363. package/dist/services/approval-flow-coordinator.test.js.map +1 -1
  364. package/dist/services/command-message-streaming.d.ts.map +1 -1
  365. package/dist/services/command-message-streaming.js +0 -3
  366. package/dist/services/command-message-streaming.js.map +1 -1
  367. package/dist/services/command-message-streaming.test.js +4 -2
  368. package/dist/services/command-message-streaming.test.js.map +1 -1
  369. package/dist/services/conversation-clear-save.test.js +38 -66
  370. package/dist/services/conversation-clear-save.test.js.map +1 -1
  371. package/dist/services/conversation-events.d.ts +44 -1
  372. package/dist/services/conversation-events.d.ts.map +1 -1
  373. package/dist/services/conversation-integration.test.js +3 -1
  374. package/dist/services/conversation-integration.test.js.map +1 -1
  375. package/dist/services/conversation-log-events.d.ts +107 -0
  376. package/dist/services/conversation-log-events.d.ts.map +1 -0
  377. package/dist/services/conversation-log-events.js +12 -0
  378. package/dist/services/conversation-log-events.js.map +1 -0
  379. package/dist/services/conversation-log-writer.d.ts +40 -0
  380. package/dist/services/conversation-log-writer.d.ts.map +1 -0
  381. package/dist/services/conversation-log-writer.js +264 -0
  382. package/dist/services/conversation-log-writer.js.map +1 -0
  383. package/dist/services/conversation-persistence-types.d.ts +14 -0
  384. package/dist/services/conversation-persistence-types.d.ts.map +1 -0
  385. package/dist/services/conversation-persistence-types.js +2 -0
  386. package/dist/services/conversation-persistence-types.js.map +1 -0
  387. package/dist/services/conversation-persistence.d.ts +38 -39
  388. package/dist/services/conversation-persistence.d.ts.map +1 -1
  389. package/dist/services/conversation-persistence.js +270 -82
  390. package/dist/services/conversation-persistence.js.map +1 -1
  391. package/dist/services/conversation-persistence.test.js +472 -637
  392. package/dist/services/conversation-persistence.test.js.map +1 -1
  393. package/dist/services/conversation-replay.d.ts +26 -0
  394. package/dist/services/conversation-replay.d.ts.map +1 -0
  395. package/dist/services/conversation-replay.js +252 -0
  396. package/dist/services/conversation-replay.js.map +1 -0
  397. package/dist/services/conversation-replay.test.d.ts +2 -0
  398. package/dist/services/conversation-replay.test.d.ts.map +1 -0
  399. package/dist/services/conversation-replay.test.js +153 -0
  400. package/dist/services/conversation-replay.test.js.map +1 -0
  401. package/dist/services/conversation-result-builder.d.ts.map +1 -1
  402. package/dist/services/conversation-result-builder.js +8 -2
  403. package/dist/services/conversation-result-builder.js.map +1 -1
  404. package/dist/services/conversation-result-builder.test.js +53 -0
  405. package/dist/services/conversation-result-builder.test.js.map +1 -1
  406. package/dist/services/conversation-retry-policy.d.ts +17 -0
  407. package/dist/services/conversation-retry-policy.d.ts.map +1 -1
  408. package/dist/services/conversation-retry-policy.js +35 -5
  409. package/dist/services/conversation-retry-policy.js.map +1 -1
  410. package/dist/services/conversation-retry-policy.test.js +56 -1
  411. package/dist/services/conversation-retry-policy.test.js.map +1 -1
  412. package/dist/services/conversation-service.d.ts +9 -0
  413. package/dist/services/conversation-service.d.ts.map +1 -1
  414. package/dist/services/conversation-service.js +18 -0
  415. package/dist/services/conversation-service.js.map +1 -1
  416. package/dist/services/conversation-session.d.ts +14 -0
  417. package/dist/services/conversation-session.d.ts.map +1 -1
  418. package/dist/services/conversation-session.js +426 -51
  419. package/dist/services/conversation-session.js.map +1 -1
  420. package/dist/services/input-surge-guard.d.ts +4 -0
  421. package/dist/services/input-surge-guard.d.ts.map +1 -1
  422. package/dist/services/input-surge-guard.js +2 -2
  423. package/dist/services/input-surge-guard.js.map +1 -1
  424. package/dist/services/input-surge-guard.test.js +15 -1
  425. package/dist/services/input-surge-guard.test.js.map +1 -1
  426. package/dist/services/large-uncached-input-guard.d.ts +35 -0
  427. package/dist/services/large-uncached-input-guard.d.ts.map +1 -0
  428. package/dist/services/large-uncached-input-guard.js +127 -0
  429. package/dist/services/large-uncached-input-guard.js.map +1 -0
  430. package/dist/services/large-uncached-input-guard.test.d.ts +2 -0
  431. package/dist/services/large-uncached-input-guard.test.d.ts.map +1 -0
  432. package/dist/services/large-uncached-input-guard.test.js +160 -0
  433. package/dist/services/large-uncached-input-guard.test.js.map +1 -0
  434. package/dist/services/model-service.d.ts +2 -0
  435. package/dist/services/model-service.d.ts.map +1 -1
  436. package/dist/services/model-service.js +7 -0
  437. package/dist/services/model-service.js.map +1 -1
  438. package/dist/services/provider-traffic.d.ts.map +1 -1
  439. package/dist/services/provider-traffic.js +82 -24
  440. package/dist/services/provider-traffic.js.map +1 -1
  441. package/dist/services/provider-traffic.test.js +98 -6
  442. package/dist/services/provider-traffic.test.js.map +1 -1
  443. package/dist/services/rtk-service.d.ts.map +1 -1
  444. package/dist/services/rtk-service.js +1 -2
  445. package/dist/services/rtk-service.js.map +1 -1
  446. package/dist/services/settings-schema.d.ts +36 -28
  447. package/dist/services/settings-schema.d.ts.map +1 -1
  448. package/dist/services/settings-schema.js +7 -2
  449. package/dist/services/settings-schema.js.map +1 -1
  450. package/dist/services/settings-sources.d.ts.map +1 -1
  451. package/dist/services/settings-sources.js +1 -0
  452. package/dist/services/settings-sources.js.map +1 -1
  453. package/dist/services/stream-event-processor.d.ts +4 -0
  454. package/dist/services/stream-event-processor.d.ts.map +1 -1
  455. package/dist/services/stream-event-processor.js +78 -39
  456. package/dist/services/stream-event-processor.js.map +1 -1
  457. package/dist/services/stream-event-processor.test.js +71 -0
  458. package/dist/services/stream-event-processor.test.js.map +1 -1
  459. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  460. package/dist/services/subagents/subagent-manager.js +88 -16
  461. package/dist/services/subagents/subagent-manager.js.map +1 -1
  462. package/dist/services/subagents/subagent-manager.test.js +354 -0
  463. package/dist/services/subagents/subagent-manager.test.js.map +1 -1
  464. package/dist/services/terminal-result-collector.d.ts.map +1 -1
  465. package/dist/services/terminal-result-collector.js +6 -1
  466. package/dist/services/terminal-result-collector.js.map +1 -1
  467. package/dist/services/tool-call-arguments.d.ts +20 -0
  468. package/dist/services/tool-call-arguments.d.ts.map +1 -0
  469. package/dist/services/tool-call-arguments.js +49 -0
  470. package/dist/services/tool-call-arguments.js.map +1 -0
  471. package/dist/services/tool-execution-ledger.d.ts +35 -0
  472. package/dist/services/tool-execution-ledger.d.ts.map +1 -0
  473. package/dist/services/tool-execution-ledger.js +204 -0
  474. package/dist/services/tool-execution-ledger.js.map +1 -0
  475. package/dist/services/tool-execution-ledger.test.d.ts +2 -0
  476. package/dist/services/tool-execution-ledger.test.d.ts.map +1 -0
  477. package/dist/services/tool-execution-ledger.test.js +96 -0
  478. package/dist/services/tool-execution-ledger.test.js.map +1 -0
  479. package/dist/tools/apply-patch.d.ts +8 -0
  480. package/dist/tools/apply-patch.d.ts.map +1 -1
  481. package/dist/tools/apply-patch.js +157 -2
  482. package/dist/tools/apply-patch.js.map +1 -1
  483. package/dist/tools/apply-patch.test.js +81 -0
  484. package/dist/tools/apply-patch.test.js.map +1 -1
  485. package/dist/tools/search-replace.d.ts.map +1 -1
  486. package/dist/tools/search-replace.js +92 -140
  487. package/dist/tools/search-replace.js.map +1 -1
  488. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  489. package/dist/utils/conversation-event-handler.js +33 -1
  490. package/dist/utils/conversation-event-handler.js.map +1 -1
  491. package/dist/utils/conversation-event-handler.test.js +103 -0
  492. package/dist/utils/conversation-event-handler.test.js.map +1 -1
  493. package/dist/utils/error-helpers.d.ts +1 -0
  494. package/dist/utils/error-helpers.d.ts.map +1 -1
  495. package/dist/utils/error-helpers.js +61 -0
  496. package/dist/utils/error-helpers.js.map +1 -1
  497. package/dist/utils/error-helpers.test.js +13 -1
  498. package/dist/utils/error-helpers.test.js.map +1 -1
  499. package/dist/utils/ink-render-options.d.ts +1 -1
  500. package/dist/utils/ink-render-options.d.ts.map +1 -1
  501. package/dist/utils/ink-render-options.js +1 -1
  502. package/dist/utils/ink-render-options.js.map +1 -1
  503. package/dist/utils/project-tree.d.ts +14 -0
  504. package/dist/utils/project-tree.d.ts.map +1 -0
  505. package/dist/utils/project-tree.js +111 -0
  506. package/dist/utils/project-tree.js.map +1 -0
  507. package/dist/utils/project-tree.test.d.ts +2 -0
  508. package/dist/utils/project-tree.test.d.ts.map +1 -0
  509. package/dist/utils/project-tree.test.js +149 -0
  510. package/dist/utils/project-tree.test.js.map +1 -0
  511. package/dist/utils/streaming-session-factory.d.ts +2 -0
  512. package/dist/utils/streaming-session-factory.d.ts.map +1 -1
  513. package/dist/utils/streaming-session-factory.js +4 -0
  514. package/dist/utils/streaming-session-factory.js.map +1 -1
  515. package/dist/utils/terminal-clear.d.ts +7 -0
  516. package/dist/utils/terminal-clear.d.ts.map +1 -0
  517. package/dist/utils/terminal-clear.js +5 -0
  518. package/dist/utils/terminal-clear.js.map +1 -0
  519. package/dist/utils/terminal-clear.test.d.ts +2 -0
  520. package/dist/utils/terminal-clear.test.d.ts.map +1 -0
  521. package/dist/utils/terminal-clear.test.js +13 -0
  522. package/dist/utils/terminal-clear.test.js.map +1 -0
  523. package/package.json +2 -2
  524. package/dist/agent.lite-mode.test.d.ts +0 -2
  525. package/dist/agent.lite-mode.test.d.ts.map +0 -1
  526. package/dist/agent.lite-mode.test.js +0 -39
  527. package/dist/agent.lite-mode.test.js.map +0 -1
  528. package/dist/components/ApprovalPrompt.test.d.ts +0 -2
  529. package/dist/components/ApprovalPrompt.test.d.ts.map +0 -1
  530. package/dist/components/ApprovalPrompt.test.js +0 -23
  531. package/dist/components/ApprovalPrompt.test.js.map +0 -1
  532. package/dist/components/LiveResponse.test.d.ts +0 -2
  533. package/dist/components/LiveResponse.test.d.ts.map +0 -1
  534. package/dist/components/LiveResponse.test.js +0 -13
  535. package/dist/components/LiveResponse.test.js.map +0 -1
  536. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
  537. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
  538. package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
  539. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
  540. package/dist/components/TextInput.d.ts +0 -42
  541. package/dist/components/TextInput.d.ts.map +0 -1
  542. package/dist/components/TextInput.js +0 -398
  543. package/dist/components/TextInput.js.map +0 -1
  544. package/dist/components/TextInput.test.d.ts +0 -2
  545. package/dist/components/TextInput.test.d.ts.map +0 -1
  546. package/dist/components/TextInput.test.js +0 -75
  547. package/dist/components/TextInput.test.js.map +0 -1
  548. package/dist/debug_ask_mentor.d.ts +0 -2
  549. package/dist/debug_ask_mentor.d.ts.map +0 -1
  550. package/dist/debug_ask_mentor.js +0 -73
  551. package/dist/debug_ask_mentor.js.map +0 -1
  552. package/dist/hooks/use-conversation.max-turns-undo.test.d.ts +0 -2
  553. package/dist/hooks/use-conversation.max-turns-undo.test.d.ts.map +0 -1
  554. package/dist/hooks/use-conversation.max-turns-undo.test.js +0 -118
  555. package/dist/hooks/use-conversation.max-turns-undo.test.js.map +0 -1
  556. package/dist/lib/shell.d.ts +0 -7
  557. package/dist/lib/shell.d.ts.map +0 -1
  558. package/dist/lib/shell.js +0 -56
  559. package/dist/lib/shell.js.map +0 -1
  560. package/dist/modes/companion/command-index.d.ts +0 -26
  561. package/dist/modes/companion/command-index.d.ts.map +0 -1
  562. package/dist/modes/companion/command-index.js +0 -50
  563. package/dist/modes/companion/command-index.js.map +0 -1
  564. package/dist/modes/companion/command-index.test.d.ts +0 -2
  565. package/dist/modes/companion/command-index.test.d.ts.map +0 -1
  566. package/dist/modes/companion/command-index.test.js +0 -86
  567. package/dist/modes/companion/command-index.test.js.map +0 -1
  568. package/dist/modes/companion/companion-app.d.ts +0 -12
  569. package/dist/modes/companion/companion-app.d.ts.map +0 -1
  570. package/dist/modes/companion/companion-app.js +0 -297
  571. package/dist/modes/companion/companion-app.js.map +0 -1
  572. package/dist/modes/companion/companion-session.d.ts +0 -63
  573. package/dist/modes/companion/companion-session.d.ts.map +0 -1
  574. package/dist/modes/companion/companion-session.js +0 -146
  575. package/dist/modes/companion/companion-session.js.map +0 -1
  576. package/dist/modes/companion/companion-session.test.d.ts +0 -2
  577. package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
  578. package/dist/modes/companion/companion-session.test.js +0 -28
  579. package/dist/modes/companion/companion-session.test.js.map +0 -1
  580. package/dist/modes/companion/components/status-bar.d.ts +0 -13
  581. package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
  582. package/dist/modes/companion/components/status-bar.js +0 -26
  583. package/dist/modes/companion/components/status-bar.js.map +0 -1
  584. package/dist/modes/companion/context-buffer.d.ts +0 -65
  585. package/dist/modes/companion/context-buffer.d.ts.map +0 -1
  586. package/dist/modes/companion/context-buffer.js +0 -156
  587. package/dist/modes/companion/context-buffer.js.map +0 -1
  588. package/dist/modes/companion/context-buffer.test.d.ts +0 -2
  589. package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
  590. package/dist/modes/companion/context-buffer.test.js +0 -154
  591. package/dist/modes/companion/context-buffer.test.js.map +0 -1
  592. package/dist/modes/companion/event-detector.d.ts +0 -46
  593. package/dist/modes/companion/event-detector.d.ts.map +0 -1
  594. package/dist/modes/companion/event-detector.js +0 -169
  595. package/dist/modes/companion/event-detector.js.map +0 -1
  596. package/dist/modes/companion/event-detector.test.d.ts +0 -2
  597. package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
  598. package/dist/modes/companion/event-detector.test.js +0 -121
  599. package/dist/modes/companion/event-detector.test.js.map +0 -1
  600. package/dist/modes/companion/index.d.ts +0 -33
  601. package/dist/modes/companion/index.d.ts.map +0 -1
  602. package/dist/modes/companion/index.js +0 -21
  603. package/dist/modes/companion/index.js.map +0 -1
  604. package/dist/modes/companion/input-key-mapper.d.ts +0 -3
  605. package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
  606. package/dist/modes/companion/input-key-mapper.js +0 -31
  607. package/dist/modes/companion/input-key-mapper.js.map +0 -1
  608. package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
  609. package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
  610. package/dist/modes/companion/input-key-mapper.test.js +0 -26
  611. package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
  612. package/dist/modes/companion/input-parser.d.ts +0 -53
  613. package/dist/modes/companion/input-parser.d.ts.map +0 -1
  614. package/dist/modes/companion/input-parser.js +0 -114
  615. package/dist/modes/companion/input-parser.js.map +0 -1
  616. package/dist/modes/companion/input-parser.test.d.ts +0 -2
  617. package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
  618. package/dist/modes/companion/input-parser.test.js +0 -123
  619. package/dist/modes/companion/input-parser.test.js.map +0 -1
  620. package/dist/modes/companion/mode-manager.d.ts +0 -41
  621. package/dist/modes/companion/mode-manager.d.ts.map +0 -1
  622. package/dist/modes/companion/mode-manager.js +0 -56
  623. package/dist/modes/companion/mode-manager.js.map +0 -1
  624. package/dist/modes/companion/mode-manager.test.d.ts +0 -2
  625. package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
  626. package/dist/modes/companion/mode-manager.test.js +0 -65
  627. package/dist/modes/companion/mode-manager.test.js.map +0 -1
  628. package/dist/modes/companion/output-classifier.d.ts +0 -15
  629. package/dist/modes/companion/output-classifier.d.ts.map +0 -1
  630. package/dist/modes/companion/output-classifier.js +0 -77
  631. package/dist/modes/companion/output-classifier.js.map +0 -1
  632. package/dist/modes/companion/output-classifier.test.d.ts +0 -2
  633. package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
  634. package/dist/modes/companion/output-classifier.test.js +0 -133
  635. package/dist/modes/companion/output-classifier.test.js.map +0 -1
  636. package/dist/modes/companion/pty-wrapper.d.ts +0 -46
  637. package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
  638. package/dist/modes/companion/pty-wrapper.js +0 -143
  639. package/dist/modes/companion/pty-wrapper.js.map +0 -1
  640. package/dist/modes/companion/safety-classifier.d.ts +0 -31
  641. package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
  642. package/dist/modes/companion/safety-classifier.js +0 -140
  643. package/dist/modes/companion/safety-classifier.js.map +0 -1
  644. package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
  645. package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
  646. package/dist/modes/companion/safety-classifier.test.js +0 -151
  647. package/dist/modes/companion/safety-classifier.test.js.map +0 -1
  648. package/dist/modes/companion/summarizer.d.ts +0 -24
  649. package/dist/modes/companion/summarizer.d.ts.map +0 -1
  650. package/dist/modes/companion/summarizer.js +0 -132
  651. package/dist/modes/companion/summarizer.js.map +0 -1
  652. package/dist/modes/companion/terminal-history.d.ts +0 -27
  653. package/dist/modes/companion/terminal-history.d.ts.map +0 -1
  654. package/dist/modes/companion/terminal-history.js +0 -142
  655. package/dist/modes/companion/terminal-history.js.map +0 -1
  656. package/dist/prompts/simple-mentor.md +0 -215
  657. package/dist/providers/ai-sdk-openai.provider.d.ts +0 -14
  658. package/dist/providers/ai-sdk-openai.provider.d.ts.map +0 -1
  659. package/dist/providers/ai-sdk-openai.provider.js +0 -18
  660. package/dist/providers/ai-sdk-openai.provider.js.map +0 -1
  661. package/dist/providers/github-copilot/converters.d.ts +0 -45
  662. package/dist/providers/github-copilot/converters.d.ts.map +0 -1
  663. package/dist/providers/github-copilot/converters.js +0 -118
  664. package/dist/providers/github-copilot/converters.js.map +0 -1
  665. package/dist/providers/github-copilot/converters.test.d.ts +0 -2
  666. package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
  667. package/dist/providers/github-copilot/converters.test.js +0 -162
  668. package/dist/providers/github-copilot/converters.test.js.map +0 -1
  669. package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
  670. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
  671. package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
  672. package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
  673. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
  674. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
  675. package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
  676. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
  677. package/dist/providers/github-copilot/index.d.ts +0 -4
  678. package/dist/providers/github-copilot/index.d.ts.map +0 -1
  679. package/dist/providers/github-copilot/index.js +0 -4
  680. package/dist/providers/github-copilot/index.js.map +0 -1
  681. package/dist/providers/github-copilot/model.d.ts +0 -24
  682. package/dist/providers/github-copilot/model.d.ts.map +0 -1
  683. package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
  684. package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
  685. package/dist/providers/github-copilot/model.delta.test.js +0 -15
  686. package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
  687. package/dist/providers/github-copilot/model.js +0 -498
  688. package/dist/providers/github-copilot/model.js.map +0 -1
  689. package/dist/providers/github-copilot/model.test.d.ts +0 -2
  690. package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
  691. package/dist/providers/github-copilot/model.test.js +0 -63
  692. package/dist/providers/github-copilot/model.test.js.map +0 -1
  693. package/dist/providers/github-copilot/provider.d.ts +0 -15
  694. package/dist/providers/github-copilot/provider.d.ts.map +0 -1
  695. package/dist/providers/github-copilot/provider.js +0 -25
  696. package/dist/providers/github-copilot/provider.js.map +0 -1
  697. package/dist/providers/github-copilot/provider.test.d.ts +0 -2
  698. package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
  699. package/dist/providers/github-copilot/provider.test.js +0 -52
  700. package/dist/providers/github-copilot/provider.test.js.map +0 -1
  701. package/dist/providers/github-copilot/utils.d.ts +0 -20
  702. package/dist/providers/github-copilot/utils.d.ts.map +0 -1
  703. package/dist/providers/github-copilot/utils.js +0 -142
  704. package/dist/providers/github-copilot/utils.js.map +0 -1
  705. package/dist/providers/github-copilot/utils.test.d.ts +0 -2
  706. package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
  707. package/dist/providers/github-copilot/utils.test.js +0 -21
  708. package/dist/providers/github-copilot/utils.test.js.map +0 -1
  709. package/dist/providers/openai-compatible/api.d.ts +0 -17
  710. package/dist/providers/openai-compatible/api.d.ts.map +0 -1
  711. package/dist/providers/openai-compatible/api.js +0 -58
  712. package/dist/providers/openai-compatible/api.js.map +0 -1
  713. package/dist/providers/openai-compatible/model.d.ts +0 -17
  714. package/dist/providers/openai-compatible/model.d.ts.map +0 -1
  715. package/dist/providers/openai-compatible/model.js +0 -473
  716. package/dist/providers/openai-compatible/model.js.map +0 -1
  717. package/dist/providers/openai-compatible/provider.d.ts +0 -22
  718. package/dist/providers/openai-compatible/provider.d.ts.map +0 -1
  719. package/dist/providers/openai-compatible/provider.js +0 -43
  720. package/dist/providers/openai-compatible/provider.js.map +0 -1
  721. package/dist/providers/openai-compatible/reasoning-content.test.d.ts +0 -2
  722. package/dist/providers/openai-compatible/reasoning-content.test.d.ts.map +0 -1
  723. package/dist/providers/openai-compatible/reasoning-content.test.js +0 -258
  724. package/dist/providers/openai-compatible/reasoning-content.test.js.map +0 -1
  725. package/dist/providers/openai-compatible/utils.d.ts +0 -3
  726. package/dist/providers/openai-compatible/utils.d.ts.map +0 -1
  727. package/dist/providers/openai-compatible/utils.js +0 -11
  728. package/dist/providers/openai-compatible/utils.js.map +0 -1
  729. package/dist/providers/openrouter/api.d.ts +0 -39
  730. package/dist/providers/openrouter/api.d.ts.map +0 -1
  731. package/dist/providers/openrouter/api.js +0 -164
  732. package/dist/providers/openrouter/api.js.map +0 -1
  733. package/dist/providers/openrouter/converters.d.ts +0 -8
  734. package/dist/providers/openrouter/converters.d.ts.map +0 -1
  735. package/dist/providers/openrouter/converters.js +0 -391
  736. package/dist/providers/openrouter/converters.js.map +0 -1
  737. package/dist/providers/openrouter/converters.test.d.ts +0 -2
  738. package/dist/providers/openrouter/converters.test.d.ts.map +0 -1
  739. package/dist/providers/openrouter/converters.test.js +0 -179
  740. package/dist/providers/openrouter/converters.test.js.map +0 -1
  741. package/dist/providers/openrouter/index.d.ts +0 -4
  742. package/dist/providers/openrouter/index.d.ts.map +0 -1
  743. package/dist/providers/openrouter/index.js +0 -4
  744. package/dist/providers/openrouter/index.js.map +0 -1
  745. package/dist/providers/openrouter/model.d.ts +0 -14
  746. package/dist/providers/openrouter/model.d.ts.map +0 -1
  747. package/dist/providers/openrouter/model.js +0 -457
  748. package/dist/providers/openrouter/model.js.map +0 -1
  749. package/dist/providers/openrouter/provider.d.ts +0 -15
  750. package/dist/providers/openrouter/provider.d.ts.map +0 -1
  751. package/dist/providers/openrouter/provider.js +0 -21
  752. package/dist/providers/openrouter/provider.js.map +0 -1
  753. package/dist/providers/openrouter/reasoning-content.test.d.ts +0 -2
  754. package/dist/providers/openrouter/reasoning-content.test.d.ts.map +0 -1
  755. package/dist/providers/openrouter/reasoning-content.test.js +0 -122
  756. package/dist/providers/openrouter/reasoning-content.test.js.map +0 -1
  757. package/dist/providers/openrouter/utils.d.ts +0 -11
  758. package/dist/providers/openrouter/utils.d.ts.map +0 -1
  759. package/dist/providers/openrouter/utils.js +0 -29
  760. package/dist/providers/openrouter/utils.js.map +0 -1
  761. package/dist/providers/openrouter.api.retry.test.d.ts +0 -2
  762. package/dist/providers/openrouter.api.retry.test.d.ts.map +0 -1
  763. package/dist/providers/openrouter.api.retry.test.js +0 -148
  764. package/dist/providers/openrouter.api.retry.test.js.map +0 -1
  765. package/dist/providers/openrouter.test.d.ts +0 -2
  766. package/dist/providers/openrouter.test.d.ts.map +0 -1
  767. package/dist/providers/openrouter.test.js +0 -1449
  768. package/dist/providers/openrouter.test.js.map +0 -1
  769. package/dist/safety-checker.js +0 -57
  770. package/dist/services/check_mock.d.ts +0 -2
  771. package/dist/services/check_mock.d.ts.map +0 -1
  772. package/dist/services/check_mock.js +0 -22
  773. package/dist/services/check_mock.js.map +0 -1
  774. package/dist/services/conversation-service.test.d.ts +0 -2
  775. package/dist/services/conversation-service.test.d.ts.map +0 -1
  776. package/dist/services/conversation-service.test.js +0 -156
  777. package/dist/services/conversation-service.test.js.map +0 -1
  778. package/dist/services/subagents/reasoning-inheritance.test.d.ts +0 -2
  779. package/dist/services/subagents/reasoning-inheritance.test.d.ts.map +0 -1
  780. package/dist/services/subagents/reasoning-inheritance.test.js +0 -73
  781. package/dist/services/subagents/reasoning-inheritance.test.js.map +0 -1
  782. package/dist/tools/bash.d.ts +0 -10
  783. package/dist/tools/bash.d.ts.map +0 -1
  784. package/dist/tools/bash.js +0 -55
  785. package/dist/tools/bash.js.map +0 -1
  786. package/dist/utils/command-safety.d.ts +0 -21
  787. package/dist/utils/command-safety.d.ts.map +0 -1
  788. package/dist/utils/command-safety.devnull.test.d.ts +0 -2
  789. package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
  790. package/dist/utils/command-safety.devnull.test.js +0 -13
  791. package/dist/utils/command-safety.devnull.test.js.map +0 -1
  792. package/dist/utils/command-safety.js +0 -348
  793. package/dist/utils/command-safety.js.map +0 -1
  794. package/dist/utils/extract-command-messages.test.d.ts +0 -2
  795. package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
  796. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +0 -2
  797. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +0 -1
  798. package/dist/utils/provider-traffic-extractor.repro.test.js.map +0 -1
@@ -9,11 +9,65 @@ import { ShellAutoApprovalResolver } from './shell-auto-approval-resolver.js';
9
9
  import { ApprovalFlowCoordinator } from './approval-flow-coordinator.js';
10
10
  import { buildConversationResult, toTerminalEvent } from './conversation-result-builder.js';
11
11
  import { normalizeUserTurn } from '../types/user-turn.js';
12
- import { InputSurgeGuard } from './input-surge-guard.js';
12
+ import { collectDuplicateToolCallResultPairs, InputSurgeGuard } from './input-surge-guard.js';
13
+ import { LargeUncachedInputGuard } from './large-uncached-input-guard.js';
14
+ import { reconcileHistoryWithToolLedger, ToolExecutionLedger, } from './tool-execution-ledger.js';
15
+ import { describeError } from '../utils/error-helpers.js';
16
+ const asRecordLocal = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : null;
17
+ const rawItemLocal = (item) => {
18
+ const rec = asRecordLocal(item);
19
+ if (!rec)
20
+ return null;
21
+ return asRecordLocal(rec.rawItem) ?? rec;
22
+ };
23
+ const callIdOfLocal = (item) => {
24
+ const raw = rawItemLocal(item);
25
+ const cid = raw?.callId ?? raw?.call_id ?? raw?.tool_call_id ?? raw?.toolCallId ?? raw?.id;
26
+ return typeof cid === 'string' && cid ? cid : null;
27
+ };
28
+ const toolNameOfLocal = (item) => {
29
+ const raw = rawItemLocal(item);
30
+ const name = raw?.name ?? asRecordLocal(item)?.name;
31
+ return typeof name === 'string' && name ? name : 'unknown';
32
+ };
33
+ const outputOfLocal = (item) => {
34
+ const raw = rawItemLocal(item);
35
+ return raw?.output ?? asRecordLocal(item)?.output;
36
+ };
13
37
  const supportsConversationChaining = (providerId) => {
14
38
  const providerDef = getProvider(providerId);
15
39
  return providerDef?.capabilities?.supportsConversationChaining ?? false;
16
40
  };
41
+ const asArray = (value) => (Array.isArray(value) ? value : []);
42
+ const warnIfStreamHistoryReplayedTools = ({ logger, sessionId, source, stream, }) => {
43
+ const streamRecord = stream;
44
+ const history = asArray(streamRecord.history);
45
+ const newItems = asArray(streamRecord.newItems);
46
+ const stateGeneratedItems = asArray(streamRecord.state?._generatedItems);
47
+ const historyDuplicates = collectDuplicateToolCallResultPairs(history);
48
+ const newItemsDuplicates = collectDuplicateToolCallResultPairs(newItems);
49
+ const stateGeneratedItemsDuplicates = collectDuplicateToolCallResultPairs(stateGeneratedItems);
50
+ if (historyDuplicates.pairs === 0 && newItemsDuplicates.pairs === 0 && stateGeneratedItemsDuplicates.pairs === 0) {
51
+ return;
52
+ }
53
+ logger.warn('Completed stream history contains replayed tool call/result pairs', {
54
+ eventType: 'conversation.stream_history.replayed_tools',
55
+ category: 'provider',
56
+ phase: 'post_stream',
57
+ sessionId,
58
+ traceId: logger.getCorrelationId(),
59
+ source,
60
+ historyLength: history.length,
61
+ newItemsLength: newItems.length,
62
+ stateGeneratedItemsLength: stateGeneratedItems.length,
63
+ historyDuplicatePairs: historyDuplicates.pairs,
64
+ historyMaxCopies: historyDuplicates.maxCopies,
65
+ newItemsDuplicatePairs: newItemsDuplicates.pairs,
66
+ newItemsMaxCopies: newItemsDuplicates.maxCopies,
67
+ stateGeneratedItemsDuplicatePairs: stateGeneratedItemsDuplicates.pairs,
68
+ stateGeneratedItemsMaxCopies: stateGeneratedItemsDuplicates.maxCopies,
69
+ });
70
+ };
17
71
  export class ConversationSession {
18
72
  id;
19
73
  startedAt;
@@ -24,12 +78,16 @@ export class ConversationSession {
24
78
  approvalState = new ApprovalState();
25
79
  toolCallArgumentsById = new Map();
26
80
  emittedInvalidToolCallPackets = new Set();
81
+ emittedToolStartedCallIds = new Set();
27
82
  shellAutoApproval;
28
83
  approvalFlow;
29
84
  inputSurgeGuard = new InputSurgeGuard();
85
+ largeUncachedInputGuard = new LargeUncachedInputGuard();
86
+ toolLedger = new ToolExecutionLedger();
30
87
  generation = 0;
31
88
  settingsService;
32
89
  pendingModeNotice = null;
90
+ logSink = null;
33
91
  constructor(id, { agentClient, deps, sessionStartedAt, }) {
34
92
  this.id = id;
35
93
  this.startedAt = sessionStartedAt ?? new Date().toISOString();
@@ -63,6 +121,78 @@ export class ConversationSession {
63
121
  return 'mentor';
64
122
  return 'standard';
65
123
  }
124
+ #getModelForGuard() {
125
+ return this.settingsService?.get('agent.model') ?? null;
126
+ }
127
+ #getReasoningEffortForGuard() {
128
+ return this.settingsService?.get('agent.reasoningEffort') ?? null;
129
+ }
130
+ #getProviderForGuard() {
131
+ const getProvider = getMethod(this.agentClient, 'getProvider');
132
+ return getProvider
133
+ ? getProvider.call(this.agentClient)
134
+ : this.settingsService?.get('agent.provider') ?? null;
135
+ }
136
+ #makeUserInputItem(turn) {
137
+ const images = turn.images ?? [];
138
+ if (images.length === 0) {
139
+ return { role: 'user', type: 'message', content: turn.text ?? '' };
140
+ }
141
+ const content = [];
142
+ if (turn.text) {
143
+ content.push({ type: 'input_text', text: turn.text });
144
+ }
145
+ for (const image of images) {
146
+ content.push({
147
+ type: 'input_image',
148
+ image: `data:${image.mimeType};base64,${image.data}`,
149
+ detail: 'auto',
150
+ });
151
+ }
152
+ return { role: 'user', type: 'message', content };
153
+ }
154
+ #buildOutgoingInput(turn, { includeTurn }) {
155
+ const provider = this.#getProviderForGuard() ?? 'openai';
156
+ const supportsChaining = supportsConversationChaining(provider);
157
+ const history = this.conversationStore.getHistory();
158
+ const outgoingHistory = includeTurn ? [...history, this.#makeUserInputItem(turn)] : history;
159
+ const useChaining = supportsChaining && (!!this.previousResponseId || outgoingHistory.length <= 1);
160
+ const notice = this.pendingModeNotice;
161
+ const latestInput = outgoingHistory[outgoingHistory.length - 1] ?? turn.text;
162
+ const chainedInput = turn.images?.length ? latestInput : turn.text;
163
+ if (notice) {
164
+ if (useChaining) {
165
+ const userItem = typeof chainedInput === 'string' ? { role: 'user', type: 'message', content: chainedInput } : chainedInput;
166
+ const noticeItem = { role: 'system', type: 'message', content: notice };
167
+ return {
168
+ streamInput: [noticeItem, userItem],
169
+ inputSurgeKind: 'delta',
170
+ };
171
+ }
172
+ const noticeItem = { role: 'user', type: 'message', content: notice };
173
+ return {
174
+ streamInput: [...outgoingHistory, noticeItem],
175
+ inputSurgeKind: 'full_history',
176
+ modeNoticeToPersist: notice,
177
+ };
178
+ }
179
+ return {
180
+ streamInput: useChaining ? (typeof chainedInput === 'string' ? chainedInput : [chainedInput]) : outgoingHistory,
181
+ inputSurgeKind: useChaining ? 'delta' : 'full_history',
182
+ };
183
+ }
184
+ previewLargeUncachedInput(input, now = Date.now()) {
185
+ const turn = normalizeUserTurn(input);
186
+ const { streamInput } = this.#buildOutgoingInput(turn, { includeTurn: true });
187
+ return this.largeUncachedInputGuard.inspect({
188
+ input: streamInput,
189
+ now,
190
+ provider: this.#getProviderForGuard(),
191
+ model: this.#getModelForGuard(),
192
+ reasoningEffort: this.#getReasoningEffortForGuard(),
193
+ mode: this.#getTrafficMode(),
194
+ });
195
+ }
66
196
  #getFirstUserMessagePreview(currentTurn) {
67
197
  const [firstTurn] = this.conversationStore.listUserTurns();
68
198
  return firstTurn?.text ?? currentTurn ?? '';
@@ -89,8 +219,11 @@ export class ConversationSession {
89
219
  this.approvalState.clearPending();
90
220
  this.approvalState.consumeAborted();
91
221
  this.toolCallArgumentsById.clear();
222
+ this.emittedToolStartedCallIds.clear();
223
+ this.toolLedger = new ToolExecutionLedger();
92
224
  this.shellAutoApproval.clearCache();
93
225
  this.inputSurgeGuard.reset();
226
+ this.largeUncachedInputGuard.reset();
94
227
  const clearConversations = getMethod(this.agentClient, 'clearConversations');
95
228
  clearConversations?.call(this.agentClient);
96
229
  }
@@ -103,8 +236,11 @@ export class ConversationSession {
103
236
  this.approvalState.clearPending();
104
237
  this.approvalState.consumeAborted();
105
238
  this.toolCallArgumentsById.clear();
239
+ this.emittedToolStartedCallIds.clear();
106
240
  this.shellAutoApproval.clearCache();
107
241
  this.inputSurgeGuard.reset();
242
+ this.largeUncachedInputGuard.markUndoOrRewind();
243
+ this.#log({ type: 'undo', removedUserTurns: 1, snapshot: this.getCurrentSnapshot() });
108
244
  return removed;
109
245
  }
110
246
  listUserTurns() {
@@ -119,8 +255,11 @@ export class ConversationSession {
119
255
  this.approvalState.clearPending();
120
256
  this.approvalState.consumeAborted();
121
257
  this.toolCallArgumentsById.clear();
258
+ this.emittedToolStartedCallIds.clear();
122
259
  this.shellAutoApproval.clearCache();
123
260
  this.inputSurgeGuard.reset();
261
+ this.largeUncachedInputGuard.markUndoOrRewind();
262
+ this.#log({ type: 'undo', removedUserTurns: n, snapshot: this.getCurrentSnapshot() });
124
263
  return removed;
125
264
  }
126
265
  setModel(model) {
@@ -135,27 +274,160 @@ export class ConversationSession {
135
274
  setTemperature?.call(this.agentClient, temperature);
136
275
  }
137
276
  setProvider(provider) {
277
+ this.generation++;
278
+ this.previousResponseId = null;
279
+ this.approvalState.clearPending();
280
+ this.approvalState.consumeAborted();
281
+ this.toolCallArgumentsById.clear();
282
+ this.emittedToolStartedCallIds.clear();
283
+ this.shellAutoApproval.clearCache();
284
+ this.inputSurgeGuard.reset();
285
+ const clearConversations = getMethod(this.agentClient, 'clearConversations');
286
+ clearConversations?.call(this.agentClient);
138
287
  const setProvider = getMethod(this.agentClient, 'setProvider');
139
288
  setProvider?.call(this.agentClient, provider);
140
289
  }
290
+ switchProvider(provider) {
291
+ this.setProvider(provider);
292
+ }
141
293
  setRetryCallback(callback) {
142
294
  if (typeof this.agentClient.setRetryCallback === 'function') {
143
295
  this.agentClient.setRetryCallback(callback);
144
296
  }
145
297
  }
298
+ setLogSink(sink) {
299
+ this.logSink = sink;
300
+ }
301
+ getCurrentSnapshot() {
302
+ const getProvider = getMethod(this.agentClient, 'getProvider');
303
+ const provider = getProvider
304
+ ? getProvider.call(this.agentClient)
305
+ : this.settingsService?.get('agent.provider');
306
+ const model = this.settingsService?.get('agent.model');
307
+ return {
308
+ history: this.conversationStore.getHistory(),
309
+ previousResponseId: this.previousResponseId,
310
+ toolLedger: this.toolLedger.export(),
311
+ ...(model ? { model } : {}),
312
+ ...(provider ? { provider } : {}),
313
+ };
314
+ }
315
+ #log(event) {
316
+ if (!this.logSink)
317
+ return;
318
+ try {
319
+ this.logSink(event);
320
+ }
321
+ catch (err) {
322
+ this.logger.warn('Conversation log sink threw', {
323
+ eventType: 'conversation_log.sink_failed',
324
+ category: 'persistence',
325
+ errorMessage: err instanceof Error ? err.message : String(err),
326
+ });
327
+ }
328
+ }
329
+ #dispatchEventToLog(event) {
330
+ if (!this.logSink)
331
+ return;
332
+ switch (event.type) {
333
+ case 'tool_started':
334
+ this.#log({
335
+ type: 'tool_started',
336
+ toolCallId: event.toolCallId,
337
+ toolName: event.toolName,
338
+ arguments: event.arguments,
339
+ });
340
+ return;
341
+ case 'command_message':
342
+ this.#log({ type: 'command_message', message: event.message });
343
+ return;
344
+ case 'approval_required':
345
+ this.#log({
346
+ type: 'approval_required',
347
+ approval: {
348
+ toolName: event.approval.toolName,
349
+ argumentsText: event.approval.argumentsText,
350
+ agentName: event.approval.agentName,
351
+ ...('callId' in event.approval && event.approval.callId ? { callId: event.approval.callId } : {}),
352
+ },
353
+ });
354
+ return;
355
+ case 'subagent_started':
356
+ this.#log({
357
+ type: 'subagent_started',
358
+ agentId: event.agentId,
359
+ role: event.role,
360
+ task: event.task,
361
+ });
362
+ return;
363
+ case 'subagent_completed':
364
+ this.#log({ type: 'subagent_completed', result: event.result });
365
+ return;
366
+ case 'error':
367
+ this.#log({ type: 'error', message: event.message, ...(event.kind ? { kind: event.kind } : {}) });
368
+ return;
369
+ case 'final': {
370
+ const snapshot = this.getCurrentSnapshot();
371
+ this.#log({
372
+ type: 'assistant_final',
373
+ message: {
374
+ id: `bot-${snapshot.history.length}-${Date.now()}`,
375
+ sender: 'bot',
376
+ status: 'finalized',
377
+ text: event.finalText,
378
+ ...(event.reasoningText ? { reasoningText: event.reasoningText } : {}),
379
+ },
380
+ finalText: event.finalText,
381
+ ...(event.reasoningText ? { reasoningText: event.reasoningText } : {}),
382
+ ...(event.usage ? { usage: event.usage } : {}),
383
+ snapshot,
384
+ });
385
+ return;
386
+ }
387
+ default:
388
+ return;
389
+ }
390
+ }
391
+ #dedupeToolStarted(event) {
392
+ if (event.type !== 'tool_started') {
393
+ return event;
394
+ }
395
+ if (this.emittedToolStartedCallIds.has(event.toolCallId)) {
396
+ return null;
397
+ }
398
+ this.emittedToolStartedCallIds.add(event.toolCallId);
399
+ return event;
400
+ }
146
401
  exportState() {
147
402
  return {
148
403
  history: this.conversationStore.getHistory(),
149
404
  previousResponseId: this.previousResponseId,
405
+ toolLedger: this.toolLedger.export(),
150
406
  };
151
407
  }
152
408
  importState(state) {
153
409
  this.conversationStore.clear();
154
- for (const item of state.history) {
410
+ this.toolLedger.import(state.toolLedger);
411
+ const reconciled = reconcileHistoryWithToolLedger(state.history, state.toolLedger);
412
+ if (reconciled.addedCompletedPairs > 0 || reconciled.droppedIncompleteCalls > 0) {
413
+ this.logger.warn('Reconciled saved conversation history with tool execution ledger', {
414
+ eventType: 'conversation.tool_ledger.reconciled',
415
+ category: 'conversation',
416
+ phase: 'resume',
417
+ sessionId: this.id,
418
+ addedCompletedPairs: reconciled.addedCompletedPairs,
419
+ droppedIncompleteCalls: reconciled.droppedIncompleteCalls,
420
+ });
421
+ }
422
+ for (const item of reconciled.history) {
155
423
  this.conversationStore.addImportedItem(item);
156
424
  }
157
425
  this.previousResponseId = state.previousResponseId;
426
+ this.emittedToolStartedCallIds.clear();
158
427
  this.inputSurgeGuard.reset();
428
+ this.largeUncachedInputGuard.markResumedSession({
429
+ updatedAtMs: state.updatedAt ? Date.parse(state.updatedAt) : null,
430
+ });
159
431
  this.generation++;
160
432
  }
161
433
  addShellContext(historyText) {
@@ -181,6 +453,8 @@ export class ConversationSession {
181
453
  const turn = normalizeUserTurn(input);
182
454
  const text = turn.text;
183
455
  let addedUserMessage = false;
456
+ const ledgerSnapshot = this.toolLedger.export();
457
+ this.toolLedger.beginTurn();
184
458
  try {
185
459
  this.logger.debug('Conversation stream start', {
186
460
  eventType: 'stream.started',
@@ -196,6 +470,12 @@ export class ConversationSession {
196
470
  this.conversationStore.addUserTurn(turn);
197
471
  addedUserMessage = true;
198
472
  }
473
+ else if (abortedContext && !skipUserMessage) {
474
+ // The UI appended a user message for this input, but the store will consume it
475
+ // as fake tool output for the aborted approval rather than as a new user turn.
476
+ // Signal the UI to mark it so /undo skips it.
477
+ yield { type: 'user_message_consumed_for_abort' };
478
+ }
199
479
  // If there's an aborted approval, we need to resolve it first.
200
480
  // The user's message is a new input, but the agent is stuck waiting for tool output.
201
481
  if (abortedContext) {
@@ -213,16 +493,43 @@ export class ConversationSession {
213
493
  try {
214
494
  const continuedStream = (await this.agentClient.continueRunStream(abortedContext.state, {
215
495
  previousResponseId: this.previousResponseId,
496
+ sessionId: this.id,
216
497
  }));
217
498
  const acc = createStreamAccumulator();
218
499
  acc.emittedCommandIds = new Set(abortedContext.emittedCommandIds);
219
- yield* processStreamEvents(continuedStream, acc, {
500
+ for await (const event of processStreamEvents(continuedStream, acc, {
220
501
  toolCallArgumentsById: this.toolCallArgumentsById,
221
502
  emittedInvalidToolCallPackets: this.emittedInvalidToolCallPackets,
222
503
  preserveExistingToolArgs: true,
223
- }, { logger: this.logger, sessionId: this.id });
504
+ onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
505
+ onFunctionResultItem: (item) => {
506
+ this.toolLedger.recordFunctionResult(item);
507
+ const cid = callIdOfLocal(item);
508
+ if (cid && this.logSink) {
509
+ const entry = this.toolLedger.export().find((e) => e.callId === cid);
510
+ this.#log({
511
+ type: 'tool_result',
512
+ callId: cid,
513
+ toolName: entry?.toolName ?? toolNameOfLocal(item),
514
+ status: entry?.status === 'failed' || entry?.status === 'aborted' ? entry.status : 'completed',
515
+ output: entry?.output ?? outputOfLocal(item),
516
+ ...(entry?.historyItems ? { historyItems: entry.historyItems } : {}),
517
+ });
518
+ }
519
+ },
520
+ }, { logger: this.logger, sessionId: this.id })) {
521
+ const filtered = this.#dedupeToolStarted(event);
522
+ if (filtered)
523
+ yield filtered;
524
+ }
224
525
  if (this.#isCurrentGeneration(gen)) {
225
526
  this.previousResponseId = continuedStream.lastResponseId ?? null;
527
+ warnIfStreamHistoryReplayedTools({
528
+ logger: this.logger,
529
+ sessionId: this.id,
530
+ source: 'abortResolution',
531
+ stream: continuedStream,
532
+ });
226
533
  this.conversationStore.updateFromResult(continuedStream);
227
534
  }
228
535
  // Check if another interruption occurred
@@ -251,49 +558,33 @@ export class ConversationSession {
251
558
  }
252
559
  }
253
560
  // Normal message flow
254
- const getProvider = getMethod(this.agentClient, 'getProvider');
255
- const provider = getProvider ? getProvider.call(this.agentClient) : 'openai';
256
- const supportsChaining = supportsConversationChaining(provider);
257
- const history = this.conversationStore.getHistory();
258
561
  // Use chaining mode only when the provider supports it AND either a valid
259
562
  // chain exists (previousResponseId is set) or there is no prior history to
260
563
  // resync (fresh start with just the current message). After undo the chain
261
564
  // is severed (previousResponseId = null) while prior turns remain in the
262
565
  // local store, so we fall back to full-history mode to re-establish context.
263
- const useChaining = supportsChaining && (!!this.previousResponseId || history.length <= 1);
264
- let streamInput;
566
+ const { streamInput, inputSurgeKind, modeNoticeToPersist } = this.#buildOutgoingInput(turn, {
567
+ includeTurn: false,
568
+ });
265
569
  if (this.pendingModeNotice) {
266
- const notice = this.pendingModeNotice;
267
570
  this.pendingModeNotice = null;
268
- if (useChaining) {
269
- const latestInput = history[history.length - 1] ?? text;
270
- const chainedInput = turn.images?.length ? latestInput : text;
271
- const userItem = typeof chainedInput === 'string' ? { role: 'user', type: 'message', content: chainedInput } : chainedInput;
272
- const noticeItem = { role: 'system', type: 'message', content: notice };
273
- streamInput = [noticeItem, userItem];
274
- }
275
- else {
276
- // Persist the notice at the tail (append-only) rather than splicing
277
- // it before the last user turn or sending it as a one-shot item.
278
- // Mid-history insertion adds a stray ephemeral cache breakpoint (see
279
- // addCacheControlToLastTwoMessages) and a transient item makes
280
- // consecutive requests diverge at the tail — both break the
281
- // Claude/Qwen prompt cache. Appending keeps the cached prefix
282
- // byte-identical and only growing.
283
- this.conversationStore.addModeNotice(notice);
284
- streamInput = this.conversationStore.getHistory();
285
- }
286
571
  }
287
- else {
288
- const latestInput = history[history.length - 1] ?? text;
289
- const chainedInput = turn.images?.length ? latestInput : text;
290
- streamInput = useChaining ? (typeof chainedInput === 'string' ? chainedInput : [chainedInput]) : history;
572
+ if (modeNoticeToPersist) {
573
+ // Persist the notice at the tail (append-only) rather than splicing
574
+ // it before the last user turn or sending it as a one-shot item.
575
+ // Mid-history insertion adds a stray ephemeral cache breakpoint (see
576
+ // addCacheControlToLastTwoMessages) and a transient item makes
577
+ // consecutive requests diverge at the tail — both break the
578
+ // Claude/Qwen prompt cache. Appending keeps the cached prefix
579
+ // byte-identical and only growing.
580
+ this.conversationStore.addModeNotice(modeNoticeToPersist);
291
581
  }
292
- const inputSurgeKind = useChaining ? 'delta' : 'full_history';
293
582
  const surgeDecision = this.inputSurgeGuard.inspect(streamInput, { kind: inputSurgeKind });
294
583
  if (surgeDecision.action === 'block') {
584
+ let droppedUserMessage;
295
585
  if (addedUserMessage && this.#isCurrentGeneration(gen)) {
296
586
  this.conversationStore.removeLastUserMessage();
587
+ droppedUserMessage = { text: turn.text, imageCount: turn.images?.length ?? 0 };
297
588
  }
298
589
  this.logger.warn('Input surge guard blocked provider request', {
299
590
  eventType: 'input_surge.blocked',
@@ -309,24 +600,38 @@ export class ConversationSession {
309
600
  type: 'error',
310
601
  kind: 'input_surge_guard',
311
602
  message: `${surgeDecision.reason} Request blocked to prevent runaway context growth. Try /undo or /clear, or compact the conversation history.`,
603
+ ...(droppedUserMessage ? { droppedUserMessage } : {}),
312
604
  };
313
605
  return;
314
606
  }
315
607
  stream = (await this.agentClient.startStream(streamInput, {
316
- previousResponseId: this.previousResponseId,
608
+ previousResponseId: inputSurgeKind === 'delta' ? this.previousResponseId : null,
609
+ sessionId: this.id,
317
610
  }));
318
611
  const acc = createStreamAccumulator();
319
- yield* processStreamEvents(stream, acc, {
612
+ for await (const event of processStreamEvents(stream, acc, {
320
613
  toolCallArgumentsById: this.toolCallArgumentsById,
321
614
  emittedInvalidToolCallPackets: this.emittedInvalidToolCallPackets,
322
615
  preserveExistingToolArgs: false,
323
- }, { logger: this.logger, sessionId: this.id });
616
+ onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
617
+ onFunctionResultItem: (item) => this.toolLedger.recordFunctionResult(item),
618
+ }, { logger: this.logger, sessionId: this.id })) {
619
+ const filtered = this.#dedupeToolStarted(event);
620
+ if (filtered)
621
+ yield filtered;
622
+ }
324
623
  if (this.#isCurrentGeneration(gen)) {
325
624
  this.previousResponseId = stream.lastResponseId ?? null;
625
+ warnIfStreamHistoryReplayedTools({
626
+ logger: this.logger,
627
+ sessionId: this.id,
628
+ source: 'startStream',
629
+ stream,
630
+ });
326
631
  this.conversationStore.updateFromResult(stream);
327
632
  }
328
633
  const resolvedResult = yield* this.#buildAndResolve(stream, acc.finalOutput || undefined, acc.reasoningOutput || undefined, acc.emittedCommandIds, acc.latestUsage);
329
- if (useChaining) {
634
+ if (inputSurgeKind === 'delta') {
330
635
  this.inputSurgeGuard.recordSuccessfulInput(streamInput, { kind: inputSurgeKind });
331
636
  }
332
637
  else {
@@ -335,6 +640,14 @@ export class ConversationSession {
335
640
  previousInput: streamInput,
336
641
  });
337
642
  }
643
+ this.largeUncachedInputGuard.recordSuccessfulInput({
644
+ input: inputSurgeKind === 'delta' ? streamInput : this.conversationStore.getHistory(),
645
+ now: Date.now(),
646
+ provider: this.#getProviderForGuard(),
647
+ model: this.#getModelForGuard(),
648
+ reasoningEffort: this.#getReasoningEffortForGuard(),
649
+ mode: this.#getTrafficMode(),
650
+ });
338
651
  if (resolvedResult.type === 'approval_required') {
339
652
  this.logger.debug('Tool approval required', {
340
653
  eventType: 'approval.required',
@@ -374,6 +687,7 @@ export class ConversationSession {
374
687
  retryType: 'flex_service_tier',
375
688
  };
376
689
  getMethod(this.agentClient, 'useStandardServiceTierForNextRequest')?.call(this.agentClient);
690
+ this.toolLedger.import(ledgerSnapshot);
377
691
  yield* this.run(turn, {
378
692
  skipUserMessage: true,
379
693
  flexServiceTierFallbackCount: flexServiceTierFallbackCount + 1,
@@ -399,6 +713,7 @@ export class ConversationSession {
399
713
  if (!this.#isCurrentGeneration(gen))
400
714
  return;
401
715
  if (decision.hadStream && stream) {
716
+ this.toolLedger.import(ledgerSnapshot);
402
717
  if (decision.shouldInjectErrorContext) {
403
718
  this.conversationStore.addErrorContext(decision.errorContextMessage);
404
719
  }
@@ -409,20 +724,38 @@ export class ConversationSession {
409
724
  yield* this.run(turn, decision.nextRunOptions);
410
725
  return;
411
726
  }
412
- yield {
413
- type: 'error',
414
- message: error instanceof Error ? error.message : String(error),
415
- };
727
+ // Drop the just-added user turn from the store before yielding so the
728
+ // generator-cleanup path doesn't strand the removal — and so the error
729
+ // event can carry the dropped text for UI restoration.
730
+ let droppedUserMessage;
416
731
  if (addedUserMessage && !stream && this.#isCurrentGeneration(gen)) {
417
732
  this.conversationStore.removeLastUserMessage();
733
+ droppedUserMessage = { text: turn.text, imageCount: turn.images?.length ?? 0 };
734
+ }
735
+ if (stream && this.#isCurrentGeneration(gen)) {
736
+ this.toolLedger.markOpenCallsAborted(error instanceof Error ? error.message : String(error));
737
+ const recoverySummary = this.toolLedger.getRecoverySummary();
738
+ if (recoverySummary) {
739
+ yield {
740
+ type: 'tool_recovery',
741
+ recoveredCallIds: recoverySummary.recoveredCallIds,
742
+ droppedCallIds: recoverySummary.droppedCallIds,
743
+ message: recoverySummary.message,
744
+ };
745
+ }
418
746
  }
747
+ yield {
748
+ type: 'error',
749
+ message: describeError(error),
750
+ ...(droppedUserMessage ? { droppedUserMessage } : {}),
751
+ };
419
752
  this.logger.error('Conversation stream error', {
420
753
  eventType: 'stream.failed',
421
754
  category: 'stream',
422
755
  phase: 'abort',
423
756
  sessionId: this.id,
424
757
  traceId: this.logger.getCorrelationId(),
425
- errorMessage: error instanceof Error ? error.message : String(error),
758
+ errorMessage: describeError(error),
426
759
  });
427
760
  throw error;
428
761
  }
@@ -440,7 +773,9 @@ export class ConversationSession {
440
773
  }
441
774
  const { pendingApprovalContext: { state, toolCallArgumentsById, emittedCommandIds: previouslyEmittedIds }, toolStartedEvent, removeInterceptor, } = plan;
442
775
  if (toolStartedEvent) {
443
- yield toolStartedEvent;
776
+ const filtered = this.#dedupeToolStarted(toolStartedEvent);
777
+ if (filtered)
778
+ yield filtered;
444
779
  }
445
780
  // Restore cached tool-call arguments so continuation outputs can attach them
446
781
  this.toolCallArgumentsById.clear();
@@ -455,15 +790,42 @@ export class ConversationSession {
455
790
  try {
456
791
  const stream = (await this.agentClient.continueRunStream(state, {
457
792
  previousResponseId: this.previousResponseId,
793
+ sessionId: this.id,
458
794
  }));
459
795
  const acc = createStreamAccumulator();
460
- yield* processStreamEvents(stream, acc, {
796
+ for await (const event of processStreamEvents(stream, acc, {
461
797
  toolCallArgumentsById: this.toolCallArgumentsById,
462
798
  emittedInvalidToolCallPackets: this.emittedInvalidToolCallPackets,
463
799
  preserveExistingToolArgs: true,
464
- }, { logger: this.logger, sessionId: this.id });
800
+ onFunctionCallItem: (item) => this.toolLedger.recordFunctionCall(item),
801
+ onFunctionResultItem: (item) => {
802
+ this.toolLedger.recordFunctionResult(item);
803
+ const cid = callIdOfLocal(item);
804
+ if (cid && this.logSink) {
805
+ const entry = this.toolLedger.export().find((e) => e.callId === cid);
806
+ this.#log({
807
+ type: 'tool_result',
808
+ callId: cid,
809
+ toolName: entry?.toolName ?? toolNameOfLocal(item),
810
+ status: entry?.status === 'failed' || entry?.status === 'aborted' ? entry.status : 'completed',
811
+ output: entry?.output ?? outputOfLocal(item),
812
+ ...(entry?.historyItems ? { historyItems: entry.historyItems } : {}),
813
+ });
814
+ }
815
+ },
816
+ }, { logger: this.logger, sessionId: this.id })) {
817
+ const filtered = this.#dedupeToolStarted(event);
818
+ if (filtered)
819
+ yield filtered;
820
+ }
465
821
  if (this.#isCurrentGeneration(gen)) {
466
822
  this.previousResponseId = stream.lastResponseId ?? null;
823
+ warnIfStreamHistoryReplayedTools({
824
+ logger: this.logger,
825
+ sessionId: this.id,
826
+ source: 'continueRunStream',
827
+ stream,
828
+ });
467
829
  this.conversationStore.updateFromResult(stream);
468
830
  }
469
831
  // Merge previously emitted command IDs with newly emitted ones
@@ -519,7 +881,7 @@ export class ConversationSession {
519
881
  catch (error) {
520
882
  yield {
521
883
  type: 'error',
522
- message: error instanceof Error ? error.message : String(error),
884
+ message: describeError(error),
523
885
  };
524
886
  throw error;
525
887
  }
@@ -531,14 +893,18 @@ export class ConversationSession {
531
893
  async sendMessage(input, { onTextChunk, onReasoningChunk, onCommandMessage, onEvent, hallucinationRetryCount = 0, } = {}) {
532
894
  const turn = normalizeUserTurn(input);
533
895
  return this.#withTrafficContext(turn.text, async () => {
534
- getMethod(this.agentClient, 'setSubagentEventSink')?.call(this.agentClient, onEvent ?? null);
896
+ const wrappedOnEvent = (event) => {
897
+ this.#dispatchEventToLog(event);
898
+ onEvent?.(event);
899
+ };
900
+ getMethod(this.agentClient, 'setSubagentEventSink')?.call(this.agentClient, wrappedOnEvent);
535
901
  let result;
536
902
  try {
537
903
  result = await collectTerminalResult(this.run(input, { hallucinationRetryCount }), {
538
904
  onTextChunk,
539
905
  onReasoningChunk,
540
906
  onCommandMessage,
541
- onEvent,
907
+ onEvent: wrappedOnEvent,
542
908
  getRawInterruption: () => this.approvalFlow.getPendingInterruption(),
543
909
  onFinalEvent: (event) => {
544
910
  this.logger.debug('sendMessage received final event', {
@@ -566,15 +932,24 @@ export class ConversationSession {
566
932
  if (!this.approvalFlow.getPending()) {
567
933
  return null;
568
934
  }
935
+ this.#log({
936
+ type: 'approval_resolved',
937
+ answer: answer === 'y' ? 'y' : 'n',
938
+ ...(rejectionReason ? { rejectionReason } : {}),
939
+ });
569
940
  return this.#withTrafficContext(undefined, async () => {
570
- getMethod(this.agentClient, 'setSubagentEventSink')?.call(this.agentClient, onEvent ?? null);
941
+ const wrappedOnEvent = (event) => {
942
+ this.#dispatchEventToLog(event);
943
+ onEvent?.(event);
944
+ };
945
+ getMethod(this.agentClient, 'setSubagentEventSink')?.call(this.agentClient, wrappedOnEvent);
571
946
  let result;
572
947
  try {
573
948
  result = await collectTerminalResult(this['continue']({ answer, rejectionReason }), {
574
949
  onTextChunk,
575
950
  onReasoningChunk,
576
951
  onCommandMessage,
577
- onEvent,
952
+ onEvent: wrappedOnEvent,
578
953
  getRawInterruption: () => this.approvalFlow.getPendingInterruption(),
579
954
  onFinalEvent: (event) => {
580
955
  this.logger.debug('handleApprovalDecision received final event', {