@qduc/term2 0.1.6 → 0.1.7

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 (300) hide show
  1. package/dist/agent.lite-mode.test.d.ts +2 -0
  2. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  3. package/dist/agent.lite-mode.test.js +39 -0
  4. package/dist/agent.lite-mode.test.js.map +1 -0
  5. package/dist/components/TextInput.d.ts.map +1 -1
  6. package/dist/components/TextInput.js +2 -1
  7. package/dist/components/TextInput.js.map +1 -1
  8. package/dist/components/TextInput.test.js.map +1 -1
  9. package/dist/debug_ask_mentor.d.ts +2 -0
  10. package/dist/debug_ask_mentor.d.ts.map +1 -0
  11. package/dist/debug_ask_mentor.js +73 -0
  12. package/dist/debug_ask_mentor.js.map +1 -0
  13. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  14. package/dist/lib/openai-agent-client.js +2 -1
  15. package/dist/lib/openai-agent-client.js.map +1 -1
  16. package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
  17. package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
  18. package/dist/lib/openai-strict-tool-schema.js +39 -0
  19. package/dist/lib/openai-strict-tool-schema.js.map +1 -0
  20. package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
  21. package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
  22. package/dist/lib/openai-strict-tool-schema.test.js +26 -0
  23. package/dist/lib/openai-strict-tool-schema.test.js.map +1 -0
  24. package/dist/modes/companion/command-index.d.ts +26 -0
  25. package/dist/modes/companion/command-index.d.ts.map +1 -0
  26. package/dist/modes/companion/command-index.js +50 -0
  27. package/dist/modes/companion/command-index.js.map +1 -0
  28. package/dist/modes/companion/command-index.test.d.ts +2 -0
  29. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  30. package/dist/modes/companion/command-index.test.js +86 -0
  31. package/dist/modes/companion/command-index.test.js.map +1 -0
  32. package/dist/modes/companion/companion-app.d.ts +12 -0
  33. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  34. package/dist/modes/companion/companion-app.js +297 -0
  35. package/dist/modes/companion/companion-app.js.map +1 -0
  36. package/dist/modes/companion/companion-session.d.ts +63 -0
  37. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  38. package/dist/modes/companion/companion-session.js +146 -0
  39. package/dist/modes/companion/companion-session.js.map +1 -0
  40. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  41. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  42. package/dist/modes/companion/companion-session.test.js +28 -0
  43. package/dist/modes/companion/companion-session.test.js.map +1 -0
  44. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  45. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  46. package/dist/modes/companion/components/status-bar.js +26 -0
  47. package/dist/modes/companion/components/status-bar.js.map +1 -0
  48. package/dist/modes/companion/context-buffer.d.ts +65 -0
  49. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  50. package/dist/modes/companion/context-buffer.js +156 -0
  51. package/dist/modes/companion/context-buffer.js.map +1 -0
  52. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  53. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  54. package/dist/modes/companion/context-buffer.test.js +154 -0
  55. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  56. package/dist/modes/companion/event-detector.d.ts +46 -0
  57. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  58. package/dist/modes/companion/event-detector.js +169 -0
  59. package/dist/modes/companion/event-detector.js.map +1 -0
  60. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  61. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  62. package/dist/modes/companion/event-detector.test.js +121 -0
  63. package/dist/modes/companion/event-detector.test.js.map +1 -0
  64. package/dist/modes/companion/index.d.ts +33 -0
  65. package/dist/modes/companion/index.d.ts.map +1 -0
  66. package/dist/modes/companion/index.js +21 -0
  67. package/dist/modes/companion/index.js.map +1 -0
  68. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  69. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  70. package/dist/modes/companion/input-key-mapper.js +31 -0
  71. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  72. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  73. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  74. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  75. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  76. package/dist/modes/companion/input-parser.d.ts +53 -0
  77. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  78. package/dist/modes/companion/input-parser.js +114 -0
  79. package/dist/modes/companion/input-parser.js.map +1 -0
  80. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  81. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  82. package/dist/modes/companion/input-parser.test.js +123 -0
  83. package/dist/modes/companion/input-parser.test.js.map +1 -0
  84. package/dist/modes/companion/mode-manager.d.ts +41 -0
  85. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  86. package/dist/modes/companion/mode-manager.js +56 -0
  87. package/dist/modes/companion/mode-manager.js.map +1 -0
  88. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  89. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  90. package/dist/modes/companion/mode-manager.test.js +65 -0
  91. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  92. package/dist/modes/companion/output-classifier.d.ts +15 -0
  93. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  94. package/dist/modes/companion/output-classifier.js +77 -0
  95. package/dist/modes/companion/output-classifier.js.map +1 -0
  96. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  97. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  98. package/dist/modes/companion/output-classifier.test.js +133 -0
  99. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  100. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  101. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  102. package/dist/modes/companion/pty-wrapper.js +143 -0
  103. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  104. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  105. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  106. package/dist/modes/companion/safety-classifier.js +140 -0
  107. package/dist/modes/companion/safety-classifier.js.map +1 -0
  108. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  109. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  110. package/dist/modes/companion/safety-classifier.test.js +151 -0
  111. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  112. package/dist/modes/companion/summarizer.d.ts +24 -0
  113. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  114. package/dist/modes/companion/summarizer.js +132 -0
  115. package/dist/modes/companion/summarizer.js.map +1 -0
  116. package/dist/modes/companion/terminal-history.d.ts +27 -0
  117. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  118. package/dist/modes/companion/terminal-history.js +142 -0
  119. package/dist/modes/companion/terminal-history.js.map +1 -0
  120. package/dist/prompts/simple-mentor.md +8 -0
  121. package/dist/providers/github-copilot/model.d.ts.map +1 -1
  122. package/dist/providers/github-copilot/model.js +25 -108
  123. package/dist/providers/github-copilot/model.js.map +1 -1
  124. package/dist/providers/github-copilot/model.test.d.ts +2 -0
  125. package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
  126. package/dist/providers/github-copilot/model.test.js +63 -0
  127. package/dist/providers/github-copilot/model.test.js.map +1 -0
  128. package/dist/providers/github-copilot/provider.d.ts +0 -5
  129. package/dist/providers/github-copilot/provider.d.ts.map +1 -1
  130. package/dist/providers/github-copilot/provider.js +2 -7
  131. package/dist/providers/github-copilot/provider.js.map +1 -1
  132. package/dist/providers/openai-compatible/model.js +3 -3
  133. package/dist/providers/openai-compatible/model.js.map +1 -1
  134. package/dist/providers/openai-compatible/reasoning-content.test.js +70 -0
  135. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  136. package/dist/providers/openrouter/model.js +3 -3
  137. package/dist/providers/openrouter/model.js.map +1 -1
  138. package/dist/providers/openrouter/utils.d.ts +1 -0
  139. package/dist/providers/openrouter/utils.d.ts.map +1 -1
  140. package/dist/providers/openrouter/utils.js +3 -0
  141. package/dist/providers/openrouter/utils.js.map +1 -1
  142. package/dist/providers/openrouter.test.js +64 -0
  143. package/dist/providers/openrouter.test.js.map +1 -1
  144. package/dist/services/check_mock.d.ts +2 -0
  145. package/dist/services/check_mock.d.ts.map +1 -0
  146. package/dist/services/check_mock.js +22 -0
  147. package/dist/services/check_mock.js.map +1 -0
  148. package/dist/services/conversation-service.test.d.ts +2 -0
  149. package/dist/services/conversation-service.test.d.ts.map +1 -0
  150. package/dist/services/conversation-service.test.js +149 -183
  151. package/dist/services/conversation-service.test.js.map +1 -0
  152. package/dist/tools/ask-mentor.d.ts +1 -1
  153. package/dist/tools/ask-mentor.js +1 -1
  154. package/dist/tools/ask-mentor.js.map +1 -1
  155. package/dist/tools/ask-mentor.test.js +9 -3
  156. package/dist/tools/ask-mentor.test.js.map +1 -1
  157. package/dist/tools/find-files.d.ts +2 -2
  158. package/dist/tools/find-files.d.ts.map +1 -1
  159. package/dist/tools/find-files.js +2 -4
  160. package/dist/tools/find-files.js.map +1 -1
  161. package/dist/tools/find-files.test.js +7 -19
  162. package/dist/tools/find-files.test.js.map +1 -1
  163. package/dist/tools/grep.d.ts +1 -1
  164. package/dist/tools/grep.d.ts.map +1 -1
  165. package/dist/tools/grep.js +1 -5
  166. package/dist/tools/grep.js.map +1 -1
  167. package/dist/tools/read-file.d.ts +2 -2
  168. package/dist/tools/read-file.d.ts.map +1 -1
  169. package/dist/tools/read-file.js +2 -4
  170. package/dist/tools/read-file.js.map +1 -1
  171. package/dist/tools/read-file.test.js +7 -13
  172. package/dist/tools/read-file.test.js.map +1 -1
  173. package/dist/tools/search-replace.d.ts +1 -1
  174. package/dist/tools/search-replace.d.ts.map +1 -1
  175. package/dist/tools/search-replace.js +1 -0
  176. package/dist/tools/search-replace.js.map +1 -1
  177. package/dist/tools/search.d.ts +4 -4
  178. package/dist/tools/search.d.ts.map +1 -1
  179. package/dist/tools/search.js +5 -14
  180. package/dist/tools/search.js.map +1 -1
  181. package/dist/tools/shell.d.ts +2 -2
  182. package/dist/tools/shell.d.ts.map +1 -1
  183. package/dist/tools/shell.js +2 -4
  184. package/dist/tools/shell.js.map +1 -1
  185. package/dist/tools/tool-parameter-schema.test.d.ts +2 -0
  186. package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
  187. package/dist/tools/tool-parameter-schema.test.js +88 -0
  188. package/dist/tools/tool-parameter-schema.test.js.map +1 -0
  189. package/dist/tools/web-fetch.d.ts +3 -3
  190. package/dist/tools/web-fetch.d.ts.map +1 -1
  191. package/dist/tools/web-fetch.js +3 -2
  192. package/dist/tools/web-fetch.js.map +1 -1
  193. package/dist/utils/command-safety.d.ts.map +1 -1
  194. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  195. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  196. package/dist/utils/command-safety.devnull.test.js +13 -0
  197. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  198. package/dist/utils/command-safety.js +10 -364
  199. package/dist/utils/command-safety.js.map +1 -1
  200. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  201. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  202. package/dist/utils/extract-command-messages.test.js +58 -51
  203. package/dist/utils/extract-command-messages.test.js.map +1 -0
  204. package/package.json +1 -1
  205. package/dist/app.model-command-feedback.test.d.ts +0 -2
  206. package/dist/app.model-command-feedback.test.d.ts.map +0 -1
  207. package/dist/app.model-command-feedback.test.js +0 -19
  208. package/dist/app.model-command-feedback.test.js.map +0 -1
  209. package/dist/components/MentorMode.test.d.ts +0 -2
  210. package/dist/components/MentorMode.test.d.ts.map +0 -1
  211. package/dist/components/MentorMode.test.js.map +0 -1
  212. package/dist/components/StatusBar.test.d.ts +0 -2
  213. package/dist/components/StatusBar.test.d.ts.map +0 -1
  214. package/dist/components/StatusBar.test.js +0 -19
  215. package/dist/components/StatusBar.test.js.map +0 -1
  216. package/dist/debug-schema.d.ts +0 -2
  217. package/dist/debug-schema.d.ts.map +0 -1
  218. package/dist/debug-schema.js +0 -22
  219. package/dist/debug-schema.js.map +0 -1
  220. package/dist/hooks/use-model-selection.test.d.ts +0 -2
  221. package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
  222. package/dist/hooks/use-model-selection.test.js +0 -28
  223. package/dist/hooks/use-model-selection.test.js.map +0 -1
  224. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  225. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  226. package/dist/hooks/use-path-completion.test.js +0 -29
  227. package/dist/hooks/use-path-completion.test.js.map +0 -1
  228. package/dist/lib/mentor-client.d.ts +0 -41
  229. package/dist/lib/mentor-client.d.ts.map +0 -1
  230. package/dist/lib/mentor-client.js +0 -146
  231. package/dist/lib/mentor-client.js.map +0 -1
  232. package/dist/lib/mentor-client.test.d.ts +0 -2
  233. package/dist/lib/mentor-client.test.d.ts.map +0 -1
  234. package/dist/lib/mentor-client.test.js +0 -440
  235. package/dist/lib/mentor-client.test.js.map +0 -1
  236. package/dist/lib/retry-strategy.d.ts +0 -43
  237. package/dist/lib/retry-strategy.d.ts.map +0 -1
  238. package/dist/lib/retry-strategy.js +0 -93
  239. package/dist/lib/retry-strategy.js.map +0 -1
  240. package/dist/lib/retry-strategy.test.d.ts +0 -2
  241. package/dist/lib/retry-strategy.test.d.ts.map +0 -1
  242. package/dist/lib/retry-strategy.test.js +0 -200
  243. package/dist/lib/retry-strategy.test.js.map +0 -1
  244. package/dist/prompts/default.md.bak +0 -77
  245. package/dist/providers/github-copilot/model-direct.d.ts +0 -34
  246. package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
  247. package/dist/providers/github-copilot/model-direct.js +0 -443
  248. package/dist/providers/github-copilot/model-direct.js.map +0 -1
  249. package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
  250. package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
  251. package/dist/providers/openrouter/merge-messages.test.js +0 -83
  252. package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
  253. package/dist/providers/openrouter.history.test.d.ts +0 -2
  254. package/dist/providers/openrouter.history.test.d.ts.map +0 -1
  255. package/dist/providers/openrouter.history.test.js +0 -533
  256. package/dist/providers/openrouter.history.test.js.map +0 -1
  257. package/dist/reproduce_issue.test.d.ts +0 -2
  258. package/dist/reproduce_issue.test.d.ts.map +0 -1
  259. package/dist/reproduce_issue.test.js +0 -31
  260. package/dist/reproduce_issue.test.js.map +0 -1
  261. package/dist/services/conversation-result-builder.d.ts +0 -41
  262. package/dist/services/conversation-result-builder.d.ts.map +0 -1
  263. package/dist/services/conversation-result-builder.js +0 -110
  264. package/dist/services/conversation-result-builder.js.map +0 -1
  265. package/dist/services/conversation-result-builder.test.d.ts +0 -2
  266. package/dist/services/conversation-result-builder.test.d.ts.map +0 -1
  267. package/dist/services/conversation-result-builder.test.js +0 -76
  268. package/dist/services/conversation-result-builder.test.js.map +0 -1
  269. package/dist/services/conversation-session.usage.test.d.ts +0 -2
  270. package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
  271. package/dist/services/conversation-session.usage.test.js +0 -59
  272. package/dist/services/conversation-session.usage.test.js.map +0 -1
  273. package/dist/services/stream-event-processor.d.ts +0 -32
  274. package/dist/services/stream-event-processor.d.ts.map +0 -1
  275. package/dist/services/stream-event-processor.js +0 -344
  276. package/dist/services/stream-event-processor.js.map +0 -1
  277. package/dist/services/stream-event-processor.test.d.ts +0 -2
  278. package/dist/services/stream-event-processor.test.d.ts.map +0 -1
  279. package/dist/services/stream-event-processor.test.js +0 -117
  280. package/dist/services/stream-event-processor.test.js.map +0 -1
  281. package/dist/test-search-tool.d.ts +0 -2
  282. package/dist/test-search-tool.d.ts.map +0 -1
  283. package/dist/test-search-tool.js +0 -36
  284. package/dist/test-search-tool.js.map +0 -1
  285. package/dist/types/messages.d.ts +0 -29
  286. package/dist/types/messages.d.ts.map +0 -1
  287. package/dist/types/messages.js +0 -2
  288. package/dist/types/messages.js.map +0 -1
  289. package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
  290. package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
  291. package/dist/utils/extract-command-messages.repro.test.js +0 -31
  292. package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
  293. package/dist/utils/message-utils.d.ts +0 -17
  294. package/dist/utils/message-utils.d.ts.map +0 -1
  295. package/dist/utils/message-utils.js +0 -52
  296. package/dist/utils/message-utils.js.map +0 -1
  297. package/dist/utils/message-utils.test.d.ts +0 -2
  298. package/dist/utils/message-utils.test.d.ts.map +0 -1
  299. package/dist/utils/message-utils.test.js +0 -48
  300. package/dist/utils/message-utils.test.js.map +0 -1
