@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,36 @@
1
+ import { registerProvider } from './registry.js';
2
+ const OPENAI_MODELS_URL = 'https://api.openai.com/v1/models';
3
+ async function fetchOpenAIModels(_deps, fetchImpl = fetch) {
4
+ const headers = {
5
+ 'Content-Type': 'application/json',
6
+ };
7
+ const apiKey = process.env.OPENAI_API_KEY;
8
+ if (apiKey) {
9
+ headers.Authorization = `Bearer ${apiKey}`;
10
+ }
11
+ const response = await fetchImpl(OPENAI_MODELS_URL, { headers });
12
+ if (!response.ok) {
13
+ throw new Error(`OpenAI models request failed (${response.status})`);
14
+ }
15
+ const body = await response.json();
16
+ const raw = body?.data || [];
17
+ if (!Array.isArray(raw))
18
+ return [];
19
+ return raw
20
+ .map((item) => {
21
+ const id = item?.id || item?.model || '';
22
+ const name = item?.name || item?.display_name || item?.description;
23
+ return id ? { id, name } : null;
24
+ })
25
+ .filter(Boolean);
26
+ }
27
+ // Register OpenAI provider
28
+ registerProvider({
29
+ id: 'openai',
30
+ label: 'OpenAI',
31
+ createRunner: undefined, // Use SDK default
32
+ fetchModels: fetchOpenAIModels,
33
+ clearConversations: undefined, // No conversation state to clear
34
+ sensitiveSettingKeys: [],
35
+ });
36
+ //# sourceMappingURL=openai.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.provider.js","sourceRoot":"","sources":["../../source/providers/openai.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAE/C,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AAE7D,KAAK,UAAU,iBAAiB,CAC5B,KAAkD,EAClD,YAA0D,KAAY;IAEtE,MAAM,OAAO,GAA2B;QACpC,cAAc,EAAE,kBAAkB;KACrC,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;IAE7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,OAAO,GAAG;SACL,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;QACf,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,WAAW,CAAC;QACnE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAuC,CAAC;AAC/D,CAAC;AAED,2BAA2B;AAC3B,gBAAgB,CAAC;IACb,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,SAAS,EAAE,kBAAkB;IAC3C,WAAW,EAAE,iBAAiB;IAC9B,kBAAkB,EAAE,SAAS,EAAE,iCAAiC;IAChE,oBAAoB,EAAE,EAAE;CAC3B,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ISettingsService } from '../../services/service-interfaces.js';
2
+ type FetchImpl = (url: string, init?: RequestInit) => Promise<Response>;
3
+ type SleepImpl = (ms: number, signal?: AbortSignal) => Promise<void>;
4
+ export type OpenRouterRetryOptions = {
5
+ /**
6
+ * Number of retries after the initial attempt.
7
+ * Example: maxRetries=2 => up to 3 total attempts.
8
+ */
9
+ maxRetries?: number;
10
+ /** Base delay for exponential backoff (ms). */
11
+ baseDelayMs?: number;
12
+ /** Max delay cap (ms). */
13
+ maxDelayMs?: number;
14
+ /**
15
+ * Jitter factor. 1 = full jitter (random 0..delay), 0 = no jitter (exact delay).
16
+ */
17
+ jitter?: number;
18
+ };
19
+ export declare class OpenRouterError extends Error {
20
+ status: number;
21
+ headers: Record<string, string>;
22
+ responseBody?: string;
23
+ constructor(message: string, status: number, headers: Record<string, string>, responseBody?: string);
24
+ }
25
+ export declare function callOpenRouter({ apiKey, model, messages, stream, signal, settings, tools, settingsService, fetchImpl, sleepImpl, retry, }: {
26
+ apiKey: string;
27
+ model: string;
28
+ messages: any[];
29
+ stream: boolean;
30
+ signal?: AbortSignal;
31
+ settings?: any;
32
+ tools?: any[];
33
+ settingsService: ISettingsService;
34
+ fetchImpl?: FetchImpl;
35
+ sleepImpl?: SleepImpl;
36
+ retry?: OpenRouterRetryOptions;
37
+ }): Promise<Response>;
38
+ export {};
39
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../source/providers/openrouter/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,sCAAsC,CAAC;AAI3E,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,KAAK,SAAS,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,MAAM,MAAM,sBAAsB,GAAG;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAiFF,qBAAa,eAAgB,SAAQ,KAAK;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;gBAGlB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,YAAY,CAAC,EAAE,MAAM;CAQ5B;AAED,wBAAsB,cAAc,CAAC,EACjC,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,KAAK,EACL,eAAe,EACf,SAAS,EACT,SAAS,EACT,KAAK,GACR,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAClC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqHpB"}
@@ -0,0 +1,172 @@
1
+ import { getOpenRouterBaseUrl } from './utils.js';
2
+ import { extractModelSettingsForRequest } from './converters.js';
3
+ function isAbortError(err) {
4
+ return ((err instanceof DOMException && err.name === 'AbortError') ||
5
+ (typeof err === 'object' &&
6
+ err !== null &&
7
+ err.name === 'AbortError'));
8
+ }
9
+ function defaultSleep(ms, signal) {
10
+ if (ms <= 0)
11
+ return Promise.resolve();
12
+ return new Promise((resolve, reject) => {
13
+ const id = setTimeout(() => {
14
+ cleanup();
15
+ resolve();
16
+ }, ms);
17
+ const onAbort = () => {
18
+ cleanup();
19
+ clearTimeout(id);
20
+ reject(new DOMException('Aborted', 'AbortError'));
21
+ };
22
+ const cleanup = () => {
23
+ signal?.removeEventListener('abort', onAbort);
24
+ };
25
+ if (signal) {
26
+ if (signal.aborted) {
27
+ onAbort();
28
+ return;
29
+ }
30
+ signal.addEventListener('abort', onAbort);
31
+ }
32
+ });
33
+ }
34
+ function parseRetryAfterToMs(value) {
35
+ if (!value)
36
+ return undefined;
37
+ // Retry-After can be seconds or an HTTP date.
38
+ const asSeconds = Number.parseInt(value, 10);
39
+ if (Number.isFinite(asSeconds)) {
40
+ return Math.max(0, asSeconds) * 1000;
41
+ }
42
+ const asDate = Date.parse(value);
43
+ if (!Number.isNaN(asDate)) {
44
+ return Math.max(0, asDate - Date.now());
45
+ }
46
+ return undefined;
47
+ }
48
+ function isRetryableStatus(status) {
49
+ // 408 can occur for upstream timeouts; treat as transient.
50
+ return status === 429 || status === 408 || status >= 500;
51
+ }
52
+ function computeRetryDelayMs(opts) {
53
+ if (typeof opts.retryAfterMs === 'number' && opts.retryAfterMs >= 0) {
54
+ return opts.retryAfterMs;
55
+ }
56
+ const exponential = opts.baseDelayMs * Math.pow(2, opts.attemptIndex);
57
+ const capped = Math.min(exponential, opts.maxDelayMs);
58
+ if (opts.jitter > 0) {
59
+ return Math.random() * capped;
60
+ }
61
+ return capped;
62
+ }
63
+ export class OpenRouterError extends Error {
64
+ status;
65
+ headers;
66
+ responseBody;
67
+ constructor(message, status, headers, responseBody) {
68
+ super(message);
69
+ this.name = 'OpenRouterError';
70
+ this.status = status;
71
+ this.headers = headers;
72
+ this.responseBody = responseBody;
73
+ }
74
+ }
75
+ export async function callOpenRouter({ apiKey, model, messages, stream, signal, settings, tools, settingsService, fetchImpl, sleepImpl, retry, }) {
76
+ const url = `${getOpenRouterBaseUrl(settingsService)}/chat/completions`;
77
+ const body = {
78
+ model,
79
+ messages,
80
+ stream,
81
+ };
82
+ // Merge settings into request body
83
+ const settingsParams = extractModelSettingsForRequest(settings);
84
+ Object.assign(body, settingsParams);
85
+ // Add tools if provided
86
+ const functionTools = tools ?? [];
87
+ body.tools = functionTools;
88
+ if (functionTools.length > 0) {
89
+ body.tool_choice = 'auto'; // Let model choose when to use tools
90
+ }
91
+ const effectiveFetch = fetchImpl ?? fetch;
92
+ const effectiveSleep = sleepImpl ?? defaultSleep;
93
+ const retryCfg = {
94
+ maxRetries: retry?.maxRetries ?? 2,
95
+ baseDelayMs: retry?.baseDelayMs ?? 500,
96
+ maxDelayMs: retry?.maxDelayMs ?? 30000,
97
+ jitter: retry?.jitter ?? 1,
98
+ };
99
+ let attemptIndex = 0;
100
+ // attemptIndex tracks the retry attempt number (0 for first retry).
101
+ // We allow up to maxRetries retries after the initial attempt.
102
+ while (true) {
103
+ if (signal?.aborted) {
104
+ throw new DOMException('Aborted', 'AbortError');
105
+ }
106
+ try {
107
+ const res = await effectiveFetch(url, {
108
+ method: 'POST',
109
+ headers: {
110
+ 'Content-Type': 'application/json',
111
+ Authorization: `Bearer ${apiKey}`,
112
+ 'HTTP-Referer': settingsService.get('agent.openrouter.referrer') ||
113
+ 'http://localhost',
114
+ 'X-Title': settingsService.get('agent.openrouter.title') ||
115
+ 'term2',
116
+ },
117
+ body: JSON.stringify(body),
118
+ signal,
119
+ });
120
+ if (res.ok)
121
+ return res;
122
+ let errText;
123
+ try {
124
+ errText = await res.text();
125
+ }
126
+ catch { }
127
+ // Extract headers for retry logic (especially Retry-After)
128
+ const headers = {};
129
+ res.headers.forEach((value, key) => {
130
+ headers[key.toLowerCase()] = value;
131
+ });
132
+ const message = `OpenRouter request failed: ${res.status} ${res.statusText}${errText ? ` - ${errText}` : ''}`;
133
+ const error = new OpenRouterError(message, res.status, headers, errText);
134
+ const canRetry = retryCfg.maxRetries > 0 &&
135
+ isRetryableStatus(res.status) &&
136
+ attemptIndex < retryCfg.maxRetries;
137
+ if (!canRetry)
138
+ throw error;
139
+ const retryAfterMs = parseRetryAfterToMs(headers['retry-after']);
140
+ const delayMs = computeRetryDelayMs({
141
+ attemptIndex,
142
+ retryAfterMs,
143
+ baseDelayMs: retryCfg.baseDelayMs,
144
+ maxDelayMs: retryCfg.maxDelayMs,
145
+ jitter: retryCfg.jitter,
146
+ });
147
+ await effectiveSleep(delayMs, signal);
148
+ attemptIndex++;
149
+ continue;
150
+ }
151
+ catch (err) {
152
+ if (isAbortError(err) || signal?.aborted)
153
+ throw err;
154
+ // Network-level failures (DNS, connection reset, etc.) often surface as TypeError.
155
+ const isNetworkError = err instanceof TypeError;
156
+ const canRetry = isNetworkError &&
157
+ retryCfg.maxRetries > 0 &&
158
+ attemptIndex < retryCfg.maxRetries;
159
+ if (!canRetry)
160
+ throw err;
161
+ const delayMs = computeRetryDelayMs({
162
+ attemptIndex,
163
+ baseDelayMs: retryCfg.baseDelayMs,
164
+ maxDelayMs: retryCfg.maxDelayMs,
165
+ jitter: retryCfg.jitter,
166
+ });
167
+ await effectiveSleep(delayMs, signal);
168
+ attemptIndex++;
169
+ }
170
+ }
171
+ }
172
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../source/providers/openrouter/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ModelRequest } from '@openai/agents-core';
2
+ import type { ILoggingService } from '../../services/service-interfaces.js';
3
+ export declare function addCacheControlToLastUserMessage(messages: any[]): void;
4
+ export declare function addCacheControlToLastToolMessage(messages: any[]): void;
5
+ export declare function buildMessagesFromRequest(req: ModelRequest, modelId?: string, loggingService?: ILoggingService): any[];
6
+ export declare function extractFunctionToolsFromRequest(req: ModelRequest): any[];
7
+ export declare function extractModelSettingsForRequest(settings: any): any;
8
+ //# sourceMappingURL=converters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../../source/providers/openrouter/converters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AA2J1E,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CA4BtE;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CA4BtE;AAED,wBAAgB,wBAAwB,CACpC,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,eAAe,GACjC,GAAG,EAAE,CAwKP;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,YAAY,GAAG,GAAG,EAAE,CAsBxE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAgDjE"}
@@ -0,0 +1,382 @@
1
+ import { isAnthropicModel } from './utils.js';
2
+ // No-op logger for fallback when loggingService is not provided
3
+ const noOpLogger = {
4
+ debug: () => { },
5
+ error: () => { },
6
+ info: () => { },
7
+ warn: () => { },
8
+ security: () => { },
9
+ setCorrelationId: () => { },
10
+ getCorrelationId: () => undefined,
11
+ clearCorrelationId: () => { },
12
+ };
13
+ /**
14
+ * Converts an agent item into a structured OpenRouter message object that adheres to
15
+ * expected formats for roles such as user, assistant, or tool, based on the item's properties.
16
+ * Supports handling various item types like input text, messages, function calls, and function call outputs.
17
+ *
18
+ * @param {any} item - The agent item to be converted. It may represent different types of messages
19
+ * (e.g., user input, assistant messages, tool calls) and can contain nested properties like rawItem, content,
20
+ * reasoning, tool calls, or reasoning details.
21
+ * @param {ILoggingService} loggingService - Logging service for debug output
22
+ *
23
+ * @return {any|null} - Returns a structured OpenRouter message object with specified properties like `role`,
24
+ * `content`, `reasoning`, `reasoning_details`, or `tool_calls`. Returns `null` if the input `item` is null or
25
+ * cannot be converted into a recognized format.
26
+ */
27
+ function convertAgentItemToOpenRouterMessage(item, loggingService) {
28
+ if (!item) {
29
+ return null;
30
+ }
31
+ const rawItem = item.rawItem || item;
32
+ if (rawItem.type === 'input_text' && typeof rawItem.text === 'string') {
33
+ return { role: 'user', content: rawItem.text };
34
+ }
35
+ if (rawItem.role === 'assistant' && rawItem.type === 'message') {
36
+ const message = { role: 'assistant' };
37
+ if (Array.isArray(rawItem.content)) {
38
+ const textContent = rawItem.content
39
+ .filter((c) => c?.type === 'output_text' && c?.text)
40
+ .map((c) => c.text)
41
+ .join('');
42
+ if (textContent) {
43
+ message.content = textContent;
44
+ }
45
+ }
46
+ // Preserve OpenRouter "reasoning" field (aka reasoning tokens) when present.
47
+ // This is distinct from reasoning_details blocks.
48
+ const reasoning = rawItem.reasoning ?? item.reasoning;
49
+ if (typeof reasoning === 'string') {
50
+ message.reasoning = reasoning;
51
+ }
52
+ // Preserve reasoning_details EXACTLY as received (required by OpenRouter).
53
+ // Some SDK history items may carry these fields under `rawItem`.
54
+ const reasoningDetails = rawItem.reasoning_details ?? item.reasoning_details;
55
+ if (reasoningDetails != null) {
56
+ loggingService.debug('convertAgentItemToOpenRouterMessage: reasoning_details', reasoningDetails);
57
+ message.reasoning_details = reasoningDetails;
58
+ }
59
+ const toolCalls = rawItem.tool_calls ?? item.tool_calls;
60
+ if (toolCalls != null) {
61
+ message.tool_calls = toolCalls;
62
+ }
63
+ return message;
64
+ }
65
+ // Handle explicit user messages included in array-form inputs
66
+ if (rawItem.role === 'user' && rawItem.type === 'message') {
67
+ if (typeof rawItem.content === 'string') {
68
+ return { role: 'user', content: rawItem.content };
69
+ }
70
+ if (Array.isArray(rawItem.content)) {
71
+ const textContent = rawItem.content
72
+ .filter((c) => (c?.type === 'input_text' ||
73
+ c?.type === 'output_text') &&
74
+ c?.text)
75
+ .map((c) => c.text)
76
+ .join('');
77
+ if (textContent) {
78
+ return { role: 'user', content: textContent };
79
+ }
80
+ }
81
+ }
82
+ if (rawItem?.type === 'function_call') {
83
+ // Tool-call continuation: to preserve reasoning blocks across tool flows,
84
+ // we may need to replay reasoning_details/reasoning alongside tool_calls.
85
+ const reasoning = rawItem.reasoning ?? item.reasoning;
86
+ const reasoningDetails = rawItem.reasoning_details ?? item.reasoning_details;
87
+ return {
88
+ role: 'assistant',
89
+ content: null,
90
+ tool_calls: [
91
+ {
92
+ id: rawItem.callId || rawItem.id,
93
+ type: 'function',
94
+ function: {
95
+ name: rawItem.name,
96
+ arguments: rawItem.arguments ??
97
+ (rawItem.args ? JSON.stringify(rawItem.args) : ''),
98
+ },
99
+ },
100
+ ],
101
+ ...(typeof reasoning === 'string' ? { reasoning } : {}),
102
+ ...(reasoningDetails != null
103
+ ? { reasoning_details: reasoningDetails }
104
+ : {}),
105
+ };
106
+ }
107
+ if (rawItem?.type === 'function_call_output' ||
108
+ rawItem?.type === 'function_call_result' ||
109
+ rawItem?.type === 'function_call_output_result') {
110
+ let outputContent = '';
111
+ if (typeof rawItem.output === 'string') {
112
+ outputContent = rawItem.output;
113
+ }
114
+ else if (rawItem.output && typeof rawItem.output === 'object') {
115
+ outputContent = JSON.stringify(rawItem.output);
116
+ }
117
+ return {
118
+ role: 'tool',
119
+ tool_call_id: rawItem.callId || rawItem.id,
120
+ content: outputContent,
121
+ };
122
+ }
123
+ return null;
124
+ }
125
+ export function addCacheControlToLastUserMessage(messages) {
126
+ // Find the last user message by iterating from the end
127
+ for (let i = messages.length - 1; i >= 0; i--) {
128
+ const msg = messages[i];
129
+ if (msg.role === 'user') {
130
+ // Transform the message content to include cache_control
131
+ if (typeof msg.content === 'string') {
132
+ // Convert string content to array format with cache_control
133
+ msg.content = [
134
+ {
135
+ type: 'text',
136
+ text: msg.content,
137
+ cache_control: { type: 'ephemeral' },
138
+ },
139
+ ];
140
+ }
141
+ else if (Array.isArray(msg.content) && msg.content.length > 0) {
142
+ // Add cache_control to the last text item in the array
143
+ for (let j = msg.content.length - 1; j >= 0; j--) {
144
+ const item = msg.content[j];
145
+ if (item.type === 'text') {
146
+ item.cache_control = { type: 'ephemeral' };
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ break; // Only process the last user message
152
+ }
153
+ }
154
+ }
155
+ export function addCacheControlToLastToolMessage(messages) {
156
+ // Find the last tool message by iterating from the end
157
+ for (let i = messages.length - 1; i >= 0; i--) {
158
+ const msg = messages[i];
159
+ if (msg.role === 'tool') {
160
+ // Transform the message content to include cache_control
161
+ if (typeof msg.content === 'string') {
162
+ // Convert string content to array format with cache_control
163
+ msg.content = [
164
+ {
165
+ type: 'text',
166
+ text: msg.content,
167
+ cache_control: { type: 'ephemeral' },
168
+ },
169
+ ];
170
+ }
171
+ else if (Array.isArray(msg.content) && msg.content.length > 0) {
172
+ // Add cache_control to the last text item in the array
173
+ for (let j = msg.content.length - 1; j >= 0; j--) {
174
+ const item = msg.content[j];
175
+ if (item.type === 'text') {
176
+ item.cache_control = { type: 'ephemeral' };
177
+ break;
178
+ }
179
+ }
180
+ }
181
+ break; // Only process the last tool message
182
+ }
183
+ }
184
+ }
185
+ export function buildMessagesFromRequest(req, modelId, loggingService) {
186
+ const messages = [];
187
+ let pendingReasoningDetails = [];
188
+ const logger = loggingService || noOpLogger;
189
+ logger.debug('buildMessagesFromRequest: req.input', {
190
+ inputType: typeof req.input,
191
+ isArray: Array.isArray(req.input),
192
+ inputLength: Array.isArray(req.input)
193
+ ? req.input.length
194
+ : typeof req.input === 'string'
195
+ ? req.input.length
196
+ : 'N/A',
197
+ inputPreview: Array.isArray(req.input)
198
+ ? req.input.map((item) => ({
199
+ role: item?.role || item?.rawItem?.role,
200
+ type: item?.type || item?.rawItem?.type,
201
+ }))
202
+ : typeof req.input === 'string'
203
+ ? req.input.substring(0, 100)
204
+ : 'non-string, non-array',
205
+ });
206
+ const isToolCallOnlyAssistant = (m) => {
207
+ return (m != null &&
208
+ m.role === 'assistant' &&
209
+ m.content == null &&
210
+ Array.isArray(m.tool_calls) &&
211
+ m.tool_calls.length > 0);
212
+ };
213
+ if (req.systemInstructions && req.systemInstructions.trim().length > 0) {
214
+ // For Anthropic models, use array format with cache_control for prompt caching.
215
+ // This enables caching of the system message (agent instructions) which is large and rarely changes.
216
+ // See: https://openrouter.ai/docs/guides/best-practices/prompt-caching#anthropic-claude
217
+ if (modelId && isAnthropicModel(modelId)) {
218
+ messages.push({
219
+ role: 'system',
220
+ content: [
221
+ {
222
+ type: 'text',
223
+ text: req.systemInstructions,
224
+ cache_control: { type: 'ephemeral' },
225
+ },
226
+ ],
227
+ });
228
+ }
229
+ else {
230
+ messages.push({ role: 'system', content: req.systemInstructions });
231
+ }
232
+ }
233
+ // Note: History is managed by the SDK
234
+ // The SDK provides full conversation context in req.input
235
+ if (typeof req.input === 'string') {
236
+ const userMessage = { role: 'user', content: req.input };
237
+ messages.push(userMessage);
238
+ }
239
+ else if (Array.isArray(req.input)) {
240
+ for (const item of req.input) {
241
+ // The Agents SDK may represent preserved reasoning blocks as standalone
242
+ // output items of type "reasoning" (with providerData containing the
243
+ // original reasoning detail object). Gemini models require these blocks
244
+ // to be replayed as reasoning_details in subsequent requests.
245
+ const raw = item?.rawItem ?? item;
246
+ if (raw?.type === 'reasoning') {
247
+ const detail = raw?.providerData ?? item?.providerData;
248
+ if (detail && typeof detail === 'object') {
249
+ pendingReasoningDetails.push(detail);
250
+ }
251
+ continue;
252
+ }
253
+ const converted = convertAgentItemToOpenRouterMessage(item, loggingService || noOpLogger);
254
+ if (converted) {
255
+ // Attach any pending reasoning blocks to the next assistant message we
256
+ // emit (including assistant tool_calls messages), unless already present.
257
+ if (pendingReasoningDetails.length > 0 &&
258
+ converted.role === 'assistant' &&
259
+ converted.reasoning_details == null) {
260
+ converted.reasoning_details = pendingReasoningDetails;
261
+ pendingReasoningDetails = [];
262
+ }
263
+ // Merge consecutive assistant messages with tool_calls to fix incorrect conversation flow
264
+ // when parallel tool calls are stored as separate history items.
265
+ const lastMessage = messages[messages.length - 1];
266
+ // Case 1: Both are tool-call-only assistant messages - merge tool_calls
267
+ if (isToolCallOnlyAssistant(lastMessage) &&
268
+ isToolCallOnlyAssistant(converted)) {
269
+ lastMessage.tool_calls.push(...converted.tool_calls);
270
+ // Preserve reasoning if the merged message didn't have it but the new one does
271
+ if (lastMessage.reasoning_details == null &&
272
+ converted.reasoning_details != null) {
273
+ lastMessage.reasoning_details =
274
+ converted.reasoning_details;
275
+ }
276
+ if (lastMessage.reasoning == null &&
277
+ converted.reasoning != null) {
278
+ lastMessage.reasoning = converted.reasoning;
279
+ }
280
+ continue;
281
+ }
282
+ // Case 2: Last message is assistant (with or without content), current is tool-call-only assistant
283
+ // This happens when SDK history has assistant message followed by function_call items
284
+ if (lastMessage?.role === 'assistant' &&
285
+ isToolCallOnlyAssistant(converted)) {
286
+ if (lastMessage.content != null) {
287
+ messages.push(converted);
288
+ continue;
289
+ }
290
+ // Merge the tool_calls into the previous assistant message
291
+ if (!lastMessage.tool_calls) {
292
+ lastMessage.tool_calls = [];
293
+ }
294
+ lastMessage.tool_calls.push(...converted.tool_calls);
295
+ // Preserve reasoning
296
+ if (lastMessage.reasoning_details == null &&
297
+ converted.reasoning_details != null) {
298
+ lastMessage.reasoning_details =
299
+ converted.reasoning_details;
300
+ }
301
+ if (lastMessage.reasoning == null &&
302
+ converted.reasoning != null) {
303
+ lastMessage.reasoning = converted.reasoning;
304
+ }
305
+ continue;
306
+ }
307
+ messages.push(converted);
308
+ }
309
+ }
310
+ }
311
+ // For Anthropic models, add cache_control to the last user message.
312
+ // This is an efficient caching strategy using 2 of 4 available cache points:
313
+ // 1. System message (static, large) - already cached above
314
+ // 2. Last user message (marks end of reusable conversation history)
315
+ // As the conversation grows, the cache automatically moves with the last user message.
316
+ // See: https://openrouter.ai/docs/guides/best-practices/prompt-caching#anthropic-claude
317
+ if (modelId && isAnthropicModel(modelId)) {
318
+ addCacheControlToLastUserMessage(messages);
319
+ addCacheControlToLastToolMessage(messages);
320
+ }
321
+ return messages;
322
+ }
323
+ export function extractFunctionToolsFromRequest(req) {
324
+ if (!req.tools || req.tools.length === 0) {
325
+ return [];
326
+ }
327
+ const functionTools = [];
328
+ for (const tool of req.tools) {
329
+ if (tool.type === 'function') {
330
+ functionTools.push({
331
+ type: 'function',
332
+ function: {
333
+ name: tool.name,
334
+ description: tool.description,
335
+ parameters: tool.parameters,
336
+ strict: tool.strict,
337
+ },
338
+ });
339
+ }
340
+ }
341
+ return functionTools;
342
+ }
343
+ export function extractModelSettingsForRequest(settings) {
344
+ const body = {};
345
+ if (settings) {
346
+ // Temperature: Supported by both SDK and OpenRouter
347
+ if (settings.temperature != null)
348
+ body.temperature = settings.temperature;
349
+ // Top P: Supported by both (SDK uses topP, OpenRouter uses top_p)
350
+ if (settings.topP != null)
351
+ body.top_p = settings.topP;
352
+ // Max Tokens: Supported by both (SDK uses maxTokens, OpenRouter uses max_tokens)
353
+ if (settings.maxTokens != null)
354
+ body.max_tokens = settings.maxTokens;
355
+ // Top K: Supported by some models via OpenRouter
356
+ if (settings.topK != null)
357
+ body.top_k = settings.topK;
358
+ // Frequency Penalty: OpenAI standard parameter
359
+ if (settings.frequencyPenalty != null)
360
+ body.frequency_penalty = settings.frequencyPenalty;
361
+ // Presence Penalty: OpenAI standard parameter
362
+ if (settings.presencePenalty != null)
363
+ body.presence_penalty = settings.presencePenalty;
364
+ const hasReasoningObj = settings.reasoning && typeof settings.reasoning === 'object';
365
+ if (hasReasoningObj) {
366
+ // Pass through the full reasoning object unmodified. (OpenRouter supports
367
+ // additional fields like max_tokens and exclude.)
368
+ body.reasoning = { ...settings.reasoning };
369
+ }
370
+ const reasoningEffort = settings.reasoningEffort ?? settings.reasoning?.effort;
371
+ const normalizedEffort = reasoningEffort === 'default' ? 'medium' : reasoningEffort;
372
+ // If an effort is provided (and isn't explicitly disabled), ensure it's set.
373
+ if (normalizedEffort && normalizedEffort !== 'none') {
374
+ body.reasoning = {
375
+ ...(body.reasoning ?? {}),
376
+ effort: normalizedEffort,
377
+ };
378
+ }
379
+ }
380
+ return body;
381
+ }
382
+ //# sourceMappingURL=converters.js.map