@qduc/term2 0.3.0 → 0.3.1

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 (230) hide show
  1. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  2. package/dist/hooks/use-model-selection.js +32 -11
  3. package/dist/hooks/use-model-selection.js.map +1 -1
  4. package/dist/hooks/use-model-selection.test.js +107 -10
  5. package/dist/hooks/use-model-selection.test.js.map +1 -1
  6. package/dist/providers/ai-sdk-message-normalizer.d.ts +8 -0
  7. package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -0
  8. package/dist/providers/ai-sdk-message-normalizer.js +70 -0
  9. package/dist/providers/ai-sdk-message-normalizer.js.map +1 -0
  10. package/dist/providers/ai-sdk-message-normalizer.test.d.ts +2 -0
  11. package/dist/providers/ai-sdk-message-normalizer.test.d.ts.map +1 -0
  12. package/dist/providers/ai-sdk-message-normalizer.test.js +195 -0
  13. package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -0
  14. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
  15. package/dist/providers/ai-sdk-openai-compatible.provider.js +2 -1
  16. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
  17. package/dist/providers/ai-sdk-openrouter.provider.d.ts +16 -0
  18. package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -0
  19. package/dist/providers/ai-sdk-openrouter.provider.js +22 -0
  20. package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -0
  21. package/dist/providers/ai-sdk-openrouter.provider.test.d.ts +2 -0
  22. package/dist/providers/ai-sdk-openrouter.provider.test.d.ts.map +1 -0
  23. package/dist/providers/ai-sdk-openrouter.provider.test.js +70 -0
  24. package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -0
  25. package/dist/providers/openrouter.provider.js +4 -3
  26. package/dist/providers/openrouter.provider.js.map +1 -1
  27. package/dist/scripts/eval-auto-approval/dataset.d.ts +1 -1
  28. package/dist/services/stream-event-parsing.js +1 -1
  29. package/dist/services/stream-event-parsing.js.map +1 -1
  30. package/dist/services/stream-event-parsing.test.js +13 -0
  31. package/dist/services/stream-event-parsing.test.js.map +1 -1
  32. package/package.json +2 -1
  33. package/readme.md +29 -24
  34. package/dist/agent.lite-mode.test.d.ts +0 -2
  35. package/dist/agent.lite-mode.test.d.ts.map +0 -1
  36. package/dist/agent.lite-mode.test.js +0 -39
  37. package/dist/agent.lite-mode.test.js.map +0 -1
  38. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
  39. package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
  40. package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
  41. package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
  42. package/dist/components/TextInput.d.ts +0 -42
  43. package/dist/components/TextInput.d.ts.map +0 -1
  44. package/dist/components/TextInput.js +0 -398
  45. package/dist/components/TextInput.js.map +0 -1
  46. package/dist/components/TextInput.test.d.ts +0 -2
  47. package/dist/components/TextInput.test.d.ts.map +0 -1
  48. package/dist/components/TextInput.test.js +0 -75
  49. package/dist/components/TextInput.test.js.map +0 -1
  50. package/dist/debug_ask_mentor.d.ts +0 -2
  51. package/dist/debug_ask_mentor.d.ts.map +0 -1
  52. package/dist/debug_ask_mentor.js +0 -73
  53. package/dist/debug_ask_mentor.js.map +0 -1
  54. package/dist/lib/shell.d.ts +0 -7
  55. package/dist/lib/shell.d.ts.map +0 -1
  56. package/dist/lib/shell.js +0 -56
  57. package/dist/lib/shell.js.map +0 -1
  58. package/dist/modes/companion/command-index.d.ts +0 -26
  59. package/dist/modes/companion/command-index.d.ts.map +0 -1
  60. package/dist/modes/companion/command-index.js +0 -50
  61. package/dist/modes/companion/command-index.js.map +0 -1
  62. package/dist/modes/companion/command-index.test.d.ts +0 -2
  63. package/dist/modes/companion/command-index.test.d.ts.map +0 -1
  64. package/dist/modes/companion/command-index.test.js +0 -86
  65. package/dist/modes/companion/command-index.test.js.map +0 -1
  66. package/dist/modes/companion/companion-app.d.ts +0 -12
  67. package/dist/modes/companion/companion-app.d.ts.map +0 -1
  68. package/dist/modes/companion/companion-app.js +0 -297
  69. package/dist/modes/companion/companion-app.js.map +0 -1
  70. package/dist/modes/companion/companion-session.d.ts +0 -63
  71. package/dist/modes/companion/companion-session.d.ts.map +0 -1
  72. package/dist/modes/companion/companion-session.js +0 -146
  73. package/dist/modes/companion/companion-session.js.map +0 -1
  74. package/dist/modes/companion/companion-session.test.d.ts +0 -2
  75. package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
  76. package/dist/modes/companion/companion-session.test.js +0 -28
  77. package/dist/modes/companion/companion-session.test.js.map +0 -1
  78. package/dist/modes/companion/components/status-bar.d.ts +0 -13
  79. package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
  80. package/dist/modes/companion/components/status-bar.js +0 -26
  81. package/dist/modes/companion/components/status-bar.js.map +0 -1
  82. package/dist/modes/companion/context-buffer.d.ts +0 -65
  83. package/dist/modes/companion/context-buffer.d.ts.map +0 -1
  84. package/dist/modes/companion/context-buffer.js +0 -156
  85. package/dist/modes/companion/context-buffer.js.map +0 -1
  86. package/dist/modes/companion/context-buffer.test.d.ts +0 -2
  87. package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
  88. package/dist/modes/companion/context-buffer.test.js +0 -154
  89. package/dist/modes/companion/context-buffer.test.js.map +0 -1
  90. package/dist/modes/companion/event-detector.d.ts +0 -46
  91. package/dist/modes/companion/event-detector.d.ts.map +0 -1
  92. package/dist/modes/companion/event-detector.js +0 -169
  93. package/dist/modes/companion/event-detector.js.map +0 -1
  94. package/dist/modes/companion/event-detector.test.d.ts +0 -2
  95. package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
  96. package/dist/modes/companion/event-detector.test.js +0 -121
  97. package/dist/modes/companion/event-detector.test.js.map +0 -1
  98. package/dist/modes/companion/index.d.ts +0 -33
  99. package/dist/modes/companion/index.d.ts.map +0 -1
  100. package/dist/modes/companion/index.js +0 -21
  101. package/dist/modes/companion/index.js.map +0 -1
  102. package/dist/modes/companion/input-key-mapper.d.ts +0 -3
  103. package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
  104. package/dist/modes/companion/input-key-mapper.js +0 -31
  105. package/dist/modes/companion/input-key-mapper.js.map +0 -1
  106. package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
  107. package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
  108. package/dist/modes/companion/input-key-mapper.test.js +0 -26
  109. package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
  110. package/dist/modes/companion/input-parser.d.ts +0 -53
  111. package/dist/modes/companion/input-parser.d.ts.map +0 -1
  112. package/dist/modes/companion/input-parser.js +0 -114
  113. package/dist/modes/companion/input-parser.js.map +0 -1
  114. package/dist/modes/companion/input-parser.test.d.ts +0 -2
  115. package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
  116. package/dist/modes/companion/input-parser.test.js +0 -123
  117. package/dist/modes/companion/input-parser.test.js.map +0 -1
  118. package/dist/modes/companion/mode-manager.d.ts +0 -41
  119. package/dist/modes/companion/mode-manager.d.ts.map +0 -1
  120. package/dist/modes/companion/mode-manager.js +0 -56
  121. package/dist/modes/companion/mode-manager.js.map +0 -1
  122. package/dist/modes/companion/mode-manager.test.d.ts +0 -2
  123. package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
  124. package/dist/modes/companion/mode-manager.test.js +0 -65
  125. package/dist/modes/companion/mode-manager.test.js.map +0 -1
  126. package/dist/modes/companion/output-classifier.d.ts +0 -15
  127. package/dist/modes/companion/output-classifier.d.ts.map +0 -1
  128. package/dist/modes/companion/output-classifier.js +0 -77
  129. package/dist/modes/companion/output-classifier.js.map +0 -1
  130. package/dist/modes/companion/output-classifier.test.d.ts +0 -2
  131. package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
  132. package/dist/modes/companion/output-classifier.test.js +0 -133
  133. package/dist/modes/companion/output-classifier.test.js.map +0 -1
  134. package/dist/modes/companion/pty-wrapper.d.ts +0 -46
  135. package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
  136. package/dist/modes/companion/pty-wrapper.js +0 -143
  137. package/dist/modes/companion/pty-wrapper.js.map +0 -1
  138. package/dist/modes/companion/safety-classifier.d.ts +0 -31
  139. package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
  140. package/dist/modes/companion/safety-classifier.js +0 -140
  141. package/dist/modes/companion/safety-classifier.js.map +0 -1
  142. package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
  143. package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
  144. package/dist/modes/companion/safety-classifier.test.js +0 -151
  145. package/dist/modes/companion/safety-classifier.test.js.map +0 -1
  146. package/dist/modes/companion/summarizer.d.ts +0 -24
  147. package/dist/modes/companion/summarizer.d.ts.map +0 -1
  148. package/dist/modes/companion/summarizer.js +0 -132
  149. package/dist/modes/companion/summarizer.js.map +0 -1
  150. package/dist/modes/companion/terminal-history.d.ts +0 -27
  151. package/dist/modes/companion/terminal-history.d.ts.map +0 -1
  152. package/dist/modes/companion/terminal-history.js +0 -142
  153. package/dist/modes/companion/terminal-history.js.map +0 -1
  154. package/dist/prompts/simple-mentor.md +0 -215
  155. package/dist/providers/github-copilot/converters.d.ts +0 -45
  156. package/dist/providers/github-copilot/converters.d.ts.map +0 -1
  157. package/dist/providers/github-copilot/converters.js +0 -118
  158. package/dist/providers/github-copilot/converters.js.map +0 -1
  159. package/dist/providers/github-copilot/converters.test.d.ts +0 -2
  160. package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
  161. package/dist/providers/github-copilot/converters.test.js +0 -162
  162. package/dist/providers/github-copilot/converters.test.js.map +0 -1
  163. package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
  164. package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
  165. package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
  166. package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
  167. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
  168. package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
  169. package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
  170. package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
  171. package/dist/providers/github-copilot/index.d.ts +0 -4
  172. package/dist/providers/github-copilot/index.d.ts.map +0 -1
  173. package/dist/providers/github-copilot/index.js +0 -4
  174. package/dist/providers/github-copilot/index.js.map +0 -1
  175. package/dist/providers/github-copilot/model.d.ts +0 -24
  176. package/dist/providers/github-copilot/model.d.ts.map +0 -1
  177. package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
  178. package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
  179. package/dist/providers/github-copilot/model.delta.test.js +0 -15
  180. package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
  181. package/dist/providers/github-copilot/model.js +0 -498
  182. package/dist/providers/github-copilot/model.js.map +0 -1
  183. package/dist/providers/github-copilot/model.test.d.ts +0 -2
  184. package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
  185. package/dist/providers/github-copilot/model.test.js +0 -63
  186. package/dist/providers/github-copilot/model.test.js.map +0 -1
  187. package/dist/providers/github-copilot/provider.d.ts +0 -15
  188. package/dist/providers/github-copilot/provider.d.ts.map +0 -1
  189. package/dist/providers/github-copilot/provider.js +0 -25
  190. package/dist/providers/github-copilot/provider.js.map +0 -1
  191. package/dist/providers/github-copilot/provider.test.d.ts +0 -2
  192. package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
  193. package/dist/providers/github-copilot/provider.test.js +0 -52
  194. package/dist/providers/github-copilot/provider.test.js.map +0 -1
  195. package/dist/providers/github-copilot/utils.d.ts +0 -20
  196. package/dist/providers/github-copilot/utils.d.ts.map +0 -1
  197. package/dist/providers/github-copilot/utils.js +0 -142
  198. package/dist/providers/github-copilot/utils.js.map +0 -1
  199. package/dist/providers/github-copilot/utils.test.d.ts +0 -2
  200. package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
  201. package/dist/providers/github-copilot/utils.test.js +0 -21
  202. package/dist/providers/github-copilot/utils.test.js.map +0 -1
  203. package/dist/safety-checker.js +0 -57
  204. package/dist/services/check_mock.d.ts +0 -2
  205. package/dist/services/check_mock.d.ts.map +0 -1
  206. package/dist/services/check_mock.js +0 -22
  207. package/dist/services/check_mock.js.map +0 -1
  208. package/dist/services/conversation-service.test.d.ts +0 -2
  209. package/dist/services/conversation-service.test.d.ts.map +0 -1
  210. package/dist/services/conversation-service.test.js +0 -156
  211. package/dist/services/conversation-service.test.js.map +0 -1
  212. package/dist/tools/bash.d.ts +0 -10
  213. package/dist/tools/bash.d.ts.map +0 -1
  214. package/dist/tools/bash.js +0 -55
  215. package/dist/tools/bash.js.map +0 -1
  216. package/dist/utils/command-safety.d.ts +0 -21
  217. package/dist/utils/command-safety.d.ts.map +0 -1
  218. package/dist/utils/command-safety.devnull.test.d.ts +0 -2
  219. package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
  220. package/dist/utils/command-safety.devnull.test.js +0 -13
  221. package/dist/utils/command-safety.devnull.test.js.map +0 -1
  222. package/dist/utils/command-safety.js +0 -348
  223. package/dist/utils/command-safety.js.map +0 -1
  224. package/dist/utils/extract-command-messages.test.d.ts +0 -2
  225. package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
  226. package/dist/utils/extract-command-messages.test.js +0 -64
  227. package/dist/utils/extract-command-messages.test.js.map +0 -1
  228. package/dist/utils/provider-traffic-extractor.repro.test.d.ts +0 -2
  229. package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +0 -1
  230. package/dist/utils/provider-traffic-extractor.repro.test.js.map +0 -1
