@qduc/term2 0.1.3 → 0.1.5

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 (375) hide show
  1. package/dist/agent.d.ts.map +1 -1
  2. package/dist/agent.js +5 -0
  3. package/dist/agent.js.map +1 -1
  4. package/dist/app.d.ts.map +1 -1
  5. package/dist/app.js +2 -2
  6. package/dist/app.js.map +1 -1
  7. package/dist/app.model-command-feedback.test.d.ts +2 -0
  8. package/dist/app.model-command-feedback.test.d.ts.map +1 -0
  9. package/dist/app.model-command-feedback.test.js +19 -0
  10. package/dist/app.model-command-feedback.test.js.map +1 -0
  11. package/dist/cli.js +2 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/components/BottomArea.d.ts +2 -0
  14. package/dist/components/BottomArea.d.ts.map +1 -1
  15. package/dist/components/BottomArea.js +2 -2
  16. package/dist/components/BottomArea.js.map +1 -1
  17. package/dist/components/ChatMessage.js +1 -1
  18. package/dist/components/ChatMessage.js.map +1 -1
  19. package/dist/components/InputBox.js +1 -1
  20. package/dist/components/InputBox.js.map +1 -1
  21. package/dist/components/MarkdownRenderer.js +1 -1
  22. package/dist/components/MarkdownRenderer.js.map +1 -1
  23. package/dist/components/MentorMode.test.d.ts +2 -0
  24. package/dist/components/MentorMode.test.d.ts.map +1 -0
  25. package/dist/components/MentorMode.test.js.map +1 -0
  26. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  27. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
  28. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
  29. package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
  30. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
  31. package/dist/components/ModelSelectionMenu.js +24 -15
  32. package/dist/components/ModelSelectionMenu.js.map +1 -1
  33. package/dist/components/SettingsSelectionMenu.js +1 -1
  34. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  35. package/dist/components/SlashCommandMenu.js +2 -2
  36. package/dist/components/SlashCommandMenu.js.map +1 -1
  37. package/dist/components/StatusBar.d.ts +2 -0
  38. package/dist/components/StatusBar.d.ts.map +1 -1
  39. package/dist/components/StatusBar.js +44 -39
  40. package/dist/components/StatusBar.js.map +1 -1
  41. package/dist/components/StatusBar.test.d.ts +2 -0
  42. package/dist/components/StatusBar.test.d.ts.map +1 -0
  43. package/dist/components/StatusBar.test.js +19 -0
  44. package/dist/components/StatusBar.test.js.map +1 -0
  45. package/dist/components/TextInput.d.ts.map +1 -1
  46. package/dist/components/TextInput.js +1 -2
  47. package/dist/components/TextInput.js.map +1 -1
  48. package/dist/components/TextInput.test.js.map +1 -1
  49. package/dist/debug-schema.d.ts +2 -0
  50. package/dist/debug-schema.d.ts.map +1 -0
  51. package/dist/debug-schema.js +22 -0
  52. package/dist/debug-schema.js.map +1 -0
  53. package/dist/hooks/use-conversation.d.ts +2 -0
  54. package/dist/hooks/use-conversation.d.ts.map +1 -1
  55. package/dist/hooks/use-conversation.js +79 -493
  56. package/dist/hooks/use-conversation.js.map +1 -1
  57. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  58. package/dist/hooks/use-model-selection.js +1 -25
  59. package/dist/hooks/use-model-selection.js.map +1 -1
  60. package/dist/hooks/use-model-selection.test.d.ts +2 -0
  61. package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
  62. package/dist/hooks/use-model-selection.test.js +28 -0
  63. package/dist/hooks/use-model-selection.test.js.map +1 -0
  64. package/dist/hooks/use-path-completion.test.d.ts +2 -0
  65. package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
  66. package/dist/hooks/use-path-completion.test.js +29 -0
  67. package/dist/hooks/use-path-completion.test.js.map +1 -0
  68. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  69. package/dist/hooks/use-settings-completion.js +2 -0
  70. package/dist/hooks/use-settings-completion.js.map +1 -1
  71. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  72. package/dist/hooks/use-settings-value-completion.js +1 -0
  73. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  74. package/dist/lib/editor-impl.test.d.ts +2 -0
  75. package/dist/lib/editor-impl.test.d.ts.map +1 -0
  76. package/dist/lib/editor-impl.test.js +188 -0
  77. package/dist/lib/editor-impl.test.js.map +1 -0
  78. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  79. package/dist/lib/openai-agent-client.js +12 -4
  80. package/dist/lib/openai-agent-client.js.map +1 -1
  81. package/dist/lib/openai-agent-client.public-methods.test.d.ts +2 -0
  82. package/dist/lib/openai-agent-client.public-methods.test.d.ts.map +1 -0
  83. package/dist/lib/openai-agent-client.public-methods.test.js +188 -0
  84. package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -0
  85. package/dist/prompts/default.md.bak +77 -0
  86. package/dist/prompts/simple-mentor.md +0 -8
  87. package/dist/providers/github-copilot/converters.d.ts +45 -0
  88. package/dist/providers/github-copilot/converters.d.ts.map +1 -0
  89. package/dist/providers/github-copilot/converters.js +118 -0
  90. package/dist/providers/github-copilot/converters.js.map +1 -0
  91. package/dist/providers/github-copilot/converters.test.d.ts +2 -0
  92. package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
  93. package/dist/providers/github-copilot/converters.test.js +162 -0
  94. package/dist/providers/github-copilot/converters.test.js.map +1 -0
  95. package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
  96. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
  97. package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
  98. package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
  99. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
  100. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
  101. package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
  102. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
  103. package/dist/providers/github-copilot/index.d.ts +4 -0
  104. package/dist/providers/github-copilot/index.d.ts.map +1 -0
  105. package/dist/providers/github-copilot/index.js +4 -0
  106. package/dist/providers/github-copilot/index.js.map +1 -0
  107. package/dist/providers/github-copilot/model-direct.d.ts +34 -0
  108. package/dist/providers/github-copilot/model-direct.d.ts.map +1 -0
  109. package/dist/providers/github-copilot/model-direct.js +443 -0
  110. package/dist/providers/github-copilot/model-direct.js.map +1 -0
  111. package/dist/providers/github-copilot/model.d.ts +24 -0
  112. package/dist/providers/github-copilot/model.d.ts.map +1 -0
  113. package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
  114. package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
  115. package/dist/providers/github-copilot/model.delta.test.js +15 -0
  116. package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
  117. package/dist/providers/github-copilot/model.js +581 -0
  118. package/dist/providers/github-copilot/model.js.map +1 -0
  119. package/dist/providers/github-copilot/provider.d.ts +20 -0
  120. package/dist/providers/github-copilot/provider.d.ts.map +1 -0
  121. package/dist/providers/github-copilot/provider.js +30 -0
  122. package/dist/providers/github-copilot/provider.js.map +1 -0
  123. package/dist/providers/github-copilot/provider.test.d.ts +2 -0
  124. package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
  125. package/dist/providers/github-copilot/provider.test.js +52 -0
  126. package/dist/providers/github-copilot/provider.test.js.map +1 -0
  127. package/dist/providers/github-copilot/utils.d.ts +20 -0
  128. package/dist/providers/github-copilot/utils.d.ts.map +1 -0
  129. package/dist/providers/github-copilot/utils.js +142 -0
  130. package/dist/providers/github-copilot/utils.js.map +1 -0
  131. package/dist/providers/github-copilot/utils.test.d.ts +2 -0
  132. package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
  133. package/dist/providers/github-copilot/utils.test.js +21 -0
  134. package/dist/providers/github-copilot/utils.test.js.map +1 -0
  135. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  136. package/dist/providers/openrouter/converters.d.ts.map +1 -1
  137. package/dist/providers/openrouter/converters.js +64 -46
  138. package/dist/providers/openrouter/converters.js.map +1 -1
  139. package/dist/providers/openrouter/converters.test.js +13 -12
  140. package/dist/providers/openrouter/converters.test.js.map +1 -1
  141. package/dist/providers/openrouter/merge-messages.test.d.ts +2 -0
  142. package/dist/providers/openrouter/merge-messages.test.d.ts.map +1 -0
  143. package/dist/providers/openrouter/merge-messages.test.js +83 -0
  144. package/dist/providers/openrouter/merge-messages.test.js.map +1 -0
  145. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
  146. package/dist/providers/openrouter.history.test.d.ts +2 -0
  147. package/dist/providers/openrouter.history.test.d.ts.map +1 -0
  148. package/dist/providers/openrouter.history.test.js +533 -0
  149. package/dist/providers/openrouter.history.test.js.map +1 -0
  150. package/dist/providers/openrouter.test.js.map +1 -1
  151. package/dist/reproduce_issue.test.d.ts +2 -0
  152. package/dist/reproduce_issue.test.d.ts.map +1 -0
  153. package/dist/reproduce_issue.test.js +31 -0
  154. package/dist/reproduce_issue.test.js.map +1 -0
  155. package/dist/services/conversation-events.d.ts +3 -0
  156. package/dist/services/conversation-events.d.ts.map +1 -1
  157. package/dist/services/conversation-service.test.js +183 -149
  158. package/dist/services/conversation-session.d.ts +2 -0
  159. package/dist/services/conversation-session.d.ts.map +1 -1
  160. package/dist/services/conversation-session.js +151 -28
  161. package/dist/services/conversation-session.js.map +1 -1
  162. package/dist/services/conversation-session.usage.test.d.ts +2 -0
  163. package/dist/services/conversation-session.usage.test.d.ts.map +1 -0
  164. package/dist/services/conversation-session.usage.test.js +59 -0
  165. package/dist/services/conversation-session.usage.test.js.map +1 -0
  166. package/dist/services/settings-service.d.ts +9 -3
  167. package/dist/services/settings-service.d.ts.map +1 -1
  168. package/dist/services/settings-service.js +14 -0
  169. package/dist/services/settings-service.js.map +1 -1
  170. package/dist/test-search-tool.d.ts +2 -0
  171. package/dist/test-search-tool.d.ts.map +1 -0
  172. package/dist/test-search-tool.js +36 -0
  173. package/dist/test-search-tool.js.map +1 -0
  174. package/dist/tools/edit-healing.d.ts +24 -0
  175. package/dist/tools/edit-healing.d.ts.map +1 -0
  176. package/dist/tools/edit-healing.js +230 -0
  177. package/dist/tools/edit-healing.js.map +1 -0
  178. package/dist/tools/edit-healing.test.d.ts +2 -0
  179. package/dist/tools/edit-healing.test.d.ts.map +1 -0
  180. package/dist/tools/edit-healing.test.js +34 -0
  181. package/dist/tools/edit-healing.test.js.map +1 -0
  182. package/dist/tools/find-files.d.ts +1 -0
  183. package/dist/tools/find-files.d.ts.map +1 -1
  184. package/dist/tools/find-files.js +92 -8
  185. package/dist/tools/find-files.js.map +1 -1
  186. package/dist/tools/find-files.test.js +45 -0
  187. package/dist/tools/find-files.test.js.map +1 -1
  188. package/dist/tools/search-replace.d.ts +2 -0
  189. package/dist/tools/search-replace.d.ts.map +1 -1
  190. package/dist/tools/search-replace.js +207 -23
  191. package/dist/tools/search-replace.js.map +1 -1
  192. package/dist/tools/search-replace.test.js +223 -2
  193. package/dist/tools/search-replace.test.js.map +1 -1
  194. package/dist/tools/web-fetch.d.ts +20 -0
  195. package/dist/tools/web-fetch.d.ts.map +1 -0
  196. package/dist/tools/web-fetch.js +87 -0
  197. package/dist/tools/web-fetch.js.map +1 -0
  198. package/dist/tools/web-fetch.test.d.ts +2 -0
  199. package/dist/tools/web-fetch.test.d.ts.map +1 -0
  200. package/dist/tools/web-fetch.test.js +94 -0
  201. package/dist/tools/web-fetch.test.js.map +1 -0
  202. package/dist/utils/command-safety/index.d.ts +2 -2
  203. package/dist/utils/command-safety/index.d.ts.map +1 -1
  204. package/dist/utils/command-safety/index.js +7 -6
  205. package/dist/utils/command-safety/index.js.map +1 -1
  206. package/dist/utils/command-safety.d.ts.map +1 -1
  207. package/dist/utils/command-safety.find.test.js +19 -21
  208. package/dist/utils/command-safety.find.test.js.map +1 -1
  209. package/dist/utils/command-safety.js +364 -10
  210. package/dist/utils/command-safety.js.map +1 -1
  211. package/dist/utils/conversation-event-handler.d.ts +63 -0
  212. package/dist/utils/conversation-event-handler.d.ts.map +1 -0
  213. package/dist/utils/conversation-event-handler.js +132 -0
  214. package/dist/utils/conversation-event-handler.js.map +1 -0
  215. package/dist/utils/conversation-event-handler.test.d.ts +2 -0
  216. package/dist/utils/conversation-event-handler.test.d.ts.map +1 -0
  217. package/dist/utils/conversation-event-handler.test.js +281 -0
  218. package/dist/utils/conversation-event-handler.test.js.map +1 -0
  219. package/dist/utils/conversation-utils.d.ts +41 -0
  220. package/dist/utils/conversation-utils.d.ts.map +1 -0
  221. package/dist/utils/conversation-utils.js +109 -0
  222. package/dist/utils/conversation-utils.js.map +1 -0
  223. package/dist/utils/conversation-utils.test.d.ts +2 -0
  224. package/dist/utils/conversation-utils.test.d.ts.map +1 -0
  225. package/dist/utils/conversation-utils.test.js +190 -0
  226. package/dist/utils/conversation-utils.test.js.map +1 -0
  227. package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
  228. package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
  229. package/dist/utils/extract-command-messages.repro.test.js +31 -0
  230. package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
  231. package/dist/utils/extract-command-messages.test.js +51 -58
  232. package/dist/utils/ink-render-options.d.ts +9 -0
  233. package/dist/utils/ink-render-options.d.ts.map +1 -0
  234. package/dist/utils/ink-render-options.js +8 -0
  235. package/dist/utils/ink-render-options.js.map +1 -0
  236. package/dist/utils/message-utils.d.ts +17 -0
  237. package/dist/utils/message-utils.d.ts.map +1 -0
  238. package/dist/utils/message-utils.js +52 -0
  239. package/dist/utils/message-utils.js.map +1 -0
  240. package/dist/utils/message-utils.test.d.ts +2 -0
  241. package/dist/utils/message-utils.test.d.ts.map +1 -0
  242. package/dist/utils/message-utils.test.js +48 -0
  243. package/dist/utils/message-utils.test.js.map +1 -0
  244. package/dist/utils/token-usage.d.ts +16 -0
  245. package/dist/utils/token-usage.d.ts.map +1 -0
  246. package/dist/utils/token-usage.js +110 -0
  247. package/dist/utils/token-usage.js.map +1 -0
  248. package/dist/utils/token-usage.test.d.ts +2 -0
  249. package/dist/utils/token-usage.test.d.ts.map +1 -0
  250. package/dist/utils/token-usage.test.js +38 -0
  251. package/dist/utils/token-usage.test.js.map +1 -0
  252. package/dist/utils/trim-tool-output.d.ts +2 -0
  253. package/dist/utils/trim-tool-output.d.ts.map +1 -0
  254. package/dist/utils/trim-tool-output.js +52 -0
  255. package/dist/utils/trim-tool-output.js.map +1 -0
  256. package/package.json +10 -3
  257. package/readme.md +22 -1
  258. package/dist/agent.lite-mode.test.d.ts +0 -2
  259. package/dist/agent.lite-mode.test.d.ts.map +0 -1
  260. package/dist/agent.lite-mode.test.js +0 -39
  261. package/dist/agent.lite-mode.test.js.map +0 -1
  262. package/dist/debug_ask_mentor.d.ts +0 -2
  263. package/dist/debug_ask_mentor.d.ts.map +0 -1
  264. package/dist/debug_ask_mentor.js +0 -73
  265. package/dist/debug_ask_mentor.js.map +0 -1
  266. package/dist/modes/companion/command-index.d.ts +0 -26
  267. package/dist/modes/companion/command-index.d.ts.map +0 -1
  268. package/dist/modes/companion/command-index.js +0 -50
  269. package/dist/modes/companion/command-index.js.map +0 -1
  270. package/dist/modes/companion/command-index.test.d.ts +0 -2
  271. package/dist/modes/companion/command-index.test.d.ts.map +0 -1
  272. package/dist/modes/companion/command-index.test.js +0 -86
  273. package/dist/modes/companion/command-index.test.js.map +0 -1
  274. package/dist/modes/companion/companion-app.d.ts +0 -12
  275. package/dist/modes/companion/companion-app.d.ts.map +0 -1
  276. package/dist/modes/companion/companion-app.js +0 -297
  277. package/dist/modes/companion/companion-app.js.map +0 -1
  278. package/dist/modes/companion/companion-session.d.ts +0 -63
  279. package/dist/modes/companion/companion-session.d.ts.map +0 -1
  280. package/dist/modes/companion/companion-session.js +0 -146
  281. package/dist/modes/companion/companion-session.js.map +0 -1
  282. package/dist/modes/companion/companion-session.test.d.ts +0 -2
  283. package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
  284. package/dist/modes/companion/companion-session.test.js +0 -28
  285. package/dist/modes/companion/companion-session.test.js.map +0 -1
  286. package/dist/modes/companion/components/status-bar.d.ts +0 -13
  287. package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
  288. package/dist/modes/companion/components/status-bar.js +0 -26
  289. package/dist/modes/companion/components/status-bar.js.map +0 -1
  290. package/dist/modes/companion/context-buffer.d.ts +0 -65
  291. package/dist/modes/companion/context-buffer.d.ts.map +0 -1
  292. package/dist/modes/companion/context-buffer.js +0 -156
  293. package/dist/modes/companion/context-buffer.js.map +0 -1
  294. package/dist/modes/companion/context-buffer.test.d.ts +0 -2
  295. package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
  296. package/dist/modes/companion/context-buffer.test.js +0 -154
  297. package/dist/modes/companion/context-buffer.test.js.map +0 -1
  298. package/dist/modes/companion/event-detector.d.ts +0 -46
  299. package/dist/modes/companion/event-detector.d.ts.map +0 -1
  300. package/dist/modes/companion/event-detector.js +0 -169
  301. package/dist/modes/companion/event-detector.js.map +0 -1
  302. package/dist/modes/companion/event-detector.test.d.ts +0 -2
  303. package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
  304. package/dist/modes/companion/event-detector.test.js +0 -121
  305. package/dist/modes/companion/event-detector.test.js.map +0 -1
  306. package/dist/modes/companion/index.d.ts +0 -33
  307. package/dist/modes/companion/index.d.ts.map +0 -1
  308. package/dist/modes/companion/index.js +0 -21
  309. package/dist/modes/companion/index.js.map +0 -1
  310. package/dist/modes/companion/input-key-mapper.d.ts +0 -3
  311. package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
  312. package/dist/modes/companion/input-key-mapper.js +0 -31
  313. package/dist/modes/companion/input-key-mapper.js.map +0 -1
  314. package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
  315. package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
  316. package/dist/modes/companion/input-key-mapper.test.js +0 -26
  317. package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
  318. package/dist/modes/companion/input-parser.d.ts +0 -53
  319. package/dist/modes/companion/input-parser.d.ts.map +0 -1
  320. package/dist/modes/companion/input-parser.js +0 -114
  321. package/dist/modes/companion/input-parser.js.map +0 -1
  322. package/dist/modes/companion/input-parser.test.d.ts +0 -2
  323. package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
  324. package/dist/modes/companion/input-parser.test.js +0 -123
  325. package/dist/modes/companion/input-parser.test.js.map +0 -1
  326. package/dist/modes/companion/mode-manager.d.ts +0 -41
  327. package/dist/modes/companion/mode-manager.d.ts.map +0 -1
  328. package/dist/modes/companion/mode-manager.js +0 -56
  329. package/dist/modes/companion/mode-manager.js.map +0 -1
  330. package/dist/modes/companion/mode-manager.test.d.ts +0 -2
  331. package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
  332. package/dist/modes/companion/mode-manager.test.js +0 -65
  333. package/dist/modes/companion/mode-manager.test.js.map +0 -1
  334. package/dist/modes/companion/output-classifier.d.ts +0 -15
  335. package/dist/modes/companion/output-classifier.d.ts.map +0 -1
  336. package/dist/modes/companion/output-classifier.js +0 -77
  337. package/dist/modes/companion/output-classifier.js.map +0 -1
  338. package/dist/modes/companion/output-classifier.test.d.ts +0 -2
  339. package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
  340. package/dist/modes/companion/output-classifier.test.js +0 -133
  341. package/dist/modes/companion/output-classifier.test.js.map +0 -1
  342. package/dist/modes/companion/pty-wrapper.d.ts +0 -46
  343. package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
  344. package/dist/modes/companion/pty-wrapper.js +0 -143
  345. package/dist/modes/companion/pty-wrapper.js.map +0 -1
  346. package/dist/modes/companion/safety-classifier.d.ts +0 -31
  347. package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
  348. package/dist/modes/companion/safety-classifier.js +0 -140
  349. package/dist/modes/companion/safety-classifier.js.map +0 -1
  350. package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
  351. package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
  352. package/dist/modes/companion/safety-classifier.test.js +0 -151
  353. package/dist/modes/companion/safety-classifier.test.js.map +0 -1
  354. package/dist/modes/companion/summarizer.d.ts +0 -24
  355. package/dist/modes/companion/summarizer.d.ts.map +0 -1
  356. package/dist/modes/companion/summarizer.js +0 -132
  357. package/dist/modes/companion/summarizer.js.map +0 -1
  358. package/dist/modes/companion/terminal-history.d.ts +0 -27
  359. package/dist/modes/companion/terminal-history.d.ts.map +0 -1
  360. package/dist/modes/companion/terminal-history.js +0 -142
  361. package/dist/modes/companion/terminal-history.js.map +0 -1
  362. package/dist/services/check_mock.d.ts +0 -2
  363. package/dist/services/check_mock.d.ts.map +0 -1
  364. package/dist/services/check_mock.js +0 -22
  365. package/dist/services/check_mock.js.map +0 -1
  366. package/dist/services/conversation-service.test.d.ts +0 -2
  367. package/dist/services/conversation-service.test.d.ts.map +0 -1
  368. package/dist/services/conversation-service.test.js.map +0 -1
  369. package/dist/utils/command-safety.devnull.test.d.ts +0 -2
  370. package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
  371. package/dist/utils/command-safety.devnull.test.js +0 -13
  372. package/dist/utils/command-safety.devnull.test.js.map +0 -1
  373. package/dist/utils/extract-command-messages.test.d.ts +0 -2
  374. package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
  375. package/dist/utils/extract-command-messages.test.js.map +0 -1
