@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,48 @@
1
+ import test from 'ava';
2
+ import { areMessageListsEqual } from './message-utils.js';
3
+ test('areMessageListsEqual returns true for same content with new array refs', t => {
4
+ const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
5
+ const messagesB = [{ id: 1, sender: 'bot', text: 'Hello' }];
6
+ t.true(areMessageListsEqual(messagesA, messagesB));
7
+ });
8
+ test('areMessageListsEqual returns false when text changes', t => {
9
+ const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
10
+ const messagesB = [{ id: 1, sender: 'bot', text: 'Hello!' }];
11
+ t.false(areMessageListsEqual(messagesA, messagesB));
12
+ });
13
+ test('areMessageListsEqual returns false when command output changes', t => {
14
+ const messagesA = [
15
+ {
16
+ id: 'cmd-1',
17
+ sender: 'command',
18
+ status: 'completed',
19
+ command: 'ls',
20
+ output: 'file-a',
21
+ success: true,
22
+ toolName: 'shell',
23
+ toolArgs: { command: 'ls' },
24
+ },
25
+ ];
26
+ const messagesB = [
27
+ {
28
+ id: 'cmd-1',
29
+ sender: 'command',
30
+ status: 'completed',
31
+ command: 'ls',
32
+ output: 'file-a\nfile-b',
33
+ success: true,
34
+ toolName: 'shell',
35
+ toolArgs: { command: 'ls' },
36
+ },
37
+ ];
38
+ t.false(areMessageListsEqual(messagesA, messagesB));
39
+ });
40
+ test('areMessageListsEqual returns false when length differs', t => {
41
+ const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
42
+ const messagesB = [
43
+ { id: 1, sender: 'bot', text: 'Hello' },
44
+ { id: 2, sender: 'bot', text: 'World' },
45
+ ];
46
+ t.false(areMessageListsEqual(messagesA, messagesB));
47
+ });
48
+ //# sourceMappingURL=message-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-utils.test.js","sourceRoot":"","sources":["../../source/utils/message-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAExD,IAAI,CAAC,wEAAwE,EAAE,CAAC,CAAC,EAAE;IAC/E,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAE1D,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE;IAC7D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;IAE3D,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IACF,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,EAAE;IAC/D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG;QACd,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;QACrC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;KACxC,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Token usage normalization and extraction utilities.
3
+ * Ported from backend/src/lib/utils/usage.js
4
+ */
5
+ export interface NormalizedUsage {
6
+ prompt_tokens?: number;
7
+ completion_tokens?: number;
8
+ total_tokens?: number;
9
+ reasoning_tokens?: number;
10
+ prompt_ms?: number;
11
+ completion_ms?: number;
12
+ }
13
+ export declare function normalizeUsage(usage: any): NormalizedUsage | undefined;
14
+ export declare function extractUsage(payload: any): NormalizedUsage | undefined;
15
+ export declare function formatFooterUsage(usage: NormalizedUsage | null | undefined): string;
16
+ //# sourceMappingURL=token-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.d.ts","sourceRoot":"","sources":["../../source/utils/token-usage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AA6BD,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,eAAe,GAAG,SAAS,CAiFtE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,eAAe,GAAG,SAAS,CAgCtE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAgBnF"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Token usage normalization and extraction utilities.
3
+ * Ported from backend/src/lib/utils/usage.js
4
+ */
5
+ function toNumber(value) {
6
+ if (value == null)
7
+ return undefined;
8
+ const asNumber = Number(value);
9
+ if (!Number.isFinite(asNumber))
10
+ return undefined;
11
+ return asNumber;
12
+ }
13
+ function coalesceNumber(...values) {
14
+ for (const value of values) {
15
+ const num = toNumber(value);
16
+ if (num != null)
17
+ return num;
18
+ }
19
+ return undefined;
20
+ }
21
+ function sumNumbers(...values) {
22
+ let total = 0;
23
+ let found = false;
24
+ for (const value of values) {
25
+ const num = toNumber(value);
26
+ if (num == null)
27
+ continue;
28
+ total += num;
29
+ found = true;
30
+ }
31
+ return found ? total : undefined;
32
+ }
33
+ export function normalizeUsage(usage) {
34
+ if (!usage || typeof usage !== 'object')
35
+ return undefined;
36
+ const promptTokens = coalesceNumber(usage.prompt_tokens, usage.input_tokens, usage.input_token_count, usage.prompt_token_count, usage.promptTokenCount, usage.inputTokenCount, usage.inputTokens, // Agents SDK
37
+ usage.prompt_n !== undefined && usage.prompt_n != null
38
+ ? (toNumber(usage.cache_n) || 0) + toNumber(usage.prompt_n)
39
+ : undefined);
40
+ const completionTokens = coalesceNumber(usage.completion_tokens, usage.output_tokens, usage.output_token_count, usage.completion_token_count, usage.candidatesTokenCount, usage.outputTokenCount, usage.outputTokens, // Agents SDK
41
+ usage.predicted_n);
42
+ const cacheCreationTokens = coalesceNumber(usage.cache_creation_input_tokens, usage.cacheCreationInputTokens);
43
+ const cacheReadTokens = coalesceNumber(usage.cache_read_input_tokens, usage.cacheReadInputTokens);
44
+ const totalTokens = coalesceNumber(usage.total_tokens, usage.total_token_count, usage.totalTokenCount, usage.totalTokens) ??
45
+ sumNumbers(promptTokens, completionTokens, cacheCreationTokens, cacheReadTokens);
46
+ const reasoningTokens = coalesceNumber(usage.reasoning_tokens, usage.reasoning_token_count, usage?.completion_tokens_details?.reasoning_tokens, usage?.output_tokens_details?.reasoning_tokens, usage.thoughtsTokenCount, usage.thoughts_token_count);
47
+ const promptMs = coalesceNumber(usage.prompt_ms, usage.promptMs);
48
+ const completionMs = coalesceNumber(usage.completion_ms, usage.completionMs, usage.predicted_ms, usage.predictedMs, usage.output_ms, usage.outputMs);
49
+ const mapped = {};
50
+ if (promptTokens != null)
51
+ mapped.prompt_tokens = promptTokens;
52
+ if (completionTokens != null)
53
+ mapped.completion_tokens = completionTokens;
54
+ if (totalTokens != null)
55
+ mapped.total_tokens = totalTokens;
56
+ if (reasoningTokens != null)
57
+ mapped.reasoning_tokens = reasoningTokens;
58
+ if (promptMs != null)
59
+ mapped.prompt_ms = promptMs;
60
+ if (completionMs != null)
61
+ mapped.completion_ms = completionMs;
62
+ return Object.keys(mapped).length > 0 ? mapped : undefined;
63
+ }
64
+ export function extractUsage(payload) {
65
+ if (!payload || typeof payload !== 'object')
66
+ return undefined;
67
+ const results = [];
68
+ const direct = normalizeUsage(payload.usage);
69
+ if (direct)
70
+ results.push(direct);
71
+ const metadata = normalizeUsage(payload.usageMetadata || payload.usage_metadata);
72
+ if (metadata)
73
+ results.push(metadata);
74
+ const nested = normalizeUsage(payload.response?.usage);
75
+ if (nested)
76
+ results.push(nested);
77
+ const timings = normalizeUsage(payload.timings);
78
+ if (timings)
79
+ results.push(timings);
80
+ // Fallback search for any usage field in the payload itself
81
+ const self = normalizeUsage(payload);
82
+ if (self)
83
+ results.push(self);
84
+ if (results.length === 0)
85
+ return undefined;
86
+ const merged = {};
87
+ for (let i = results.length - 1; i >= 0; i--) {
88
+ Object.assign(merged, results[i]);
89
+ }
90
+ // Re-normalize to fix up computed total_tokens if components were merged from different sources
91
+ return normalizeUsage(merged);
92
+ }
93
+ export function formatFooterUsage(usage) {
94
+ if (!usage)
95
+ return '';
96
+ const parts = [];
97
+ if (usage.prompt_tokens != null) {
98
+ parts.push(`${usage.prompt_tokens.toLocaleString()} in`);
99
+ }
100
+ if (usage.completion_tokens != null) {
101
+ parts.push(`${usage.completion_tokens.toLocaleString()} out`);
102
+ }
103
+ if (usage.total_tokens != null) {
104
+ parts.push(`${usage.total_tokens.toLocaleString()} total`);
105
+ }
106
+ if (parts.length === 0)
107
+ return '';
108
+ return `Tok: ${parts.join(' / ')}`;
109
+ }
110
+ //# sourceMappingURL=token-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.js","sourceRoot":"","sources":["../../source/utils/token-usage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,SAAS,QAAQ,CAAC,KAAc;IAC5B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,GAAG,MAAiB;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,GAAG,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,GAAG,MAAiB;IACpC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,GAAG,IAAI,IAAI;YAAE,SAAS;QAC1B,KAAK,IAAI,GAAG,CAAC;QACb,KAAK,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAU;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE1D,MAAM,YAAY,GAAG,cAAc,CAC/B,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,kBAAkB,EACxB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,WAAW,EAAE,aAAa;IAChC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI;QAClD,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAE;QAC5D,CAAC,CAAC,SAAS,CAClB,CAAC;IAEF,MAAM,gBAAgB,GAAG,cAAc,CACnC,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,kBAAkB,EACxB,KAAK,CAAC,sBAAsB,EAC5B,KAAK,CAAC,oBAAoB,EAC1B,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,YAAY,EAAE,aAAa;IACjC,KAAK,CAAC,WAAW,CACpB,CAAC;IAEF,MAAM,mBAAmB,GAAG,cAAc,CACtC,KAAK,CAAC,2BAA2B,EACjC,KAAK,CAAC,wBAAwB,CACjC,CAAC;IAEF,MAAM,eAAe,GAAG,cAAc,CAClC,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,oBAAoB,CAC7B,CAAC;IAEF,MAAM,WAAW,GACb,cAAc,CACV,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,WAAW,CACpB;QACD,UAAU,CACN,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,CAClB,CAAC;IAEN,MAAM,eAAe,GAAG,cAAc,CAClC,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,qBAAqB,EAC3B,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAClD,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAC9C,KAAK,CAAC,kBAAkB,EACxB,KAAK,CAAC,oBAAoB,CAC7B,CAAC;IAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,cAAc,CAC/B,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,CACjB,CAAC;IAEF,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,IAAI,YAAY,IAAI,IAAI;QAAE,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC;IAC9D,IAAI,gBAAgB,IAAI,IAAI;QACxB,MAAM,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;IAChD,IAAI,WAAW,IAAI,IAAI;QAAE,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC;IAC3D,IAAI,eAAe,IAAI,IAAI;QAAE,MAAM,CAAC,gBAAgB,GAAG,eAAe,CAAC;IACvE,IAAI,QAAQ,IAAI,IAAI;QAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;IAClD,IAAI,YAAY,IAAI,IAAI;QAAE,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC;IAE9D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAY;IACrC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE9D,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,cAAc,CAC3B,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,cAAc,CAClD,CAAC;IACF,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEnC,4DAA4D;IAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,gGAAgG;IAChG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAyC;IACvE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token-usage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.test.d.ts","sourceRoot":"","sources":["../../source/utils/token-usage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import test from 'ava';
2
+ import { normalizeUsage, extractUsage, formatFooterUsage } from './token-usage.js';
3
+ test('normalizeUsage handles multiple formats', t => {
4
+ // OpenAI style
5
+ t.deepEqual(normalizeUsage({ prompt_tokens: 10, completion_tokens: 20, total_tokens: 30 }), {
6
+ prompt_tokens: 10,
7
+ completion_tokens: 20,
8
+ total_tokens: 30
9
+ });
10
+ // Agents SDK style
11
+ t.deepEqual(normalizeUsage({ inputTokens: 5, outputTokens: 15, totalTokens: 20 }), {
12
+ prompt_tokens: 5,
13
+ completion_tokens: 15,
14
+ total_tokens: 20
15
+ });
16
+ // Mixed/partial
17
+ t.deepEqual(normalizeUsage({ input_tokens: 100 }), {
18
+ prompt_tokens: 100,
19
+ total_tokens: 100
20
+ });
21
+ });
22
+ test('extractUsage finds usage in nested locations', t => {
23
+ const payload = {
24
+ usage: { prompt_tokens: 1, total_tokens: 3 },
25
+ response: { usage: { completion_tokens: 2, total_tokens: 3 } }
26
+ };
27
+ t.deepEqual(extractUsage(payload), {
28
+ prompt_tokens: 1,
29
+ completion_tokens: 2,
30
+ total_tokens: 3
31
+ });
32
+ });
33
+ test('formatFooterUsage returns formatted string', t => {
34
+ t.is(formatFooterUsage({ prompt_tokens: 1200, completion_tokens: 350, total_tokens: 1550 }), 'Tok: 1,200 in / 350 out / 1,550 total');
35
+ t.is(formatFooterUsage({ total_tokens: 100 }), 'Tok: 100 total');
36
+ t.is(formatFooterUsage(null), '');
37
+ });
38
+ //# sourceMappingURL=token-usage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-usage.test.js","sourceRoot":"","sources":["../../source/utils/token-usage.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAEjF,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE;IAChD,eAAe;IACf,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAC,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAC,CAAC,EAAE;QACtF,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;KACnB,CAAC,CAAC;IAEH,mBAAmB;IACnB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAC,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAC,CAAC,EAAE;QAC7E,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,EAAE;KACnB,CAAC,CAAC;IAEH,gBAAgB;IAChB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAC,YAAY,EAAE,GAAG,EAAC,CAAC,EAAE;QAC7C,aAAa,EAAE,GAAG;QAClB,YAAY,EAAE,GAAG;KACpB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,CAAC,CAAC,EAAE;IACrD,MAAM,OAAO,GAAG;QACZ,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;QAC5C,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;KACjE,CAAC;IACF,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;QAC/B,aAAa,EAAE,CAAC;QAChB,iBAAiB,EAAE,CAAC;QACpB,YAAY,EAAE,CAAC;KAClB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,EAAE;IACnD,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAC,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAC,CAAC,EAAE,uCAAuC,CAAC,CAAC;IACpI,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAC,YAAY,EAAE,GAAG,EAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC/D,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const trimToolOutput: (output: unknown, maxLines?: number, maxCharacters?: number) => string;
2
+ //# sourceMappingURL=trim-tool-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-tool-output.d.ts","sourceRoot":"","sources":["../../source/utils/trim-tool-output.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,cAAc,GACvB,QAAQ,OAAO,EACf,WAAW,MAAM,EACjB,gBAAgB,MAAM,KACvB,MAgBF,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { trimOutput } from './output-trim.js';
2
+ const tryParseJson = (value) => {
3
+ if (!value.trim()) {
4
+ return null;
5
+ }
6
+ try {
7
+ return JSON.parse(value);
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ };
13
+ const trimStringValue = (value, maxLines, maxCharacters) => {
14
+ if (!value) {
15
+ return value;
16
+ }
17
+ return trimOutput(value, maxLines, maxCharacters);
18
+ };
19
+ const trimJsonStrings = (value, maxLines, maxCharacters) => {
20
+ if (typeof value === 'string') {
21
+ return trimStringValue(value, maxLines, maxCharacters);
22
+ }
23
+ if (Array.isArray(value)) {
24
+ return value.map(entry => trimJsonStrings(entry, maxLines, maxCharacters));
25
+ }
26
+ if (value && typeof value === 'object') {
27
+ const record = value;
28
+ const next = {};
29
+ for (const [key, entry] of Object.entries(record)) {
30
+ next[key] = trimJsonStrings(entry, maxLines, maxCharacters);
31
+ }
32
+ return next;
33
+ }
34
+ return value;
35
+ };
36
+ export const trimToolOutput = (output, maxLines, maxCharacters) => {
37
+ if (typeof output !== 'string') {
38
+ return String(output ?? '');
39
+ }
40
+ const parsed = tryParseJson(output);
41
+ if (parsed !== null) {
42
+ const trimmed = trimJsonStrings(parsed, maxLines, maxCharacters);
43
+ try {
44
+ return JSON.stringify(trimmed);
45
+ }
46
+ catch {
47
+ return trimStringValue(output, maxLines, maxCharacters);
48
+ }
49
+ }
50
+ return trimStringValue(output, maxLines, maxCharacters);
51
+ };
52
+ //# sourceMappingURL=trim-tool-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trim-tool-output.js","sourceRoot":"","sources":["../../source/utils/trim-tool-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAE5C,MAAM,YAAY,GAAG,CAAC,KAAa,EAAkB,EAAE;IACnD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,KAAa,EACb,QAAiB,EACjB,aAAsB,EAChB,EAAE;IACR,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,KAAc,EACd,QAAiB,EACjB,aAAsB,EACf,EAAE;IACT,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACrB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAClD,CAAC;IACN,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,MAAe,EACf,QAAiB,EACjB,aAAsB,EAChB,EAAE;IACR,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC;IACL,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC5D,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qduc/term2",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "A terminal-based AI assistant that can help you get things done on your computer",
5
5
  "license": "MIT",
6
6
  "author": "qduc",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "type": "module",
29
29
  "engines": {
30
- "node": ">=16"
30
+ "node": ">=20"
31
31
  },
32
32
  "scripts": {
33
33
  "start": "node dist/cli.js",
@@ -46,20 +46,24 @@
46
46
  "dist"
47
47
  ],
48
48
  "dependencies": {
49
+ "@mozilla/readability": "^0.6.0",
49
50
  "@openai/agents": "^0.4.3",
51
+ "@qduc/web-fetch": "^0.1.0",
50
52
  "@types/ssh2": "^1.15.5",
51
53
  "bash-parser": "^0.5.0",
52
54
  "env-paths": "^3.0.0",
53
55
  "fast-glob": "^3.3.2",
54
56
  "fuse.js": "^7.0.0",
55
57
  "ignore": "^5.3.2",
56
- "ink": "^6.5.1",
58
+ "ink": "^6.6.0",
57
59
  "ink-prompt": "^0.1.7",
60
+ "jsdom": "^27.4.0",
58
61
  "marked": "^17.0.1",
59
62
  "meow": "^11.0.0",
60
63
  "openai": "^6.9.1",
61
64
  "react": "^19.0.0",
62
65
  "ssh2": "^1.17.0",
66
+ "turndown": "^7.2.2",
63
67
  "winston": "^3.18.3",
64
68
  "winston-daily-rotate-file": "^5.0.0",
65
69
  "zod": "^4.1.13"
@@ -69,9 +73,12 @@
69
73
  "@babel/cli": "^7.21.0",
70
74
  "@babel/preset-react": "^7.18.6",
71
75
  "@types/env-paths": "^1.0.2",
76
+ "@types/jsdom": "^27.0.0",
72
77
  "@types/marked": "^5.0.2",
78
+ "@types/mozilla-readability": "^0.2.1",
73
79
  "@types/node": "^24.10.1",
74
80
  "@types/react": "^19.0.0",
81
+ "@types/turndown": "^5.0.6",
75
82
  "ava": "^6.4.1",
76
83
  "chalk": "^5.2.0",
77
84
  "eslint-config-xo-react": "^0.27.0",
package/readme.md CHANGED
@@ -5,13 +5,16 @@
5
5
 
6
6
  A powerful terminal-based AI assistant that helps you get things done on your computer through natural conversation.
7
7
 
8
+ **Why term2?** Unlike proprietary alternatives, term2 is **open-source (MIT)**, works with **any AI provider** (OpenAI, OpenRouter, local self-hosted, etc.), requires **no subscription**, and uniquely supports **remote server management via SSH** — all while giving you full control over what commands execute on your system.
9
+
8
10
  ## Demo
9
11
 
10
12
  https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
11
13
 
12
14
  ## Features
13
15
 
14
- - 🎭 **Three Operating Modes** - Default (full-power), Lite (fast & safe), and Mentor (collaborative problem-solving)
16
+ - 🎭 **Three Operating Modes** - Default (full-power), Lite (fast & safe), and Mentor (get help from a smarter model on complex problems)
17
+ - 🌍 **Open Source** - MIT licensed, hackable, auditable, community-driven
15
18
  - 🤖 **Multi-Provider Support** - Works with OpenAI, OpenRouter, and OpenAI-compatible APIs
16
19
  - 🔒 **Safe Execution** - Every command requires your explicit approval with diff preview
17
20
  - 🛠️ **Advanced Tools** - Shell execution, file patching, search/replace, grep, find files, file reading, web search, and mentor consultation
@@ -24,6 +27,24 @@ https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
24
27
  - 🔄 **Retry Logic** - Automatic recovery from tool hallucinations and upstream errors
25
28
  - 🌐 **SSH Mode** - Execute commands and edit files on remote servers over SSH
26
29
 
30
+ ## Why term2 vs Alternatives?
31
+
32
+ | | **term2** | Claude Code | Warp |
33
+ |---|:---:|:---:|:---:|
34
+ | **Open Source** | ✅ MIT | ❌ Proprietary | ❌ Proprietary |
35
+ | **Cost** | Pay-per-use | $20-200/mo | Freemium |
36
+ | **AI Providers** | Any (OpenAI, OpenRouter, local, etc.) | Anthropic only | selected models only |
37
+ | **SSH Remote** | ✅ Native | ❌ No | ✅ Yes |
38
+ | **Mentor Mode** | ✅ Built-in | ❌ No | ❌ No |
39
+ | **Self-Hostable** | ✅ | ❌ | ❌ |
40
+
41
+ **term2 gives you:**
42
+ - **Freedom** — No vendor lock-in. Use any AI provider or model you prefer.
43
+ - **Transparency** — Open source means you can audit every line of code.
44
+ - **Cost Control** — Pay only for API usage, no monthly subscriptions.
45
+ - **Remote Work** — Troubleshoot and manage remote servers without installing anything on remote hosts.
46
+ - **Safety** — Every command requires explicit approval with diff previews before execution.
47
+
27
48
  ## Installation
28
49
 
29
50
  **Requirements:**
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=agent.lite-mode.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.lite-mode.test.d.ts","sourceRoot":"","sources":["../source/agent.lite-mode.test.ts"],"names":[],"mappings":""}
@@ -1,39 +0,0 @@
1
- import test from 'ava';
2
- import { getAgentDefinition } from './agent.js';
3
- const mockSettings = (lite) => ({
4
- get: (key) => {
5
- if (key === 'app.liteMode')
6
- return lite;
7
- if (key === 'agent.model')
8
- return 'gpt-4';
9
- return undefined;
10
- },
11
- set: () => { },
12
- on: () => { },
13
- off: () => { },
14
- getAll: () => ({}),
15
- });
16
- const mockLogging = {};
17
- test('getAgentDefinition in lite mode should include web_search tool', t => {
18
- const deps = {
19
- settingsService: mockSettings(true),
20
- loggingService: mockLogging,
21
- };
22
- const agent = getAgentDefinition(deps, 'gpt-4');
23
- const toolNames = agent.tools.map(tool => tool.name);
24
- t.true(toolNames.includes('shell'));
25
- t.true(toolNames.includes('read_file'));
26
- t.true(toolNames.includes('find_files'));
27
- t.true(toolNames.includes('grep'));
28
- t.true(toolNames.includes('web_search'), 'web_search should be included in lite mode');
29
- });
30
- test('getAgentDefinition in non-lite mode should include web_search tool', t => {
31
- const deps = {
32
- settingsService: mockSettings(false),
33
- loggingService: mockLogging,
34
- };
35
- const agent = getAgentDefinition(deps, 'gpt-4');
36
- const toolNames = agent.tools.map(tool => tool.name);
37
- t.true(toolNames.includes('web_search'), 'web_search should be included in full mode');
38
- });
39
- //# sourceMappingURL=agent.lite-mode.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.lite-mode.test.js","sourceRoot":"","sources":["../source/agent.lite-mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhD,MAAM,YAAY,GAAG,CAAC,IAAa,EAAoB,EAAE,CAAC,CAAC;IACvD,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE;QACjB,IAAI,GAAG,KAAK,cAAc;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,OAAO,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;IACb,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC;IACZ,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;CACW,CAAA,CAAC;AAElC,MAAM,WAAW,GAAG,EAAgC,CAAC;AAErD,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,IAAI,GAAG;QACT,eAAe,EAAE,YAAY,CAAC,IAAI,CAAC;QACnC,cAAc,EAAE,WAAW;KAC9B,CAAC;IACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,4CAA4C,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,CAAC,CAAC,EAAE;IAC3E,MAAM,IAAI,GAAG;QACT,eAAe,EAAE,YAAY,CAAC,KAAK,CAAC;QACpC,cAAc,EAAE,WAAW;KAC9B,CAAC;IACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,4CAA4C,CAAC,CAAC;AAC3F,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=debug_ask_mentor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug_ask_mentor.d.ts","sourceRoot":"","sources":["../source/debug_ask_mentor.ts"],"names":[],"mappings":""}
@@ -1,73 +0,0 @@
1
- import { OpenAIAgentClient } from './lib/openai-agent-client.js';
2
- import { registerProvider } from './providers/registry.js';
3
- // Mock Logger
4
- const mockLogger = {
5
- debug: () => { },
6
- info: () => { },
7
- warn: () => { },
8
- error: console.error,
9
- setCorrelationId: () => { },
10
- clearCorrelationId: () => { },
11
- log: () => { },
12
- };
13
- // Mock Settings
14
- const mockSettings = {
15
- get: (key) => {
16
- if (key === 'agent.provider')
17
- return 'mock-provider';
18
- if (key === 'agent.model')
19
- return 'mock-model';
20
- if (key === 'agent.mentorModel')
21
- return 'mock-mentor';
22
- return undefined;
23
- },
24
- set: () => { },
25
- onChange: () => { },
26
- };
27
- // Mock Runner
28
- class MockRunner {
29
- async run(agent, input, options) {
30
- console.log('MockRunner.run called');
31
- // Return a result similar to what might be causing issues
32
- // Missing finalOutput, but maybe has messages or text
33
- return {
34
- status: 'completed',
35
- messages: [{ role: 'assistant', content: 'This is the answer' }],
36
- // finalOutput is missing!
37
- };
38
- }
39
- }
40
- // Register Mock Provider
41
- registerProvider({
42
- id: 'mock-provider',
43
- label: 'Mock Provider',
44
- createRunner: () => new MockRunner(),
45
- fetchModels: async () => [{ id: 'mock-model' }, { id: 'mock-mentor' }],
46
- });
47
- async function main() {
48
- console.log('Starting debug script...');
49
- try {
50
- const client = new OpenAIAgentClient({
51
- deps: {
52
- logger: mockLogger,
53
- settings: mockSettings,
54
- }
55
- });
56
- console.log('Client initialized. Calling chat...');
57
- const response = await client.chat('Hello');
58
- console.log('Chat response:', response);
59
- if (response === 'This is the answer') {
60
- console.log('SUCCESS: Got expected response from messages fallback.');
61
- }
62
- else {
63
- console.error('FAILURE: Response did not match expected.');
64
- process.exit(1);
65
- }
66
- }
67
- catch (e) {
68
- console.log('Caught UNEXPECTED error:', e.message);
69
- process.exit(1);
70
- }
71
- }
72
- main().catch(console.error);
73
- //# sourceMappingURL=debug_ask_mentor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug_ask_mentor.js","sourceRoot":"","sources":["../source/debug_ask_mentor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,cAAc;AACd,MAAM,UAAU,GAAoB;IAChC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC1B,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC5B,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;CACT,CAAC;AAET,gBAAgB;AAChB,MAAM,YAAY,GAAqB;IACnC,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE;QACjB,IAAI,GAAG,KAAK,gBAAgB;YAAE,OAAO,eAAe,CAAC;QACrD,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,YAAY,CAAC;QAC/C,IAAI,GAAG,KAAK,mBAAmB;YAAE,OAAO,aAAa,CAAC;QACtD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;IACb,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;CACd,CAAC;AAET,cAAc;AACd,MAAM,UAAU;IACZ,KAAK,CAAC,GAAG,CAAC,KAAU,EAAE,KAAU,EAAE,OAAY;QAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,0DAA0D;QAC1D,sDAAsD;QACtD,OAAO;YACH,MAAM,EAAE,WAAW;YACnB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;YAChE,0BAA0B;SAC7B,CAAC;IACN,CAAC;CACJ;AAED,yBAAyB;AACzB,gBAAgB,CAAC;IACb,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,eAAe;IACtB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,UAAU,EAAS;IAC3C,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;CACzE,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;YACjC,IAAI,EAAE;gBACF,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,YAAY;aACzB;SACJ,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Command index utilities for companion mode.
3
- * Generates lightweight command summaries for AI context.
4
- */
5
- import type { CommandIndexEntry } from './context-buffer.js';
6
- /**
7
- * Format command index entries for inclusion in AI system prompt.
8
- * Produces a compact, readable representation that uses minimal tokens.
9
- *
10
- * Example output:
11
- * [0] npm test ✗ exit:1 5s ago (542 lines)
12
- * [1] git diff ✓ exit:0 30s ago (23 lines)
13
- * [2] npm install ✓ exit:0 2m ago (891 lines)
14
- */
15
- export declare function formatCommandIndex(entries: CommandIndexEntry[]): string;
16
- /**
17
- * Generate system prompt section for command index.
18
- * This is always included in companion mode AI context.
19
- */
20
- export declare function generateCommandIndexPrompt(entries: CommandIndexEntry[]): string;
21
- /**
22
- * Estimate token count for command index.
23
- * Rough approximation: ~4 characters per token.
24
- */
25
- export declare function estimateTokens(entries: CommandIndexEntry[]): number;
26
- //# sourceMappingURL=command-index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-index.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/command-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAYvE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,iBAAiB,EAAE,GAC7B,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAGnE"}
@@ -1,50 +0,0 @@
1
- /**
2
- * Command index utilities for companion mode.
3
- * Generates lightweight command summaries for AI context.
4
- */
5
- /**
6
- * Format command index entries for inclusion in AI system prompt.
7
- * Produces a compact, readable representation that uses minimal tokens.
8
- *
9
- * Example output:
10
- * [0] npm test ✗ exit:1 5s ago (542 lines)
11
- * [1] git diff ✓ exit:0 30s ago (23 lines)
12
- * [2] npm install ✓ exit:0 2m ago (891 lines)
13
- */
14
- export function formatCommandIndex(entries) {
15
- if (entries.length === 0) {
16
- return 'No recent commands.';
17
- }
18
- return entries
19
- .map(entry => {
20
- const status = entry.exitCode === 0 ? '✓' : '✗';
21
- const cmd = entry.command.padEnd(25).slice(0, 25);
22
- return `[${entry.index}] ${cmd} ${status} exit:${entry.exitCode} ${entry.relativeTime} (${entry.outputLines} lines)`;
23
- })
24
- .join('\n');
25
- }
26
- /**
27
- * Generate system prompt section for command index.
28
- * This is always included in companion mode AI context.
29
- */
30
- export function generateCommandIndexPrompt(entries) {
31
- const indexSection = formatCommandIndex(entries);
32
- return `
33
- ## Terminal Context
34
-
35
- You are observing the user's terminal session. Here are the recent commands:
36
-
37
- ${indexSection}
38
-
39
- Use the terminal_history tool to fetch detailed output when needed.
40
- `;
41
- }
42
- /**
43
- * Estimate token count for command index.
44
- * Rough approximation: ~4 characters per token.
45
- */
46
- export function estimateTokens(entries) {
47
- const formatted = formatCommandIndex(entries);
48
- return Math.ceil(formatted.length / 4);
49
- }
50
- //# sourceMappingURL=command-index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-index.js","sourceRoot":"","sources":["../../../source/modes/companion/command-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAED,OAAO,OAAO;SACT,GAAG,CAAC,KAAK,CAAC,EAAE;QACT,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,MAAM,SAAS,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,WAAW,SAAS,CAAC;IAC3H,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACtC,OAA4B;IAE5B,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAEjD,OAAO;;;;;EAKT,YAAY;;;CAGb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4B;IACvD,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=command-index.test.d.ts.map