@qduc/term2 0.1.8 → 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 (618) 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 +1 -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 +1 -1
  17. package/dist/components/BottomArea.d.ts.map +1 -1
  18. package/dist/components/Input/determine-active-menu.d.ts +23 -0
  19. package/dist/components/Input/determine-active-menu.d.ts.map +1 -0
  20. package/dist/components/Input/determine-active-menu.js +57 -0
  21. package/dist/components/Input/determine-active-menu.js.map +1 -0
  22. package/dist/components/Input/input-width.d.ts +7 -0
  23. package/dist/components/Input/input-width.d.ts.map +1 -0
  24. package/dist/components/Input/input-width.js +20 -0
  25. package/dist/components/Input/input-width.js.map +1 -0
  26. package/dist/components/Input/insertions.d.ts +34 -0
  27. package/dist/components/Input/insertions.d.ts.map +1 -0
  28. package/dist/components/Input/insertions.js +52 -0
  29. package/dist/components/Input/insertions.js.map +1 -0
  30. package/dist/components/Input/popup-props.d.ts +18 -0
  31. package/dist/components/Input/popup-props.d.ts.map +1 -0
  32. package/dist/components/Input/popup-props.js +42 -0
  33. package/dist/components/Input/popup-props.js.map +1 -0
  34. package/dist/components/Input/triggers.d.ts +9 -0
  35. package/dist/components/Input/triggers.d.ts.map +1 -0
  36. package/dist/components/Input/triggers.js +25 -0
  37. package/dist/components/Input/triggers.js.map +1 -0
  38. package/dist/components/InputBox.d.ts +2 -6
  39. package/dist/components/InputBox.d.ts.map +1 -1
  40. package/dist/components/InputBox.js +118 -406
  41. package/dist/components/InputBox.js.map +1 -1
  42. package/dist/components/InputBox.menu-logic.test.js +82 -99
  43. package/dist/components/InputBox.menu-logic.test.js.map +1 -1
  44. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  45. package/dist/components/MarkdownRenderer.js +96 -23
  46. package/dist/components/MarkdownRenderer.js.map +1 -1
  47. package/dist/components/MessageList.d.ts +8 -0
  48. package/dist/components/MessageList.d.ts.map +1 -1
  49. package/dist/components/MessageList.js +25 -7
  50. package/dist/components/MessageList.js.map +1 -1
  51. package/dist/components/MessageList.test.js +48 -1
  52. package/dist/components/MessageList.test.js.map +1 -1
  53. package/dist/components/StatusBar.d.ts +1 -1
  54. package/dist/components/StatusBar.d.ts.map +1 -1
  55. package/dist/components/StatusBar.js +49 -38
  56. package/dist/components/StatusBar.js.map +1 -1
  57. package/dist/contracts/conversation.d.ts +9 -0
  58. package/dist/contracts/conversation.d.ts.map +1 -1
  59. package/dist/hooks/message-id.d.ts +3 -0
  60. package/dist/hooks/message-id.d.ts.map +1 -0
  61. package/dist/hooks/message-id.js +17 -0
  62. package/dist/hooks/message-id.js.map +1 -0
  63. package/dist/hooks/message-id.test.d.ts +2 -0
  64. package/dist/hooks/message-id.test.d.ts.map +1 -0
  65. package/dist/hooks/message-id.test.js +17 -0
  66. package/dist/hooks/message-id.test.js.map +1 -0
  67. package/dist/hooks/use-app-commands.d.ts +20 -0
  68. package/dist/hooks/use-app-commands.d.ts.map +1 -0
  69. package/dist/hooks/use-app-commands.js +197 -0
  70. package/dist/hooks/use-app-commands.js.map +1 -0
  71. package/dist/hooks/use-app-commands.test.d.ts +2 -0
  72. package/dist/hooks/use-app-commands.test.d.ts.map +1 -0
  73. package/dist/hooks/use-app-commands.test.js +34 -0
  74. package/dist/hooks/use-app-commands.test.js.map +1 -0
  75. package/dist/hooks/use-conversation.d.ts +11 -11
  76. package/dist/hooks/use-conversation.d.ts.map +1 -1
  77. package/dist/hooks/use-conversation.js +13 -10
  78. package/dist/hooks/use-conversation.js.map +1 -1
  79. package/dist/hooks/use-escape-key.d.ts +24 -0
  80. package/dist/hooks/use-escape-key.d.ts.map +1 -0
  81. package/dist/hooks/use-escape-key.js +60 -0
  82. package/dist/hooks/use-escape-key.js.map +1 -0
  83. package/dist/hooks/use-escape-key.test.d.ts +2 -0
  84. package/dist/hooks/use-escape-key.test.d.ts.map +1 -0
  85. package/dist/hooks/use-escape-key.test.js +49 -0
  86. package/dist/hooks/use-escape-key.test.js.map +1 -0
  87. package/dist/hooks/use-mode-handlers.d.ts +35 -0
  88. package/dist/hooks/use-mode-handlers.d.ts.map +1 -0
  89. package/dist/hooks/use-mode-handlers.js +79 -0
  90. package/dist/hooks/use-mode-handlers.js.map +1 -0
  91. package/dist/hooks/use-model-selection.d.ts +6 -3
  92. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  93. package/dist/hooks/use-model-selection.js +19 -16
  94. package/dist/hooks/use-model-selection.js.map +1 -1
  95. package/dist/hooks/use-model-selection.test.d.ts.map +1 -1
  96. package/dist/hooks/use-model-selection.test.js +53 -22
  97. package/dist/hooks/use-model-selection.test.js.map +1 -1
  98. package/dist/hooks/use-path-completion.d.ts.map +1 -1
  99. package/dist/hooks/use-path-completion.js +5 -36
  100. package/dist/hooks/use-path-completion.js.map +1 -1
  101. package/dist/hooks/use-runtime-settings.d.ts +12 -0
  102. package/dist/hooks/use-runtime-settings.d.ts.map +1 -0
  103. package/dist/hooks/use-runtime-settings.js +68 -0
  104. package/dist/hooks/use-runtime-settings.js.map +1 -0
  105. package/dist/hooks/use-selection.d.ts +8 -0
  106. package/dist/hooks/use-selection.d.ts.map +1 -0
  107. package/dist/hooks/use-selection.js +31 -0
  108. package/dist/hooks/use-selection.js.map +1 -0
  109. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  110. package/dist/hooks/use-settings-completion.js +15 -30
  111. package/dist/hooks/use-settings-completion.js.map +1 -1
  112. package/dist/hooks/use-settings-completion.test.js +9 -9
  113. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  114. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  115. package/dist/hooks/use-settings-value-completion.js +30 -28
  116. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  117. package/dist/hooks/use-settings-value-completion.test.js +13 -0
  118. package/dist/hooks/use-settings-value-completion.test.js.map +1 -1
  119. package/dist/hooks/use-shell-mode.d.ts +31 -0
  120. package/dist/hooks/use-shell-mode.d.ts.map +1 -0
  121. package/dist/hooks/use-shell-mode.js +85 -0
  122. package/dist/hooks/use-shell-mode.js.map +1 -0
  123. package/dist/hooks/use-slash-commands.d.ts +1 -0
  124. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  125. package/dist/hooks/use-slash-commands.js +32 -23
  126. package/dist/hooks/use-slash-commands.js.map +1 -1
  127. package/dist/hooks/use-terminal-width.d.ts +7 -0
  128. package/dist/hooks/use-terminal-width.d.ts.map +1 -0
  129. package/dist/hooks/use-terminal-width.js +33 -0
  130. package/dist/hooks/use-terminal-width.js.map +1 -0
  131. package/dist/hooks/use-trigger-detection.d.ts +40 -0
  132. package/dist/hooks/use-trigger-detection.d.ts.map +1 -0
  133. package/dist/hooks/use-trigger-detection.js +45 -0
  134. package/dist/hooks/use-trigger-detection.js.map +1 -0
  135. package/dist/lib/editor-impl.js +6 -6
  136. package/dist/lib/editor-impl.js.map +1 -1
  137. package/dist/lib/openai-agent-client.d.ts +2 -0
  138. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  139. package/dist/lib/openai-agent-client.js +187 -191
  140. package/dist/lib/openai-agent-client.js.map +1 -1
  141. package/dist/lib/openai-agent-client.public-methods.test.js +61 -13
  142. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
  143. package/dist/lib/retry-executor.d.ts +16 -0
  144. package/dist/lib/retry-executor.d.ts.map +1 -0
  145. package/dist/lib/retry-executor.js +71 -0
  146. package/dist/lib/retry-executor.js.map +1 -0
  147. package/dist/lib/retry-executor.test.d.ts +2 -0
  148. package/dist/lib/retry-executor.test.d.ts.map +1 -0
  149. package/dist/lib/retry-executor.test.js +178 -0
  150. package/dist/lib/retry-executor.test.js.map +1 -0
  151. package/dist/lib/tool-selection-policy.d.ts +14 -0
  152. package/dist/lib/tool-selection-policy.d.ts.map +1 -0
  153. package/dist/lib/tool-selection-policy.js +17 -0
  154. package/dist/lib/tool-selection-policy.js.map +1 -0
  155. package/dist/lib/tool-selection-policy.test.d.ts +2 -0
  156. package/dist/lib/tool-selection-policy.test.d.ts.map +1 -0
  157. package/dist/lib/tool-selection-policy.test.js +69 -0
  158. package/dist/lib/tool-selection-policy.test.js.map +1 -0
  159. package/dist/providers/index.d.ts +1 -1
  160. package/dist/providers/index.d.ts.map +1 -1
  161. package/dist/providers/index.js +1 -1
  162. package/dist/providers/index.js.map +1 -1
  163. package/dist/providers/openai-compatible/model.d.ts.map +1 -1
  164. package/dist/providers/openai-compatible/model.js +68 -7
  165. package/dist/providers/openai-compatible/model.js.map +1 -1
  166. package/dist/providers/openai-compatible/reasoning-content.test.js +107 -6
  167. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  168. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  169. package/dist/providers/openai-compatible.provider.js.map +1 -1
  170. package/dist/providers/openai.provider.js +2 -0
  171. package/dist/providers/openai.provider.js.map +1 -1
  172. package/dist/providers/openrouter/converters.d.ts.map +1 -1
  173. package/dist/providers/openrouter/converters.js +8 -6
  174. package/dist/providers/openrouter/converters.js.map +1 -1
  175. package/dist/providers/openrouter/converters.test.js +24 -0
  176. package/dist/providers/openrouter/converters.test.js.map +1 -1
  177. package/dist/providers/openrouter/model.d.ts.map +1 -1
  178. package/dist/providers/openrouter/model.js +13 -5
  179. package/dist/providers/openrouter/model.js.map +1 -1
  180. package/dist/providers/openrouter/reasoning-content.test.js +48 -2
  181. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
  182. package/dist/providers/openrouter.provider.createRunner.test.js +17 -9
  183. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  184. package/dist/providers/openrouter.provider.js.map +1 -1
  185. package/dist/providers/openrouter.test.js +0 -2
  186. package/dist/providers/openrouter.test.js.map +1 -1
  187. package/dist/providers/registry.d.ts +17 -8
  188. package/dist/providers/registry.d.ts.map +1 -1
  189. package/dist/providers/registry.js +9 -0
  190. package/dist/providers/registry.js.map +1 -1
  191. package/dist/providers/web-search/exa.provider.d.ts +15 -0
  192. package/dist/providers/web-search/exa.provider.d.ts.map +1 -0
  193. package/dist/providers/web-search/exa.provider.js +82 -0
  194. package/dist/providers/web-search/exa.provider.js.map +1 -0
  195. package/dist/providers/web-search/exa.provider.test.d.ts +2 -0
  196. package/dist/providers/web-search/exa.provider.test.d.ts.map +1 -0
  197. package/dist/providers/web-search/exa.provider.test.js +67 -0
  198. package/dist/providers/web-search/exa.provider.test.js.map +1 -0
  199. package/dist/providers/web-search/index.d.ts +1 -0
  200. package/dist/providers/web-search/index.d.ts.map +1 -1
  201. package/dist/providers/web-search/index.js +1 -0
  202. package/dist/providers/web-search/index.js.map +1 -1
  203. package/dist/scripts/eval-auto-approval/cache.d.ts +9 -0
  204. package/dist/scripts/eval-auto-approval/cache.d.ts.map +1 -0
  205. package/dist/scripts/eval-auto-approval/cache.js +64 -0
  206. package/dist/scripts/eval-auto-approval/cache.js.map +1 -0
  207. package/dist/scripts/eval-auto-approval/dataset.d.ts +45 -0
  208. package/dist/scripts/eval-auto-approval/dataset.d.ts.map +1 -0
  209. package/dist/scripts/eval-auto-approval/dataset.js +65 -0
  210. package/dist/scripts/eval-auto-approval/dataset.js.map +1 -0
  211. package/dist/scripts/eval-auto-approval/dataset.test.d.ts +2 -0
  212. package/dist/scripts/eval-auto-approval/dataset.test.d.ts.map +1 -0
  213. package/dist/scripts/eval-auto-approval/dataset.test.js +88 -0
  214. package/dist/scripts/eval-auto-approval/dataset.test.js.map +1 -0
  215. package/dist/scripts/eval-auto-approval/leaderboard.d.ts +92 -0
  216. package/dist/scripts/eval-auto-approval/leaderboard.d.ts.map +1 -0
  217. package/dist/scripts/eval-auto-approval/leaderboard.js +402 -0
  218. package/dist/scripts/eval-auto-approval/leaderboard.js.map +1 -0
  219. package/dist/scripts/eval-auto-approval/leaderboard.test.d.ts +2 -0
  220. package/dist/scripts/eval-auto-approval/leaderboard.test.d.ts.map +1 -0
  221. package/dist/scripts/eval-auto-approval/leaderboard.test.js +689 -0
  222. package/dist/scripts/eval-auto-approval/leaderboard.test.js.map +1 -0
  223. package/dist/scripts/eval-auto-approval/metrics.d.ts +34 -0
  224. package/dist/scripts/eval-auto-approval/metrics.d.ts.map +1 -0
  225. package/dist/scripts/eval-auto-approval/metrics.js +74 -0
  226. package/dist/scripts/eval-auto-approval/metrics.js.map +1 -0
  227. package/dist/scripts/eval-auto-approval/metrics.test.d.ts +2 -0
  228. package/dist/scripts/eval-auto-approval/metrics.test.d.ts.map +1 -0
  229. package/dist/scripts/eval-auto-approval/metrics.test.js +79 -0
  230. package/dist/scripts/eval-auto-approval/metrics.test.js.map +1 -0
  231. package/dist/scripts/eval-auto-approval/report.d.ts +5 -0
  232. package/dist/scripts/eval-auto-approval/report.d.ts.map +1 -0
  233. package/dist/scripts/eval-auto-approval/report.js +51 -0
  234. package/dist/scripts/eval-auto-approval/report.js.map +1 -0
  235. package/dist/scripts/eval-auto-approval/report.test.d.ts +2 -0
  236. package/dist/scripts/eval-auto-approval/report.test.d.ts.map +1 -0
  237. package/dist/scripts/eval-auto-approval/report.test.js +23 -0
  238. package/dist/scripts/eval-auto-approval/report.test.js.map +1 -0
  239. package/dist/scripts/eval-auto-approval/runner-utils.d.ts +41 -0
  240. package/dist/scripts/eval-auto-approval/runner-utils.d.ts.map +1 -0
  241. package/dist/scripts/eval-auto-approval/runner-utils.js +187 -0
  242. package/dist/scripts/eval-auto-approval/runner-utils.js.map +1 -0
  243. package/dist/scripts/eval-auto-approval/runner-utils.test.d.ts +2 -0
  244. package/dist/scripts/eval-auto-approval/runner-utils.test.d.ts.map +1 -0
  245. package/dist/scripts/eval-auto-approval/runner-utils.test.js +135 -0
  246. package/dist/scripts/eval-auto-approval/runner-utils.test.js.map +1 -0
  247. package/dist/scripts/eval-auto-approval/runner.d.ts +2 -0
  248. package/dist/scripts/eval-auto-approval/runner.d.ts.map +1 -0
  249. package/dist/scripts/eval-auto-approval/runner.js +326 -0
  250. package/dist/scripts/eval-auto-approval/runner.js.map +1 -0
  251. package/dist/services/agent-stream.d.ts +11 -0
  252. package/dist/services/agent-stream.d.ts.map +1 -0
  253. package/dist/services/agent-stream.js +2 -0
  254. package/dist/services/agent-stream.js.map +1 -0
  255. package/dist/services/approval-flow-coordinator.d.ts +43 -0
  256. package/dist/services/approval-flow-coordinator.d.ts.map +1 -0
  257. package/dist/services/approval-flow-coordinator.js +120 -0
  258. package/dist/services/approval-flow-coordinator.js.map +1 -0
  259. package/dist/services/approval-flow-coordinator.test.d.ts +2 -0
  260. package/dist/services/approval-flow-coordinator.test.d.ts.map +1 -0
  261. package/dist/services/approval-flow-coordinator.test.js +168 -0
  262. package/dist/services/approval-flow-coordinator.test.js.map +1 -0
  263. package/dist/services/approval-rejection-interceptor.d.ts +16 -0
  264. package/dist/services/approval-rejection-interceptor.d.ts.map +1 -0
  265. package/dist/services/approval-rejection-interceptor.js +20 -0
  266. package/dist/services/approval-rejection-interceptor.js.map +1 -0
  267. package/dist/services/approval-rejection-interceptor.test.d.ts +2 -0
  268. package/dist/services/approval-rejection-interceptor.test.d.ts.map +1 -0
  269. package/dist/services/approval-rejection-interceptor.test.js +60 -0
  270. package/dist/services/approval-rejection-interceptor.test.js.map +1 -0
  271. package/dist/services/conversation-events.d.ts +4 -2
  272. package/dist/services/conversation-events.d.ts.map +1 -1
  273. package/dist/services/conversation-result-builder.d.ts +34 -34
  274. package/dist/services/conversation-result-builder.d.ts.map +1 -1
  275. package/dist/services/conversation-result-builder.js +64 -76
  276. package/dist/services/conversation-result-builder.js.map +1 -1
  277. package/dist/services/conversation-result-builder.test.js +145 -65
  278. package/dist/services/conversation-result-builder.test.js.map +1 -1
  279. package/dist/services/conversation-retry-policy.d.ts +37 -0
  280. package/dist/services/conversation-retry-policy.d.ts.map +1 -0
  281. package/dist/services/conversation-retry-policy.js +51 -0
  282. package/dist/services/conversation-retry-policy.js.map +1 -0
  283. package/dist/services/conversation-retry-policy.test.d.ts +2 -0
  284. package/dist/services/conversation-retry-policy.test.d.ts.map +1 -0
  285. package/dist/services/conversation-retry-policy.test.js +79 -0
  286. package/dist/services/conversation-retry-policy.test.js.map +1 -0
  287. package/dist/services/conversation-service.d.ts +2 -1
  288. package/dist/services/conversation-service.d.ts.map +1 -1
  289. package/dist/services/conversation-session.auto-approval.test.d.ts +2 -0
  290. package/dist/services/conversation-session.auto-approval.test.d.ts.map +1 -0
  291. package/dist/services/conversation-session.auto-approval.test.js +617 -0
  292. package/dist/services/conversation-session.auto-approval.test.js.map +1 -0
  293. package/dist/services/conversation-session.d.ts +6 -3
  294. package/dist/services/conversation-session.d.ts.map +1 -1
  295. package/dist/services/conversation-session.js +164 -696
  296. package/dist/services/conversation-session.js.map +1 -1
  297. package/dist/services/interruption-info.d.ts +13 -0
  298. package/dist/services/interruption-info.d.ts.map +1 -0
  299. package/dist/services/interruption-info.js +89 -0
  300. package/dist/services/interruption-info.js.map +1 -0
  301. package/dist/services/interruption-info.test.d.ts +2 -0
  302. package/dist/services/interruption-info.test.d.ts.map +1 -0
  303. package/dist/services/interruption-info.test.js +84 -0
  304. package/dist/services/interruption-info.test.js.map +1 -0
  305. package/dist/services/logging-contract.d.ts +1 -1
  306. package/dist/services/logging-service.d.ts +6 -2
  307. package/dist/services/logging-service.d.ts.map +1 -1
  308. package/dist/services/logging-service.js +48 -91
  309. package/dist/services/logging-service.js.map +1 -1
  310. package/dist/services/settings-env.d.ts.map +1 -1
  311. package/dist/services/settings-env.js +3 -0
  312. package/dist/services/settings-env.js.map +1 -1
  313. package/dist/services/settings-schema.d.ts +34 -0
  314. package/dist/services/settings-schema.d.ts.map +1 -1
  315. package/dist/services/settings-schema.js +37 -0
  316. package/dist/services/settings-schema.js.map +1 -1
  317. package/dist/services/settings-service.d.ts.map +1 -1
  318. package/dist/services/settings-service.js +12 -166
  319. package/dist/services/settings-service.js.map +1 -1
  320. package/dist/services/settings-sources.d.ts +5 -0
  321. package/dist/services/settings-sources.d.ts.map +1 -0
  322. package/dist/services/settings-sources.js +92 -0
  323. package/dist/services/settings-sources.js.map +1 -0
  324. package/dist/services/settings-sources.test.d.ts +2 -0
  325. package/dist/services/settings-sources.test.d.ts.map +1 -0
  326. package/dist/services/settings-sources.test.js +34 -0
  327. package/dist/services/settings-sources.test.js.map +1 -0
  328. package/dist/services/shell-auto-approval-evaluator.d.ts +19 -0
  329. package/dist/services/shell-auto-approval-evaluator.d.ts.map +1 -0
  330. package/dist/services/shell-auto-approval-evaluator.js +207 -0
  331. package/dist/services/shell-auto-approval-evaluator.js.map +1 -0
  332. package/dist/services/shell-auto-approval-evaluator.test.d.ts +2 -0
  333. package/dist/services/shell-auto-approval-evaluator.test.d.ts.map +1 -0
  334. package/dist/services/shell-auto-approval-evaluator.test.js +211 -0
  335. package/dist/services/shell-auto-approval-evaluator.test.js.map +1 -0
  336. package/dist/services/shell-auto-approval-resolver.d.ts +24 -0
  337. package/dist/services/shell-auto-approval-resolver.d.ts.map +1 -0
  338. package/dist/services/shell-auto-approval-resolver.js +59 -0
  339. package/dist/services/shell-auto-approval-resolver.js.map +1 -0
  340. package/dist/services/shell-auto-approval-resolver.test.d.ts +2 -0
  341. package/dist/services/shell-auto-approval-resolver.test.d.ts.map +1 -0
  342. package/dist/services/shell-auto-approval-resolver.test.js +110 -0
  343. package/dist/services/shell-auto-approval-resolver.test.js.map +1 -0
  344. package/dist/services/ssh-service.test.js +2 -2
  345. package/dist/services/ssh-service.test.js.map +1 -1
  346. package/dist/services/stream-event-processor.d.ts +18 -23
  347. package/dist/services/stream-event-processor.d.ts.map +1 -1
  348. package/dist/services/stream-event-processor.js +186 -325
  349. package/dist/services/stream-event-processor.js.map +1 -1
  350. package/dist/services/stream-event-processor.test.js +143 -90
  351. package/dist/services/stream-event-processor.test.js.map +1 -1
  352. package/dist/services/terminal-result-collector.d.ts +12 -0
  353. package/dist/services/terminal-result-collector.d.ts.map +1 -0
  354. package/dist/services/terminal-result-collector.js +64 -0
  355. package/dist/services/terminal-result-collector.js.map +1 -0
  356. package/dist/services/terminal-result-collector.test.d.ts +2 -0
  357. package/dist/services/terminal-result-collector.test.d.ts.map +1 -0
  358. package/dist/services/terminal-result-collector.test.js +93 -0
  359. package/dist/services/terminal-result-collector.test.js.map +1 -0
  360. package/dist/tools/apply-patch.js +5 -5
  361. package/dist/tools/apply-patch.js.map +1 -1
  362. package/dist/tools/create-file.js +2 -2
  363. package/dist/tools/create-file.js.map +1 -1
  364. package/dist/tools/edit-healing.d.ts.map +1 -1
  365. package/dist/tools/edit-healing.js +4 -1
  366. package/dist/tools/edit-healing.js.map +1 -1
  367. package/dist/tools/edit-healing.test.js +22 -0
  368. package/dist/tools/edit-healing.test.js.map +1 -1
  369. package/dist/tools/search-replace.d.ts.map +1 -1
  370. package/dist/tools/search-replace.js +114 -194
  371. package/dist/tools/search-replace.js.map +1 -1
  372. package/dist/tools/search-replace.test.js +38 -0
  373. package/dist/tools/search-replace.test.js.map +1 -1
  374. package/dist/tools/shell.js +2 -2
  375. package/dist/tools/shell.js.map +1 -1
  376. package/dist/tools/shell.test.js +0 -5
  377. package/dist/tools/shell.test.js.map +1 -1
  378. package/dist/tools/web-fetch.test.js +3 -3
  379. package/dist/tools/web-fetch.test.js.map +1 -1
  380. package/dist/utils/clipboard.d.ts +16 -0
  381. package/dist/utils/clipboard.d.ts.map +1 -0
  382. package/dist/utils/clipboard.js +55 -0
  383. package/dist/utils/clipboard.js.map +1 -0
  384. package/dist/utils/clipboard.test.d.ts +2 -0
  385. package/dist/utils/clipboard.test.d.ts.map +1 -0
  386. package/dist/utils/clipboard.test.js +59 -0
  387. package/dist/utils/clipboard.test.js.map +1 -0
  388. package/dist/utils/command-safety/constants.d.ts.map +1 -1
  389. package/dist/utils/command-safety/constants.js +3 -21
  390. package/dist/utils/command-safety/constants.js.map +1 -1
  391. package/dist/utils/command-safety/find-helpers.d.ts.map +1 -1
  392. package/dist/utils/command-safety/find-helpers.js +13 -95
  393. package/dist/utils/command-safety/find-helpers.js.map +1 -1
  394. package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -1
  395. package/dist/utils/command-safety/handlers/sed-handler.js +2 -4
  396. package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -1
  397. package/dist/utils/command-safety/index.d.ts +9 -0
  398. package/dist/utils/command-safety/index.d.ts.map +1 -1
  399. package/dist/utils/command-safety/index.js +12 -2
  400. package/dist/utils/command-safety/index.js.map +1 -1
  401. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -1
  402. package/dist/utils/command-safety/path-analysis.js +7 -6
  403. package/dist/utils/command-safety/path-analysis.js.map +1 -1
  404. package/dist/utils/command-safety.find.test.js +56 -39
  405. package/dist/utils/command-safety.find.test.js.map +1 -1
  406. package/dist/utils/command-safety.path.test.js +7 -7
  407. package/dist/utils/command-safety.path.test.js.map +1 -1
  408. package/dist/utils/command-safety.red-yellow-policy.test.d.ts +2 -0
  409. package/dist/utils/command-safety.red-yellow-policy.test.d.ts.map +1 -0
  410. package/dist/utils/command-safety.red-yellow-policy.test.js +36 -0
  411. package/dist/utils/command-safety.red-yellow-policy.test.js.map +1 -0
  412. package/dist/utils/conversation-event-handler.d.ts +4 -3
  413. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  414. package/dist/utils/conversation-event-handler.js +15 -5
  415. package/dist/utils/conversation-event-handler.js.map +1 -1
  416. package/dist/utils/conversation-event-handler.test.js +24 -0
  417. package/dist/utils/conversation-event-handler.test.js.map +1 -1
  418. package/dist/utils/conversation-utils.d.ts +1 -1
  419. package/dist/utils/execute-shell.d.ts +10 -0
  420. package/dist/utils/execute-shell.d.ts.map +1 -1
  421. package/dist/utils/execute-shell.js +3 -3
  422. package/dist/utils/execute-shell.js.map +1 -1
  423. package/dist/utils/execute-shell.test.js +19 -3
  424. package/dist/utils/execute-shell.test.js.map +1 -1
  425. package/dist/utils/input-parser.d.ts +13 -0
  426. package/dist/utils/input-parser.d.ts.map +1 -0
  427. package/dist/utils/input-parser.js +10 -0
  428. package/dist/utils/input-parser.js.map +1 -0
  429. package/dist/utils/model-provider-arg.d.ts +5 -0
  430. package/dist/utils/model-provider-arg.d.ts.map +1 -0
  431. package/dist/utils/model-provider-arg.js +15 -0
  432. package/dist/utils/model-provider-arg.js.map +1 -0
  433. package/dist/utils/model-provider-arg.test.d.ts +2 -0
  434. package/dist/utils/model-provider-arg.test.d.ts.map +1 -0
  435. package/dist/utils/model-provider-arg.test.js +21 -0
  436. package/dist/utils/model-provider-arg.test.js.map +1 -0
  437. package/dist/utils/model-settings.d.ts +12 -0
  438. package/dist/utils/model-settings.d.ts.map +1 -0
  439. package/dist/utils/model-settings.js +35 -0
  440. package/dist/utils/model-settings.js.map +1 -0
  441. package/dist/utils/provider-traffic-extractor.d.ts +1 -0
  442. package/dist/utils/provider-traffic-extractor.d.ts.map +1 -1
  443. package/dist/utils/provider-traffic-extractor.js +90 -5
  444. package/dist/utils/provider-traffic-extractor.js.map +1 -1
  445. package/dist/utils/settings-command.d.ts.map +1 -1
  446. package/dist/utils/settings-command.js +10 -8
  447. package/dist/utils/settings-command.js.map +1 -1
  448. package/dist/utils/streaming-session-factory.d.ts +1 -1
  449. package/dist/utils/streaming-session-factory.d.ts.map +1 -1
  450. package/dist/utils/streaming-session-factory.js +5 -2
  451. package/dist/utils/streaming-session-factory.js.map +1 -1
  452. package/dist/utils/streaming-session-factory.test.js +2 -2
  453. package/dist/utils/streaming-session-factory.test.js.map +1 -1
  454. package/dist/utils/streaming-updater.d.ts +2 -1
  455. package/dist/utils/streaming-updater.d.ts.map +1 -1
  456. package/dist/utils/streaming-updater.js +2 -2
  457. package/dist/utils/streaming-updater.js.map +1 -1
  458. package/dist/utils/throttle.d.ts +6 -1
  459. package/dist/utils/throttle.d.ts.map +1 -1
  460. package/dist/utils/throttle.js +11 -6
  461. package/dist/utils/throttle.js.map +1 -1
  462. package/dist/utils/viewport.d.ts +6 -0
  463. package/dist/utils/viewport.d.ts.map +1 -0
  464. package/dist/utils/viewport.js +20 -0
  465. package/dist/utils/viewport.js.map +1 -0
  466. package/dist/utils/viewport.test.d.ts +2 -0
  467. package/dist/utils/viewport.test.d.ts.map +1 -0
  468. package/dist/utils/viewport.test.js +43 -0
  469. package/dist/utils/viewport.test.js.map +1 -0
  470. package/package.json +5 -4
  471. package/dist/app.model-command-feedback.test.d.ts +0 -2
  472. package/dist/app.model-command-feedback.test.d.ts.map +0 -1
  473. package/dist/app.model-command-feedback.test.js +0 -19
  474. package/dist/app.model-command-feedback.test.js.map +0 -1
  475. package/dist/components/MentorMode.test.d.ts +0 -2
  476. package/dist/components/MentorMode.test.d.ts.map +0 -1
  477. package/dist/components/MentorMode.test.js.map +0 -1
  478. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
  479. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
  480. package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
  481. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
  482. package/dist/components/StatusBar.test.d.ts +0 -2
  483. package/dist/components/StatusBar.test.d.ts.map +0 -1
  484. package/dist/components/StatusBar.test.js +0 -19
  485. package/dist/components/StatusBar.test.js.map +0 -1
  486. package/dist/components/TextInput.d.ts +0 -42
  487. package/dist/components/TextInput.d.ts.map +0 -1
  488. package/dist/components/TextInput.js +0 -397
  489. package/dist/components/TextInput.js.map +0 -1
  490. package/dist/components/TextInput.test.d.ts +0 -2
  491. package/dist/components/TextInput.test.d.ts.map +0 -1
  492. package/dist/components/TextInput.test.js +0 -75
  493. package/dist/components/TextInput.test.js.map +0 -1
  494. package/dist/debug-schema.d.ts +0 -2
  495. package/dist/debug-schema.d.ts.map +0 -1
  496. package/dist/debug-schema.js +0 -22
  497. package/dist/debug-schema.js.map +0 -1
  498. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  499. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  500. package/dist/hooks/use-path-completion.test.js +0 -29
  501. package/dist/hooks/use-path-completion.test.js.map +0 -1
  502. package/dist/lib/mentor-client.d.ts +0 -41
  503. package/dist/lib/mentor-client.d.ts.map +0 -1
  504. package/dist/lib/mentor-client.js +0 -146
  505. package/dist/lib/mentor-client.js.map +0 -1
  506. package/dist/lib/mentor-client.test.d.ts +0 -2
  507. package/dist/lib/mentor-client.test.d.ts.map +0 -1
  508. package/dist/lib/mentor-client.test.js +0 -440
  509. package/dist/lib/mentor-client.test.js.map +0 -1
  510. package/dist/lib/retry-strategy.d.ts +0 -43
  511. package/dist/lib/retry-strategy.d.ts.map +0 -1
  512. package/dist/lib/retry-strategy.js +0 -93
  513. package/dist/lib/retry-strategy.js.map +0 -1
  514. package/dist/lib/retry-strategy.test.d.ts +0 -2
  515. package/dist/lib/retry-strategy.test.d.ts.map +0 -1
  516. package/dist/lib/retry-strategy.test.js +0 -200
  517. package/dist/lib/retry-strategy.test.js.map +0 -1
  518. package/dist/lib/shell.d.ts +0 -7
  519. package/dist/lib/shell.d.ts.map +0 -1
  520. package/dist/lib/shell.js +0 -56
  521. package/dist/lib/shell.js.map +0 -1
  522. package/dist/prompts/default.md.bak +0 -77
  523. package/dist/prompts/simple-mentor.md +0 -207
  524. package/dist/providers/github-copilot/converters.d.ts +0 -45
  525. package/dist/providers/github-copilot/converters.d.ts.map +0 -1
  526. package/dist/providers/github-copilot/converters.js +0 -118
  527. package/dist/providers/github-copilot/converters.js.map +0 -1
  528. package/dist/providers/github-copilot/converters.test.d.ts +0 -2
  529. package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
  530. package/dist/providers/github-copilot/converters.test.js +0 -162
  531. package/dist/providers/github-copilot/converters.test.js.map +0 -1
  532. package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
  533. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
  534. package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
  535. package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
  536. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
  537. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
  538. package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
  539. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
  540. package/dist/providers/github-copilot/index.d.ts +0 -4
  541. package/dist/providers/github-copilot/index.d.ts.map +0 -1
  542. package/dist/providers/github-copilot/index.js +0 -4
  543. package/dist/providers/github-copilot/index.js.map +0 -1
  544. package/dist/providers/github-copilot/model-direct.d.ts +0 -34
  545. package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
  546. package/dist/providers/github-copilot/model-direct.js +0 -443
  547. package/dist/providers/github-copilot/model-direct.js.map +0 -1
  548. package/dist/providers/github-copilot/model.d.ts +0 -24
  549. package/dist/providers/github-copilot/model.d.ts.map +0 -1
  550. package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
  551. package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
  552. package/dist/providers/github-copilot/model.delta.test.js +0 -15
  553. package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
  554. package/dist/providers/github-copilot/model.js +0 -581
  555. package/dist/providers/github-copilot/model.js.map +0 -1
  556. package/dist/providers/github-copilot/provider.d.ts +0 -20
  557. package/dist/providers/github-copilot/provider.d.ts.map +0 -1
  558. package/dist/providers/github-copilot/provider.js +0 -30
  559. package/dist/providers/github-copilot/provider.js.map +0 -1
  560. package/dist/providers/github-copilot/provider.test.d.ts +0 -2
  561. package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
  562. package/dist/providers/github-copilot/provider.test.js +0 -52
  563. package/dist/providers/github-copilot/provider.test.js.map +0 -1
  564. package/dist/providers/github-copilot/utils.d.ts +0 -20
  565. package/dist/providers/github-copilot/utils.d.ts.map +0 -1
  566. package/dist/providers/github-copilot/utils.js +0 -142
  567. package/dist/providers/github-copilot/utils.js.map +0 -1
  568. package/dist/providers/github-copilot/utils.test.d.ts +0 -2
  569. package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
  570. package/dist/providers/github-copilot/utils.test.js +0 -21
  571. package/dist/providers/github-copilot/utils.test.js.map +0 -1
  572. package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
  573. package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
  574. package/dist/providers/openrouter/merge-messages.test.js +0 -83
  575. package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
  576. package/dist/providers/openrouter.history.test.d.ts +0 -2
  577. package/dist/providers/openrouter.history.test.d.ts.map +0 -1
  578. package/dist/providers/openrouter.history.test.js +0 -533
  579. package/dist/providers/openrouter.history.test.js.map +0 -1
  580. package/dist/reproduce_issue.test.d.ts +0 -2
  581. package/dist/reproduce_issue.test.d.ts.map +0 -1
  582. package/dist/reproduce_issue.test.js +0 -31
  583. package/dist/reproduce_issue.test.js.map +0 -1
  584. package/dist/safety-checker.js +0 -57
  585. package/dist/services/conversation-service.test.js +0 -190
  586. package/dist/services/conversation-session.usage.test.d.ts +0 -2
  587. package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
  588. package/dist/services/conversation-session.usage.test.js +0 -59
  589. package/dist/services/conversation-session.usage.test.js.map +0 -1
  590. package/dist/test-search-tool.d.ts +0 -2
  591. package/dist/test-search-tool.d.ts.map +0 -1
  592. package/dist/test-search-tool.js +0 -36
  593. package/dist/test-search-tool.js.map +0 -1
  594. package/dist/tools/bash.d.ts +0 -10
  595. package/dist/tools/bash.d.ts.map +0 -1
  596. package/dist/tools/bash.js +0 -55
  597. package/dist/tools/bash.js.map +0 -1
  598. package/dist/types/messages.d.ts +0 -29
  599. package/dist/types/messages.d.ts.map +0 -1
  600. package/dist/types/messages.js +0 -2
  601. package/dist/types/messages.js.map +0 -1
  602. package/dist/utils/command-safety.d.ts +0 -21
  603. package/dist/utils/command-safety.d.ts.map +0 -1
  604. package/dist/utils/command-safety.js +0 -702
  605. package/dist/utils/command-safety.js.map +0 -1
  606. package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
  607. package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
  608. package/dist/utils/extract-command-messages.repro.test.js +0 -31
  609. package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
  610. package/dist/utils/extract-command-messages.test.js +0 -57
  611. package/dist/utils/message-utils.d.ts +0 -17
  612. package/dist/utils/message-utils.d.ts.map +0 -1
  613. package/dist/utils/message-utils.js +0 -52
  614. package/dist/utils/message-utils.js.map +0 -1
  615. package/dist/utils/message-utils.test.d.ts +0 -2
  616. package/dist/utils/message-utils.test.d.ts.map +0 -1
  617. package/dist/utils/message-utils.test.js +0 -48
  618. package/dist/utils/message-utils.test.js.map +0 -1
