@qduc/term2 0.1.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 (621) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent.d.ts +19 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +143 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/app.d.ts +22 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +403 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/app.model-command-feedback.test.d.ts +2 -0
  11. package/dist/app.model-command-feedback.test.d.ts.map +1 -0
  12. package/dist/app.model-command-feedback.test.js +19 -0
  13. package/dist/app.model-command-feedback.test.js.map +1 -0
  14. package/dist/app.parseInput.test.d.ts +2 -0
  15. package/dist/app.parseInput.test.d.ts.map +1 -0
  16. package/dist/app.parseInput.test.js +97 -0
  17. package/dist/app.parseInput.test.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +241 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/components/ApprovalPrompt.d.ts +10 -0
  23. package/dist/components/ApprovalPrompt.d.ts.map +1 -0
  24. package/dist/components/ApprovalPrompt.js +163 -0
  25. package/dist/components/ApprovalPrompt.js.map +1 -0
  26. package/dist/components/Banner.d.ts +9 -0
  27. package/dist/components/Banner.d.ts.map +1 -0
  28. package/dist/components/Banner.js +86 -0
  29. package/dist/components/Banner.js.map +1 -0
  30. package/dist/components/BottomArea.d.ts +33 -0
  31. package/dist/components/BottomArea.d.ts.map +1 -0
  32. package/dist/components/BottomArea.js +31 -0
  33. package/dist/components/BottomArea.js.map +1 -0
  34. package/dist/components/BottomArea.test.d.ts +2 -0
  35. package/dist/components/BottomArea.test.d.ts.map +1 -0
  36. package/dist/components/BottomArea.test.js +73 -0
  37. package/dist/components/BottomArea.test.js.map +1 -0
  38. package/dist/components/ChatMessage.d.ts +7 -0
  39. package/dist/components/ChatMessage.d.ts.map +1 -0
  40. package/dist/components/ChatMessage.js +10 -0
  41. package/dist/components/ChatMessage.js.map +1 -0
  42. package/dist/components/CommandMessage.d.ts +15 -0
  43. package/dist/components/CommandMessage.d.ts.map +1 -0
  44. package/dist/components/CommandMessage.js +188 -0
  45. package/dist/components/CommandMessage.js.map +1 -0
  46. package/dist/components/CommandMessage.test.d.ts +2 -0
  47. package/dist/components/CommandMessage.test.d.ts.map +1 -0
  48. package/dist/components/CommandMessage.test.js +35 -0
  49. package/dist/components/CommandMessage.test.js.map +1 -0
  50. package/dist/components/ErrorBoundary.d.ts +27 -0
  51. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  52. package/dist/components/ErrorBoundary.js +77 -0
  53. package/dist/components/ErrorBoundary.js.map +1 -0
  54. package/dist/components/ErrorBoundary.test.d.ts +2 -0
  55. package/dist/components/ErrorBoundary.test.d.ts.map +1 -0
  56. package/dist/components/ErrorBoundary.test.js +32 -0
  57. package/dist/components/ErrorBoundary.test.js.map +1 -0
  58. package/dist/components/Input/PopupManager.d.ts +42 -0
  59. package/dist/components/Input/PopupManager.d.ts.map +1 -0
  60. package/dist/components/Input/PopupManager.js +13 -0
  61. package/dist/components/Input/PopupManager.js.map +1 -0
  62. package/dist/components/InputBox.d.ts +18 -0
  63. package/dist/components/InputBox.d.ts.map +1 -0
  64. package/dist/components/InputBox.js +384 -0
  65. package/dist/components/InputBox.js.map +1 -0
  66. package/dist/components/InputBox.menu-logic.test.d.ts +2 -0
  67. package/dist/components/InputBox.menu-logic.test.d.ts.map +1 -0
  68. package/dist/components/InputBox.menu-logic.test.js +151 -0
  69. package/dist/components/InputBox.menu-logic.test.js.map +1 -0
  70. package/dist/components/InputBox.test.d.ts +2 -0
  71. package/dist/components/InputBox.test.d.ts.map +1 -0
  72. package/dist/components/InputBox.test.js +91 -0
  73. package/dist/components/InputBox.test.js.map +1 -0
  74. package/dist/components/LiveResponse.d.ts +13 -0
  75. package/dist/components/LiveResponse.d.ts.map +1 -0
  76. package/dist/components/LiveResponse.js +16 -0
  77. package/dist/components/LiveResponse.js.map +1 -0
  78. package/dist/components/MarkdownRenderer.d.ts +8 -0
  79. package/dist/components/MarkdownRenderer.d.ts.map +1 -0
  80. package/dist/components/MarkdownRenderer.js +225 -0
  81. package/dist/components/MarkdownRenderer.js.map +1 -0
  82. package/dist/components/MentorMode.test.d.ts +2 -0
  83. package/dist/components/MentorMode.test.d.ts.map +1 -0
  84. package/dist/components/MentorMode.test.js.map +1 -0
  85. package/dist/components/MessageList.d.ts +7 -0
  86. package/dist/components/MessageList.d.ts.map +1 -0
  87. package/dist/components/MessageList.js +29 -0
  88. package/dist/components/MessageList.js.map +1 -0
  89. package/dist/components/MessageList.test.d.ts +2 -0
  90. package/dist/components/MessageList.test.d.ts.map +1 -0
  91. package/dist/components/MessageList.test.js +15 -0
  92. package/dist/components/MessageList.test.js.map +1 -0
  93. package/dist/components/ModelSelectionMenu.d.ts +18 -0
  94. package/dist/components/ModelSelectionMenu.d.ts.map +1 -0
  95. package/dist/components/ModelSelectionMenu.js +91 -0
  96. package/dist/components/ModelSelectionMenu.js.map +1 -0
  97. package/dist/components/ModelSelectionMenu.test.d.ts +2 -0
  98. package/dist/components/ModelSelectionMenu.test.d.ts.map +1 -0
  99. package/dist/components/ModelSelectionMenu.test.js +83 -0
  100. package/dist/components/ModelSelectionMenu.test.js.map +1 -0
  101. package/dist/components/PathSelectionMenu.d.ts +12 -0
  102. package/dist/components/PathSelectionMenu.d.ts.map +1 -0
  103. package/dist/components/PathSelectionMenu.js +42 -0
  104. package/dist/components/PathSelectionMenu.js.map +1 -0
  105. package/dist/components/SettingsSelectionMenu.d.ts +9 -0
  106. package/dist/components/SettingsSelectionMenu.d.ts.map +1 -0
  107. package/dist/components/SettingsSelectionMenu.js +21 -0
  108. package/dist/components/SettingsSelectionMenu.js.map +1 -0
  109. package/dist/components/SlashCommandMenu.d.ts +15 -0
  110. package/dist/components/SlashCommandMenu.d.ts.map +1 -0
  111. package/dist/components/SlashCommandMenu.js +20 -0
  112. package/dist/components/SlashCommandMenu.js.map +1 -0
  113. package/dist/components/StatusBar.d.ts +11 -0
  114. package/dist/components/StatusBar.d.ts.map +1 -0
  115. package/dist/components/StatusBar.js +59 -0
  116. package/dist/components/StatusBar.js.map +1 -0
  117. package/dist/components/TextInput.d.ts +42 -0
  118. package/dist/components/TextInput.d.ts.map +1 -0
  119. package/dist/components/TextInput.js +397 -0
  120. package/dist/components/TextInput.js.map +1 -0
  121. package/dist/components/TextInput.test.d.ts +2 -0
  122. package/dist/components/TextInput.test.d.ts.map +1 -0
  123. package/dist/components/TextInput.test.js +75 -0
  124. package/dist/components/TextInput.test.js.map +1 -0
  125. package/dist/context/InputContext.d.ts +31 -0
  126. package/dist/context/InputContext.d.ts.map +1 -0
  127. package/dist/context/InputContext.js +36 -0
  128. package/dist/context/InputContext.js.map +1 -0
  129. package/dist/context/InputContext.stability.test.d.ts +2 -0
  130. package/dist/context/InputContext.stability.test.d.ts.map +1 -0
  131. package/dist/context/InputContext.stability.test.js +28 -0
  132. package/dist/context/InputContext.stability.test.js.map +1 -0
  133. package/dist/context/InputContext.test.d.ts +2 -0
  134. package/dist/context/InputContext.test.d.ts.map +1 -0
  135. package/dist/context/InputContext.test.js +168 -0
  136. package/dist/context/InputContext.test.js.map +1 -0
  137. package/dist/debug-schema.d.ts +2 -0
  138. package/dist/debug-schema.d.ts.map +1 -0
  139. package/dist/debug-schema.js +22 -0
  140. package/dist/debug-schema.js.map +1 -0
  141. package/dist/hooks/use-conversation.d.ts +78 -0
  142. package/dist/hooks/use-conversation.d.ts.map +1 -0
  143. package/dist/hooks/use-conversation.js +1017 -0
  144. package/dist/hooks/use-conversation.js.map +1 -0
  145. package/dist/hooks/use-input-history.d.ts +16 -0
  146. package/dist/hooks/use-input-history.d.ts.map +1 -0
  147. package/dist/hooks/use-input-history.js +71 -0
  148. package/dist/hooks/use-input-history.js.map +1 -0
  149. package/dist/hooks/use-model-selection.d.ts +27 -0
  150. package/dist/hooks/use-model-selection.d.ts.map +1 -0
  151. package/dist/hooks/use-model-selection.js +187 -0
  152. package/dist/hooks/use-model-selection.js.map +1 -0
  153. package/dist/hooks/use-model-selection.test.d.ts +2 -0
  154. package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
  155. package/dist/hooks/use-model-selection.test.js +28 -0
  156. package/dist/hooks/use-model-selection.test.js.map +1 -0
  157. package/dist/hooks/use-path-completion.d.ts +22 -0
  158. package/dist/hooks/use-path-completion.d.ts.map +1 -0
  159. package/dist/hooks/use-path-completion.js +153 -0
  160. package/dist/hooks/use-path-completion.js.map +1 -0
  161. package/dist/hooks/use-path-completion.test.d.ts +2 -0
  162. package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
  163. package/dist/hooks/use-path-completion.test.js +29 -0
  164. package/dist/hooks/use-path-completion.test.js.map +1 -0
  165. package/dist/hooks/use-setting.d.ts +7 -0
  166. package/dist/hooks/use-setting.d.ts.map +1 -0
  167. package/dist/hooks/use-setting.js +35 -0
  168. package/dist/hooks/use-setting.js.map +1 -0
  169. package/dist/hooks/use-settings-completion.d.ts +23 -0
  170. package/dist/hooks/use-settings-completion.d.ts.map +1 -0
  171. package/dist/hooks/use-settings-completion.js +164 -0
  172. package/dist/hooks/use-settings-completion.js.map +1 -0
  173. package/dist/hooks/use-settings-completion.test.d.ts +2 -0
  174. package/dist/hooks/use-settings-completion.test.d.ts.map +1 -0
  175. package/dist/hooks/use-settings-completion.test.js +334 -0
  176. package/dist/hooks/use-settings-completion.test.js.map +1 -0
  177. package/dist/hooks/use-slash-commands.d.ts +21 -0
  178. package/dist/hooks/use-slash-commands.d.ts.map +1 -0
  179. package/dist/hooks/use-slash-commands.js +87 -0
  180. package/dist/hooks/use-slash-commands.js.map +1 -0
  181. package/dist/hooks/use-slash-commands.test.d.ts +2 -0
  182. package/dist/hooks/use-slash-commands.test.d.ts.map +1 -0
  183. package/dist/hooks/use-slash-commands.test.js +246 -0
  184. package/dist/hooks/use-slash-commands.test.js.map +1 -0
  185. package/dist/lib/editor-impl.d.ts +23 -0
  186. package/dist/lib/editor-impl.d.ts.map +1 -0
  187. package/dist/lib/editor-impl.js +235 -0
  188. package/dist/lib/editor-impl.js.map +1 -0
  189. package/dist/lib/openai-agent-client.chat.test.d.ts +2 -0
  190. package/dist/lib/openai-agent-client.chat.test.d.ts.map +1 -0
  191. package/dist/lib/openai-agent-client.chat.test.js +68 -0
  192. package/dist/lib/openai-agent-client.chat.test.js.map +1 -0
  193. package/dist/lib/openai-agent-client.d.ts +48 -0
  194. package/dist/lib/openai-agent-client.d.ts.map +1 -0
  195. package/dist/lib/openai-agent-client.js +653 -0
  196. package/dist/lib/openai-agent-client.js.map +1 -0
  197. package/dist/lib/openai-agent-client.test.d.ts +2 -0
  198. package/dist/lib/openai-agent-client.test.d.ts.map +1 -0
  199. package/dist/lib/openai-agent-client.test.js +181 -0
  200. package/dist/lib/openai-agent-client.test.js.map +1 -0
  201. package/dist/lib/shell.d.ts +7 -0
  202. package/dist/lib/shell.d.ts.map +1 -0
  203. package/dist/lib/shell.js +56 -0
  204. package/dist/lib/shell.js.map +1 -0
  205. package/dist/lib/tool-invoke.d.ts +4 -0
  206. package/dist/lib/tool-invoke.d.ts.map +1 -0
  207. package/dist/lib/tool-invoke.js +26 -0
  208. package/dist/lib/tool-invoke.js.map +1 -0
  209. package/dist/lib/tool-invoke.test.d.ts +2 -0
  210. package/dist/lib/tool-invoke.test.d.ts.map +1 -0
  211. package/dist/lib/tool-invoke.test.js +19 -0
  212. package/dist/lib/tool-invoke.test.js.map +1 -0
  213. package/dist/no-singleton-imports.test.d.ts +2 -0
  214. package/dist/no-singleton-imports.test.d.ts.map +1 -0
  215. package/dist/no-singleton-imports.test.js +30 -0
  216. package/dist/no-singleton-imports.test.js.map +1 -0
  217. package/dist/prompts/anthropic.md +79 -0
  218. package/dist/prompts/codex.md +97 -0
  219. package/dist/prompts/default.md +77 -0
  220. package/dist/prompts/default.md.bak +77 -0
  221. package/dist/prompts/gpt-5.md +318 -0
  222. package/dist/prompts/lite.md +29 -0
  223. package/dist/prompts/simple-mentor.md +207 -0
  224. package/dist/prompts/simple.md +189 -0
  225. package/dist/providers/index.d.ts +5 -0
  226. package/dist/providers/index.d.ts.map +1 -0
  227. package/dist/providers/index.js +8 -0
  228. package/dist/providers/index.js.map +1 -0
  229. package/dist/providers/openai-compatible/api.d.ts +17 -0
  230. package/dist/providers/openai-compatible/api.d.ts.map +1 -0
  231. package/dist/providers/openai-compatible/api.js +58 -0
  232. package/dist/providers/openai-compatible/api.js.map +1 -0
  233. package/dist/providers/openai-compatible/model.d.ts +17 -0
  234. package/dist/providers/openai-compatible/model.d.ts.map +1 -0
  235. package/dist/providers/openai-compatible/model.js +435 -0
  236. package/dist/providers/openai-compatible/model.js.map +1 -0
  237. package/dist/providers/openai-compatible/provider.d.ts +22 -0
  238. package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
  239. package/dist/providers/openai-compatible/provider.js +43 -0
  240. package/dist/providers/openai-compatible/provider.js.map +1 -0
  241. package/dist/providers/openai-compatible/utils.d.ts +3 -0
  242. package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
  243. package/dist/providers/openai-compatible/utils.js +11 -0
  244. package/dist/providers/openai-compatible/utils.js.map +1 -0
  245. package/dist/providers/openai-compatible.provider.d.ts +8 -0
  246. package/dist/providers/openai-compatible.provider.d.ts.map +1 -0
  247. package/dist/providers/openai-compatible.provider.js +71 -0
  248. package/dist/providers/openai-compatible.provider.js.map +1 -0
  249. package/dist/providers/openai.provider.d.ts +2 -0
  250. package/dist/providers/openai.provider.d.ts.map +1 -0
  251. package/dist/providers/openai.provider.js +36 -0
  252. package/dist/providers/openai.provider.js.map +1 -0
  253. package/dist/providers/openrouter/api.d.ts +39 -0
  254. package/dist/providers/openrouter/api.d.ts.map +1 -0
  255. package/dist/providers/openrouter/api.js +172 -0
  256. package/dist/providers/openrouter/api.js.map +1 -0
  257. package/dist/providers/openrouter/converters.d.ts +8 -0
  258. package/dist/providers/openrouter/converters.d.ts.map +1 -0
  259. package/dist/providers/openrouter/converters.js +382 -0
  260. package/dist/providers/openrouter/converters.js.map +1 -0
  261. package/dist/providers/openrouter/converters.test.d.ts +2 -0
  262. package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
  263. package/dist/providers/openrouter/converters.test.js +158 -0
  264. package/dist/providers/openrouter/converters.test.js.map +1 -0
  265. package/dist/providers/openrouter/index.d.ts +4 -0
  266. package/dist/providers/openrouter/index.d.ts.map +1 -0
  267. package/dist/providers/openrouter/index.js +4 -0
  268. package/dist/providers/openrouter/index.js.map +1 -0
  269. package/dist/providers/openrouter/model.d.ts +14 -0
  270. package/dist/providers/openrouter/model.d.ts.map +1 -0
  271. package/dist/providers/openrouter/model.js +485 -0
  272. package/dist/providers/openrouter/model.js.map +1 -0
  273. package/dist/providers/openrouter/provider.d.ts +15 -0
  274. package/dist/providers/openrouter/provider.d.ts.map +1 -0
  275. package/dist/providers/openrouter/provider.js +21 -0
  276. package/dist/providers/openrouter/provider.js.map +1 -0
  277. package/dist/providers/openrouter/utils.d.ts +10 -0
  278. package/dist/providers/openrouter/utils.d.ts.map +1 -0
  279. package/dist/providers/openrouter/utils.js +27 -0
  280. package/dist/providers/openrouter/utils.js.map +1 -0
  281. package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
  282. package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
  283. package/dist/providers/openrouter.api.retry.test.js +148 -0
  284. package/dist/providers/openrouter.api.retry.test.js.map +1 -0
  285. package/dist/providers/openrouter.d.ts +2 -0
  286. package/dist/providers/openrouter.d.ts.map +1 -0
  287. package/dist/providers/openrouter.history.test.d.ts +2 -0
  288. package/dist/providers/openrouter.history.test.d.ts.map +1 -0
  289. package/dist/providers/openrouter.history.test.js +533 -0
  290. package/dist/providers/openrouter.history.test.js.map +1 -0
  291. package/dist/providers/openrouter.js +4 -0
  292. package/dist/providers/openrouter.js.map +1 -0
  293. package/dist/providers/openrouter.provider.createRunner.test.d.ts +2 -0
  294. package/dist/providers/openrouter.provider.createRunner.test.d.ts.map +1 -0
  295. package/dist/providers/openrouter.provider.createRunner.test.js +23 -0
  296. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -0
  297. package/dist/providers/openrouter.provider.d.ts +2 -0
  298. package/dist/providers/openrouter.provider.d.ts.map +1 -0
  299. package/dist/providers/openrouter.provider.js +56 -0
  300. package/dist/providers/openrouter.provider.js.map +1 -0
  301. package/dist/providers/openrouter.test.d.ts +2 -0
  302. package/dist/providers/openrouter.test.d.ts.map +1 -0
  303. package/dist/providers/openrouter.test.js +1382 -0
  304. package/dist/providers/openrouter.test.js.map +1 -0
  305. package/dist/providers/registry.d.ts +65 -0
  306. package/dist/providers/registry.d.ts.map +1 -0
  307. package/dist/providers/registry.js +44 -0
  308. package/dist/providers/registry.js.map +1 -0
  309. package/dist/providers/registry.test.d.ts +2 -0
  310. package/dist/providers/registry.test.d.ts.map +1 -0
  311. package/dist/providers/registry.test.js +76 -0
  312. package/dist/providers/registry.test.js.map +1 -0
  313. package/dist/providers/web-search/index.d.ts +8 -0
  314. package/dist/providers/web-search/index.d.ts.map +1 -0
  315. package/dist/providers/web-search/index.js +9 -0
  316. package/dist/providers/web-search/index.js.map +1 -0
  317. package/dist/providers/web-search/registry.d.ts +35 -0
  318. package/dist/providers/web-search/registry.d.ts.map +1 -0
  319. package/dist/providers/web-search/registry.js +56 -0
  320. package/dist/providers/web-search/registry.js.map +1 -0
  321. package/dist/providers/web-search/registry.test.d.ts +2 -0
  322. package/dist/providers/web-search/registry.test.d.ts.map +1 -0
  323. package/dist/providers/web-search/registry.test.js +105 -0
  324. package/dist/providers/web-search/registry.test.js.map +1 -0
  325. package/dist/providers/web-search/tavily.provider.d.ts +15 -0
  326. package/dist/providers/web-search/tavily.provider.d.ts.map +1 -0
  327. package/dist/providers/web-search/tavily.provider.js +69 -0
  328. package/dist/providers/web-search/tavily.provider.js.map +1 -0
  329. package/dist/providers/web-search/tavily.provider.test.d.ts +2 -0
  330. package/dist/providers/web-search/tavily.provider.test.d.ts.map +1 -0
  331. package/dist/providers/web-search/tavily.provider.test.js +67 -0
  332. package/dist/providers/web-search/tavily.provider.test.js.map +1 -0
  333. package/dist/providers/web-search/types.d.ts +55 -0
  334. package/dist/providers/web-search/types.d.ts.map +1 -0
  335. package/dist/providers/web-search/types.js +6 -0
  336. package/dist/providers/web-search/types.js.map +1 -0
  337. package/dist/safety-checker.js +57 -0
  338. package/dist/services/conversation-events.d.ts +76 -0
  339. package/dist/services/conversation-events.d.ts.map +1 -0
  340. package/dist/services/conversation-events.js +2 -0
  341. package/dist/services/conversation-events.js.map +1 -0
  342. package/dist/services/conversation-service.d.ts +31 -0
  343. package/dist/services/conversation-service.d.ts.map +1 -0
  344. package/dist/services/conversation-service.js +46 -0
  345. package/dist/services/conversation-service.js.map +1 -0
  346. package/dist/services/conversation-service.test.js +190 -0
  347. package/dist/services/conversation-session.d.ts +99 -0
  348. package/dist/services/conversation-session.d.ts.map +1 -0
  349. package/dist/services/conversation-session.js +978 -0
  350. package/dist/services/conversation-session.js.map +1 -0
  351. package/dist/services/conversation-store.d.ts +24 -0
  352. package/dist/services/conversation-store.d.ts.map +1 -0
  353. package/dist/services/conversation-store.js +216 -0
  354. package/dist/services/conversation-store.js.map +1 -0
  355. package/dist/services/conversation-store.test.d.ts +2 -0
  356. package/dist/services/conversation-store.test.d.ts.map +1 -0
  357. package/dist/services/conversation-store.test.js +167 -0
  358. package/dist/services/conversation-store.test.js.map +1 -0
  359. package/dist/services/execution-context.d.ts +10 -0
  360. package/dist/services/execution-context.d.ts.map +1 -0
  361. package/dist/services/execution-context.js +22 -0
  362. package/dist/services/execution-context.js.map +1 -0
  363. package/dist/services/execution-context.test.d.ts +2 -0
  364. package/dist/services/execution-context.test.d.ts.map +1 -0
  365. package/dist/services/execution-context.test.js +49 -0
  366. package/dist/services/execution-context.test.js.map +1 -0
  367. package/dist/services/file-service.d.ts +12 -0
  368. package/dist/services/file-service.d.ts.map +1 -0
  369. package/dist/services/file-service.js +90 -0
  370. package/dist/services/file-service.js.map +1 -0
  371. package/dist/services/history-service.d.ts +39 -0
  372. package/dist/services/history-service.d.ts.map +1 -0
  373. package/dist/services/history-service.js +152 -0
  374. package/dist/services/history-service.js.map +1 -0
  375. package/dist/services/logging-service.d.ts +75 -0
  376. package/dist/services/logging-service.d.ts.map +1 -0
  377. package/dist/services/logging-service.js +343 -0
  378. package/dist/services/logging-service.js.map +1 -0
  379. package/dist/services/model-service.d.ts +15 -0
  380. package/dist/services/model-service.d.ts.map +1 -0
  381. package/dist/services/model-service.js +46 -0
  382. package/dist/services/model-service.js.map +1 -0
  383. package/dist/services/model-service.test.d.ts +2 -0
  384. package/dist/services/model-service.test.d.ts.map +1 -0
  385. package/dist/services/model-service.test.js +128 -0
  386. package/dist/services/model-service.test.js.map +1 -0
  387. package/dist/services/service-interfaces.d.ts +33 -0
  388. package/dist/services/service-interfaces.d.ts.map +1 -0
  389. package/dist/services/service-interfaces.js +2 -0
  390. package/dist/services/service-interfaces.js.map +1 -0
  391. package/dist/services/settings-service.d.ts +316 -0
  392. package/dist/services/settings-service.d.ts.map +1 -0
  393. package/dist/services/settings-service.js +1128 -0
  394. package/dist/services/settings-service.js.map +1 -0
  395. package/dist/services/settings-service.mock.d.ts +20 -0
  396. package/dist/services/settings-service.mock.d.ts.map +1 -0
  397. package/dist/services/settings-service.mock.js +55 -0
  398. package/dist/services/settings-service.mock.js.map +1 -0
  399. package/dist/services/singleton-deprecation.test.d.ts +2 -0
  400. package/dist/services/singleton-deprecation.test.d.ts.map +1 -0
  401. package/dist/services/singleton-deprecation.test.js +59 -0
  402. package/dist/services/singleton-deprecation.test.js.map +1 -0
  403. package/dist/services/ssh-service.d.ts +32 -0
  404. package/dist/services/ssh-service.d.ts.map +1 -0
  405. package/dist/services/ssh-service.js +119 -0
  406. package/dist/services/ssh-service.js.map +1 -0
  407. package/dist/services/ssh-service.test.d.ts +2 -0
  408. package/dist/services/ssh-service.test.d.ts.map +1 -0
  409. package/dist/services/ssh-service.test.js +269 -0
  410. package/dist/services/ssh-service.test.js.map +1 -0
  411. package/dist/test-search-tool.d.ts +2 -0
  412. package/dist/test-search-tool.d.ts.map +1 -0
  413. package/dist/test-search-tool.js +36 -0
  414. package/dist/test-search-tool.js.map +1 -0
  415. package/dist/tools/apply-patch.d.ts +28 -0
  416. package/dist/tools/apply-patch.d.ts.map +1 -0
  417. package/dist/tools/apply-patch.js +399 -0
  418. package/dist/tools/apply-patch.js.map +1 -0
  419. package/dist/tools/apply-patch.test.d.ts +2 -0
  420. package/dist/tools/apply-patch.test.d.ts.map +1 -0
  421. package/dist/tools/apply-patch.test.js +155 -0
  422. package/dist/tools/apply-patch.test.js.map +1 -0
  423. package/dist/tools/ask-mentor.d.ts +11 -0
  424. package/dist/tools/ask-mentor.d.ts.map +1 -0
  425. package/dist/tools/ask-mentor.js +52 -0
  426. package/dist/tools/ask-mentor.js.map +1 -0
  427. package/dist/tools/ask-mentor.test.d.ts +2 -0
  428. package/dist/tools/ask-mentor.test.d.ts.map +1 -0
  429. package/dist/tools/ask-mentor.test.js +47 -0
  430. package/dist/tools/ask-mentor.test.js.map +1 -0
  431. package/dist/tools/bash.d.ts +10 -0
  432. package/dist/tools/bash.d.ts.map +1 -0
  433. package/dist/tools/bash.js +55 -0
  434. package/dist/tools/bash.js.map +1 -0
  435. package/dist/tools/find-files.d.ts +15 -0
  436. package/dist/tools/find-files.d.ts.map +1 -0
  437. package/dist/tools/find-files.js +179 -0
  438. package/dist/tools/find-files.js.map +1 -0
  439. package/dist/tools/find-files.test.d.ts +2 -0
  440. package/dist/tools/find-files.test.d.ts.map +1 -0
  441. package/dist/tools/find-files.test.js +131 -0
  442. package/dist/tools/find-files.test.js.map +1 -0
  443. package/dist/tools/format-helpers.d.ts +34 -0
  444. package/dist/tools/format-helpers.d.ts.map +1 -0
  445. package/dist/tools/format-helpers.js +131 -0
  446. package/dist/tools/format-helpers.js.map +1 -0
  447. package/dist/tools/grep.d.ts +16 -0
  448. package/dist/tools/grep.d.ts.map +1 -0
  449. package/dist/tools/grep.js +211 -0
  450. package/dist/tools/grep.js.map +1 -0
  451. package/dist/tools/read-file.d.ts +15 -0
  452. package/dist/tools/read-file.d.ts.map +1 -0
  453. package/dist/tools/read-file.js +114 -0
  454. package/dist/tools/read-file.js.map +1 -0
  455. package/dist/tools/read-file.test.d.ts +2 -0
  456. package/dist/tools/read-file.test.d.ts.map +1 -0
  457. package/dist/tools/read-file.test.js +122 -0
  458. package/dist/tools/read-file.test.js.map +1 -0
  459. package/dist/tools/search-replace.d.ts +19 -0
  460. package/dist/tools/search-replace.d.ts.map +1 -0
  461. package/dist/tools/search-replace.js +411 -0
  462. package/dist/tools/search-replace.js.map +1 -0
  463. package/dist/tools/search-replace.test.d.ts +2 -0
  464. package/dist/tools/search-replace.test.d.ts.map +1 -0
  465. package/dist/tools/search-replace.test.js +302 -0
  466. package/dist/tools/search-replace.test.js.map +1 -0
  467. package/dist/tools/search.d.ts +15 -0
  468. package/dist/tools/search.d.ts.map +1 -0
  469. package/dist/tools/search.js +143 -0
  470. package/dist/tools/search.js.map +1 -0
  471. package/dist/tools/shell.d.ts +19 -0
  472. package/dist/tools/shell.d.ts.map +1 -0
  473. package/dist/tools/shell.js +278 -0
  474. package/dist/tools/shell.js.map +1 -0
  475. package/dist/tools/tool-execution-context.d.ts +7 -0
  476. package/dist/tools/tool-execution-context.d.ts.map +1 -0
  477. package/dist/tools/tool-execution-context.js +7 -0
  478. package/dist/tools/tool-execution-context.js.map +1 -0
  479. package/dist/tools/types.d.ts +30 -0
  480. package/dist/tools/types.d.ts.map +1 -0
  481. package/dist/tools/types.js +2 -0
  482. package/dist/tools/types.js.map +1 -0
  483. package/dist/tools/utils.d.ts +12 -0
  484. package/dist/tools/utils.d.ts.map +1 -0
  485. package/dist/tools/utils.js +19 -0
  486. package/dist/tools/utils.js.map +1 -0
  487. package/dist/tools/web-search.d.ts +29 -0
  488. package/dist/tools/web-search.d.ts.map +1 -0
  489. package/dist/tools/web-search.js +106 -0
  490. package/dist/tools/web-search.js.map +1 -0
  491. package/dist/tools/web-search.test.d.ts +2 -0
  492. package/dist/tools/web-search.test.d.ts.map +1 -0
  493. package/dist/tools/web-search.test.js +176 -0
  494. package/dist/tools/web-search.test.js.map +1 -0
  495. package/dist/utils/command-logger.d.ts +11 -0
  496. package/dist/utils/command-logger.d.ts.map +1 -0
  497. package/dist/utils/command-logger.js +34 -0
  498. package/dist/utils/command-logger.js.map +1 -0
  499. package/dist/utils/command-safety/constants.d.ts +21 -0
  500. package/dist/utils/command-safety/constants.d.ts.map +1 -0
  501. package/dist/utils/command-safety/constants.js +245 -0
  502. package/dist/utils/command-safety/constants.js.map +1 -0
  503. package/dist/utils/command-safety/find-helpers.d.ts +15 -0
  504. package/dist/utils/command-safety/find-helpers.d.ts.map +1 -0
  505. package/dist/utils/command-safety/find-helpers.js +218 -0
  506. package/dist/utils/command-safety/find-helpers.js.map +1 -0
  507. package/dist/utils/command-safety/handlers/find-handler.d.ts +6 -0
  508. package/dist/utils/command-safety/handlers/find-handler.d.ts.map +1 -0
  509. package/dist/utils/command-safety/handlers/find-handler.js +113 -0
  510. package/dist/utils/command-safety/handlers/find-handler.js.map +1 -0
  511. package/dist/utils/command-safety/handlers/git-handler.d.ts +6 -0
  512. package/dist/utils/command-safety/handlers/git-handler.d.ts.map +1 -0
  513. package/dist/utils/command-safety/handlers/git-handler.js +68 -0
  514. package/dist/utils/command-safety/handlers/git-handler.js.map +1 -0
  515. package/dist/utils/command-safety/handlers/index.d.ts +13 -0
  516. package/dist/utils/command-safety/handlers/index.d.ts.map +1 -0
  517. package/dist/utils/command-safety/handlers/index.js +20 -0
  518. package/dist/utils/command-safety/handlers/index.js.map +1 -0
  519. package/dist/utils/command-safety/handlers/sed-handler.d.ts +6 -0
  520. package/dist/utils/command-safety/handlers/sed-handler.d.ts.map +1 -0
  521. package/dist/utils/command-safety/handlers/sed-handler.js +94 -0
  522. package/dist/utils/command-safety/handlers/sed-handler.js.map +1 -0
  523. package/dist/utils/command-safety/handlers/types.d.ts +36 -0
  524. package/dist/utils/command-safety/handlers/types.d.ts.map +1 -0
  525. package/dist/utils/command-safety/handlers/types.js +2 -0
  526. package/dist/utils/command-safety/handlers/types.js.map +1 -0
  527. package/dist/utils/command-safety/index.d.ts +14 -0
  528. package/dist/utils/command-safety/index.d.ts.map +1 -0
  529. package/dist/utils/command-safety/index.js +183 -0
  530. package/dist/utils/command-safety/index.js.map +1 -0
  531. package/dist/utils/command-safety/path-analysis.d.ts +4 -0
  532. package/dist/utils/command-safety/path-analysis.d.ts.map +1 -0
  533. package/dist/utils/command-safety/path-analysis.js +153 -0
  534. package/dist/utils/command-safety/path-analysis.js.map +1 -0
  535. package/dist/utils/command-safety/utils.d.ts +2 -0
  536. package/dist/utils/command-safety/utils.d.ts.map +1 -0
  537. package/dist/utils/command-safety/utils.js +22 -0
  538. package/dist/utils/command-safety/utils.js.map +1 -0
  539. package/dist/utils/command-safety.d.ts +21 -0
  540. package/dist/utils/command-safety.d.ts.map +1 -0
  541. package/dist/utils/command-safety.find.test.d.ts +2 -0
  542. package/dist/utils/command-safety.find.test.d.ts.map +1 -0
  543. package/dist/utils/command-safety.find.test.js +342 -0
  544. package/dist/utils/command-safety.find.test.js.map +1 -0
  545. package/dist/utils/command-safety.js +702 -0
  546. package/dist/utils/command-safety.js.map +1 -0
  547. package/dist/utils/command-safety.path.test.d.ts +2 -0
  548. package/dist/utils/command-safety.path.test.d.ts.map +1 -0
  549. package/dist/utils/command-safety.path.test.js +360 -0
  550. package/dist/utils/command-safety.path.test.js.map +1 -0
  551. package/dist/utils/diff.d.ts +2 -0
  552. package/dist/utils/diff.d.ts.map +1 -0
  553. package/dist/utils/diff.js +44 -0
  554. package/dist/utils/diff.js.map +1 -0
  555. package/dist/utils/diff.test.d.ts +2 -0
  556. package/dist/utils/diff.test.d.ts.map +1 -0
  557. package/dist/utils/diff.test.js +85 -0
  558. package/dist/utils/diff.test.js.map +1 -0
  559. package/dist/utils/error-helpers.d.ts +6 -0
  560. package/dist/utils/error-helpers.d.ts.map +1 -0
  561. package/dist/utils/error-helpers.js +46 -0
  562. package/dist/utils/error-helpers.js.map +1 -0
  563. package/dist/utils/error-helpers.test.d.ts +2 -0
  564. package/dist/utils/error-helpers.test.d.ts.map +1 -0
  565. package/dist/utils/error-helpers.test.js +152 -0
  566. package/dist/utils/error-helpers.test.js.map +1 -0
  567. package/dist/utils/execute-shell.d.ts +15 -0
  568. package/dist/utils/execute-shell.d.ts.map +1 -0
  569. package/dist/utils/execute-shell.js +34 -0
  570. package/dist/utils/execute-shell.js.map +1 -0
  571. package/dist/utils/execute-shell.test.d.ts +2 -0
  572. package/dist/utils/execute-shell.test.d.ts.map +1 -0
  573. package/dist/utils/execute-shell.test.js +20 -0
  574. package/dist/utils/execute-shell.test.js.map +1 -0
  575. package/dist/utils/extract-command-messages.d.ts +5 -0
  576. package/dist/utils/extract-command-messages.d.ts.map +1 -0
  577. package/dist/utils/extract-command-messages.js +140 -0
  578. package/dist/utils/extract-command-messages.js.map +1 -0
  579. package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
  580. package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
  581. package/dist/utils/extract-command-messages.repro.test.js +31 -0
  582. package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
  583. package/dist/utils/extract-command-messages.test.js +57 -0
  584. package/dist/utils/message-buffer.d.ts +2 -0
  585. package/dist/utils/message-buffer.d.ts.map +1 -0
  586. package/dist/utils/message-buffer.js +15 -0
  587. package/dist/utils/message-buffer.js.map +1 -0
  588. package/dist/utils/message-buffer.test.d.ts +2 -0
  589. package/dist/utils/message-buffer.test.d.ts.map +1 -0
  590. package/dist/utils/message-buffer.test.js +17 -0
  591. package/dist/utils/message-buffer.test.js.map +1 -0
  592. package/dist/utils/output-trim.d.ts +31 -0
  593. package/dist/utils/output-trim.d.ts.map +1 -0
  594. package/dist/utils/output-trim.js +71 -0
  595. package/dist/utils/output-trim.js.map +1 -0
  596. package/dist/utils/provider-credentials.d.ts +10 -0
  597. package/dist/utils/provider-credentials.d.ts.map +1 -0
  598. package/dist/utils/provider-credentials.js +22 -0
  599. package/dist/utils/provider-credentials.js.map +1 -0
  600. package/dist/utils/settings-command.d.ts +13 -0
  601. package/dist/utils/settings-command.d.ts.map +1 -0
  602. package/dist/utils/settings-command.js +173 -0
  603. package/dist/utils/settings-command.js.map +1 -0
  604. package/dist/utils/ssh-config-parser.d.ts +21 -0
  605. package/dist/utils/ssh-config-parser.d.ts.map +1 -0
  606. package/dist/utils/ssh-config-parser.js +89 -0
  607. package/dist/utils/ssh-config-parser.js.map +1 -0
  608. package/dist/utils/ssh-config-parser.test.d.ts +2 -0
  609. package/dist/utils/ssh-config-parser.test.d.ts.map +1 -0
  610. package/dist/utils/ssh-config-parser.test.js +153 -0
  611. package/dist/utils/ssh-config-parser.test.js.map +1 -0
  612. package/dist/utils/streaming-updater.d.ts +7 -0
  613. package/dist/utils/streaming-updater.d.ts.map +1 -0
  614. package/dist/utils/streaming-updater.js +41 -0
  615. package/dist/utils/streaming-updater.js.map +1 -0
  616. package/dist/utils/throttle.d.ts +7 -0
  617. package/dist/utils/throttle.d.ts.map +1 -0
  618. package/dist/utils/throttle.js +49 -0
  619. package/dist/utils/throttle.js.map +1 -0
  620. package/package.json +108 -0
  621. package/readme.md +428 -0
