@tyvm/knowhow 0.0.109 → 0.0.111

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 (108) hide show
  1. package/autodoc/README.md +324 -0
  2. package/autodoc/chat-guide.md +268 -365
  3. package/autodoc/cli-reference.md +399 -473
  4. package/autodoc/config-reference.md +431 -330
  5. package/autodoc/embeddings-guide.md +223 -322
  6. package/autodoc/generate-guide.md +261 -301
  7. package/autodoc/language-plugin-guide.md +221 -247
  8. package/autodoc/modules-guide.md +242 -215
  9. package/autodoc/plugins-guide.md +470 -469
  10. package/autodoc/quickstart-guide.md +67 -70
  11. package/autodoc/skills-guide.md +455 -339
  12. package/autodoc/worker-guide.md +301 -308
  13. package/package.json +1 -1
  14. package/scripts/build-for-node.sh +10 -24
  15. package/src/agents/tools/list.ts +2 -2
  16. package/src/ai.ts +81 -37
  17. package/src/auth/browserLogin.ts +129 -3
  18. package/src/chat/CliChatService.ts +1 -1
  19. package/src/chat/modules/AgentModule.ts +7 -2
  20. package/src/chat/modules/SessionsModule.ts +40 -1
  21. package/src/chat/modules/SystemModule.ts +2 -2
  22. package/src/clients/anthropic.ts +1 -1
  23. package/src/clients/index.ts +25 -6
  24. package/src/clients/openai.ts +8 -5
  25. package/src/clients/types.ts +29 -6
  26. package/src/clients/withRetry.ts +89 -0
  27. package/src/commands/agent.ts +30 -0
  28. package/src/commands/modules.ts +417 -47
  29. package/src/config.ts +1 -1
  30. package/src/fileSync.ts +20 -12
  31. package/src/hashes.ts +43 -22
  32. package/src/index.ts +4 -2
  33. package/src/login.ts +3 -2
  34. package/src/processors/Base64ImageDetector.ts +73 -0
  35. package/src/services/Mcp.ts +14 -1
  36. package/src/services/MediaProcessorService.ts +79 -10
  37. package/src/services/modules/index.ts +47 -18
  38. package/src/utils/http.ts +9 -2
  39. package/tests/processors/Base64ImageDetector.test.ts +160 -0
  40. package/tests/unit/clients/AIClient.test.ts +446 -0
  41. package/tests/unit/clients/withRetry.test.ts +319 -0
  42. package/tests/unit/commands/github-credentials.test.ts +1 -2
  43. package/ts_build/package.json +1 -1
  44. package/ts_build/src/agents/tools/list.js +2 -2
  45. package/ts_build/src/agents/tools/list.js.map +1 -1
  46. package/ts_build/src/ai.d.ts +3 -3
  47. package/ts_build/src/ai.js +51 -23
  48. package/ts_build/src/ai.js.map +1 -1
  49. package/ts_build/src/auth/browserLogin.d.ts +2 -0
  50. package/ts_build/src/auth/browserLogin.js +91 -3
  51. package/ts_build/src/auth/browserLogin.js.map +1 -1
  52. package/ts_build/src/chat/CliChatService.js +1 -1
  53. package/ts_build/src/chat/CliChatService.js.map +1 -1
  54. package/ts_build/src/chat/modules/AgentModule.js +5 -2
  55. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  56. package/ts_build/src/chat/modules/SessionsModule.js +30 -1
  57. package/ts_build/src/chat/modules/SessionsModule.js.map +1 -1
  58. package/ts_build/src/chat/modules/SystemModule.js +2 -2
  59. package/ts_build/src/chat/modules/SystemModule.js.map +1 -1
  60. package/ts_build/src/clients/anthropic.js +1 -1
  61. package/ts_build/src/clients/anthropic.js.map +1 -1
  62. package/ts_build/src/clients/index.js +7 -6
  63. package/ts_build/src/clients/index.js.map +1 -1
  64. package/ts_build/src/clients/openai.js +4 -4
  65. package/ts_build/src/clients/openai.js.map +1 -1
  66. package/ts_build/src/clients/types.d.ts +12 -6
  67. package/ts_build/src/clients/withRetry.d.ts +2 -0
  68. package/ts_build/src/clients/withRetry.js +60 -0
  69. package/ts_build/src/clients/withRetry.js.map +1 -0
  70. package/ts_build/src/commands/agent.js +25 -0
  71. package/ts_build/src/commands/agent.js.map +1 -1
  72. package/ts_build/src/commands/modules.js +359 -32
  73. package/ts_build/src/commands/modules.js.map +1 -1
  74. package/ts_build/src/config.js +1 -1
  75. package/ts_build/src/config.js.map +1 -1
  76. package/ts_build/src/fileSync.d.ts +2 -2
  77. package/ts_build/src/fileSync.js +13 -11
  78. package/ts_build/src/fileSync.js.map +1 -1
  79. package/ts_build/src/hashes.d.ts +2 -2
  80. package/ts_build/src/hashes.js +40 -16
  81. package/ts_build/src/hashes.js.map +1 -1
  82. package/ts_build/src/index.js +1 -1
  83. package/ts_build/src/index.js.map +1 -1
  84. package/ts_build/src/login.js +2 -2
  85. package/ts_build/src/login.js.map +1 -1
  86. package/ts_build/src/processors/Base64ImageDetector.d.ts +3 -0
  87. package/ts_build/src/processors/Base64ImageDetector.js +42 -0
  88. package/ts_build/src/processors/Base64ImageDetector.js.map +1 -1
  89. package/ts_build/src/services/Mcp.js +9 -1
  90. package/ts_build/src/services/Mcp.js.map +1 -1
  91. package/ts_build/src/services/MediaProcessorService.d.ts +5 -4
  92. package/ts_build/src/services/MediaProcessorService.js +53 -8
  93. package/ts_build/src/services/MediaProcessorService.js.map +1 -1
  94. package/ts_build/src/services/modules/index.js +35 -12
  95. package/ts_build/src/services/modules/index.js.map +1 -1
  96. package/ts_build/src/utils/http.d.ts +2 -1
  97. package/ts_build/src/utils/http.js +11 -2
  98. package/ts_build/src/utils/http.js.map +1 -1
  99. package/ts_build/tests/processors/Base64ImageDetector.test.js +111 -0
  100. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +1 -1
  101. package/ts_build/tests/unit/clients/AIClient.test.d.ts +1 -0
  102. package/ts_build/tests/unit/clients/AIClient.test.js +339 -0
  103. package/ts_build/tests/unit/clients/AIClient.test.js.map +1 -0
  104. package/ts_build/tests/unit/clients/withRetry.test.d.ts +1 -0
  105. package/ts_build/tests/unit/clients/withRetry.test.js +225 -0
  106. package/ts_build/tests/unit/clients/withRetry.test.js.map +1 -0
  107. package/ts_build/tests/unit/commands/github-credentials.test.js +1 -2
  108. package/ts_build/tests/unit/commands/github-credentials.test.js.map +1 -1
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ jest.mock("../../../src/config", () => ({
4
+ getConfig: jest.fn().mockResolvedValue({ modules: [] }),
5
+ getGlobalConfig: jest.fn().mockResolvedValue({ modules: [] }),
6
+ getConfigSync: jest.fn().mockReturnValue({}),
7
+ }));
8
+ jest.mock("../../../src/services/KnowhowClient", () => ({
9
+ loadKnowhowJwt: jest.fn().mockReturnValue(null),
10
+ KNOWHOW_API_URL: "https://mock.local",
11
+ }));
12
+ const index_1 = require("../../../src/clients/index");
13
+ const mockCompletion = () => ({
14
+ choices: [{ message: { role: "assistant", content: "hello" } }],
15
+ model: "mock-model",
16
+ usage: { prompt_tokens: 10, completion_tokens: 5 },
17
+ });
18
+ const mockImage = () => ({
19
+ created: Date.now(),
20
+ data: [{ url: "https://mock.local/image.png" }],
21
+ });
22
+ const mockEmbedding = () => ({
23
+ data: [{ object: "embedding", embedding: [0.1, 0.2], index: 0 }],
24
+ model: "mock-embed",
25
+ usage: { prompt_tokens: 5, total_tokens: 5 },
26
+ });
27
+ const mockAudio = () => ({
28
+ audio: Buffer.from("fake-audio"),
29
+ format: "mp3",
30
+ });
31
+ function setupClient(overrides = {}) {
32
+ const mockGenericClient = {
33
+ setKey: jest.fn(),
34
+ createChatCompletion: jest
35
+ .fn()
36
+ .mockResolvedValue(mockCompletion()),
37
+ createEmbedding: jest.fn().mockResolvedValue(mockEmbedding()),
38
+ createImageGeneration: jest.fn().mockResolvedValue(mockImage()),
39
+ createAudioGeneration: jest.fn().mockResolvedValue(mockAudio()),
40
+ createAudioTranscription: jest
41
+ .fn()
42
+ .mockResolvedValue({ text: "transcribed" }),
43
+ createVideoGeneration: jest.fn().mockResolvedValue({
44
+ created: Date.now(),
45
+ data: [{ url: "https://mock.local/video.mp4" }],
46
+ }),
47
+ getModels: jest.fn().mockResolvedValue([]),
48
+ ...overrides,
49
+ };
50
+ const aiClient = new index_1.AIClient();
51
+ aiClient.registerClient("mock", mockGenericClient);
52
+ aiClient.registerModels("mock", ["mock-model", "mock-embed"]);
53
+ return { aiClient, mockGenericClient };
54
+ }
55
+ describe("AIClient — retry / timeout / AbortSignal", () => {
56
+ afterEach(() => {
57
+ jest.useRealTimers();
58
+ });
59
+ describe("createCompletion", () => {
60
+ it("returns a completion on success", async () => {
61
+ const { aiClient } = setupClient();
62
+ const result = await aiClient.createCompletion("mock", {
63
+ model: "mock-model",
64
+ messages: [{ role: "user", content: "hi" }],
65
+ });
66
+ expect(result.choices[0].message.content).toBe("hello");
67
+ });
68
+ it("forwards the AbortSignal to createChatCompletion", async () => {
69
+ const { aiClient, mockGenericClient } = setupClient();
70
+ const controller = new AbortController();
71
+ await aiClient.createCompletion("mock", {
72
+ model: "mock-model",
73
+ messages: [],
74
+ signal: controller.signal,
75
+ });
76
+ const callArgs = mockGenericClient.createChatCompletion
77
+ .mock.calls[0][0];
78
+ expect(callArgs.signal).toBeInstanceOf(AbortSignal);
79
+ });
80
+ it("retries on 429 and succeeds", async () => {
81
+ jest.useFakeTimers();
82
+ const { aiClient, mockGenericClient } = setupClient({
83
+ createChatCompletion: jest
84
+ .fn()
85
+ .mockRejectedValueOnce(new Error("429 rate limited"))
86
+ .mockResolvedValueOnce(mockCompletion()),
87
+ });
88
+ const promise = aiClient.createCompletion("mock", {
89
+ model: "mock-model",
90
+ messages: [],
91
+ maxRetries: 2,
92
+ backoffMs: 50,
93
+ });
94
+ await jest.runAllTimersAsync();
95
+ const result = await promise;
96
+ expect(result.choices[0].message.content).toBe("hello");
97
+ expect(mockGenericClient.createChatCompletion).toHaveBeenCalledTimes(2);
98
+ });
99
+ it("aborts immediately when external signal is pre-aborted", async () => {
100
+ const controller = new AbortController();
101
+ controller.abort();
102
+ const { aiClient, mockGenericClient } = setupClient();
103
+ await expect(aiClient.createCompletion("mock", {
104
+ model: "mock-model",
105
+ messages: [],
106
+ signal: controller.signal,
107
+ })).rejects.toMatchObject({ name: "AbortError" });
108
+ expect(mockGenericClient.createChatCompletion).not.toHaveBeenCalled();
109
+ });
110
+ it("cancels in-flight request when external signal is aborted", async () => {
111
+ const controller = new AbortController();
112
+ const { aiClient, mockGenericClient } = setupClient({
113
+ createChatCompletion: jest.fn().mockImplementation((opts) => {
114
+ return new Promise((_, reject) => {
115
+ opts.signal?.addEventListener("abort", () => reject(opts.signal.reason));
116
+ });
117
+ }),
118
+ });
119
+ const promise = aiClient.createCompletion("mock", {
120
+ model: "mock-model",
121
+ messages: [],
122
+ signal: controller.signal,
123
+ });
124
+ setImmediate(() => controller.abort(new DOMException("User cancelled", "AbortError")));
125
+ await expect(promise).rejects.toMatchObject({ name: "AbortError" });
126
+ expect(mockGenericClient.createChatCompletion).toHaveBeenCalledTimes(1);
127
+ });
128
+ it("times out per-attempt and retries", async () => {
129
+ jest.useFakeTimers();
130
+ const { aiClient, mockGenericClient } = setupClient({
131
+ createChatCompletion: jest
132
+ .fn()
133
+ .mockImplementationOnce((opts) => {
134
+ return new Promise((_, reject) => {
135
+ opts.signal?.addEventListener("abort", () => reject(opts.signal.reason));
136
+ });
137
+ })
138
+ .mockResolvedValueOnce(mockCompletion()),
139
+ });
140
+ const promise = aiClient.createCompletion("mock", {
141
+ model: "mock-model",
142
+ messages: [],
143
+ timeout: 1000,
144
+ maxRetries: 2,
145
+ backoffMs: 10,
146
+ });
147
+ await jest.runAllTimersAsync();
148
+ const result = await promise;
149
+ expect(result.choices[0].message.content).toBe("hello");
150
+ expect(mockGenericClient.createChatCompletion).toHaveBeenCalledTimes(2);
151
+ });
152
+ });
153
+ describe("createEmbedding", () => {
154
+ it("forwards the AbortSignal to createEmbedding on the client", async () => {
155
+ const { aiClient, mockGenericClient } = setupClient();
156
+ const controller = new AbortController();
157
+ await aiClient.createEmbedding("mock", {
158
+ input: "test text",
159
+ model: "mock-embed",
160
+ signal: controller.signal,
161
+ });
162
+ const callArgs = mockGenericClient.createEmbedding.mock
163
+ .calls[0][0];
164
+ expect(callArgs.signal).toBeInstanceOf(AbortSignal);
165
+ });
166
+ it("retries on 500 and succeeds", async () => {
167
+ jest.useFakeTimers();
168
+ const { aiClient, mockGenericClient } = setupClient({
169
+ createEmbedding: jest
170
+ .fn()
171
+ .mockRejectedValueOnce(new Error("500 Internal Server Error"))
172
+ .mockResolvedValueOnce(mockEmbedding()),
173
+ });
174
+ const promise = aiClient.createEmbedding("mock", {
175
+ input: "test",
176
+ model: "mock-embed",
177
+ maxRetries: 2,
178
+ backoffMs: 50,
179
+ });
180
+ await jest.runAllTimersAsync();
181
+ const result = await promise;
182
+ expect(result.data[0].embedding).toEqual([0.1, 0.2]);
183
+ expect(mockGenericClient.createEmbedding).toHaveBeenCalledTimes(2);
184
+ });
185
+ });
186
+ describe("createImageGeneration", () => {
187
+ it("forwards the AbortSignal to createImageGeneration on the client", async () => {
188
+ const { aiClient, mockGenericClient } = setupClient();
189
+ const controller = new AbortController();
190
+ await aiClient.createImageGeneration("mock", {
191
+ model: "mock-model",
192
+ prompt: "a cat",
193
+ signal: controller.signal,
194
+ });
195
+ const callArgs = mockGenericClient.createImageGeneration
196
+ .mock.calls[0][0];
197
+ expect(callArgs.signal).toBeInstanceOf(AbortSignal);
198
+ });
199
+ it("retries on 429 and succeeds", async () => {
200
+ jest.useFakeTimers();
201
+ const { aiClient, mockGenericClient } = setupClient({
202
+ createImageGeneration: jest
203
+ .fn()
204
+ .mockRejectedValueOnce(new Error("429 Too Many Requests"))
205
+ .mockResolvedValueOnce(mockImage()),
206
+ });
207
+ const promise = aiClient.createImageGeneration("mock", {
208
+ model: "mock-model",
209
+ prompt: "a cat",
210
+ maxRetries: 2,
211
+ backoffMs: 50,
212
+ });
213
+ await jest.runAllTimersAsync();
214
+ const result = await promise;
215
+ expect(result.data[0].url).toBe("https://mock.local/image.png");
216
+ expect(mockGenericClient.createImageGeneration).toHaveBeenCalledTimes(2);
217
+ });
218
+ it("aborts when external signal fires mid-request", async () => {
219
+ const controller = new AbortController();
220
+ const { aiClient, mockGenericClient } = setupClient({
221
+ createImageGeneration: jest.fn().mockImplementation((opts) => {
222
+ return new Promise((_, reject) => {
223
+ opts.signal?.addEventListener("abort", () => reject(opts.signal.reason));
224
+ });
225
+ }),
226
+ });
227
+ const promise = aiClient.createImageGeneration("mock", {
228
+ model: "mock-model",
229
+ prompt: "a cat",
230
+ signal: controller.signal,
231
+ });
232
+ setImmediate(() => controller.abort(new DOMException("User cancelled", "AbortError")));
233
+ await expect(promise).rejects.toMatchObject({ name: "AbortError" });
234
+ expect(mockGenericClient.createImageGeneration).toHaveBeenCalledTimes(1);
235
+ });
236
+ });
237
+ describe("createAudioGeneration", () => {
238
+ it("forwards the AbortSignal to createAudioGeneration on the client", async () => {
239
+ const { aiClient, mockGenericClient } = setupClient();
240
+ const controller = new AbortController();
241
+ await aiClient.createAudioGeneration("mock", {
242
+ model: "mock-model",
243
+ input: "Hello world",
244
+ voice: "alloy",
245
+ signal: controller.signal,
246
+ });
247
+ const callArgs = mockGenericClient.createAudioGeneration
248
+ .mock.calls[0][0];
249
+ expect(callArgs.signal).toBeInstanceOf(AbortSignal);
250
+ });
251
+ it("retries on ECONNRESET and succeeds", async () => {
252
+ jest.useFakeTimers();
253
+ const { aiClient, mockGenericClient } = setupClient({
254
+ createAudioGeneration: jest
255
+ .fn()
256
+ .mockRejectedValueOnce(new Error("ECONNRESET"))
257
+ .mockResolvedValueOnce(mockAudio()),
258
+ });
259
+ const promise = aiClient.createAudioGeneration("mock", {
260
+ model: "mock-model",
261
+ input: "Hello",
262
+ voice: "alloy",
263
+ maxRetries: 2,
264
+ backoffMs: 50,
265
+ });
266
+ await jest.runAllTimersAsync();
267
+ const result = await promise;
268
+ expect(result.format).toBe("mp3");
269
+ expect(mockGenericClient.createAudioGeneration).toHaveBeenCalledTimes(2);
270
+ });
271
+ });
272
+ describe("createVideoGeneration", () => {
273
+ it("forwards the AbortSignal to createVideoGeneration on the client", async () => {
274
+ const { aiClient, mockGenericClient } = setupClient();
275
+ const controller = new AbortController();
276
+ await aiClient.createVideoGeneration("mock", {
277
+ model: "mock-model",
278
+ prompt: "a sunset",
279
+ signal: controller.signal,
280
+ });
281
+ const callArgs = mockGenericClient.createVideoGeneration
282
+ .mock.calls[0][0];
283
+ expect(callArgs.signal).toBeInstanceOf(AbortSignal);
284
+ });
285
+ it("retries on 503 and succeeds", async () => {
286
+ jest.useFakeTimers();
287
+ const { aiClient, mockGenericClient } = setupClient({
288
+ createVideoGeneration: jest
289
+ .fn()
290
+ .mockRejectedValueOnce(new Error("503 Service Unavailable"))
291
+ .mockResolvedValueOnce({
292
+ created: Date.now(),
293
+ data: [{ url: "https://mock.local/video.mp4" }],
294
+ }),
295
+ });
296
+ const promise = aiClient.createVideoGeneration("mock", {
297
+ model: "mock-model",
298
+ prompt: "a sunset",
299
+ maxRetries: 2,
300
+ backoffMs: 50,
301
+ });
302
+ await jest.runAllTimersAsync();
303
+ const result = await promise;
304
+ expect(result.data[0].url).toBe("https://mock.local/video.mp4");
305
+ expect(mockGenericClient.createVideoGeneration).toHaveBeenCalledTimes(2);
306
+ });
307
+ });
308
+ describe("createAudioTranscription", () => {
309
+ it("forwards the AbortSignal to createAudioTranscription on the client", async () => {
310
+ const { aiClient, mockGenericClient } = setupClient();
311
+ const controller = new AbortController();
312
+ await aiClient.createAudioTranscription("mock", {
313
+ file: Buffer.from("fake-audio"),
314
+ signal: controller.signal,
315
+ });
316
+ const callArgs = mockGenericClient.createAudioTranscription.mock.calls[0][0];
317
+ expect(callArgs.signal).toBeInstanceOf(AbortSignal);
318
+ });
319
+ it("retries on timeout error and succeeds", async () => {
320
+ jest.useFakeTimers();
321
+ const { aiClient, mockGenericClient } = setupClient({
322
+ createAudioTranscription: jest
323
+ .fn()
324
+ .mockRejectedValueOnce(new Error("timeout"))
325
+ .mockResolvedValueOnce({ text: "hello world" }),
326
+ });
327
+ const promise = aiClient.createAudioTranscription("mock", {
328
+ file: Buffer.from("fake-audio"),
329
+ maxRetries: 2,
330
+ backoffMs: 50,
331
+ });
332
+ await jest.runAllTimersAsync();
333
+ const result = await promise;
334
+ expect(result.text).toBe("hello world");
335
+ expect(mockGenericClient.createAudioTranscription).toHaveBeenCalledTimes(2);
336
+ });
337
+ });
338
+ });
339
+ //# sourceMappingURL=AIClient.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIClient.test.js","sourceRoot":"","sources":["../../../../tests/unit/clients/AIClient.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const withRetry_1 = require("../../../src/clients/withRetry");
4
+ describe("withRetry", () => {
5
+ afterEach(() => {
6
+ jest.useRealTimers();
7
+ });
8
+ describe("success path", () => {
9
+ it("returns the result immediately when fn succeeds on the first attempt", async () => {
10
+ const fn = jest.fn().mockResolvedValue({ answer: 42 });
11
+ const result = await (0, withRetry_1.withRetry)(fn, { maxRetries: 2 });
12
+ expect(result).toEqual({ answer: 42 });
13
+ expect(fn).toHaveBeenCalledTimes(1);
14
+ });
15
+ it("passes undefined signal to fn when no timeout or external signal is provided", async () => {
16
+ let receivedSignal = "not-called";
17
+ const fn = jest.fn().mockImplementation((signal) => {
18
+ receivedSignal = signal;
19
+ return Promise.resolve("ok");
20
+ });
21
+ await (0, withRetry_1.withRetry)(fn, {});
22
+ expect(receivedSignal).toBeUndefined();
23
+ });
24
+ it("passes a signal to fn when a timeout is provided", async () => {
25
+ let receivedSignal;
26
+ const fn = jest.fn().mockImplementation((signal) => {
27
+ receivedSignal = signal;
28
+ return Promise.resolve("ok");
29
+ });
30
+ await (0, withRetry_1.withRetry)(fn, { timeout: 5000 });
31
+ expect(receivedSignal).toBeInstanceOf(AbortSignal);
32
+ expect(receivedSignal.aborted).toBe(false);
33
+ });
34
+ });
35
+ describe("retry on retriable errors", () => {
36
+ it("retries on a 429 rate-limit error and eventually succeeds", async () => {
37
+ jest.useFakeTimers();
38
+ const fn = jest
39
+ .fn()
40
+ .mockRejectedValueOnce(new Error("429 Too Many Requests"))
41
+ .mockResolvedValueOnce({ answer: "retried" });
42
+ const promise = (0, withRetry_1.withRetry)(fn, { maxRetries: 2, backoffMs: 100 });
43
+ await jest.runAllTimersAsync();
44
+ const result = await promise;
45
+ expect(result).toEqual({ answer: "retried" });
46
+ expect(fn).toHaveBeenCalledTimes(2);
47
+ });
48
+ it("retries on a 500 server error and eventually succeeds", async () => {
49
+ jest.useFakeTimers();
50
+ const fn = jest
51
+ .fn()
52
+ .mockRejectedValueOnce(new Error("500 Internal Server Error"))
53
+ .mockResolvedValueOnce({
54
+ choices: [{ message: { role: "assistant", content: "hi" } }],
55
+ });
56
+ const promise = (0, withRetry_1.withRetry)(fn, { maxRetries: 2, backoffMs: 100 });
57
+ await jest.runAllTimersAsync();
58
+ const result = await promise;
59
+ expect(result).toMatchObject({
60
+ choices: [{ message: { content: "hi" } }],
61
+ });
62
+ expect(fn).toHaveBeenCalledTimes(2);
63
+ });
64
+ it("retries on ECONNRESET and succeeds", async () => {
65
+ jest.useFakeTimers();
66
+ const fn = jest
67
+ .fn()
68
+ .mockRejectedValueOnce(new Error("ECONNRESET"))
69
+ .mockResolvedValueOnce("success");
70
+ const promise = (0, withRetry_1.withRetry)(fn, { maxRetries: 2, backoffMs: 100 });
71
+ await jest.runAllTimersAsync();
72
+ const result = await promise;
73
+ expect(result).toBe("success");
74
+ expect(fn).toHaveBeenCalledTimes(2);
75
+ });
76
+ it("retries up to maxRetries times then throws", async () => {
77
+ jest.useFakeTimers();
78
+ const fn = jest.fn().mockImplementation(() => Promise.reject(new Error("500 Server Error")));
79
+ const resultPromise = (0, withRetry_1.withRetry)(fn, { maxRetries: 2, backoffMs: 10 });
80
+ resultPromise.catch(() => { });
81
+ await jest.runAllTimersAsync();
82
+ await expect(resultPromise).rejects.toThrow("500 Server Error");
83
+ expect(fn).toHaveBeenCalledTimes(3);
84
+ });
85
+ it("does NOT retry on a non-retriable error (e.g. 400 Bad Request)", async () => {
86
+ const fn = jest
87
+ .fn()
88
+ .mockRejectedValue(new Error("400 Bad Request"));
89
+ await expect((0, withRetry_1.withRetry)(fn, { maxRetries: 2 })).rejects.toThrow("400 Bad Request");
90
+ expect(fn).toHaveBeenCalledTimes(1);
91
+ });
92
+ it("does NOT retry when maxRetries is 0", async () => {
93
+ const fn = jest
94
+ .fn()
95
+ .mockRejectedValue(new Error("500 Server Error"));
96
+ await expect((0, withRetry_1.withRetry)(fn, { maxRetries: 0 })).rejects.toThrow("500 Server Error");
97
+ expect(fn).toHaveBeenCalledTimes(1);
98
+ });
99
+ it("uses exponential backoff between retries", async () => {
100
+ jest.useFakeTimers();
101
+ const error = new Error("500 err");
102
+ const fn = jest
103
+ .fn()
104
+ .mockRejectedValueOnce(error)
105
+ .mockRejectedValueOnce(error)
106
+ .mockResolvedValueOnce("done");
107
+ const observedDelays = [];
108
+ const origSetTimeout = global.setTimeout;
109
+ const spy = jest
110
+ .spyOn(global, "setTimeout")
111
+ .mockImplementation((cb, delay, ...args) => {
112
+ if (delay === 100 || delay === 200) {
113
+ observedDelays.push(delay);
114
+ }
115
+ return origSetTimeout(cb, 0, ...args);
116
+ });
117
+ const promise = (0, withRetry_1.withRetry)(fn, { maxRetries: 2, backoffMs: 100 });
118
+ await jest.runAllTimersAsync();
119
+ await promise;
120
+ spy.mockRestore();
121
+ expect(observedDelays).toContain(100);
122
+ expect(observedDelays).toContain(200);
123
+ });
124
+ });
125
+ describe("per-attempt timeout", () => {
126
+ it("aborts fn via signal when timeout fires and retries on the next attempt", async () => {
127
+ jest.useFakeTimers();
128
+ const fn = jest
129
+ .fn()
130
+ .mockImplementationOnce((signal) => {
131
+ return new Promise((_, reject) => {
132
+ signal.addEventListener("abort", () => reject(signal.reason));
133
+ });
134
+ })
135
+ .mockResolvedValueOnce("completed after timeout retry");
136
+ const promise = (0, withRetry_1.withRetry)(fn, {
137
+ timeout: 1000,
138
+ maxRetries: 2,
139
+ backoffMs: 10,
140
+ });
141
+ await jest.runAllTimersAsync();
142
+ const result = await promise;
143
+ expect(result).toBe("completed after timeout retry");
144
+ expect(fn).toHaveBeenCalledTimes(2);
145
+ });
146
+ it("throws after all retries are exhausted by timeouts", async () => {
147
+ jest.useFakeTimers();
148
+ const fn = jest.fn().mockImplementation((signal) => {
149
+ return new Promise((_, reject) => {
150
+ signal.addEventListener("abort", () => reject(signal.reason));
151
+ });
152
+ });
153
+ const promise = (0, withRetry_1.withRetry)(fn, {
154
+ timeout: 500,
155
+ maxRetries: 1,
156
+ backoffMs: 10,
157
+ });
158
+ promise.catch(() => { });
159
+ await jest.runAllTimersAsync();
160
+ await expect(promise).rejects.toMatchObject({ name: "TimeoutError" });
161
+ expect(fn).toHaveBeenCalledTimes(2);
162
+ });
163
+ });
164
+ describe("external AbortSignal", () => {
165
+ it("does not call fn when signal is already aborted before invocation", async () => {
166
+ const controller = new AbortController();
167
+ controller.abort();
168
+ const fn = jest.fn().mockResolvedValue("should not reach");
169
+ await expect((0, withRetry_1.withRetry)(fn, { signal: controller.signal, maxRetries: 2 })).rejects.toMatchObject({ name: "AbortError" });
170
+ expect(fn).not.toHaveBeenCalled();
171
+ });
172
+ it("cancels an in-flight request when signal is aborted externally", async () => {
173
+ const controller = new AbortController();
174
+ const fn = jest.fn().mockImplementation((signal) => {
175
+ return new Promise((_, reject) => {
176
+ signal.addEventListener("abort", () => reject(signal.reason));
177
+ });
178
+ });
179
+ const promise = (0, withRetry_1.withRetry)(fn, {
180
+ signal: controller.signal,
181
+ maxRetries: 2,
182
+ });
183
+ setImmediate(() => controller.abort(new DOMException("User cancelled", "AbortError")));
184
+ await expect(promise).rejects.toMatchObject({ name: "AbortError" });
185
+ expect(fn).toHaveBeenCalledTimes(1);
186
+ });
187
+ it("does not retry after external abort even if error string looks retriable", async () => {
188
+ const controller = new AbortController();
189
+ controller.abort(new DOMException("Aborted", "AbortError"));
190
+ const fn = jest.fn().mockResolvedValue("ok");
191
+ await expect((0, withRetry_1.withRetry)(fn, { signal: controller.signal, maxRetries: 3 })).rejects.toMatchObject({ name: "AbortError" });
192
+ expect(fn).not.toHaveBeenCalled();
193
+ });
194
+ it("forwards the combined signal to fn and it is not aborted on success", async () => {
195
+ const controller = new AbortController();
196
+ let receivedSignal;
197
+ const fn = jest.fn().mockImplementation((signal) => {
198
+ receivedSignal = signal;
199
+ return Promise.resolve("ok");
200
+ });
201
+ await (0, withRetry_1.withRetry)(fn, { signal: controller.signal, timeout: 5000 });
202
+ expect(receivedSignal).toBeInstanceOf(AbortSignal);
203
+ expect(receivedSignal.aborted).toBe(false);
204
+ });
205
+ });
206
+ describe("timeout + external signal combined", () => {
207
+ it("abort via external signal takes priority over pending timeout", async () => {
208
+ const controller = new AbortController();
209
+ const fn = jest.fn().mockImplementation((signal) => {
210
+ return new Promise((_, reject) => {
211
+ signal.addEventListener("abort", () => reject(signal.reason));
212
+ });
213
+ });
214
+ const promise = (0, withRetry_1.withRetry)(fn, {
215
+ signal: controller.signal,
216
+ timeout: 10_000,
217
+ maxRetries: 2,
218
+ });
219
+ setImmediate(() => controller.abort(new DOMException("User cancelled", "AbortError")));
220
+ await expect(promise).rejects.toMatchObject({ name: "AbortError" });
221
+ expect(fn).toHaveBeenCalledTimes(1);
222
+ });
223
+ });
224
+ });
225
+ //# sourceMappingURL=withRetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withRetry.test.js","sourceRoot":"","sources":["../../../../tests/unit/clients/withRetry.test.ts"],"names":[],"mappings":"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"}
@@ -52,8 +52,7 @@ describe("github-credentials command", () => {
52
52
  logger_1.logger.silence();
53
53
  }
54
54
  const consoleSpy = jest.spyOn(process.stdout, "write");
55
- console.warn("⚠️ Terminal module: no TunnelHandler in context terminal addon not registered");
56
- console.log("some other module loading noise");
55
+ console.log("some module loading noise that should be suppressed");
57
56
  expect(consoleSpy).not.toHaveBeenCalled();
58
57
  consoleSpy.mockRestore();
59
58
  process.argv = originalArgv;