@@ -0,0 +1,16 @@
1
+ import { type OpenRouterProviderSettings } from '@openrouter/ai-sdk-provider';
2
+ import { type ModelProvider, type Model } from '@openai/agents-core';
3
+ export type AiSdkOpenRouterConfig = Pick<OpenRouterProviderSettings, 'baseURL' | 'apiKey' | 'headers' | 'appName' | 'appUrl'>;
4
+ export type AiSdkOpenRouterProviderFactory = (options: AiSdkOpenRouterConfig & {
5
+ compatibility?: 'strict' | 'compatible';
6
+ }) => (modelId: string) => any;
7
+ export declare class AiSdkOpenRouterProvider implements ModelProvider {
8
+ #private;
9
+ constructor(deps: {
10
+ defaultModel: string;
11
+ resolveConfig: () => AiSdkOpenRouterConfig;
12
+ createProvider?: AiSdkOpenRouterProviderFactory;
13
+ });
14
+ getModel(modelName?: string): Promise<Model> | Model;
15
+ }
16
+ //# sourceMappingURL=ai-sdk-openrouter.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGrE,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,0BAA0B,EAC1B,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CACxD,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,CAC3C,OAAO,EAAE,qBAAqB,GAAG;IAAE,aAAa,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;CAAE,KACzE,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC;AAE9B,qBAAa,uBAAwB,YAAW,aAAa;;gBAK/C,IAAI,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,qBAAqB,CAAC;QAC3C,cAAc,CAAC,EAAE,8BAA8B,CAAC;KACjD;IAMD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CASrD"}
@@ -0,0 +1,22 @@
1
+ import { aisdk } from '@openai/agents-extensions/ai-sdk';
2
+ import { createOpenRouter } from '@openrouter/ai-sdk-provider';
3
+ import { withMergedAssistantReasoning } from './ai-sdk-message-normalizer.js';
4
+ export class AiSdkOpenRouterProvider {
5
+ #defaultModel;
6
+ #resolveConfig;
7
+ #createProvider;
8
+ constructor(deps) {
9
+ this.#defaultModel = deps.defaultModel;
10
+ this.#resolveConfig = deps.resolveConfig;
11
+ this.#createProvider = deps.createProvider ?? createOpenRouter;
12
+ }
13
+ getModel(modelName) {
14
+ const config = this.#resolveConfig();
15
+ const provider = this.#createProvider({
16
+ ...config,
17
+ compatibility: 'strict',
18
+ });
19
+ return aisdk(withMergedAssistantReasoning(provider(modelName || this.#defaultModel)));
20
+ }
21
+ }
22
+ //# sourceMappingURL=ai-sdk-openrouter.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAmC,MAAM,6BAA6B,CAAC;AAEhG,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAW9E,MAAM,OAAO,uBAAuB;IAClC,aAAa,CAAS;IACtB,cAAc,CAA8B;IAC5C,eAAe,CAAiC;IAEhD,YAAY,IAIX;QACC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,IAAK,gBAAmD,CAAC;IACrG,CAAC;IAED,QAAQ,CAAC,SAAkB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;YACpC,GAAG,MAAM;YACT,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,4BAA4B,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAqB,CAAC;IAC5G,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-sdk-openrouter.provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.test.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ import test from 'ava';
2
+ import { AiSdkOpenRouterProvider } from './ai-sdk-openrouter.provider.js';
3
+ test('AiSdkOpenRouterProvider creates an AI SDK model with OpenRouter settings', (t) => {
4
+ const calls = [];
5
+ let requestedModel;
6
+ const provider = new AiSdkOpenRouterProvider({
7
+ defaultModel: 'openrouter/auto',
8
+ resolveConfig: () => ({
9
+ baseURL: 'https://openrouter.test/api/v1',
10
+ apiKey: 'sk-test',
11
+ headers: {
12
+ 'HTTP-Referer': 'https://term2.test',
13
+ 'X-Title': 'term2',
14
+ },
15
+ appName: 'term2',
16
+ appUrl: 'https://term2.test',
17
+ }),
18
+ createProvider: (options) => {
19
+ calls.push(options);
20
+ return (modelId) => {
21
+ requestedModel = modelId;
22
+ return {
23
+ specificationVersion: 'v3',
24
+ provider: 'openrouter.chat',
25
+ modelId,
26
+ supportedUrls: {},
27
+ doGenerate: async () => ({}),
28
+ doStream: async () => ({ stream: [] }),
29
+ };
30
+ };
31
+ },
32
+ });
33
+ const model = provider.getModel('anthropic/claude-sonnet-4.5');
34
+ t.is(calls.length, 1);
35
+ t.like(calls[0], {
36
+ baseURL: 'https://openrouter.test/api/v1',
37
+ apiKey: 'sk-test',
38
+ headers: {
39
+ 'HTTP-Referer': 'https://term2.test',
40
+ 'X-Title': 'term2',
41
+ },
42
+ appName: 'term2',
43
+ appUrl: 'https://term2.test',
44
+ compatibility: 'strict',
45
+ });
46
+ t.is(requestedModel, 'anthropic/claude-sonnet-4.5');
47
+ t.is(typeof model.getResponse, 'function');
48
+ t.is(typeof model.getStreamedResponse, 'function');
49
+ });
50
+ test('AiSdkOpenRouterProvider uses the default model when none is requested', (t) => {
51
+ let requestedModel;
52
+ const provider = new AiSdkOpenRouterProvider({
53
+ defaultModel: 'openrouter/auto',
54
+ resolveConfig: () => ({}),
55
+ createProvider: () => (modelId) => {
56
+ requestedModel = modelId;
57
+ return {
58
+ specificationVersion: 'v3',
59
+ provider: 'openrouter.chat',
60
+ modelId,
61
+ supportedUrls: {},
62
+ doGenerate: async () => ({}),
63
+ doStream: async () => ({ stream: [] }),
64
+ };
65
+ },
66
+ });
67
+ provider.getModel();
68
+ t.is(requestedModel, 'openrouter/auto');
69
+ });
70
+ //# sourceMappingURL=ai-sdk-openrouter.provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.test.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Runner } from '@openai/agents';
2
2
  import { registerProvider } from './registry.js';
3
- import { AiSdkOpenAICompatibleProvider } from './ai-sdk-openai-compatible.provider.js';
3
+ import { AiSdkOpenRouterProvider } from './ai-sdk-openrouter.provider.js';
4
4
  async function fetchOpenRouterModels(deps, fetchImpl = fetch) {
5
5
  const { settingsService } = deps;
6
6
  const baseUrl = settingsService.get('agent.openrouter.baseUrl') || 'https://openrouter.ai/api/v1';
@@ -37,8 +37,7 @@ registerProvider({
37
37
  return null;
38
38
  }
39
39
  return new Runner({
40
- modelProvider: new AiSdkOpenAICompatibleProvider({
41
- label: 'OpenRouter',
40
+ modelProvider: new AiSdkOpenRouterProvider({
42
41
  defaultModel: settingsService.get('agent.model') || 'openrouter/auto',
43
42
  resolveConfig: () => ({
44
43
  baseURL: settingsService.get('agent.openrouter.baseUrl') || 'https://openrouter.ai/api/v1',
@@ -47,6 +46,8 @@ registerProvider({
47
46
  'HTTP-Referer': settingsService.get('agent.openrouter.referrer') || 'http://localhost',
48
47
  'X-Title': settingsService.get('agent.openrouter.title') || 'term2',
49
48
  },
49
+ appUrl: settingsService.get('agent.openrouter.referrer') || 'http://localhost',
50
+ appName: settingsService.get('agent.openrouter.title') || 'term2',
50
51
  }),
51
52
  }),
52
53
  });
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter.provider.js","sourceRoot":"","sources":["../../source/providers/openrouter.provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openrouter.provider.js","sourceRoot":"","sources":["../../source/providers/openrouter.provider.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@ export declare const CaseSchema: z.ZodObject<{
7
7
  command: z.ZodString;
8
8
  history: z.ZodArray<z.ZodObject<{
9
9
  role: z.ZodEnum<{
10
- user: "user";
11
10
  assistant: "assistant";
11
+ user: "user";
12
12
  system: "system";
13
13
  }>;
14
14
  content: z.ZodString;
@@ -55,7 +55,7 @@ export function extractReasoningDelta(event) {
55
55
  const eventDetail = data.event;
56
56
  if (eventDetail &&
57
57
  typeof eventDetail === 'object' &&
58
- eventDetail.type === 'response.reasoning_summary_text.delta') {
58
+ (eventDetail.type === 'response.reasoning_summary_text.delta' || eventDetail.type === 'reasoning-delta')) {
59
59
  return eventDetail.delta ?? '';
60
60
  }
61
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream-event-parsing.js","sourceRoot":"","sources":["../../source/services/stream-event-parsing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stream-event-parsing.js","sourceRoot":"","sources":["../../source/services/stream-event-parsing.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,19 @@ test('extractReasoningDelta: extracts OpenAI reasoning summary deltas', (t) => {
26
26
  };
27
27
  t.is(extractReasoningDelta(event), 'think');
28
28
  });
29
+ test('extractReasoningDelta: extracts model reasoning-delta events', (t) => {
30
+ const event = {
31
+ data: {
32
+ type: 'model',
33
+ event: {
34
+ type: 'reasoning-delta',
35
+ delta: 'The',
36
+ id: 'msfDurU72uN4YQQg',
37
+ },
38
+ },
39
+ };
40
+ t.is(extractReasoningDelta(event), 'The');
41
+ });
29
42
  test('extractReasoningDelta: extracts OpenRouter reasoning delta fields', (t) => {
30
43
  const reasoningEvent = {
31
44
  data: {
@@ -1 +1 @@
1
- {"version":3,"file":"stream-event-parsing.test.js","sourceRoot":"","sources":["../../source/services/stream-event-parsing.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEpF,IAAI,CAAC,+DAA+D,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1E,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,OAAO;KACf,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;KACrD,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5E,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,uCAAuC;gBAC7C,KAAK,EAAE,OAAO;aACf;SACF;KACF,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9E,MAAM,cAAc,GAAG;QACrB,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE;4BACL,SAAS,EAAE,MAAM;yBAClB;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,MAAM,qBAAqB,GAAG;QAC5B,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE;4BACL,iBAAiB,EAAE,SAAS;yBAC7B;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"stream-event-parsing.test.js","sourceRoot":"","sources":["../../source/services/stream-event-parsing.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEpF,IAAI,CAAC,+DAA+D,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1E,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,OAAO;KACf,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;KACrD,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5E,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,uCAAuC;gBAC7C,KAAK,EAAE,OAAO;aACf;SACF;KACF,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,CAAC,CAAC,EAAE,EAAE;IACzE,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,KAAK;gBACZ,EAAE,EAAE,kBAAkB;aACvB;SACF;KACF,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9E,MAAM,cAAc,GAAG;QACrB,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE;4BACL,SAAS,EAAE,MAAM;yBAClB;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,MAAM,qBAAqB,GAAG;QAC5B,IAAI,EAAE;YACJ,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP;wBACE,KAAK,EAAE;4BACL,iBAAiB,EAAE,SAAS;yBAC7B;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,EAAE,SAAS,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qduc/term2",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
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",
@@ -52,6 +52,7 @@
52
52
  "@mozilla/readability": "^0.6.0",
53
53
  "@openai/agents": "^0.8.3",
54
54
  "@openai/agents-extensions": "^0.11.1",
55
+ "@openrouter/ai-sdk-provider": "^2.9.0",
55
56
  "@qduc/web-fetch": "^0.1.0",
56
57
  "@types/ssh2": "^1.15.5",
57
58
  "ai": "^6.0.177",
package/readme.md CHANGED
@@ -15,18 +15,22 @@ https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
15
15
 
16
16
  - 🎭 **Three Operating Modes** - Default (full-power), Lite (fast & safe), and Mentor (get help from a smarter model on complex problems)
17
17
  - 🌍 **Open Source** - MIT licensed, hackable, auditable, community-driven
18
- - 🤖 **Multi-Provider Support** - Works with OpenAI, OpenRouter, and OpenAI-compatible APIs
18
+ - 🤖 **Multi-Provider Support** - Works with OpenAI, OpenRouter, OpenAI-compatible APIs, and Vercel AI SDK providers
19
19
  - 🔒 **Safe Execution** - Every command requires your explicit approval with diff preview
20
- - 🛠️ **Advanced Tools** - Shell execution, file patching, search/replace, grep, find files, file reading, web search, and mentor consultation
21
- - 💬 **Slash Commands** - Quick actions like `/clear`, `/quit`, `/model`, `/mentor`, `/lite` for easy control
20
+ - 🛠️ **Advanced Tools** - Shell execution, file patching, search/replace (with `<...>` gap matching), grep, find files, file reading, file creation, web search, and mentor consultation
21
+ - 💬 **Slash Commands** - Quick actions like `/clear`, `/quit`, `/model`, `/mentor`, `/lite`, `/copy`, `/auto-approve` for easy control
22
22
  - 📝 **Smart Context** - The assistant understands your environment and provides relevant help
23
23
  - 🎯 **Streaming Responses** - See the AI's thoughts and reasoning in real-time
24
24
  - 🧠 **Reasoning Effort Control** - Configurable reasoning levels (minimal to high) for O1/O3 models
25
25
  - ⚡ **Command History** - Navigate previous inputs with arrow keys
26
- - 🎨 **Markdown Rendering** - Formatted code blocks and text in the terminal
26
+ - 🎨 **Markdown Rendering** - Formatted code blocks, tables, and text in the terminal
27
27
  - 🔄 **Retry Logic** - Automatic recovery from tool hallucinations and upstream errors
28
28
  - 🌐 **SSH Mode** - Execute commands and edit files on remote servers over SSH
29
29
  - 🤖 **Non-Interactive Mode** - Run commands from the CLI without starting the full UI
30
+ - ✏️ **Edit Mode** - Press `Shift+Tab` to auto-approve file edits in your workspace for faster development
31
+ - 🤖 **Auto-Approval** - Optional LLM-based safety evaluation can automatically approve safe shell commands
32
+ - 🖼️ **Image Pasting** - Paste images from your clipboard directly into the terminal for vision-model analysis
33
+ - 📈 **Real-time Token Usage** - Live token consumption displayed during streaming
30
34
 
31
35
  ## Why term2 vs Alternatives?
32
36
 
@@ -51,7 +55,7 @@ https://github.com/user-attachments/assets/ac960d65-f7c8-453a-9440-91f6397ae842
51
55
 
52
56
  **Requirements:**
53
57
 
54
- - Node.js 16 or higher
58
+ - Node.js 20 or higher
55
59
  - An API key from OpenAI, OpenRouter, or any OpenAI-compatible provider
56
60
 
57
61
  Install globally via npm:
@@ -139,6 +143,8 @@ While in the chat, you can use these commands:
139
143
  - `/model [model-name]` - Switch to a different model
140
144
  - `/mentor` - Toggle mentor mode (see "Operating Modes" section for details)
141
145
  - `/lite` - Toggle lite mode (see "Operating Modes" section for details)
146
+ - `/copy` - Copy the latest assistant response
147
+ - `/auto-approve [off|advisory|auto]` - Set or cycle shell auto-approval mode
142
148
  - `/settings [key] [value]` - Modify runtime settings (e.g., `/settings agent.temperature 0.7`)
143
149
 
144
150
  ## Operating Modes
@@ -222,7 +228,7 @@ Mentor mode gives you two AI minds working together on your codebase. Your prima
222
228
 
223
229
  **Requirements:**
224
230
 
225
- - Configure `agent.mentorModel` in settings (e.g., `gpt-5.2`, `claude-opus-4.5` or `gemini-3-pro-preview`)
231
+ - Configure `agent.mentorModel` in settings (e.g., `gpt-5.5`, `claude-opus-4.6` or `gemini-3.1-pro-preview`)
226
232
  - Mentor model should be more capable than primary model for best results
227
233
  - Toggle with `/mentor` command mid-session
228
234
 
@@ -253,10 +259,11 @@ AI: [Does additional checks based on mentor's questions]
253
259
 
254
260
  Modes are mutually exclusive—each represents a different working style matched to your task. You can switch modes mid-session:
255
261
 
256
- - `/lite` - Toggle lite mode (clears history when switching)
262
+ - `/lite` - Toggle lite mode (requires clearing history first if session is active)
257
263
  - `/mentor` - Toggle mentor mode
264
+ - `Shift+Tab` - Toggle edit mode (auto-approves file edits in workspace)
258
265
  - Switching to lite mode automatically disables edit/mentor modes
259
- - Enabling edit or mentor mode automatically disables lite mode
266
+ - Enabling lite mode disables edit and mentor modes
260
267
 
261
268
  ## SSH Mode
262
269
 
@@ -375,8 +382,11 @@ export OPENAI_API_KEY="sk-..."
375
382
  # OpenRouter (for Claude, Gemini, and other models)
376
383
  export OPENROUTER_API_KEY="sk-or-v1-..."
377
384
 
378
- # Web Search (Tavily)
385
+ # Web Search (Tavily — default)
379
386
  export TAVILY_API_KEY="tvly-..."
387
+
388
+ # Web Search (Exa)
389
+ export EXA_API_KEY="..."
380
390
  ```
381
391
 
382
392
  To make them permanent, add these exports to your shell configuration file (`~/.bashrc`, `~/.zshrc`, or `~/.profile`).
@@ -477,17 +487,12 @@ term2 works with multiple AI providers:
477
487
 
478
488
  ### OpenAI (default)
479
489
 
480
- - `gpt-5.2` (latest)
490
+ - `gpt-5.5` (latest)
491
+ - `gpt-5.4`
492
+ - `gpt-5.4-mini`
493
+ - `gpt-5.3-codex`
494
+ - `gpt-5.2`
481
495
  - `gpt-5.1` (default)
482
- - `gpt-5`
483
- - `gpt-5-mini`
484
- - `gpt-4.1`
485
- - `gpt-4.1-mini`
486
- - `gpt-5.1`
487
- - `gpt-5.1-mini`
488
- - `o3` (supports reasoning effort)
489
- - `o3-mini` (supports reasoning effort)
490
- - `o1` (supports reasoning effort)
491
496
 
492
497
  ### OpenRouter
493
498
 
@@ -503,13 +508,14 @@ Use CLI flags (`-m model-name`) or settings file to select OpenRouter models.
503
508
 
504
509
  term2 can connect to any OpenAI-compatible API. This allows you to use:
505
510
 
506
- - **Local Models**: Run private models locally via Ollama, LM Studio, vLLM, or LocalAI.
511
+ - **Local Models**: Run private models locally via Ollama, LM Studio, vLLM, or llama.cpp.
507
512
  - **Self-Hosted**: Connect to private deployments of models.
508
513
  - **Other Providers**: Any service offering an OpenAI-compatible endpoint (e.g., Groq, Together AI).
509
514
 
510
515
  ## Safety Features
511
516
 
512
517
  - **Command Approval** - Every destructive operation requires your explicit confirmation
518
+ - **Auto-Approval** - Optional LLM-based safety evaluation with advisory and auto modes for shell commands
513
519
  - **Diff Preview** - See exact file changes before approving patches or edits
514
520
  - **Risk Analysis** - Dangerous operations (like `rm -rf`, `git push --force`) are flagged
515
521
  - **Path Safety** - Operations on sensitive directories require extra caution
@@ -616,6 +622,9 @@ term2 --ssh user@host --lite
616
622
  - Use arrow keys to navigate through your command history
617
623
  - Be specific in your requests for better results
618
624
  - Use `/mentor` to get expert consultation on difficult architectural decisions
625
+ - Use `Shift+Tab` to toggle edit mode for faster file editing workflows
626
+ - Use `/auto-approve` to enable LLM-based safety evaluation for faster shell command workflows
627
+ - Paste images directly into the terminal when using vision-capable models
619
628
  - Use `--lite` flag when SSH'ing to servers for general system work without codebase context
620
629
 
621
630
  ## Contributing
@@ -634,7 +643,3 @@ Built with:
634
643
  - [Ink](https://github.com/vadimdemedes/ink) - React for CLI
635
644
  - [TypeScript](https://www.typescriptlang.org/)
636
645
  - [ssh2](https://github.com/mscdex/ssh2) - SSH client for Node.js
637
-
638
- ---
639
-
640
- Made with ❤️ by [qduc](https://github.com/qduc)
@@ -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=ModelSelectionMenu.error-tabs.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModelSelectionMenu.error-tabs.test.d.ts","sourceRoot":"","sources":["../../source/components/ModelSelectionMenu.error-tabs.test.tsx"],"names":[],"mappings":""}
@@ -1,18 +0,0 @@
1
- import test from 'ava';
2
- import React from 'react';
3
- import { render } from 'ink-testing-library';
4
- import ModelSelectionMenu from './ModelSelectionMenu.js';
5
- import { createMockSettingsService } from '../services/settings-service.mock.js';
6
- test('ModelSelectionMenu renders provider tabs even when error occurs', t => {
7
- // OpenAI is a default provider
8
- const settingsService = createMockSettingsService();
9
- const { lastFrame } = render(React.createElement(ModelSelectionMenu, { settingsService: settingsService, items: [], selectedIndex: 0, query: "", error: "Failed to fetch models", provider: "openai" }));
10
- const output = lastFrame();
11
- t.true(output?.includes('Unable to load models: Failed to fetch models'));
12
- // Should verify that provider tabs are still visible
13
- // "OpenAI" shows up as a label in the tabs
14
- t.true(output?.includes('OpenAI'));
15
- // And possibly the switch instruction
16
- t.true(output?.includes('Tab → switch provider'));
17
- });
18
- //# sourceMappingURL=ModelSelectionMenu.error-tabs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModelSelectionMenu.error-tabs.test.js","sourceRoot":"","sources":["../../source/components/ModelSelectionMenu.error-tabs.test.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAC,yBAAyB,EAAC,MAAM,sCAAsC,CAAC;AAE/E,IAAI,CAAC,iEAAiE,EAAE,CAAC,CAAC,EAAE;IACxE,+BAA+B;IAC/B,MAAM,eAAe,GAAG,yBAAyB,EAAE,CAAC;IAEpD,MAAM,EAAC,SAAS,EAAC,GAAG,MAAM,CACtB,oBAAC,kBAAkB,IACf,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,CAAC,EAChB,KAAK,EAAC,EAAE,EACR,KAAK,EAAC,wBAAwB,EAC9B,QAAQ,EAAC,QAAQ,GACnB,CACL,CAAC;IAEF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC1E,qDAAqD;IACrD,2CAA2C;IAC3C,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnC,sCAAsC;IACtC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -1,42 +0,0 @@
1
- import React from 'react';
2
- interface TextInputProps {
3
- /**
4
- * The value of the input.
5
- */
6
- value: string;
7
- /**
8
- * Handler called when value changes.
9
- */
10
- onChange: (value: string) => void;
11
- /**
12
- * Handler called when "Enter" is pressed.
13
- */
14
- onSubmit?: (value: string) => void;
15
- /**
16
- * Text to display when value is empty.
17
- */
18
- placeholder?: string;
19
- /**
20
- * Whether the input is currently focused and accepting input.
21
- */
22
- focus?: boolean;
23
- /**
24
- * Character to mask input with (e.g. '*' for passwords).
25
- */
26
- mask?: string;
27
- /**
28
- * Whether to allow multi-line input.
29
- */
30
- multiLine?: boolean;
31
- /**
32
- * Called whenever the cursor offset changes.
33
- */
34
- onCursorChange?: (offset: number) => void;
35
- /**
36
- * Optional external cursor override.
37
- */
38
- cursorOverride?: number;
39
- }
40
- export declare const TextInput: React.FC<TextInputProps>;
41
- export default TextInput;
42
- //# sourceMappingURL=TextInput.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../source/components/TextInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAKzD,UAAU,cAAc;IACpB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1C;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAoc9C,CAAC;AAEF,eAAe,SAAS,CAAC"}