@@ -0,0 +1,83 @@
1
+ import test from 'ava';
2
+ import { buildMessagesFromRequest } from './converters.js';
3
+ import { LoggingService } from '../../services/logging-service.js';
4
+ const logger = new LoggingService({ disableLogging: true });
5
+ test('merges assistant message with content and subsequent assistant tool call', t => {
6
+ const input = [
7
+ {
8
+ type: 'message',
9
+ role: 'assistant',
10
+ content: [{ type: 'output_text', text: "I'll help with that." }],
11
+ reasoning_details: [{ type: 'reasoning.text', text: 'thinking about helping' }],
12
+ },
13
+ {
14
+ type: 'function_call',
15
+ callId: 'call-1',
16
+ name: 'ls',
17
+ arguments: '{"path": "."}',
18
+ }
19
+ ];
20
+ const messages = buildMessagesFromRequest({
21
+ input: input,
22
+ tools: [],
23
+ }, 'model-id', logger);
24
+ t.is(messages.length, 1);
25
+ t.is(messages[0].role, 'assistant');
26
+ t.is(messages[0].content, "I'll help with that.");
27
+ t.is(messages[0].tool_calls.length, 1);
28
+ t.is(messages[0].tool_calls[0].id, 'call-1');
29
+ t.deepEqual(messages[0].reasoning_details, [
30
+ { type: 'reasoning.text', text: 'thinking about helping' },
31
+ ]);
32
+ });
33
+ test('merges consecutive user messages', t => {
34
+ const input = [
35
+ {
36
+ type: 'message',
37
+ role: 'user',
38
+ content: [{ type: 'input_text', text: 'Hello' }]
39
+ },
40
+ {
41
+ type: 'message',
42
+ role: 'user',
43
+ content: [{ type: 'input_text', text: 'World' }]
44
+ }
45
+ ];
46
+ const messages = buildMessagesFromRequest({
47
+ input: input,
48
+ tools: [],
49
+ }, 'model-id', logger);
50
+ t.is(messages.length, 1);
51
+ t.is(messages[0].role, 'user');
52
+ t.is(messages[0].content, 'Hello\nWorld');
53
+ });
54
+ test('merges assistant message, reasoning details, and tool calls', t => {
55
+ const input = [
56
+ {
57
+ type: 'message',
58
+ role: 'assistant',
59
+ content: [{ type: 'output_text', text: 'Thinking...' }],
60
+ reasoning_details: [{ type: 'reasoning.text', text: 'initial thought' }]
61
+ },
62
+ {
63
+ type: 'reasoning',
64
+ providerData: { type: 'reasoning.text', text: 'more thought', index: 1 }
65
+ },
66
+ {
67
+ type: 'function_call',
68
+ callId: 'call-1',
69
+ name: 'tool1',
70
+ arguments: '{}'
71
+ }
72
+ ];
73
+ const messages = buildMessagesFromRequest({
74
+ input: input,
75
+ tools: [],
76
+ }, 'model-id', logger);
77
+ t.is(messages.length, 1);
78
+ t.is(messages[0].role, 'assistant');
79
+ t.is(messages[0].content, 'Thinking...');
80
+ t.is(messages[0].tool_calls.length, 1);
81
+ t.is(messages[0].reasoning_details.length, 2);
82
+ });
83
+ //# sourceMappingURL=merge-messages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-messages.test.js","sourceRoot":"","sources":["../../../source/providers/openrouter/merge-messages.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-content.test.js","sourceRoot":"","sources":["../../../source/providers/openrouter/reasoning-content.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reasoning-content.test.js","sourceRoot":"","sources":["../../../source/providers/openrouter/reasoning-content.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openrouter.history.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.history.test.d.ts","sourceRoot":"","sources":["../../source/providers/openrouter.history.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,533 @@
1
+ import test from 'ava';
2
+ import { OpenRouterModel, clearOpenRouterConversations } from './openrouter.js';
3
+ import { settingsService } from '../services/settings-service.js';
4
+ const originalFetch = globalThis.fetch;
5
+ const originalGet = settingsService.get;
6
+ const createJsonResponse = (body) => new Response(JSON.stringify(body), {
7
+ status: 200,
8
+ headers: { 'Content-Type': 'application/json' },
9
+ });
10
+ test.beforeEach(() => {
11
+ clearOpenRouterConversations();
12
+ settingsService.get = ((key) => {
13
+ if (key === 'agent.openrouter.apiKey') {
14
+ return 'mock-api-key';
15
+ }
16
+ return originalGet.call(settingsService, key);
17
+ });
18
+ });
19
+ test.afterEach.always(() => {
20
+ clearOpenRouterConversations();
21
+ globalThis.fetch = originalFetch;
22
+ settingsService.get = originalGet;
23
+ });
24
+ test.serial('previousResponseId maintains conversation history across turns', async (t) => {
25
+ const requests = [];
26
+ const responses = [
27
+ // First turn response
28
+ createJsonResponse({
29
+ id: 'resp-1',
30
+ choices: [
31
+ {
32
+ message: {
33
+ content: 'Hi there! How can I help you?',
34
+ },
35
+ },
36
+ ],
37
+ usage: { prompt_tokens: 10, completion_tokens: 8, total_tokens: 18 },
38
+ }),
39
+ // Second turn response
40
+ createJsonResponse({
41
+ id: 'resp-2',
42
+ choices: [
43
+ {
44
+ message: {
45
+ content: "I'm doing well, thanks!",
46
+ },
47
+ },
48
+ ],
49
+ usage: { prompt_tokens: 25, completion_tokens: 6, total_tokens: 31 },
50
+ }),
51
+ // Third turn response
52
+ createJsonResponse({
53
+ id: 'resp-3',
54
+ choices: [
55
+ {
56
+ message: {
57
+ content: 'Glad to hear that!',
58
+ },
59
+ },
60
+ ],
61
+ usage: { prompt_tokens: 35, completion_tokens: 4, total_tokens: 39 },
62
+ }),
63
+ ];
64
+ globalThis.fetch = async (_url, options) => {
65
+ const body = JSON.parse(options.body);
66
+ requests.push(body);
67
+ return responses[requests.length - 1];
68
+ };
69
+ const model = new OpenRouterModel('mock-model');
70
+ // First turn - provide explicit history in array form to bootstrap conversation
71
+ const firstResponse = await model.getResponse({
72
+ systemInstructions: 'You are a helpful assistant.',
73
+ input: [
74
+ { type: 'input_text', text: 'Hello' },
75
+ ],
76
+ previousResponseId: 'conv-1', // Use a conversation ID to enable history storage
77
+ });
78
+ t.truthy(firstResponse);
79
+ t.is(firstResponse.responseId, 'resp-1');
80
+ t.is(requests.length, 1);
81
+ // Verify first turn request structure
82
+ const firstRequest = requests[0];
83
+ t.truthy(firstRequest);
84
+ t.deepEqual(firstRequest.messages, [
85
+ { role: 'system', content: 'You are a helpful assistant.' },
86
+ { role: 'user', content: 'Hello' },
87
+ ]);
88
+ // Second turn - use previousResponseId to retrieve stored conversation history
89
+ const secondResponse = await model.getResponse({
90
+ systemInstructions: 'You are a helpful assistant.',
91
+ input: 'How are you?',
92
+ previousResponseId: firstResponse.responseId,
93
+ });
94
+ t.truthy(secondResponse);
95
+ t.is(secondResponse.responseId, 'resp-2');
96
+ t.is(requests.length, 2);
97
+ // Verify second turn request includes history from first turn
98
+ const secondRequest = requests[1];
99
+ t.truthy(secondRequest);
100
+ t.deepEqual(secondRequest.messages, [
101
+ { role: 'system', content: 'You are a helpful assistant.' },
102
+ // History from first turn (stored because we used previousResponseId in turn 1)
103
+ { role: 'user', content: 'Hello' },
104
+ { role: 'assistant', content: 'Hi there! How can I help you?' },
105
+ // Current turn
106
+ { role: 'user', content: 'How are you?' },
107
+ ]);
108
+ // Third turn - continue the conversation
109
+ const thirdResponse = await model.getResponse({
110
+ systemInstructions: 'You are a helpful assistant.',
111
+ input: 'Great!',
112
+ previousResponseId: secondResponse.responseId,
113
+ });
114
+ t.truthy(thirdResponse);
115
+ t.is(thirdResponse.responseId, 'resp-3');
116
+ t.is(requests.length, 3);
117
+ // Verify third turn includes full conversation history
118
+ const thirdRequest = requests[2];
119
+ t.truthy(thirdRequest);
120
+ t.deepEqual(thirdRequest.messages, [
121
+ { role: 'system', content: 'You are a helpful assistant.' },
122
+ { role: 'user', content: 'Hello' },
123
+ { role: 'assistant', content: 'Hi there! How can I help you?' },
124
+ { role: 'user', content: 'How are you?' },
125
+ { role: 'assistant', content: "I'm doing well, thanks!" },
126
+ { role: 'user', content: 'Great!' },
127
+ ]);
128
+ });
129
+ test.serial('previousResponseId works with tool calls in history', async (t) => {
130
+ const requests = [];
131
+ const responses = [
132
+ // First turn with tool call
133
+ createJsonResponse({
134
+ id: 'resp-1',
135
+ choices: [
136
+ {
137
+ message: {
138
+ content: null,
139
+ tool_calls: [
140
+ {
141
+ id: 'call-123',
142
+ type: 'function',
143
+ function: {
144
+ name: 'get_weather',
145
+ arguments: '{"location":"San Francisco"}',
146
+ },
147
+ },
148
+ ],
149
+ },
150
+ },
151
+ ],
152
+ usage: { prompt_tokens: 15, completion_tokens: 10, total_tokens: 25 },
153
+ }),
154
+ // Second turn response
155
+ createJsonResponse({
156
+ id: 'resp-2',
157
+ choices: [
158
+ {
159
+ message: {
160
+ content: 'Based on the weather data, it looks sunny in San Francisco!',
161
+ },
162
+ },
163
+ ],
164
+ usage: { prompt_tokens: 35, completion_tokens: 12, total_tokens: 47 },
165
+ }),
166
+ ];
167
+ globalThis.fetch = async (_url, options) => {
168
+ const body = JSON.parse(options.body);
169
+ requests.push(body);
170
+ return responses[requests.length - 1];
171
+ };
172
+ const model = new OpenRouterModel('mock-model');
173
+ // First turn - model requests a tool call
174
+ // Use a conversation ID to enable history storage
175
+ const firstResponse = await model.getResponse({
176
+ systemInstructions: 'You are a helpful assistant.',
177
+ input: "What's the weather like?",
178
+ previousResponseId: 'conv-1',
179
+ tools: [
180
+ {
181
+ type: 'function',
182
+ name: 'get_weather',
183
+ description: 'Get weather for a location',
184
+ parameters: {
185
+ type: 'object',
186
+ properties: {
187
+ location: { type: 'string' },
188
+ },
189
+ },
190
+ },
191
+ ],
192
+ });
193
+ t.truthy(firstResponse);
194
+ t.is(firstResponse.responseId, 'resp-1');
195
+ t.is(requests.length, 1);
196
+ // Second turn - provide tool result and continue conversation
197
+ const secondResponse = await model.getResponse({
198
+ systemInstructions: 'You are a helpful assistant.',
199
+ input: [
200
+ {
201
+ type: 'function_call',
202
+ id: 'call-123',
203
+ callId: 'call-123',
204
+ name: 'get_weather',
205
+ arguments: '{"location":"San Francisco"}',
206
+ },
207
+ {
208
+ type: 'function_call_result',
209
+ callId: 'call-123',
210
+ output: '{"temperature": 72, "condition": "sunny"}',
211
+ },
212
+ ],
213
+ previousResponseId: firstResponse.responseId,
214
+ });
215
+ t.truthy(secondResponse);
216
+ t.is(secondResponse.responseId, 'resp-2');
217
+ t.is(requests.length, 2);
218
+ // Verify second turn request includes tool call history
219
+ const secondRequest = requests[1];
220
+ t.truthy(secondRequest);
221
+ t.deepEqual(secondRequest.messages, [
222
+ { role: 'system', content: 'You are a helpful assistant.' },
223
+ // History from first turn
224
+ { role: 'user', content: "What's the weather like?" },
225
+ {
226
+ role: 'assistant',
227
+ content: null,
228
+ tool_calls: [
229
+ {
230
+ id: 'call-123',
231
+ type: 'function',
232
+ function: {
233
+ name: 'get_weather',
234
+ arguments: '{"location":"San Francisco"}',
235
+ },
236
+ },
237
+ ],
238
+ },
239
+ // Current turn with tool result
240
+ {
241
+ role: 'assistant',
242
+ content: null,
243
+ tool_calls: [
244
+ {
245
+ id: 'call-123',
246
+ type: 'function',
247
+ function: {
248
+ name: 'get_weather',
249
+ arguments: '{"location":"San Francisco"}',
250
+ },
251
+ },
252
+ ],
253
+ },
254
+ {
255
+ role: 'tool',
256
+ tool_call_id: 'call-123',
257
+ content: '{"temperature": 72, "condition": "sunny"}',
258
+ },
259
+ ]);
260
+ });
261
+ test.serial('previousResponseId works with reasoning details in history', async (t) => {
262
+ const requests = [];
263
+ const responses = [
264
+ // First turn with reasoning
265
+ createJsonResponse({
266
+ id: 'resp-1',
267
+ choices: [
268
+ {
269
+ message: {
270
+ content: 'The answer is 42.',
271
+ reasoning_details: [
272
+ { type: 'reasoning.text', text: 'Let me think about this...' },
273
+ ],
274
+ },
275
+ },
276
+ ],
277
+ usage: { prompt_tokens: 10, completion_tokens: 15, total_tokens: 25 },
278
+ }),
279
+ // Second turn response
280
+ createJsonResponse({
281
+ id: 'resp-2',
282
+ choices: [
283
+ {
284
+ message: {
285
+ content: 'Yes, 42 is the answer to life, the universe, and everything!',
286
+ },
287
+ },
288
+ ],
289
+ usage: { prompt_tokens: 30, completion_tokens: 14, total_tokens: 44 },
290
+ }),
291
+ ];
292
+ globalThis.fetch = async (_url, options) => {
293
+ const body = JSON.parse(options.body);
294
+ requests.push(body);
295
+ return responses[requests.length - 1];
296
+ };
297
+ const model = new OpenRouterModel('mock-model');
298
+ // First turn - model provides reasoning
299
+ // Use a conversation ID to enable history storage
300
+ const firstResponse = await model.getResponse({
301
+ systemInstructions: 'You are a helpful assistant.',
302
+ input: 'What is the meaning of life?',
303
+ previousResponseId: 'conv-1',
304
+ modelSettings: { reasoningEffort: 'high' },
305
+ });
306
+ t.truthy(firstResponse);
307
+ t.is(firstResponse.responseId, 'resp-1');
308
+ t.is(requests.length, 1);
309
+ // Second turn - continue conversation
310
+ const secondResponse = await model.getResponse({
311
+ systemInstructions: 'You are a helpful assistant.',
312
+ input: 'Are you sure about that?',
313
+ previousResponseId: firstResponse.responseId,
314
+ });
315
+ t.truthy(secondResponse);
316
+ t.is(secondResponse.responseId, 'resp-2');
317
+ t.is(requests.length, 2);
318
+ // Verify second turn request includes reasoning from first turn
319
+ const secondRequest = requests[1];
320
+ t.truthy(secondRequest);
321
+ t.deepEqual(secondRequest.messages, [
322
+ { role: 'system', content: 'You are a helpful assistant.' },
323
+ // History from first turn
324
+ { role: 'user', content: 'What is the meaning of life?' },
325
+ {
326
+ role: 'assistant',
327
+ content: 'The answer is 42.',
328
+ reasoning_details: [
329
+ { type: 'reasoning.text', text: 'Let me think about this...' },
330
+ ],
331
+ },
332
+ // Current turn
333
+ { role: 'user', content: 'Are you sure about that?' },
334
+ ]);
335
+ });
336
+ test.serial('multiple turns maintain complete conversation history', async (t) => {
337
+ const requests = [];
338
+ const responses = [
339
+ createJsonResponse({
340
+ id: 'resp-1',
341
+ choices: [{ message: { content: 'Response 1' } }],
342
+ usage: { prompt_tokens: 5, completion_tokens: 2, total_tokens: 7 },
343
+ }),
344
+ createJsonResponse({
345
+ id: 'resp-2',
346
+ choices: [{ message: { content: 'Response 2' } }],
347
+ usage: { prompt_tokens: 10, completion_tokens: 2, total_tokens: 12 },
348
+ }),
349
+ createJsonResponse({
350
+ id: 'resp-3',
351
+ choices: [{ message: { content: 'Response 3' } }],
352
+ usage: { prompt_tokens: 15, completion_tokens: 2, total_tokens: 17 },
353
+ }),
354
+ ];
355
+ globalThis.fetch = async (_url, options) => {
356
+ const body = JSON.parse(options.body);
357
+ requests.push(body);
358
+ return responses[requests.length - 1];
359
+ };
360
+ const model = new OpenRouterModel('mock-model');
361
+ // Turn 1 - start with a conversation ID
362
+ const resp1 = await model.getResponse({
363
+ systemInstructions: 'System',
364
+ input: 'Turn 1',
365
+ previousResponseId: 'conv-1',
366
+ });
367
+ t.is(resp1.responseId, 'resp-1');
368
+ // Turn 2
369
+ const resp2 = await model.getResponse({
370
+ systemInstructions: 'System',
371
+ input: 'Turn 2',
372
+ previousResponseId: resp1.responseId,
373
+ });
374
+ t.is(resp2.responseId, 'resp-2');
375
+ // Turn 3
376
+ const resp3 = await model.getResponse({
377
+ systemInstructions: 'System',
378
+ input: 'Turn 3',
379
+ previousResponseId: resp2.responseId,
380
+ });
381
+ t.is(resp3.responseId, 'resp-3');
382
+ // Verify turn 3 contains all history
383
+ const thirdRequest = requests[2];
384
+ t.deepEqual(thirdRequest.messages, [
385
+ { role: 'system', content: 'System' },
386
+ { role: 'user', content: 'Turn 1' },
387
+ { role: 'assistant', content: 'Response 1' },
388
+ { role: 'user', content: 'Turn 2' },
389
+ { role: 'assistant', content: 'Response 2' },
390
+ { role: 'user', content: 'Turn 3' },
391
+ ]);
392
+ });
393
+ test.serial('without previousResponseId, no history is included', async (t) => {
394
+ const requests = [];
395
+ const responses = [
396
+ createJsonResponse({
397
+ id: 'resp-1',
398
+ choices: [{ message: { content: 'First response' } }],
399
+ usage: { prompt_tokens: 5, completion_tokens: 2, total_tokens: 7 },
400
+ }),
401
+ createJsonResponse({
402
+ id: 'resp-2',
403
+ choices: [{ message: { content: 'Second response' } }],
404
+ usage: { prompt_tokens: 5, completion_tokens: 2, total_tokens: 7 },
405
+ }),
406
+ ];
407
+ globalThis.fetch = async (_url, options) => {
408
+ const body = JSON.parse(options.body);
409
+ requests.push(body);
410
+ return responses[requests.length - 1];
411
+ };
412
+ const model = new OpenRouterModel('mock-model');
413
+ // First turn
414
+ await model.getResponse({
415
+ systemInstructions: 'System',
416
+ input: 'First message',
417
+ });
418
+ // Second turn WITHOUT previousResponseId
419
+ await model.getResponse({
420
+ systemInstructions: 'System',
421
+ input: 'Second message',
422
+ });
423
+ // Verify second request has no history
424
+ const secondRequest = requests[1];
425
+ t.deepEqual(secondRequest.messages, [
426
+ { role: 'system', content: 'System' },
427
+ { role: 'user', content: 'Second message' },
428
+ ]);
429
+ });
430
+ test.serial('clearOpenRouterConversations removes specific conversation', async (t) => {
431
+ const requests = [];
432
+ const responses = [
433
+ createJsonResponse({
434
+ id: 'resp-1',
435
+ choices: [{ message: { content: 'Response 1' } }],
436
+ usage: { prompt_tokens: 5, completion_tokens: 2, total_tokens: 7 },
437
+ }),
438
+ createJsonResponse({
439
+ id: 'resp-2',
440
+ choices: [{ message: { content: 'Response 2' } }],
441
+ usage: { prompt_tokens: 5, completion_tokens: 2, total_tokens: 7 },
442
+ }),
443
+ ];
444
+ globalThis.fetch = async (_url, options) => {
445
+ const body = JSON.parse(options.body);
446
+ requests.push(body);
447
+ return responses[requests.length - 1];
448
+ };
449
+ const model = new OpenRouterModel('mock-model');
450
+ // First turn
451
+ const resp1 = await model.getResponse({
452
+ systemInstructions: 'System',
453
+ input: 'First message',
454
+ });
455
+ // Clear the conversation
456
+ clearOpenRouterConversations(resp1.responseId);
457
+ // Second turn with previousResponseId should have no history (cleared)
458
+ await model.getResponse({
459
+ systemInstructions: 'System',
460
+ input: 'Second message',
461
+ previousResponseId: resp1.responseId,
462
+ });
463
+ // Verify second request has no history
464
+ const secondRequest = requests[1];
465
+ t.deepEqual(secondRequest.messages, [
466
+ { role: 'system', content: 'System' },
467
+ { role: 'user', content: 'Second message' },
468
+ ]);
469
+ });
470
+ test.serial('previousResponseId works with streaming responses', async (t) => {
471
+ const requests = [];
472
+ const encoder = new TextEncoder();
473
+ const createStream = (responseId, content) => new ReadableStream({
474
+ start(controller) {
475
+ controller.enqueue(encoder.encode(`data: {"id":"${responseId}","choices":[{"delta":{"content":"${content}"}}]}\n`));
476
+ controller.enqueue(encoder.encode('data: [DONE]\n'));
477
+ controller.close();
478
+ },
479
+ });
480
+ const responses = [
481
+ new Response(createStream('resp-1', 'Streaming response 1'), {
482
+ status: 200,
483
+ headers: { 'Content-Type': 'text/event-stream' },
484
+ }),
485
+ new Response(createStream('resp-2', 'Streaming response 2'), {
486
+ status: 200,
487
+ headers: { 'Content-Type': 'text/event-stream' },
488
+ }),
489
+ ];
490
+ globalThis.fetch = async (_url, options) => {
491
+ const body = JSON.parse(options.body);
492
+ requests.push(body);
493
+ return responses[requests.length - 1];
494
+ };
495
+ const model = new OpenRouterModel('mock-model');
496
+ // First turn with streaming - use a conversation ID to enable history storage
497
+ const events1 = [];
498
+ for await (const event of model.getStreamedResponse({
499
+ systemInstructions: 'System',
500
+ input: 'First message',
501
+ previousResponseId: 'conv-1', // Start with a conversation ID
502
+ })) {
503
+ events1.push(event);
504
+ }
505
+ t.true(events1.length > 0);
506
+ const responseDone1 = events1.find(e => e.type === 'response_done');
507
+ t.truthy(responseDone1);
508
+ // When previousResponseId is provided, it's used as the responseId in streaming
509
+ t.is(responseDone1.response.id, 'conv-1');
510
+ // Second turn with streaming - use previousResponseId from first turn
511
+ const events2 = [];
512
+ for await (const event of model.getStreamedResponse({
513
+ systemInstructions: 'System',
514
+ input: 'Second message',
515
+ previousResponseId: responseDone1.response.id,
516
+ })) {
517
+ events2.push(event);
518
+ }
519
+ t.true(events2.length > 0);
520
+ const responseDone2 = events2.find(e => e.type === 'response_done');
521
+ t.truthy(responseDone2);
522
+ // Same conversation ID is reused
523
+ t.is(responseDone2.response.id, 'conv-1');
524
+ // Verify second request includes history from first streaming turn
525
+ const secondRequest = requests[1];
526
+ t.deepEqual(secondRequest.messages, [
527
+ { role: 'system', content: 'System' },
528
+ { role: 'user', content: 'First message' },
529
+ { role: 'assistant', content: 'Streaming response 1' },
530
+ { role: 'user', content: 'Second message' },
531
+ ]);
532
+ });
533
+ //# sourceMappingURL=openrouter.history.test.js.map