@@ -0,0 +1,653 @@
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
+ import { getProvider } from '../providers/index.js';
6
+ import { randomUUID } from 'node:crypto';
7
+ import { getAgentDefinition } from '../agent.js';
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import os from 'os';
11
+ import { normalizeToolInput, wrapToolInvoke } from './tool-invoke.js';
12
+ import { createEditorImpl } from './editor-impl.js';
13
+ import { ConversationStore } from '../services/conversation-store.js';
14
+ /**
15
+ * Minimal adapter that isolates usage of @openai/agents.
16
+ * Swap this module to change the underlying agent provider without touching the UI.
17
+ */
18
+ export class OpenAIAgentClient {
19
+ #agent;
20
+ #model;
21
+ // Accept 'default' here to denote 'do not pass this param; use API default'
22
+ #reasoningEffort;
23
+ #temperature;
24
+ #provider;
25
+ #maxTurns;
26
+ #retryAttempts;
27
+ #currentAbortController = null;
28
+ #currentCorrelationId = null;
29
+ #retryCallback = null;
30
+ #runner = null;
31
+ #toolInterceptors = [];
32
+ #logger;
33
+ #settings;
34
+ #executionContext;
35
+ #editor;
36
+ #mentorAgent = null;
37
+ #mentorStore = null;
38
+ #mentorPreviousResponseId = null;
39
+ constructor({ model, reasoningEffort, maxTurns, retryAttempts, deps, }) {
40
+ this.#logger = deps.logger;
41
+ this.#settings = deps.settings;
42
+ this.#executionContext = deps.executionContext;
43
+ this.#editor = createEditorImpl({
44
+ loggingService: this.#logger,
45
+ settingsService: this.#settings,
46
+ executionContext: this.#executionContext,
47
+ });
48
+ this.#reasoningEffort = reasoningEffort;
49
+ this.#temperature = this.#settings.get('agent.temperature');
50
+ this.#provider =
51
+ this.#settings.get('agent.provider') || 'openai';
52
+ this.#maxTurns = maxTurns ?? 20;
53
+ this.#retryAttempts = retryAttempts ?? 2;
54
+ this.#agent = this.#createAgent({ model, reasoningEffort });
55
+ this.#runner = this.#createRunner();
56
+ this.#logger.info('OpenAI Agent Client initialized', {
57
+ model: model || this.#settings.get('agent.model'),
58
+ reasoningEffort: reasoningEffort ?? 'default',
59
+ temperature: this.#temperature,
60
+ maxTurns: this.#maxTurns,
61
+ retryAttempts: this.#retryAttempts,
62
+ });
63
+ }
64
+ setModel(model) {
65
+ this.#agent = this.#createAgent({
66
+ model,
67
+ reasoningEffort: this.#reasoningEffort,
68
+ });
69
+ }
70
+ setReasoningEffort(effort) {
71
+ this.#reasoningEffort = effort;
72
+ this.#agent = this.#createAgent({
73
+ model: this.#model,
74
+ reasoningEffort: effort,
75
+ });
76
+ }
77
+ setTemperature(temperature) {
78
+ this.#temperature = temperature;
79
+ this.#agent = this.#createAgent({
80
+ model: this.#model,
81
+ reasoningEffort: this.#reasoningEffort,
82
+ temperature,
83
+ });
84
+ }
85
+ setProvider(provider) {
86
+ this.#provider = provider;
87
+ this.#settings.set('agent.provider', provider);
88
+ this.#agent = this.#createAgent({
89
+ model: this.#model,
90
+ reasoningEffort: this.#reasoningEffort,
91
+ });
92
+ this.#runner = this.#createRunner();
93
+ }
94
+ getProvider() {
95
+ return this.#provider;
96
+ }
97
+ addToolInterceptor(interceptor) {
98
+ this.#toolInterceptors.push(interceptor);
99
+ return () => {
100
+ this.#toolInterceptors = this.#toolInterceptors.filter(i => i !== interceptor);
101
+ };
102
+ }
103
+ async #checkToolInterceptors(name, params, toolCallId) {
104
+ for (const interceptor of this.#toolInterceptors) {
105
+ try {
106
+ const result = await interceptor(name, params, toolCallId);
107
+ if (result !== null) {
108
+ return result;
109
+ }
110
+ }
111
+ catch (error) {
112
+ this.#logger.error('Tool interceptor threw an error', {
113
+ name,
114
+ params,
115
+ toolCallId,
116
+ error: error instanceof Error ? error.message : String(error),
117
+ });
118
+ return `Tool execution intercepted but failed: ${error instanceof Error ? error.message : String(error)}`;
119
+ }
120
+ }
121
+ return null;
122
+ }
123
+ #createRunner() {
124
+ const providerDef = getProvider(this.#provider);
125
+ if (!providerDef?.createRunner) {
126
+ return null;
127
+ }
128
+ return providerDef.createRunner({
129
+ settingsService: this.#settings,
130
+ loggingService: this.#logger,
131
+ });
132
+ }
133
+ setRetryCallback(callback) {
134
+ this.#retryCallback = callback;
135
+ }
136
+ /**
137
+ * Abort the current running stream/operation
138
+ */
139
+ abort() {
140
+ if (this.#currentAbortController) {
141
+ this.#currentAbortController.abort();
142
+ this.#currentAbortController = null;
143
+ }
144
+ if (this.#currentCorrelationId) {
145
+ this.#logger.clearCorrelationId();
146
+ this.#currentCorrelationId = null;
147
+ }
148
+ this.#logger.debug('Agent operation aborted');
149
+ }
150
+ clearConversations() {
151
+ const providerDef = getProvider(this.#provider);
152
+ if (providerDef?.clearConversations) {
153
+ providerDef.clearConversations();
154
+ }
155
+ // Also clear mentor conversation
156
+ if (this.#mentorStore) {
157
+ this.#mentorStore.clear();
158
+ }
159
+ this.#mentorPreviousResponseId = null;
160
+ this.#mentorAgent = null;
161
+ this.#mentorStore = null;
162
+ }
163
+ async startStream(userInput, { previousResponseId } = {}) {
164
+ // Abort any previous operation
165
+ this.abort();
166
+ // Create correlation ID for this stream
167
+ this.#currentCorrelationId = randomUUID();
168
+ this.#logger.setCorrelationId(this.#currentCorrelationId);
169
+ this.#currentAbortController = new AbortController();
170
+ const signal = this.#currentAbortController.signal;
171
+ this.#logger.info('Agent stream started', {
172
+ inputType: Array.isArray(userInput) ? 'array' : typeof userInput,
173
+ inputLength: typeof userInput === 'string' ? userInput.length : undefined,
174
+ inputItems: Array.isArray(userInput) ? userInput.length : undefined,
175
+ hasPreviousResponseId: !!previousResponseId,
176
+ });
177
+ try {
178
+ const options = {
179
+ stream: true,
180
+ maxTurns: this.#maxTurns,
181
+ signal,
182
+ };
183
+ // Only pass previousResponseId for OpenAI provider (server-managed conversation chaining)
184
+ if (this.#provider === 'openai' && previousResponseId) {
185
+ options.previousResponseId = previousResponseId;
186
+ }
187
+ const result = await this.#executeWithRetry(() => this.#runAgent(this.#agent, userInput, options));
188
+ return result;
189
+ }
190
+ catch (error) {
191
+ this.#logger.error('Agent stream failed', {
192
+ error: error instanceof Error ? error.message : String(error),
193
+ inputType: Array.isArray(userInput)
194
+ ? 'array'
195
+ : typeof userInput,
196
+ inputLength: typeof userInput === 'string'
197
+ ? userInput.length
198
+ : undefined,
199
+ inputItems: Array.isArray(userInput)
200
+ ? userInput.length
201
+ : undefined,
202
+ });
203
+ throw error;
204
+ }
205
+ }
206
+ async continueRun(state, { previousResponseId } = {}) {
207
+ this.abort();
208
+ this.#currentAbortController = new AbortController();
209
+ const signal = this.#currentAbortController.signal;
210
+ const options = {
211
+ signal,
212
+ };
213
+ // Only pass previousResponseId for OpenAI provider (server-managed conversation chaining)
214
+ if (this.#provider === 'openai' && previousResponseId) {
215
+ options.previousResponseId = previousResponseId;
216
+ }
217
+ return this.#executeWithRetry(() => this.#runAgent(this.#agent, state, options));
218
+ }
219
+ async continueRunStream(state, { previousResponseId } = {}) {
220
+ this.abort();
221
+ this.#currentAbortController = new AbortController();
222
+ const signal = this.#currentAbortController.signal;
223
+ const options = {
224
+ stream: true,
225
+ maxTurns: this.#maxTurns,
226
+ signal,
227
+ };
228
+ // Only pass previousResponseId for OpenAI provider (server-managed conversation chaining)
229
+ if (this.#provider === 'openai' && previousResponseId) {
230
+ options.previousResponseId = previousResponseId;
231
+ }
232
+ return this.#executeWithRetry(() => this.#runAgent(this.#agent, state, options));
233
+ }
234
+ #runAgent(agent, input, options) {
235
+ // The Agents SDK enables tracing by default and exports spans to OpenAI.
236
+ // When using non-OpenAI providers (e.g., OpenRouter), this export can fail noisily
237
+ // (e.g., 503 errors). Disable tracing per-run for any non-OpenAI provider.
238
+ const effectiveOptions = options ? { ...options } : {};
239
+ if (this.#provider !== 'openai') {
240
+ effectiveOptions.tracingDisabled = true;
241
+ }
242
+ // Check if provider is configured but runner failed to initialize
243
+ if (!this.#runner && this.#provider !== 'openai') {
244
+ const providerDef = getProvider(this.#provider);
245
+ const providerLabel = providerDef?.label || this.#provider;
246
+ throw new Error(`${providerLabel} is configured but could not be initialized. ` +
247
+ `Please check that all required credentials are set. ` +
248
+ `For OpenRouter, set OPENROUTER_API_KEY environment variable. ` +
249
+ `Get your API key from: https://openrouter.ai/keys`);
250
+ }
251
+ // Use runner if available (custom provider), otherwise use run() directly (OpenAI)
252
+ if (this.#runner) {
253
+ return this.#runner.run(agent, input, effectiveOptions);
254
+ }
255
+ return run(agent, input, effectiveOptions);
256
+ }
257
+ async #executeWithRetry(operation, retries = this.#retryAttempts) {
258
+ try {
259
+ return await operation();
260
+ }
261
+ catch (error) {
262
+ // Determine if the error is retryable
263
+ // UserError and ModelBehaviorError are NOT retried (logic errors, not transient)
264
+ const isTransientError = error instanceof APIConnectionError ||
265
+ error instanceof APIConnectionTimeoutError ||
266
+ error instanceof InternalServerError ||
267
+ error instanceof RateLimitError;
268
+ // Check if it's an OpenRouter error with retryable status
269
+ const isOpenRouterRetryable = error instanceof OpenRouterError &&
270
+ (error.status === 429 || error.status >= 500);
271
+ const isOpenAICompatibleRetryable = error instanceof OpenAICompatibleError &&
272
+ (error.status === 429 || error.status >= 500);
273
+ const isRetryable = retries > 0 &&
274
+ (isTransientError ||
275
+ isOpenRouterRetryable ||
276
+ isOpenAICompatibleRetryable);
277
+ if (isRetryable) {
278
+ const attemptIndex = this.#retryAttempts - retries;
279
+ let delay;
280
+ // Check for Retry-After header (both OpenAI and OpenRouter)
281
+ const retryAfterHeader = (error instanceof RateLimitError &&
282
+ error.headers?.['retry-after']) ||
283
+ (error instanceof OpenRouterError &&
284
+ error.headers['retry-after']) ||
285
+ (error instanceof OpenAICompatibleError &&
286
+ error.headers['retry-after']);
287
+ if (retryAfterHeader) {
288
+ // Respect the Retry-After header
289
+ delay = parseInt(retryAfterHeader, 10) * 1000;
290
+ }
291
+ else {
292
+ // Exponential backoff with full jitter
293
+ // Base delay: 500-1000ms
294
+ // Multiplier: 2^attemptIndex
295
+ // Max cap: 30 seconds
296
+ const baseDelay = 500 + Math.random() * 500; // 500-1000ms
297
+ const exponentialDelay = baseDelay * Math.pow(2, attemptIndex);
298
+ const maxDelay = 30000; // 30 seconds
299
+ const cappedDelay = Math.min(exponentialDelay, maxDelay);
300
+ // Apply full jitter: random value between 0 and cappedDelay
301
+ delay = Math.random() * cappedDelay;
302
+ }
303
+ await new Promise(resolve => setTimeout(resolve, delay));
304
+ this.#logger.warn('Agent operation retry', {
305
+ errorType: error.constructor.name,
306
+ retriesRemaining: retries - 1,
307
+ delayMs: Math.round(delay),
308
+ attemptIndex,
309
+ errorMessage: error instanceof Error ? error.message : String(error),
310
+ ...(error instanceof OpenRouterError && {
311
+ status: error.status,
312
+ }),
313
+ ...(error instanceof OpenAICompatibleError && {
314
+ status: error.status,
315
+ }),
316
+ });
317
+ this.#retryCallback?.();
318
+ return this.#executeWithRetry(operation, retries - 1);
319
+ }
320
+ throw error;
321
+ }
322
+ }
323
+ async chat(message, options = {}) {
324
+ this.#logger.debug('Agent chat request', {
325
+ messageLength: message.length,
326
+ model: options.model || this.#model,
327
+ });
328
+ try {
329
+ // Create a temporary agent for this specific chat request if params differ
330
+ let agentForChat = this.#agent;
331
+ if (options.model || options.reasoningEffort) {
332
+ const tempModel = options.model || this.#model;
333
+ const tempEffort = options.reasoningEffort || this.#reasoningEffort;
334
+ const modelSettings = {};
335
+ if (tempEffort && tempEffort !== 'default') {
336
+ modelSettings.reasoning = {
337
+ effort: tempEffort,
338
+ summary: 'auto',
339
+ };
340
+ }
341
+ // For simple chat, we generally don't need tools, but we keep the system instructions
342
+ // Actually, for mentor mode, we might want a simpler agent without tools
343
+ agentForChat = new Agent({
344
+ name: 'Mentor',
345
+ model: tempModel,
346
+ ...(Object.keys(modelSettings).length > 0
347
+ ? { modelSettings }
348
+ : {}),
349
+ instructions: options.instructions || 'You are a helpful mentor assistant.',
350
+ });
351
+ // Ensure runner is compatible or use run()
352
+ if (!this.#runner && this.#provider !== 'openai') {
353
+ // Logic to ensure runner exists... same as #runAgent
354
+ const providerDef = getProvider(this.#provider);
355
+ if (!providerDef)
356
+ throw new Error(`Provider ${this.#provider} not found`);
357
+ if (providerDef.createRunner) {
358
+ // We can't easily reuse the main runner if it's bound to the main agent
359
+ // But creating a new runner for every chat might be expensive?
360
+ // For now, let's assume we can just use `run` if no tools are needed,
361
+ // but some providers NEED a runner.
362
+ // Actually, most providers' runners are stateless or lightweight wrappers.
363
+ }
364
+ }
365
+ }
366
+ // We use a simplified run flow for chat
367
+ const result = await this.#runAgent(agentForChat, message, {
368
+ stream: false,
369
+ maxTurns: 1, // Chat is usually single turn
370
+ });
371
+ if (result.finalOutput) {
372
+ return result.finalOutput;
373
+ }
374
+ // Fallback: extract from messages if finalOutput is missing
375
+ if (result.messages && Array.isArray(result.messages)) {
376
+ const lastMessage = result.messages[result.messages.length - 1];
377
+ if (lastMessage && lastMessage.content) {
378
+ if (typeof lastMessage.content === 'string') {
379
+ return lastMessage.content;
380
+ }
381
+ if (Array.isArray(lastMessage.content)) {
382
+ return lastMessage.content
383
+ .map((part) => part.text || part.value || '')
384
+ .join('');
385
+ }
386
+ }
387
+ }
388
+ return '';
389
+ }
390
+ catch (error) {
391
+ this.#logger.error('Agent chat failed', {
392
+ error: error instanceof Error ? error.message : String(error),
393
+ });
394
+ throw error; // Propagate error
395
+ }
396
+ }
397
+ #getAgentsInstructions() {
398
+ const agentsPath = path.join(process.cwd(), 'AGENTS.md');
399
+ if (!fs.existsSync(agentsPath))
400
+ return '';
401
+ try {
402
+ const contents = fs.readFileSync(agentsPath, 'utf-8').trim();
403
+ return `\n\nAGENTS.md contents:\n${contents}`;
404
+ }
405
+ catch (e) {
406
+ return `\n\nFailed to read AGENTS.md: ${e.message}`;
407
+ }
408
+ }
409
+ #getEnvInfo() {
410
+ return `OS: ${os.type()} ${os.release()} (${os.platform()}); shell: ${this.#settings.get('app.shellPath') || 'unknown'}; cwd: ${process.cwd()}`;
411
+ }
412
+ #createMentor = async (question) => {
413
+ const mentorModel = this.#settings.get('agent.mentorModel');
414
+ if (!mentorModel) {
415
+ throw new Error('Mentor model is not configured');
416
+ }
417
+ const mentorMode = this.#settings.get('app.mentorMode');
418
+ // Different instructions based on mode
419
+ let baseInstructions = mentorMode
420
+ ? 'You are a senior architect acting as a peer reviewer. You have no codebase access—you rely on what the user reports.\n\n' +
421
+ 'Your role is adversarial review, not rubber-stamping:\n' +
422
+ '- Challenge assumptions, even when reasoning sounds solid\n' +
423
+ '- Probe for gaps: what did they not check? What could go wrong?\n' +
424
+ '- Suggest alternatives they may have dismissed too quickly\n' +
425
+ '- Ask for evidence when confidence seems misplaced\n\n' +
426
+ 'When satisfied, give clear approval with specific next steps. When not, say exactly what needs more investigation.\n\n' +
427
+ 'Be concise. Push back hard, but don\'t block unnecessarily.'
428
+ : 'You are a helpful mentor assistant. Provide advice and guidance on technical problems. Be concise and actionable.';
429
+ // Add environment info and AGENTS.md context
430
+ const instructions = `${baseInstructions}\n\nEnvironment: ${this.#getEnvInfo()}${this.#getAgentsInstructions()}`;
431
+ // Initialize mentor agent and conversation store if needed
432
+ if (!this.#mentorAgent) {
433
+ const reasoningEffort = this.#settings.get('agent.mentorReasoningEffort');
434
+ const modelSettings = {};
435
+ if (reasoningEffort && reasoningEffort !== 'default') {
436
+ modelSettings.reasoning = {
437
+ effort: reasoningEffort,
438
+ summary: 'auto',
439
+ };
440
+ }
441
+ this.#mentorAgent = new Agent({
442
+ name: 'Mentor',
443
+ model: mentorModel,
444
+ ...(Object.keys(modelSettings).length > 0
445
+ ? { modelSettings }
446
+ : {}),
447
+ instructions,
448
+ });
449
+ this.#mentorStore = new ConversationStore();
450
+ }
451
+ try {
452
+ // Add user message to conversation history
453
+ this.#mentorStore.addUserMessage(question);
454
+ // Determine input based on provider
455
+ // OpenAI uses previousResponseId for server-side history
456
+ // Others need full conversation history from store
457
+ const input = this.#provider !== 'openai'
458
+ ? this.#mentorStore.getHistory()
459
+ : question;
460
+ const result = await this.#runAgent(this.#mentorAgent, input, {
461
+ stream: false,
462
+ maxTurns: 1,
463
+ ...(this.#provider === 'openai' && this.#mentorPreviousResponseId
464
+ ? { previousResponseId: this.#mentorPreviousResponseId }
465
+ : {}),
466
+ });
467
+ // Update conversation store with result
468
+ this.#mentorStore.updateFromResult(result);
469
+ // Track previousResponseId for OpenAI
470
+ if (result.responseId) {
471
+ this.#mentorPreviousResponseId = result.responseId;
472
+ }
473
+ // Extract response
474
+ let response = '';
475
+ if (result.finalOutput) {
476
+ response = result.finalOutput;
477
+ }
478
+ else if (result.messages && Array.isArray(result.messages)) {
479
+ const lastMessage = result.messages[result.messages.length - 1];
480
+ if (lastMessage && lastMessage.content) {
481
+ if (typeof lastMessage.content === 'string') {
482
+ response = lastMessage.content;
483
+ }
484
+ else if (Array.isArray(lastMessage.content)) {
485
+ response = lastMessage.content
486
+ .map((part) => part.text || part.value || '')
487
+ .join('');
488
+ }
489
+ }
490
+ }
491
+ return response;
492
+ }
493
+ catch (error) {
494
+ this.#logger.error('Mentor consultation failed', {
495
+ error: error instanceof Error ? error.message : String(error),
496
+ });
497
+ throw error;
498
+ }
499
+ };
500
+ #createAgent({ model, reasoningEffort, temperature, } = {}) {
501
+ const resolvedModel = model?.trim() || this.#settings.get('agent.model');
502
+ this.#model = resolvedModel;
503
+ const resolvedTemperature = temperature ??
504
+ this.#settings.get('agent.temperature');
505
+ const { name, instructions, tools: toolDefinitions, } = getAgentDefinition({
506
+ settingsService: this.#settings,
507
+ loggingService: this.#logger,
508
+ executionContext: this.#executionContext,
509
+ // @ts-ignore - Definition update coming next
510
+ askMentor: this.#createMentor,
511
+ }, resolvedModel);
512
+ // Determine if we should use the native applyPatchTool
513
+ const shouldUseNativePatchTool = this.#provider === 'openai' && resolvedModel.startsWith('gpt-5.1');
514
+ const tools = toolDefinitions
515
+ .filter(definition => {
516
+ // Exclude custom apply_patch if we're using native one
517
+ if (shouldUseNativePatchTool &&
518
+ definition.name === 'apply_patch') {
519
+ return false;
520
+ }
521
+ return true;
522
+ })
523
+ .map(definition => wrapToolInvoke(createTool({
524
+ name: definition.name,
525
+ description: definition.description,
526
+ parameters: definition.parameters,
527
+ needsApproval: async (context, params) => definition.needsApproval(params, context),
528
+ execute: async (params, _context, details) => {
529
+ // Extract tool call ID from details if available
530
+ const toolCallId = details?.toolCall?.callId;
531
+ // Check if this execution should be intercepted
532
+ const rejectionMessage = await this.#checkToolInterceptors(definition.name, params, toolCallId);
533
+ if (rejectionMessage) {
534
+ this.#logger.info('Tool execution intercepted', {
535
+ tool: definition.name,
536
+ params: JSON.stringify(params).substring(0, 100),
537
+ });
538
+ // Return a failure response that all tools should understand
539
+ return JSON.stringify({
540
+ output: [
541
+ {
542
+ success: false,
543
+ error: rejectionMessage,
544
+ },
545
+ ],
546
+ });
547
+ }
548
+ // Normal execution
549
+ return definition.execute(params, _context);
550
+ },
551
+ })));
552
+ // Add native applyPatchTool for gpt-5.1 on OpenAI provider
553
+ if (shouldUseNativePatchTool) {
554
+ const nativePatchTool = applyPatchTool({
555
+ editor: this.#editor,
556
+ needsApproval: false, // Default to auto-approve for now
557
+ }); // Type assertion needed as invoke is not in public API
558
+ // Wrap the native tool's invoke function to apply interceptor check
559
+ const originalInvoke = nativePatchTool.invoke;
560
+ if (originalInvoke) {
561
+ nativePatchTool.invoke = async (runContext, input, details) => {
562
+ // Extract tool call ID from details if available
563
+ const toolCallId = details?.toolCall?.callId;
564
+ // Parse input to get params for logging
565
+ const normalizedInput = normalizeToolInput(input);
566
+ let params;
567
+ try {
568
+ params =
569
+ typeof input === 'string'
570
+ ? JSON.parse(input)
571
+ : input;
572
+ }
573
+ catch {
574
+ params = input;
575
+ }
576
+ const rejectionMessage = await this.#checkToolInterceptors('apply_patch', params, toolCallId);
577
+ if (rejectionMessage) {
578
+ this.#logger.info('Native tool execution intercepted', {
579
+ tool: 'apply_patch',
580
+ toolCallId,
581
+ params: JSON.stringify(params).substring(0, 100),
582
+ });
583
+ return JSON.stringify({
584
+ output: [
585
+ {
586
+ success: false,
587
+ error: rejectionMessage,
588
+ },
589
+ ],
590
+ });
591
+ }
592
+ return originalInvoke.call(nativePatchTool, runContext, normalizedInput, details);
593
+ };
594
+ }
595
+ tools.push(nativePatchTool);
596
+ this.#logger.info('Using native applyPatchTool from SDK', {
597
+ model: resolvedModel,
598
+ provider: this.#provider,
599
+ });
600
+ }
601
+ else {
602
+ this.#logger.info('Using custom apply_patch implementation', {
603
+ model: resolvedModel,
604
+ provider: this.#provider,
605
+ });
606
+ }
607
+ // Add web search tool. If the user explicitly selected 'minimal' we
608
+ // disable it; if they selected 'default', we don't influence the
609
+ // decision and leave the web tool enabled.
610
+ if (reasoningEffort !== 'minimal') {
611
+ const webTool = webSearchTool();
612
+ // Note: webSearchTool is a HostedTool that runs server-side and cannot be intercepted
613
+ // the same way as FunctionTools. Interception for hosted tools would need to be
614
+ // handled differently, likely through approval mechanisms.
615
+ tools.push(webTool);
616
+ }
617
+ // Build modelSettings only if an explicit effort value (other than
618
+ // 'default') was provided. 'default' means we should not pass the
619
+ // effort param and allow the underlying API to choose the default.
620
+ const modelSettings = {};
621
+ if (reasoningEffort && reasoningEffort !== 'default') {
622
+ modelSettings.reasoning = {
623
+ effort: reasoningEffort,
624
+ summary: 'auto',
625
+ };
626
+ }
627
+ // Temperature: only pass when explicitly set (number). Undefined means
628
+ // provider/model default.
629
+ if (typeof resolvedTemperature === 'number' &&
630
+ Number.isFinite(resolvedTemperature)) {
631
+ modelSettings.temperature = resolvedTemperature;
632
+ }
633
+ const agent = new Agent({
634
+ name,
635
+ model: resolvedModel,
636
+ ...(Object.keys(modelSettings).length > 0 ? { modelSettings } : {}),
637
+ instructions,
638
+ tools,
639
+ });
640
+ // Only add defaultRunOptions if an explicit effort is set (not
641
+ // 'default'). This ensures the API receives the param only when
642
+ // intended.
643
+ if (reasoningEffort && reasoningEffort !== 'default') {
644
+ agent.defaultRunOptions = {
645
+ ...(agent.defaultRunOptions || {}),
646
+ // Pass through to underlying client for models that support it
647
+ reasoning: { effort: reasoningEffort },
648
+ };
649
+ }
650
+ return agent;
651
+ }
652
+ }
653
+ //# sourceMappingURL=openai-agent-client.js.map