@@ -1,7 +1,4 @@
1
1
  import { Agent, run, tool as createTool, webSearchTool, applyPatchTool } from '@openai/agents';
2
- import { APIConnectionError, APIConnectionTimeoutError, InternalServerError, RateLimitError } from 'openai';
3
- import { OpenRouterError } from '../providers/openrouter.js';
4
- import { OpenAICompatibleError } from '../providers/openai-compatible/api.js';
5
2
  import { getProvider } from '../providers/index.js';
6
3
  import { randomUUID } from 'node:crypto';
7
4
  import { getAgentDefinition, getEnvInfo, getAgentsInstructions } from '../agent.js';
@@ -10,6 +7,80 @@ import { createEditorImpl } from './editor-impl.js';
10
7
  import { ConversationStore } from '../services/conversation-store.js';
11
8
  import { trimToolOutput } from '../utils/trim-tool-output.js';
12
9
  import { toOpenAIStrictToolSchema } from './openai-strict-tool-schema.js';
10
+ import { executeWithRetry } from './retry-executor.js';
11
+ import { shouldUseNativePatchTool, shouldUseStrictToolSchema } from './tool-selection-policy.js';
12
+ class MentorSession {
13
+ #provider = null;
14
+ #runner = null;
15
+ #agent = null;
16
+ #store = null;
17
+ #previousResponseId = null;
18
+ get provider() {
19
+ return this.#provider;
20
+ }
21
+ get runner() {
22
+ return this.#runner;
23
+ }
24
+ get agent() {
25
+ return this.#agent;
26
+ }
27
+ get previousResponseId() {
28
+ return this.#previousResponseId;
29
+ }
30
+ reset() {
31
+ if (this.#store) {
32
+ this.#store.clear();
33
+ }
34
+ this.#previousResponseId = null;
35
+ this.#store = null;
36
+ this.#runner = null;
37
+ this.#provider = null;
38
+ this.#agent = null;
39
+ }
40
+ switchProvider(provider) {
41
+ if (this.#provider !== provider) {
42
+ this.#agent = null;
43
+ this.#store = null;
44
+ this.#previousResponseId = null;
45
+ this.#runner = null;
46
+ this.#provider = provider;
47
+ }
48
+ }
49
+ ensureRunner(provider, createRunner) {
50
+ if (!this.#runner && provider !== 'openai') {
51
+ this.#runner = createRunner(provider);
52
+ }
53
+ return this.#runner;
54
+ }
55
+ ensureAgent(createAgent) {
56
+ if (!this.#agent) {
57
+ this.#agent = createAgent();
58
+ this.#store = new ConversationStore();
59
+ }
60
+ return this.#agent;
61
+ }
62
+ addUserMessage(message) {
63
+ this.#store.addUserMessage(message);
64
+ }
65
+ getInput(question, supportsConversationChaining) {
66
+ return supportsConversationChaining ? question : this.#store.getHistory();
67
+ }
68
+ getRunOptions(supportsConversationChaining) {
69
+ return {
70
+ stream: false,
71
+ maxTurns: 1,
72
+ ...(supportsConversationChaining && this.#previousResponseId
73
+ ? { previousResponseId: this.#previousResponseId }
74
+ : {}),
75
+ };
76
+ }
77
+ updateFromResult(result) {
78
+ this.#store.updateFromResult(result);
79
+ if (result.responseId) {
80
+ this.#previousResponseId = result.responseId;
81
+ }
82
+ }
83
+ }
13
84
  /**
14
85
  * Minimal adapter that isolates usage of @openai/agents.
15
86
  * Swap this module to change the underlying agent provider without touching the UI.
@@ -21,8 +92,6 @@ export class OpenAIAgentClient {
21
92
  #reasoningEffort;
22
93
  #temperature;
23
94
  #provider;
24
- #mentorProvider = null;
25
- #mentorRunner = null;
26
95
  #maxTurns;
27
96
  #retryAttempts;
28
97
  #currentAbortController = null;
@@ -34,23 +103,15 @@ export class OpenAIAgentClient {
34
103
  #settings;
35
104
  #executionContext;
36
105
  #editor;
37
- #mentorAgent = null;
38
- #mentorStore = null;
39
- #mentorPreviousResponseId = null;
106
+ #mentorSession;
40
107
  #resetMentorState() {
41
- if (this.#mentorStore) {
42
- this.#mentorStore.clear();
43
- }
44
- this.#mentorPreviousResponseId = null;
45
- this.#mentorStore = null;
46
- this.#mentorRunner = null;
47
- this.#mentorProvider = null;
48
- this.#mentorAgent = null;
108
+ this.#mentorSession.reset();
49
109
  }
50
110
  constructor({ model, reasoningEffort, maxTurns, retryAttempts, deps, }) {
51
111
  this.#logger = deps.logger;
52
112
  this.#settings = deps.settings;
53
113
  this.#executionContext = deps.executionContext;
114
+ this.#mentorSession = new MentorSession();
54
115
  this.#editor = createEditorImpl({
55
116
  loggingService: this.#logger,
56
117
  settingsService: this.#settings,
@@ -63,7 +124,7 @@ export class OpenAIAgentClient {
63
124
  this.#retryAttempts = retryAttempts ?? 2;
64
125
  this.#agent = this.#createAgent({ model, reasoningEffort });
65
126
  this.#runner = this.#createRunner(this.#provider);
66
- this.#logger.info('OpenAI Agent Client initialized', {
127
+ this.#logger.debug('OpenAI Agent Client initialized', {
67
128
  model: model || this.#settings.get('agent.model'),
68
129
  reasoningEffort: reasoningEffort ?? 'default',
69
130
  temperature: this.#temperature,
@@ -137,6 +198,8 @@ export class OpenAIAgentClient {
137
198
  return {
138
199
  supportsConversationChaining: providerDef?.capabilities?.supportsConversationChaining ?? false,
139
200
  supportsTracingControl: providerDef?.capabilities?.supportsTracingControl ?? false,
201
+ usesStrictToolSchema: providerDef?.capabilities?.usesStrictToolSchema,
202
+ nativePatchModelPrefixes: providerDef?.capabilities?.nativePatchModelPrefixes,
140
203
  };
141
204
  }
142
205
  #createRunner(providerId) {
@@ -187,7 +250,7 @@ export class OpenAIAgentClient {
187
250
  providerDef.clearConversations();
188
251
  }
189
252
  this.#refreshAgent();
190
- this.#logger.info('Conversation and agent refreshed');
253
+ this.#logger.debug('Conversation and agent refreshed');
191
254
  }
192
255
  async startStream(userInput, { previousResponseId } = {}) {
193
256
  // Abort any previous operation
@@ -203,7 +266,7 @@ export class OpenAIAgentClient {
203
266
  this.#logger.setCorrelationId(this.#currentCorrelationId);
204
267
  this.#currentAbortController = new AbortController();
205
268
  const signal = this.#currentAbortController.signal;
206
- this.#logger.info('Agent stream started', {
269
+ this.#logger.debug('Agent stream started', {
207
270
  eventType: 'provider.request.started',
208
271
  category: 'provider',
209
272
  phase: 'request_start',
@@ -213,6 +276,7 @@ export class OpenAIAgentClient {
213
276
  inputType: Array.isArray(userInput) ? 'array' : typeof userInput,
214
277
  inputLength: typeof userInput === 'string' ? userInput.length : undefined,
215
278
  inputItems: Array.isArray(userInput) ? userInput.length : undefined,
279
+ messages: Array.isArray(userInput) ? userInput : undefined,
216
280
  hasPreviousResponseId: !!previousResponseId,
217
281
  });
218
282
  try {
@@ -300,82 +364,29 @@ export class OpenAIAgentClient {
300
364
  return this.#runAgentWithProvider(this.#provider, this.#runner, agent, input, options);
301
365
  }
302
366
  async #executeWithRetry(operation, retries = this.#retryAttempts) {
303
- try {
304
- return await operation();
305
- }
306
- catch (error) {
307
- // Determine if the error is retryable
308
- // UserError and ModelBehaviorError are NOT retried (logic errors, not transient)
309
- const isTransientError = error instanceof APIConnectionError ||
310
- error instanceof APIConnectionTimeoutError ||
311
- error instanceof InternalServerError ||
312
- error instanceof RateLimitError;
313
- // Check if it's an OpenRouter error with retryable status
314
- const isOpenRouterRetryable = error instanceof OpenRouterError && (error.status === 429 || error.status >= 500);
315
- const isOpenAICompatibleRetryable = error instanceof OpenAICompatibleError && (error.status === 429 || error.status >= 500);
316
- const isRetryable = retries > 0 && (isTransientError || isOpenRouterRetryable || isOpenAICompatibleRetryable);
317
- if (isRetryable) {
318
- const attemptIndex = this.#retryAttempts - retries;
319
- let delay;
320
- // Check for Retry-After header (both OpenAI and OpenRouter)
321
- const retryAfterHeader = (error instanceof RateLimitError && error.headers?.['retry-after']) ||
322
- (error instanceof OpenRouterError && error.headers['retry-after']) ||
323
- (error instanceof OpenAICompatibleError && error.headers['retry-after']);
324
- if (retryAfterHeader) {
325
- // Respect the Retry-After header
326
- delay = parseInt(retryAfterHeader, 10) * 1000;
327
- }
328
- else {
329
- // Exponential backoff with full jitter
330
- // Base delay: 500-1000ms
331
- // Multiplier: 2^attemptIndex
332
- // Max cap: 30 seconds
333
- const baseDelay = 500 + Math.random() * 500; // 500-1000ms
334
- const exponentialDelay = baseDelay * Math.pow(2, attemptIndex);
335
- const maxDelay = 30000; // 30 seconds
336
- const cappedDelay = Math.min(exponentialDelay, maxDelay);
337
- // Apply full jitter: random value between 0 and cappedDelay
338
- delay = Math.random() * cappedDelay;
339
- }
340
- await new Promise((resolve) => setTimeout(resolve, delay));
341
- this.#logger.warn('Agent operation retry', {
342
- eventType: 'retry.upstream',
343
- category: 'retry',
344
- phase: 'retry',
345
- traceId: this.#currentCorrelationId,
346
- provider: this.#provider,
347
- model: this.#model,
348
- retryType: 'upstream',
349
- retryAttempt: attemptIndex + 1,
350
- errorType: error.constructor.name,
351
- retriesRemaining: retries - 1,
352
- delayMs: Math.round(delay),
353
- attemptIndex,
354
- errorMessage: error instanceof Error ? error.message : String(error),
355
- ...(error instanceof OpenRouterError && {
356
- status: error.status,
357
- }),
358
- ...(error instanceof OpenAICompatibleError && {
359
- status: error.status,
360
- }),
361
- });
362
- this.#retryCallback?.();
363
- return this.#executeWithRetry(operation, retries - 1);
364
- }
365
- throw error;
366
- }
367
+ return executeWithRetry({
368
+ operation,
369
+ retryAttempts: retries,
370
+ provider: this.#provider,
371
+ model: this.#model,
372
+ traceId: this.#currentCorrelationId,
373
+ logger: this.#logger,
374
+ onRetry: this.#retryCallback ?? undefined,
375
+ });
367
376
  }
368
377
  async chat(message, options = {}) {
378
+ const tempProvider = options.provider || this.#provider;
369
379
  this.#logger.debug('Agent chat request', {
370
380
  messageLength: message.length,
371
381
  model: options.model || this.#model,
382
+ provider: tempProvider,
372
383
  });
373
384
  try {
374
385
  // Create a temporary agent for this specific chat request if params differ
375
386
  let agentForChat = this.#agent;
376
- if (options.model || options.reasoningEffort) {
377
- const tempModel = options.model || this.#model;
378
- const tempEffort = options.reasoningEffort || this.#reasoningEffort;
387
+ const tempModel = options.model || this.#model;
388
+ const tempEffort = options.reasoningEffort || this.#reasoningEffort;
389
+ if (options.model || options.reasoningEffort || options.instructions || options.provider) {
379
390
  const modelSettings = {};
380
391
  if (tempEffort && tempEffort !== 'default') {
381
392
  modelSettings.reasoning = {
@@ -384,49 +395,24 @@ export class OpenAIAgentClient {
384
395
  };
385
396
  }
386
397
  // For simple chat, we generally don't need tools, but we keep the system instructions
387
- // Actually, for mentor mode, we might want a simpler agent without tools
388
398
  agentForChat = new Agent({
389
- name: 'Mentor',
399
+ name: 'Chat',
390
400
  model: tempModel,
391
401
  ...(Object.keys(modelSettings).length > 0 ? { modelSettings } : {}),
392
- instructions: options.instructions || 'You are a helpful mentor assistant.',
402
+ instructions: options.instructions || 'You are a helpful assistant.',
393
403
  });
394
- // Ensure runner is compatible or use run()
395
- if (!this.#runner && this.#provider !== 'openai') {
396
- // Logic to ensure runner exists... same as #runAgent
397
- const providerDef = getProvider(this.#provider);
398
- if (!providerDef)
399
- throw new Error(`Provider ${this.#provider} not found`);
400
- if (providerDef.createRunner) {
401
- // We can't easily reuse the main runner if it's bound to the main agent
402
- // But creating a new runner for every chat might be expensive?
403
- // For now, let's assume we can just use `run` if no tools are needed,
404
- // but some providers NEED a runner.
405
- // Actually, most providers' runners are stateless or lightweight wrappers.
406
- }
407
- }
404
+ }
405
+ // If provider is different from main provider, we need a separate runner
406
+ let runnerForChat = this.#runner;
407
+ if (tempProvider !== this.#provider) {
408
+ runnerForChat = this.#createRunner(tempProvider);
408
409
  }
409
410
  // We use a simplified run flow for chat
410
- const result = await this.#runAgent(agentForChat, message, {
411
+ const result = await this.#runAgentWithProvider(tempProvider, runnerForChat, agentForChat, message, {
411
412
  stream: false,
412
413
  maxTurns: 1, // Chat is usually single turn
413
414
  });
414
- if (result.finalOutput) {
415
- return result.finalOutput;
416
- }
417
- // Fallback: extract from messages if finalOutput is missing
418
- if (result.messages && Array.isArray(result.messages)) {
419
- const lastMessage = result.messages[result.messages.length - 1];
420
- if (lastMessage && lastMessage.content) {
421
- if (typeof lastMessage.content === 'string') {
422
- return lastMessage.content;
423
- }
424
- if (Array.isArray(lastMessage.content)) {
425
- return lastMessage.content.map((part) => part.text || part.value || '').join('');
426
- }
427
- }
428
- }
429
- return '';
415
+ return this.#extractResponse(result);
430
416
  }
431
417
  catch (error) {
432
418
  this.#logger.error('Agent chat failed', {
@@ -435,6 +421,24 @@ export class OpenAIAgentClient {
435
421
  throw error; // Propagate error
436
422
  }
437
423
  }
424
+ #extractResponse(result) {
425
+ if (result.finalOutput) {
426
+ return result.finalOutput;
427
+ }
428
+ // Fallback: extract from messages if finalOutput is missing
429
+ if (result.messages && Array.isArray(result.messages)) {
430
+ const lastMessage = result.messages[result.messages.length - 1];
431
+ if (lastMessage && lastMessage.content) {
432
+ if (typeof lastMessage.content === 'string') {
433
+ return lastMessage.content;
434
+ }
435
+ if (Array.isArray(lastMessage.content)) {
436
+ return lastMessage.content.map((part) => part.text || part.value || '').join('');
437
+ }
438
+ }
439
+ }
440
+ return '';
441
+ }
438
442
  #createMentor = async (question) => {
439
443
  const mentorModel = this.#settings.get('agent.mentorModel');
440
444
  if (!mentorModel) {
@@ -459,18 +463,9 @@ export class OpenAIAgentClient {
459
463
  const agentsInstructions = this.#executionContext?.isRemote() ? '' : getAgentsInstructions(cwd);
460
464
  const instructions = `${baseInstructions}\n\nEnvironment: ${envInfo}${agentsInstructions}`;
461
465
  // If mentor provider changed, reset mentor state to avoid mixing stores/prev ids across providers
462
- if (this.#mentorProvider !== mentorProvider) {
463
- this.#mentorAgent = null;
464
- this.#mentorStore = null;
465
- this.#mentorPreviousResponseId = null;
466
- this.#mentorRunner = null;
467
- this.#mentorProvider = mentorProvider;
468
- }
469
- // Initialize mentor runner/agent and conversation store if needed
470
- if (!this.#mentorRunner && mentorProvider !== 'openai') {
471
- this.#mentorRunner = this.#createRunner(mentorProvider);
472
- }
473
- if (!this.#mentorAgent) {
466
+ this.#mentorSession.switchProvider(mentorProvider);
467
+ const mentorRunner = this.#mentorSession.ensureRunner(mentorProvider, (providerId) => this.#createRunner(providerId));
468
+ const mentorAgent = this.#mentorSession.ensureAgent(() => {
474
469
  const reasoningEffort = this.#settings.get('agent.mentorReasoningEffort');
475
470
  const modelSettings = {};
476
471
  if (reasoningEffort && reasoningEffort !== 'default') {
@@ -479,52 +474,25 @@ export class OpenAIAgentClient {
479
474
  summary: 'auto',
480
475
  };
481
476
  }
482
- this.#mentorAgent = new Agent({
477
+ return new Agent({
483
478
  name: 'Mentor',
484
479
  model: mentorModel,
485
480
  ...(Object.keys(modelSettings).length > 0 ? { modelSettings } : {}),
486
481
  instructions,
487
482
  });
488
- this.#mentorStore = new ConversationStore();
489
- }
483
+ });
490
484
  try {
491
485
  // Add user message to conversation history
492
- this.#mentorStore.addUserMessage(question);
486
+ this.#mentorSession.addUserMessage(question);
493
487
  // Determine input based on provider
494
488
  // OpenAI uses previousResponseId for server-side history
495
489
  // Others need full conversation history from store
496
490
  const { supportsConversationChaining } = this.#getProviderCapabilities(mentorProvider);
497
- const input = supportsConversationChaining ? question : this.#mentorStore.getHistory();
498
- const result = await this.#runAgentWithProvider(mentorProvider, this.#mentorRunner, this.#mentorAgent, input, {
499
- stream: false,
500
- maxTurns: 1,
501
- ...(supportsConversationChaining && this.#mentorPreviousResponseId
502
- ? { previousResponseId: this.#mentorPreviousResponseId }
503
- : {}),
504
- });
491
+ const input = this.#mentorSession.getInput(question, supportsConversationChaining);
492
+ const result = await this.#runAgentWithProvider(mentorProvider, mentorRunner, mentorAgent, input, this.#mentorSession.getRunOptions(supportsConversationChaining));
505
493
  // Update conversation store with result
506
- this.#mentorStore.updateFromResult(result);
507
- // Track previousResponseId when provided by the provider.
508
- if (result.responseId) {
509
- this.#mentorPreviousResponseId = result.responseId;
510
- }
511
- // Extract response
512
- let response = '';
513
- if (result.finalOutput) {
514
- response = result.finalOutput;
515
- }
516
- else if (result.messages && Array.isArray(result.messages)) {
517
- const lastMessage = result.messages[result.messages.length - 1];
518
- if (lastMessage && lastMessage.content) {
519
- if (typeof lastMessage.content === 'string') {
520
- response = lastMessage.content;
521
- }
522
- else if (Array.isArray(lastMessage.content)) {
523
- response = lastMessage.content.map((part) => part.text || part.value || '').join('');
524
- }
525
- }
526
- }
527
- return response;
494
+ this.#mentorSession.updateFromResult(result);
495
+ return this.#extractResponse(result);
528
496
  }
529
497
  catch (error) {
530
498
  this.#logger.error('Mentor consultation failed', {
@@ -544,8 +512,47 @@ export class OpenAIAgentClient {
544
512
  // @ts-ignore - Definition update coming next
545
513
  askMentor: this.#createMentor,
546
514
  }, resolvedModel);
547
- // Determine if we should use the native applyPatchTool
548
- const shouldUseNativePatchTool = this.#provider === 'openai' && resolvedModel.startsWith('gpt-5.1');
515
+ const providerCapabilities = this.#getProviderCapabilities(this.#provider);
516
+ const shouldUseNativePatchToolForModel = shouldUseNativePatchTool({
517
+ providerId: this.#provider,
518
+ model: resolvedModel,
519
+ capabilities: providerCapabilities,
520
+ });
521
+ const tools = this.#buildAgentTools({
522
+ toolDefinitions,
523
+ resolvedModel,
524
+ reasoningEffort,
525
+ shouldUseNativePatchTool: shouldUseNativePatchToolForModel,
526
+ });
527
+ const modelSettings = this.#buildModelSettings({
528
+ reasoningEffort,
529
+ resolvedTemperature,
530
+ });
531
+ const agent = new Agent({
532
+ name,
533
+ model: resolvedModel,
534
+ ...(Object.keys(modelSettings).length > 0 ? { modelSettings } : {}),
535
+ instructions,
536
+ tools,
537
+ });
538
+ // Only add defaultRunOptions if an explicit effort is set (not
539
+ // 'default'). This ensures the API receives the param only when
540
+ // intended.
541
+ if (reasoningEffort && reasoningEffort !== 'default') {
542
+ agent.defaultRunOptions = {
543
+ ...(agent.defaultRunOptions || {}),
544
+ // Pass through to underlying client for models that support it
545
+ reasoning: { effort: reasoningEffort },
546
+ };
547
+ }
548
+ return agent;
549
+ }
550
+ #buildAgentTools({ toolDefinitions, resolvedModel, reasoningEffort, shouldUseNativePatchTool, }) {
551
+ const providerCapabilities = this.#getProviderCapabilities(this.#provider);
552
+ const useStrictToolSchema = shouldUseStrictToolSchema({
553
+ providerId: this.#provider,
554
+ capabilities: providerCapabilities,
555
+ });
549
556
  const tools = toolDefinitions
550
557
  .filter((definition) => {
551
558
  // Exclude custom apply_patch if we're using native one
@@ -557,7 +564,7 @@ export class OpenAIAgentClient {
557
564
  .map((definition) => wrapToolInvoke(createTool({
558
565
  name: definition.name,
559
566
  description: definition.description,
560
- parameters: this.#provider === 'openai' ? toOpenAIStrictToolSchema(definition.parameters) : definition.parameters,
567
+ parameters: useStrictToolSchema ? toOpenAIStrictToolSchema(definition.parameters) : definition.parameters,
561
568
  needsApproval: async (context, params) => definition.needsApproval(params, context),
562
569
  execute: async (params, _context, details) => {
563
570
  const maxOutputLengthValue = this.#settings.get('shell.maxOutputChars');
@@ -566,7 +573,7 @@ export class OpenAIAgentClient {
566
573
  // Check if this execution should be intercepted
567
574
  const rejectionMessage = await this.#checkToolInterceptors(definition.name, params, toolCallId);
568
575
  if (rejectionMessage) {
569
- this.#logger.info('Tool execution intercepted', {
576
+ this.#logger.debug('Tool execution intercepted', {
570
577
  tool: definition.name,
571
578
  params: JSON.stringify(params).substring(0, 100),
572
579
  });
@@ -609,7 +616,7 @@ export class OpenAIAgentClient {
609
616
  }
610
617
  const rejectionMessage = await this.#checkToolInterceptors('apply_patch', params, toolCallId);
611
618
  if (rejectionMessage) {
612
- this.#logger.info('Native tool execution intercepted', {
619
+ this.#logger.debug('Native tool execution intercepted', {
613
620
  tool: 'apply_patch',
614
621
  toolCallId,
615
622
  params: JSON.stringify(params).substring(0, 100),
@@ -631,13 +638,13 @@ export class OpenAIAgentClient {
631
638
  };
632
639
  }
633
640
  tools.push(nativePatchTool);
634
- this.#logger.info('Using native applyPatchTool from SDK', {
641
+ this.#logger.debug('Using native applyPatchTool from SDK', {
635
642
  model: resolvedModel,
636
643
  provider: this.#provider,
637
644
  });
638
645
  }
639
646
  else {
640
- this.#logger.info('Using custom apply_patch implementation', {
647
+ this.#logger.debug('Using custom apply_patch implementation', {
641
648
  model: resolvedModel,
642
649
  provider: this.#provider,
643
650
  });
@@ -652,6 +659,9 @@ export class OpenAIAgentClient {
652
659
  // handled differently, likely through approval mechanisms.
653
660
  tools.push(webTool);
654
661
  }
662
+ return tools;
663
+ }
664
+ #buildModelSettings({ reasoningEffort, resolvedTemperature, }) {
655
665
  // Build modelSettings only if an explicit effort value (other than
656
666
  // 'default') was provided. 'default' means we should not pass the
657
667
  // effort param and allow the underlying API to choose the default.
@@ -677,24 +687,10 @@ export class OpenAIAgentClient {
677
687
  service_tier: 'flex',
678
688
  };
679
689
  }
680
- const agent = new Agent({
681
- name,
682
- model: resolvedModel,
683
- ...(Object.keys(modelSettings).length > 0 ? { modelSettings } : {}),
684
- instructions,
685
- tools,
686
- });
687
- // Only add defaultRunOptions if an explicit effort is set (not
688
- // 'default'). This ensures the API receives the param only when
689
- // intended.
690
- if (reasoningEffort && reasoningEffort !== 'default') {
691
- agent.defaultRunOptions = {
692
- ...(agent.defaultRunOptions || {}),
693
- // Pass through to underlying client for models that support it
694
- reasoning: { effort: reasoningEffort },
695
- };
696
- }
697
- return agent;
690
+ return modelSettings;
691
+ }
692
+ getSettings() {
693
+ return this.#settings;
698
694
  }
699
695
  }
700
696
  //# sourceMappingURL=openai-agent-client.js.map