@@ -1,200 +0,0 @@
1
- import test from 'ava';
2
- import { APIConnectionError, APIConnectionTimeoutError, InternalServerError, RateLimitError } from 'openai';
3
- import { OpenRouterError } from '../providers/openrouter.js';
4
- import { OpenAICompatibleError } from '../providers/openai-compatible/api.js';
5
- import { isTransientError, getRetryAfterMs, computeBackoffDelay, executeWithRetry } from './retry-strategy.js';
6
- // ========== isTransientError ==========
7
- test('isTransientError - APIConnectionError is transient', (t) => {
8
- // APIConnectionError expects (opts: { cause?: Error }) as first arg
9
- const error = new APIConnectionError({ cause: new Error('connect timeout') });
10
- t.true(isTransientError(error));
11
- });
12
- test('isTransientError - APIConnectionTimeoutError is transient', (t) => {
13
- const error = new APIConnectionTimeoutError();
14
- t.true(isTransientError(error));
15
- });
16
- test('isTransientError - InternalServerError is transient', (t) => {
17
- const error = new InternalServerError(500, undefined, 'server error', undefined);
18
- t.true(isTransientError(error));
19
- });
20
- test('isTransientError - RateLimitError is transient', (t) => {
21
- const error = new RateLimitError(429, undefined, 'rate limited', undefined);
22
- t.true(isTransientError(error));
23
- });
24
- test('isTransientError - OpenRouterError 429 is transient', (t) => {
25
- t.true(isTransientError(new OpenRouterError('rate limit', 429, {})));
26
- });
27
- test('isTransientError - OpenRouterError 500 is transient', (t) => {
28
- t.true(isTransientError(new OpenRouterError('server error', 500, {})));
29
- });
30
- test('isTransientError - OpenRouterError 502 is transient', (t) => {
31
- t.true(isTransientError(new OpenRouterError('bad gateway', 502, {})));
32
- });
33
- test('isTransientError - OpenRouterError 400 is NOT transient', (t) => {
34
- t.false(isTransientError(new OpenRouterError('bad request', 400, {})));
35
- });
36
- test('isTransientError - OpenRouterError 401 is NOT transient', (t) => {
37
- t.false(isTransientError(new OpenRouterError('unauthorized', 401, {})));
38
- });
39
- test('isTransientError - OpenAICompatibleError 429 is transient', (t) => {
40
- t.true(isTransientError(new OpenAICompatibleError('rate limit', 429, {})));
41
- });
42
- test('isTransientError - OpenAICompatibleError 503 is transient', (t) => {
43
- t.true(isTransientError(new OpenAICompatibleError('unavailable', 503, {})));
44
- });
45
- test('isTransientError - OpenAICompatibleError 403 is NOT transient', (t) => {
46
- t.false(isTransientError(new OpenAICompatibleError('forbidden', 403, {})));
47
- });
48
- test('isTransientError - generic Error is NOT transient', (t) => {
49
- t.false(isTransientError(new Error('generic')));
50
- });
51
- test('isTransientError - non-Error value is NOT transient', (t) => {
52
- t.false(isTransientError('string error'));
53
- t.false(isTransientError(null));
54
- t.false(isTransientError(undefined));
55
- });
56
- // ========== getRetryAfterMs ==========
57
- test('getRetryAfterMs - extracts from RateLimitError headers', (t) => {
58
- const error = new RateLimitError(429, undefined, 'rate limited', {
59
- get: (key) => (key === 'retry-after' ? '10' : null),
60
- values: () => ({}),
61
- entries: () => ({}),
62
- keys: () => ({}),
63
- has: (key) => key === 'retry-after',
64
- [Symbol.iterator]: function* () { },
65
- 'retry-after': '10',
66
- });
67
- t.is(getRetryAfterMs(error), 10000);
68
- });
69
- test('getRetryAfterMs - extracts from OpenRouterError headers', (t) => {
70
- const error = new OpenRouterError('rate limit', 429, { 'retry-after': '60' });
71
- t.is(getRetryAfterMs(error), 60000);
72
- });
73
- test('getRetryAfterMs - extracts from OpenAICompatibleError headers', (t) => {
74
- const error = new OpenAICompatibleError('rate limit', 429, { 'retry-after': '5' });
75
- t.is(getRetryAfterMs(error), 5000);
76
- });
77
- test('getRetryAfterMs - returns undefined when no header present', (t) => {
78
- const error = new OpenRouterError('server error', 500, {});
79
- t.is(getRetryAfterMs(error), undefined);
80
- });
81
- test('getRetryAfterMs - returns undefined for generic Error', (t) => {
82
- t.is(getRetryAfterMs(new Error('generic')), undefined);
83
- });
84
- test('getRetryAfterMs - returns undefined for non-numeric header', (t) => {
85
- const error = new OpenRouterError('rate limit', 429, { 'retry-after': 'not-a-number' });
86
- t.is(getRetryAfterMs(error), undefined);
87
- });
88
- // ========== computeBackoffDelay ==========
89
- test('computeBackoffDelay - attemptIndex 0 produces delay in [0, 1000]', (t) => {
90
- // With random returning 0.5: baseDelay=750, exp=750, capped=750, jitter=0.5*750=375
91
- const delay = computeBackoffDelay(0, () => 0.5);
92
- t.is(delay, 375);
93
- });
94
- test('computeBackoffDelay - attemptIndex 0 with random 0', (t) => {
95
- // random=0: baseDelay=500, exp=500, capped=500, jitter=0*500=0
96
- const delay = computeBackoffDelay(0, () => 0);
97
- t.is(delay, 0);
98
- });
99
- test('computeBackoffDelay - delay is always within [0, 30000]', (t) => {
100
- for (let attempt = 0; attempt < 20; attempt++) {
101
- // Worst case: random=1 (just below), base=1000, but jitter caps
102
- const delay = computeBackoffDelay(attempt, () => 0.999);
103
- t.true(delay >= 0, `attempt ${attempt}: delay >= 0`);
104
- t.true(delay <= 30000, `attempt ${attempt}: delay <= 30000`);
105
- }
106
- });
107
- test('computeBackoffDelay - higher attemptIndex produces higher max possible delay', (t) => {
108
- // Use random=1 (max) to check ceiling growth
109
- const r = () => 0.999;
110
- const d0 = computeBackoffDelay(0, r);
111
- const d1 = computeBackoffDelay(1, r);
112
- const d2 = computeBackoffDelay(2, r);
113
- t.true(d1 > d0);
114
- t.true(d2 > d1);
115
- });
116
- test('computeBackoffDelay - caps at 30000ms for large attemptIndex', (t) => {
117
- // random=0.999: baseDelay≈999.5, 999.5*2^10≈1023488, capped=30000, jitter≈0.999*30000≈29970
118
- const delay = computeBackoffDelay(10, () => 0.999);
119
- t.true(delay <= 30000);
120
- t.true(delay > 29000); // should be close to cap
121
- });
122
- // ========== executeWithRetry ==========
123
- test('executeWithRetry - returns result on first attempt success', async (t) => {
124
- const result = await executeWithRetry(() => Promise.resolve('ok'), { retries: 2, sleep: async () => { } });
125
- t.is(result, 'ok');
126
- });
127
- test('executeWithRetry - does not retry non-transient errors', async (t) => {
128
- let calls = 0;
129
- const error = await t.throwsAsync(() => executeWithRetry(() => {
130
- calls++;
131
- return Promise.reject(new Error('non-transient'));
132
- }, { retries: 2, sleep: async () => { } }));
133
- t.is(calls, 1);
134
- t.is(error?.message, 'non-transient');
135
- });
136
- test('executeWithRetry - retries transient errors up to the limit', async (t) => {
137
- let calls = 0;
138
- const error = await t.throwsAsync(() => executeWithRetry(() => {
139
- calls++;
140
- return Promise.reject(new OpenRouterError('oops', 500, {}));
141
- }, { retries: 2, sleep: async () => { } }));
142
- // 1 initial + 2 retries = 3 total calls
143
- t.is(calls, 3);
144
- t.true(error instanceof OpenRouterError);
145
- });
146
- test('executeWithRetry - succeeds on a later retry', async (t) => {
147
- let calls = 0;
148
- const result = await executeWithRetry(() => {
149
- calls++;
150
- if (calls < 3) {
151
- return Promise.reject(new OpenRouterError('oops', 502, {}));
152
- }
153
- return Promise.resolve('recovered');
154
- }, { retries: 3, sleep: async () => { } });
155
- t.is(result, 'recovered');
156
- t.is(calls, 3);
157
- });
158
- test('executeWithRetry - calls onRetry callback with correct metadata', async (t) => {
159
- const retryInfos = [];
160
- await t.throwsAsync(() => executeWithRetry(() => Promise.reject(new OpenRouterError('err', 500, {})), {
161
- retries: 2,
162
- onRetry: (info) => retryInfos.push(info),
163
- sleep: async () => { },
164
- }));
165
- t.is(retryInfos.length, 2);
166
- t.is(retryInfos[0].attemptIndex, 0);
167
- t.is(retryInfos[1].attemptIndex, 1);
168
- t.true(retryInfos[0].delay >= 0);
169
- t.true(retryInfos[1].delay >= 0);
170
- t.true(retryInfos[0].error instanceof OpenRouterError);
171
- });
172
- test('executeWithRetry - retries zero means no retries', async (t) => {
173
- let calls = 0;
174
- await t.throwsAsync(() => executeWithRetry(() => {
175
- calls++;
176
- return Promise.reject(new OpenRouterError('err', 500, {}));
177
- }, { retries: 0, sleep: async () => { } }));
178
- t.is(calls, 1);
179
- });
180
- test('executeWithRetry - uses Retry-After header delay for OpenRouterError', async (t) => {
181
- const delays = [];
182
- await t.throwsAsync(() => executeWithRetry(() => Promise.reject(new OpenRouterError('rate limit', 429, { 'retry-after': '1' })), {
183
- retries: 1,
184
- onRetry: (info) => delays.push(info.delay),
185
- sleep: async () => { },
186
- }));
187
- t.is(delays.length, 1);
188
- t.is(delays[0], 1000); // 1 second parsed from header
189
- });
190
- test('executeWithRetry - uses Retry-After header delay for OpenAICompatibleError', async (t) => {
191
- const delays = [];
192
- await t.throwsAsync(() => executeWithRetry(() => Promise.reject(new OpenAICompatibleError('rate limit', 429, { 'retry-after': '2' })), {
193
- retries: 1,
194
- onRetry: (info) => delays.push(info.delay),
195
- sleep: async () => { },
196
- }));
197
- t.is(delays.length, 1);
198
- t.is(delays[0], 2000);
199
- });
200
- //# sourceMappingURL=retry-strategy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry-strategy.test.js","sourceRoot":"","sources":["../../source/lib/retry-strategy.test.ts"],"names":[],"mappings":"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"}
@@ -1,77 +0,0 @@
1
- ## Introduction
2
-
3
- Serve as a technically skilled reasoning partner: precise, objective, and contextually aware. Help solve problems by understanding requirements, thinking systematically when necessary, and delivering reliable results. Prioritize accuracy and usefulness over agreement or reassurance.
4
-
5
- ## Core Behavior
6
-
7
- Communicate clearly and thoughtfully. Verify claims rather than accepting them at face value, and prioritize accuracy over persuasion. When user intent is unclear, reason carefully rather than making assumptions. When a task requires creativity, ground it in concrete reasoning. Operate within the constraints defined by the user's environment.
8
-
9
- ### Example: Interpreting Ambiguous Intent (DO vs. DON'T)
10
-
11
- DON'T (overstates certainty, assumes intent):
12
- User: "Optimize this algorithm; it's too slow."
13
- Assistant: "I'll parallelize it across threads for a 10× speedup."
14
- *(No code inspection; claims unsupported.)*
15
-
16
- DO (investigate, reason, stay grounded):
17
- Assistant: "Before proposing changes, I need to understand the existing implementation. Please share the current function or describe its inputs and constraints so I can identify actual bottlenecks."
18
-
19
- ## Working With Code and Tools
20
-
21
- Be rigorous before acting. Review code completely before editing. Modify only what is directly necessary, avoiding unnecessary changes. Maintain safety boundaries around user input, execution environments, and external APIs. Use provided tools in preference to alternatives, and create files only when explicitly required.
22
-
23
- ### Example: Handling a Requested Refactor (DO vs. DON'T)
24
-
25
- DON'T (changes code without review, adds speculative improvements):
26
- User: "Fix the logging bug in this file."
27
- Assistant: "I rewrote the logging module to be more modular and added retries."
28
- *(Unnecessary changes; introduces new behavior.)*
29
-
30
- DO (minimal, accurate, context-aware):
31
- Assistant: "I'll inspect the file to understand the logging implementation and address only the bug you specified without altering unrelated code."
32
-
33
- ## Reasoning Style
34
-
35
- Explain your thinking when it informs the user's decision, but avoid over-explaining routine steps. Keep reasoning internal when unnecessary, presenting only conclusions unless deeper analysis is needed. When comparing design options, articulate tradeoffs clearly and distinguish between established facts and assumptions.
36
-
37
- ### Example: Complex Tradeoff (DO vs. DON'T)
38
-
39
- DON'T (selects approach without justification):
40
- User: "Should we store this state in memory or persist it?"
41
- Assistant: "In-memory storage is best."
42
- *(No explanation; failure modes unaddressed.)*
43
-
44
- DO (articulates meaningful tradeoffs):
45
- Assistant: "In-memory storage provides faster access but loses state on process restart. Persistence adds overhead but ensures recovery. Your choice depends on whether crash resilience is more important than peak performance."
46
-
47
- ## Handling User Intent and Safety
48
-
49
- Support user goals while maintaining boundaries around security, privacy, and correctness. Decline unsafe requests directly, offering secure alternatives when applicable. If a user pursues a harmful approach, redirect with transparent reasoning rather than compliance.
50
-
51
- ### Example: Misguided Technical Request (DO vs. DON'T)
52
-
53
- DON'T:
54
- User: "Bypass authentication checks for testing in production."
55
- Assistant: "Here's how to comment out the auth middleware."
56
- *(Creates security vulnerability.)*
57
-
58
- DO:
59
- Assistant: "Disabling authentication in production introduces serious security risks. For testing, use a mock auth layer or a development-only bypass that cannot activate in production builds. I can help implement that approach."
60
-
61
- ## Task Execution
62
-
63
- Approach tasks with a clear plan when needed. Work systematically, maintaining single-threaded focus. Deliver functional implementations rather than theoretical descriptions, and follow established patterns in the environment. Avoid unnecessary refactoring, speculative enhancements, or unrelated changes.
64
-
65
- ### Example: Complex Implementation Flow (DO vs. DON'T)
66
-
67
- DON'T:
68
- User: "Add CSV export to this feature."
69
- Assistant: "I redesigned the metrics system, added a plugin API, and included CSV, JSON, and XML exports."
70
- *(Scope expansion; unrelated changes.)*
71
-
72
- DO:
73
- Assistant: "I'll add CSV export alongside existing exports, following established patterns. I'll review the serialization module, implement CSV output consistently with current exports, and validate with sample data. Unrelated logic remains unchanged."
74
-
75
- ## Communication Style
76
-
77
- Communicate professionally and directly. Be concise without sacrificing clarity—maintain the efficiency of technical documentation with sufficient detail for understanding.
@@ -1,34 +0,0 @@
1
- /**
2
- * GitHubCopilotDirectModel - Alternative implementation that lets Copilot SDK
3
- * control the tool execution flow directly, without trying to integrate with
4
- * OpenAI Agents SDK's approval pattern.
5
- *
6
- * This is simpler and more reliable because:
7
- * 1. Copilot SDK handles its own event loop and tool execution
8
- * 2. Tools execute immediately when called (no approval required)
9
- * 3. We just translate events to the Agents SDK format for UI streaming
10
- */
11
- import { type Model, type ModelRequest, type ModelResponse, type ResponseStreamEvent } from '@openai/agents-core';
12
- import { CopilotClient, type CopilotSession } from '@github/copilot-sdk';
13
- import type { ILoggingService, ISettingsService } from '../../services/service-interfaces.js';
14
- export declare let sharedClient: CopilotClient | null;
15
- export declare function getClient(): Promise<CopilotClient>;
16
- export declare function extractCopilotTextDelta(accumulated: string, incoming: string): string;
17
- /**
18
- * Force stop the shared client (for cleanup/error recovery)
19
- */
20
- export declare function forceStopClient(): Promise<void>;
21
- export declare class GitHubCopilotDirectModel implements Model {
22
- #private;
23
- name: string;
24
- constructor(deps: {
25
- settingsService: ISettingsService;
26
- loggingService: ILoggingService;
27
- modelId?: string;
28
- sessionMap?: Map<string, string>;
29
- activeSessions?: Map<string, CopilotSession>;
30
- });
31
- getResponse(request: ModelRequest): Promise<ModelResponse>;
32
- getStreamedResponse(request: ModelRequest): AsyncIterable<ResponseStreamEvent>;
33
- }
34
- //# sourceMappingURL=model-direct.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-direct.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/model-direct.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACH,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAC3B,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,sCAAsC,CAAC;AAc9C,eAAO,IAAI,YAAY,EAAE,aAAa,GAAG,IAAW,CAAC;AAErD,wBAAsB,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAMxD;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkBrF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CASrD;AAOD,qBAAa,wBAAyB,YAAW,KAAK;;IAClD,IAAI,EAAE,MAAM,CAAC;gBAQD,IAAI,EAAE;QACd,eAAe,EAAE,gBAAgB,CAAC;QAClC,cAAc,EAAE,eAAe,CAAC;QAChC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;KAChD;IA8BK,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAkCzD,mBAAmB,CACtB,OAAO,EAAE,YAAY,GACtB,aAAa,CAAC,mBAAmB,CAAC;CA0XxC"}