beth-copilot 1.0.18 → 1.1.0

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 (291) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +158 -358
  4. package/dist/__tests__/smoke.test.d.ts +8 -0
  5. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  6. package/dist/__tests__/smoke.test.js +49 -0
  7. package/dist/__tests__/smoke.test.js.map +1 -0
  8. package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
  9. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  10. package/dist/cli/commands/beads.e2e.test.js +526 -0
  11. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  12. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  13. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  14. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  15. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  16. package/dist/cli/commands/close.d.ts +89 -0
  17. package/dist/cli/commands/close.d.ts.map +1 -0
  18. package/dist/cli/commands/close.e2e.test.d.ts +27 -0
  19. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  20. package/dist/cli/commands/close.e2e.test.js +252 -0
  21. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  22. package/dist/cli/commands/close.js +309 -0
  23. package/dist/cli/commands/close.js.map +1 -0
  24. package/dist/cli/commands/close.test.d.ts +15 -0
  25. package/dist/cli/commands/close.test.d.ts.map +1 -0
  26. package/dist/cli/commands/close.test.js +634 -0
  27. package/dist/cli/commands/close.test.js.map +1 -0
  28. package/dist/cli/commands/doctor.d.ts +23 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -1
  30. package/dist/cli/commands/doctor.js +93 -0
  31. package/dist/cli/commands/doctor.js.map +1 -1
  32. package/dist/cli/commands/doctor.test.js +209 -0
  33. package/dist/cli/commands/doctor.test.js.map +1 -1
  34. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  35. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  36. package/dist/cli/commands/framework-isolation.test.js +119 -0
  37. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  38. package/dist/cli/commands/help.e2e.test.js +4 -4
  39. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  40. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  41. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  42. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  43. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  44. package/dist/cli/commands/land.d.ts +142 -0
  45. package/dist/cli/commands/land.d.ts.map +1 -0
  46. package/dist/cli/commands/land.js +647 -0
  47. package/dist/cli/commands/land.js.map +1 -0
  48. package/dist/cli/commands/land.test.d.ts +20 -0
  49. package/dist/cli/commands/land.test.d.ts.map +1 -0
  50. package/dist/cli/commands/land.test.js +622 -0
  51. package/dist/cli/commands/land.test.js.map +1 -0
  52. package/dist/cli/commands/mcp.e2e.test.js +22 -29
  53. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  54. package/dist/cli/commands/pipeline.e2e.test.js +20 -20
  55. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  56. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  57. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  59. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  61. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.js +257 -0
  63. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  64. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  65. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  66. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  67. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  69. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  70. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  71. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  72. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  73. package/dist/cli/commands/quickstart.js +7 -23
  74. package/dist/cli/commands/quickstart.js.map +1 -1
  75. package/dist/cli/commands/quickstart.test.js +40 -67
  76. package/dist/cli/commands/quickstart.test.js.map +1 -1
  77. package/dist/core/agents/suite.test.js +4 -2
  78. package/dist/core/agents/suite.test.js.map +1 -1
  79. package/dist/core/agents/tools.test.js +5 -1
  80. package/dist/core/agents/tools.test.js.map +1 -1
  81. package/dist/index.d.ts +3 -10
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +5 -10
  84. package/dist/index.js.map +1 -1
  85. package/package.json +15 -9
  86. package/sbom.json +2011 -819
  87. package/templates/.github/agents/beth.agent.md +220 -66
  88. package/templates/.github/agents/developer.agent.md +53 -90
  89. package/templates/.github/agents/product-manager.agent.md +15 -68
  90. package/templates/.github/agents/researcher.agent.md +20 -71
  91. package/templates/.github/agents/security-reviewer.agent.md +29 -81
  92. package/templates/.github/agents/tester.agent.md +40 -69
  93. package/templates/.github/agents/ux-designer.agent.md +20 -74
  94. package/templates/.github/copilot-instructions.md +217 -225
  95. package/templates/AGENTS.md +108 -20
  96. package/templates/mcp.json.example +0 -3
  97. package/dist/cli/commands/client-config.d.ts +0 -31
  98. package/dist/cli/commands/client-config.d.ts.map +0 -1
  99. package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
  100. package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
  101. package/dist/cli/commands/client-config.e2e.test.js +0 -556
  102. package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
  103. package/dist/cli/commands/client-config.js +0 -73
  104. package/dist/cli/commands/client-config.js.map +0 -1
  105. package/dist/cli/commands/client-config.test.d.ts +0 -6
  106. package/dist/cli/commands/client-config.test.d.ts.map +0 -1
  107. package/dist/cli/commands/client-config.test.js +0 -133
  108. package/dist/cli/commands/client-config.test.js.map +0 -1
  109. package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
  110. package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
  111. package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
  112. package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
  113. package/dist/core/context.d.ts +0 -171
  114. package/dist/core/context.d.ts.map +0 -1
  115. package/dist/core/context.js +0 -353
  116. package/dist/core/context.js.map +0 -1
  117. package/dist/core/context.test.d.ts +0 -8
  118. package/dist/core/context.test.d.ts.map +0 -1
  119. package/dist/core/context.test.js +0 -253
  120. package/dist/core/context.test.js.map +0 -1
  121. package/dist/core/handoffs.d.ts +0 -151
  122. package/dist/core/handoffs.d.ts.map +0 -1
  123. package/dist/core/handoffs.js +0 -220
  124. package/dist/core/handoffs.js.map +0 -1
  125. package/dist/core/handoffs.test.d.ts +0 -8
  126. package/dist/core/handoffs.test.d.ts.map +0 -1
  127. package/dist/core/handoffs.test.js +0 -231
  128. package/dist/core/handoffs.test.js.map +0 -1
  129. package/dist/core/orchestrator.d.ts +0 -246
  130. package/dist/core/orchestrator.d.ts.map +0 -1
  131. package/dist/core/orchestrator.js +0 -514
  132. package/dist/core/orchestrator.js.map +0 -1
  133. package/dist/core/orchestrator.test.d.ts +0 -8
  134. package/dist/core/orchestrator.test.d.ts.map +0 -1
  135. package/dist/core/orchestrator.test.js +0 -517
  136. package/dist/core/orchestrator.test.js.map +0 -1
  137. package/dist/core/router.d.ts +0 -102
  138. package/dist/core/router.d.ts.map +0 -1
  139. package/dist/core/router.js +0 -178
  140. package/dist/core/router.js.map +0 -1
  141. package/dist/core/router.test.d.ts +0 -8
  142. package/dist/core/router.test.d.ts.map +0 -1
  143. package/dist/core/router.test.js +0 -215
  144. package/dist/core/router.test.js.map +0 -1
  145. package/dist/init.test.js +0 -288
  146. package/dist/providers/azure.d.ts +0 -147
  147. package/dist/providers/azure.d.ts.map +0 -1
  148. package/dist/providers/azure.js +0 -491
  149. package/dist/providers/azure.js.map +0 -1
  150. package/dist/providers/azure.test.d.ts +0 -11
  151. package/dist/providers/azure.test.d.ts.map +0 -1
  152. package/dist/providers/azure.test.js +0 -330
  153. package/dist/providers/azure.test.js.map +0 -1
  154. package/dist/providers/config.d.ts +0 -87
  155. package/dist/providers/config.d.ts.map +0 -1
  156. package/dist/providers/config.js +0 -193
  157. package/dist/providers/config.js.map +0 -1
  158. package/dist/providers/config.test.d.ts +0 -7
  159. package/dist/providers/config.test.d.ts.map +0 -1
  160. package/dist/providers/config.test.js +0 -370
  161. package/dist/providers/config.test.js.map +0 -1
  162. package/dist/providers/index.d.ts +0 -18
  163. package/dist/providers/index.d.ts.map +0 -1
  164. package/dist/providers/index.js +0 -14
  165. package/dist/providers/index.js.map +0 -1
  166. package/dist/providers/interface.d.ts +0 -191
  167. package/dist/providers/interface.d.ts.map +0 -1
  168. package/dist/providers/interface.js +0 -94
  169. package/dist/providers/interface.js.map +0 -1
  170. package/dist/providers/retry.d.ts +0 -128
  171. package/dist/providers/retry.d.ts.map +0 -1
  172. package/dist/providers/retry.js +0 -205
  173. package/dist/providers/retry.js.map +0 -1
  174. package/dist/providers/retry.test.d.ts +0 -7
  175. package/dist/providers/retry.test.d.ts.map +0 -1
  176. package/dist/providers/retry.test.js +0 -439
  177. package/dist/providers/retry.test.js.map +0 -1
  178. package/dist/providers/streaming.d.ts +0 -157
  179. package/dist/providers/streaming.d.ts.map +0 -1
  180. package/dist/providers/streaming.js +0 -233
  181. package/dist/providers/streaming.js.map +0 -1
  182. package/dist/providers/streaming.test.d.ts +0 -7
  183. package/dist/providers/streaming.test.d.ts.map +0 -1
  184. package/dist/providers/streaming.test.js +0 -372
  185. package/dist/providers/streaming.test.js.map +0 -1
  186. package/dist/providers/types.d.ts +0 -209
  187. package/dist/providers/types.d.ts.map +0 -1
  188. package/dist/providers/types.js +0 -53
  189. package/dist/providers/types.js.map +0 -1
  190. package/dist/providers/types.test.d.ts +0 -7
  191. package/dist/providers/types.test.d.ts.map +0 -1
  192. package/dist/providers/types.test.js +0 -141
  193. package/dist/providers/types.test.js.map +0 -1
  194. package/dist/tools/cli/beads.d.ts +0 -27
  195. package/dist/tools/cli/beads.d.ts.map +0 -1
  196. package/dist/tools/cli/beads.js +0 -172
  197. package/dist/tools/cli/beads.js.map +0 -1
  198. package/dist/tools/cli/beads.test.d.ts +0 -8
  199. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  200. package/dist/tools/cli/beads.test.js +0 -264
  201. package/dist/tools/cli/beads.test.js.map +0 -1
  202. package/dist/tools/cli/editFile.d.ts +0 -17
  203. package/dist/tools/cli/editFile.d.ts.map +0 -1
  204. package/dist/tools/cli/editFile.js +0 -125
  205. package/dist/tools/cli/editFile.js.map +0 -1
  206. package/dist/tools/cli/editFile.test.d.ts +0 -8
  207. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  208. package/dist/tools/cli/editFile.test.js +0 -177
  209. package/dist/tools/cli/editFile.test.js.map +0 -1
  210. package/dist/tools/cli/readFile.d.ts +0 -25
  211. package/dist/tools/cli/readFile.d.ts.map +0 -1
  212. package/dist/tools/cli/readFile.js +0 -118
  213. package/dist/tools/cli/readFile.js.map +0 -1
  214. package/dist/tools/cli/readFile.test.d.ts +0 -8
  215. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  216. package/dist/tools/cli/readFile.test.js +0 -194
  217. package/dist/tools/cli/readFile.test.js.map +0 -1
  218. package/dist/tools/cli/search.d.ts +0 -16
  219. package/dist/tools/cli/search.d.ts.map +0 -1
  220. package/dist/tools/cli/search.js +0 -261
  221. package/dist/tools/cli/search.js.map +0 -1
  222. package/dist/tools/cli/search.test.d.ts +0 -8
  223. package/dist/tools/cli/search.test.d.ts.map +0 -1
  224. package/dist/tools/cli/search.test.js +0 -172
  225. package/dist/tools/cli/search.test.js.map +0 -1
  226. package/dist/tools/cli/subagent.d.ts +0 -43
  227. package/dist/tools/cli/subagent.d.ts.map +0 -1
  228. package/dist/tools/cli/subagent.js +0 -99
  229. package/dist/tools/cli/subagent.js.map +0 -1
  230. package/dist/tools/cli/subagent.test.d.ts +0 -8
  231. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  232. package/dist/tools/cli/subagent.test.js +0 -190
  233. package/dist/tools/cli/subagent.test.js.map +0 -1
  234. package/dist/tools/cli/terminal.d.ts +0 -19
  235. package/dist/tools/cli/terminal.d.ts.map +0 -1
  236. package/dist/tools/cli/terminal.js +0 -164
  237. package/dist/tools/cli/terminal.js.map +0 -1
  238. package/dist/tools/cli/terminal.test.d.ts +0 -8
  239. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  240. package/dist/tools/cli/terminal.test.js +0 -161
  241. package/dist/tools/cli/terminal.test.js.map +0 -1
  242. package/dist/tools/index.d.ts +0 -25
  243. package/dist/tools/index.d.ts.map +0 -1
  244. package/dist/tools/index.js +0 -41
  245. package/dist/tools/index.js.map +0 -1
  246. package/dist/tools/interface.d.ts +0 -64
  247. package/dist/tools/interface.d.ts.map +0 -1
  248. package/dist/tools/interface.js +0 -37
  249. package/dist/tools/interface.js.map +0 -1
  250. package/dist/tools/interface.test.d.ts +0 -7
  251. package/dist/tools/interface.test.d.ts.map +0 -1
  252. package/dist/tools/interface.test.js +0 -179
  253. package/dist/tools/interface.test.js.map +0 -1
  254. package/dist/tools/mcp/bridge.d.ts +0 -48
  255. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  256. package/dist/tools/mcp/bridge.js +0 -128
  257. package/dist/tools/mcp/bridge.js.map +0 -1
  258. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  259. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  260. package/dist/tools/mcp/bridge.test.js +0 -300
  261. package/dist/tools/mcp/bridge.test.js.map +0 -1
  262. package/dist/tools/mcp/client.d.ts +0 -135
  263. package/dist/tools/mcp/client.d.ts.map +0 -1
  264. package/dist/tools/mcp/client.js +0 -263
  265. package/dist/tools/mcp/client.js.map +0 -1
  266. package/dist/tools/mcp/client.test.d.ts +0 -8
  267. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  268. package/dist/tools/mcp/client.test.js +0 -390
  269. package/dist/tools/mcp/client.test.js.map +0 -1
  270. package/dist/tools/registry.d.ts +0 -82
  271. package/dist/tools/registry.d.ts.map +0 -1
  272. package/dist/tools/registry.js +0 -99
  273. package/dist/tools/registry.js.map +0 -1
  274. package/dist/tools/registry.test.d.ts +0 -7
  275. package/dist/tools/registry.test.d.ts.map +0 -1
  276. package/dist/tools/registry.test.js +0 -199
  277. package/dist/tools/registry.test.js.map +0 -1
  278. package/dist/tools/suite.test.d.ts +0 -11
  279. package/dist/tools/suite.test.d.ts.map +0 -1
  280. package/dist/tools/suite.test.js +0 -119
  281. package/dist/tools/suite.test.js.map +0 -1
  282. package/dist/tools/types.d.ts +0 -75
  283. package/dist/tools/types.d.ts.map +0 -1
  284. package/dist/tools/types.js +0 -30
  285. package/dist/tools/types.js.map +0 -1
  286. package/dist/tools/types.test.d.ts +0 -7
  287. package/dist/tools/types.test.d.ts.map +0 -1
  288. package/dist/tools/types.test.js +0 -178
  289. package/dist/tools/types.test.js.map +0 -1
  290. package/templates/.vscode/mcp.json +0 -20
  291. package/templates/CLAUDE.md +0 -129
@@ -1,94 +0,0 @@
1
- /**
2
- * LLM Provider Interface
3
- *
4
- * Abstract base class and interfaces for LLM provider implementations.
5
- * Designed to be provider-agnostic, enabling support for Azure OpenAI,
6
- * Claude, Ollama, and other providers.
7
- */
8
- // =============================================================================
9
- // Provider Interface
10
- // =============================================================================
11
- /**
12
- * Abstract base class for LLM provider implementations.
13
- *
14
- * Provides a unified interface for interacting with different LLM providers.
15
- * Concrete implementations handle provider-specific API details while
16
- * conforming to this common contract.
17
- *
18
- * @example
19
- * ```typescript
20
- * class AzureOpenAIProvider extends LLMProviderBase {
21
- * get name() { return 'azure-openai'; }
22
- * get isConfigured() { return !!this.config.apiKey; }
23
- *
24
- * async chat(messages, options) {
25
- * // Azure-specific implementation
26
- * }
27
- *
28
- * async *chatStream(messages, options) {
29
- * // Azure-specific streaming implementation
30
- * }
31
- *
32
- * async countTokens(messages) {
33
- * // Token counting implementation
34
- * }
35
- * }
36
- * ```
37
- */
38
- export class LLMProviderBase {
39
- /** Provider configuration */
40
- config;
41
- /**
42
- * Create a new provider instance.
43
- *
44
- * @param config - Provider configuration including credentials and model settings
45
- */
46
- constructor(config) {
47
- this.config = config;
48
- }
49
- // ===========================================================================
50
- // Utility Methods
51
- // ===========================================================================
52
- /**
53
- * Get the configured model name or deployment.
54
- *
55
- * Returns the model specified in the provider configuration.
56
- */
57
- get model() {
58
- return this.config.model;
59
- }
60
- /**
61
- * Get a redacted summary of the configuration for logging.
62
- *
63
- * Returns configuration information safe for logging, with
64
- * sensitive values (endpoints) masked. Credential type is shown
65
- * but no secrets are exposed.
66
- */
67
- getConfigSummary() {
68
- return {
69
- provider: this.name,
70
- model: this.config.model,
71
- endpoint: this.maskEndpoint(this.config.endpoint),
72
- auth: 'Entra ID (TokenCredential)',
73
- };
74
- }
75
- /**
76
- * Mask an endpoint URL for safe logging.
77
- *
78
- * Preserves the host but masks path segments to avoid leaking
79
- * deployment names or resource identifiers.
80
- *
81
- * @param endpoint - Full endpoint URL
82
- * @returns Masked endpoint safe for logging
83
- */
84
- maskEndpoint(endpoint) {
85
- try {
86
- const url = new URL(endpoint);
87
- return `${url.protocol}//${url.host}/***`;
88
- }
89
- catch {
90
- return '(invalid url)';
91
- }
92
- }
93
- }
94
- //# sourceMappingURL=interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2CH,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAgB,eAAe;IACnC,6BAA6B;IACV,MAAM,CAAY;IAErC;;;;OAIG;IACH,YAAY,MAAiB;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IA2GD,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;;OAIG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB;QACd,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACjD,IAAI,EAAE,4BAA4B;SACnC,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -1,128 +0,0 @@
1
- /**
2
- * Retry Utility for LLM API Calls
3
- *
4
- * Provides exponential backoff retry logic with jitter for handling
5
- * transient errors in LLM API calls. Designed to prevent thundering herd
6
- * problems and gracefully handle rate limits and temporary failures.
7
- */
8
- /**
9
- * Options for configuring retry behavior.
10
- */
11
- export interface RetryOptions {
12
- /** Maximum number of retry attempts (default: 3) */
13
- maxRetries?: number;
14
- /** Base delay in milliseconds before first retry (default: 1000) */
15
- baseDelay?: number;
16
- /** Maximum delay in milliseconds between retries (default: 30000) */
17
- maxDelay?: number;
18
- /** Whether to add randomized jitter to prevent thundering herd (default: true) */
19
- jitter?: boolean;
20
- /** HTTP status codes that should trigger a retry (default: [429, 500, 502, 503, 504]) */
21
- retryableStatuses?: number[];
22
- /** Optional callback invoked before each retry attempt */
23
- onRetry?: (error: Error, attempt: number, delay: number) => void;
24
- }
25
- /**
26
- * Error thrown when all retry attempts have been exhausted.
27
- */
28
- export declare class RetryError extends Error {
29
- /** Number of attempts made before giving up */
30
- readonly attempts: number;
31
- /** The last error that caused the final retry to fail */
32
- readonly lastError: Error;
33
- /**
34
- * Create a new RetryError
35
- * @param message - Human-readable error message
36
- * @param attempts - Number of retry attempts made
37
- * @param lastError - The error from the final attempt
38
- */
39
- constructor(message: string, attempts: number, lastError: Error);
40
- }
41
- /**
42
- * Calculate the delay before the next retry attempt.
43
- *
44
- * Uses exponential backoff: `baseDelay * 2^attempt`, capped at `maxDelay`.
45
- * When jitter is enabled, multiplies by a random factor between 0.5 and 1.5.
46
- *
47
- * @param attempt - Zero-based attempt number (0 = first retry)
48
- * @param baseDelay - Base delay in milliseconds
49
- * @param maxDelay - Maximum delay cap in milliseconds
50
- * @param jitter - Whether to apply random jitter
51
- * @returns Calculated delay in milliseconds
52
- *
53
- * @example
54
- * ```typescript
55
- * // First retry, base 1000ms, no jitter
56
- * calculateDelay(0, 1000, 30000, false); // 1000
57
- *
58
- * // Second retry, base 1000ms, no jitter
59
- * calculateDelay(1, 1000, 30000, false); // 2000
60
- *
61
- * // With jitter, result varies between 500-1500 for first retry
62
- * calculateDelay(0, 1000, 30000, true); // 500-1500
63
- * ```
64
- */
65
- export declare function calculateDelay(attempt: number, baseDelay: number, maxDelay: number, jitter: boolean): number;
66
- /**
67
- * Determine if an error is transient and should be retried.
68
- *
69
- * Checks for:
70
- * - HTTP status codes: 429 (rate limit), 500, 502, 503, 504 (server errors)
71
- * - Network errors: ECONNRESET, ETIMEDOUT, ECONNREFUSED, etc.
72
- *
73
- * @param error - The error to check
74
- * @param retryableStatuses - HTTP status codes considered retryable
75
- * @returns True if the error is transient and should be retried
76
- *
77
- * @example
78
- * ```typescript
79
- * // HTTP 429 Too Many Requests
80
- * const rateLimitError = new Error('Rate limited');
81
- * (rateLimitError as any).status = 429;
82
- * isTransientError(rateLimitError); // true
83
- *
84
- * // Network error
85
- * const networkError = new Error('Connection reset');
86
- * (networkError as any).code = 'ECONNRESET';
87
- * isTransientError(networkError); // true
88
- *
89
- * // Client error (not retryable)
90
- * const clientError = new Error('Bad request');
91
- * (clientError as any).status = 400;
92
- * isTransientError(clientError); // false
93
- * ```
94
- */
95
- export declare function isTransientError(error: Error, retryableStatuses?: number[]): boolean;
96
- /**
97
- * Execute an async function with automatic retry on transient failures.
98
- *
99
- * Uses exponential backoff with optional jitter to retry failed operations.
100
- * Only retries on transient errors (rate limits, server errors, network issues).
101
- *
102
- * @typeParam T - The return type of the async function
103
- * @param fn - The async function to execute
104
- * @param options - Retry configuration options
105
- * @returns The result of the successful function call
106
- * @throws {RetryError} When all retry attempts are exhausted
107
- * @throws {Error} When a non-transient error occurs
108
- *
109
- * @example
110
- * ```typescript
111
- * // Basic usage
112
- * const result = await retry(() => fetchFromLLM(prompt));
113
- *
114
- * // With custom options
115
- * const result = await retry(
116
- * () => fetchFromLLM(prompt),
117
- * {
118
- * maxRetries: 5,
119
- * baseDelay: 2000,
120
- * onRetry: (error, attempt, delay) => {
121
- * console.log(`Retry ${attempt} after ${delay}ms: ${error.message}`);
122
- * }
123
- * }
124
- * );
125
- * ```
126
- */
127
- export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
128
- //# sourceMappingURL=retry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,kFAAkF;IAClF,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAE1B;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK;CAWhE;AAYD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,GACd,MAAM,CAcR;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,iBAAiB,GAAE,MAAM,EAA+B,GACvD,OAAO,CAgBT;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA4DZ"}
@@ -1,205 +0,0 @@
1
- /**
2
- * Retry Utility for LLM API Calls
3
- *
4
- * Provides exponential backoff retry logic with jitter for handling
5
- * transient errors in LLM API calls. Designed to prevent thundering herd
6
- * problems and gracefully handle rate limits and temporary failures.
7
- */
8
- /**
9
- * Network error codes that indicate transient failures.
10
- */
11
- const TRANSIENT_ERROR_CODES = new Set([
12
- 'ECONNRESET',
13
- 'ETIMEDOUT',
14
- 'ECONNREFUSED',
15
- 'ENOTFOUND',
16
- 'ENETUNREACH',
17
- 'EHOSTUNREACH',
18
- 'EPIPE',
19
- 'EAI_AGAIN',
20
- ]);
21
- /**
22
- * HTTP status codes that indicate retryable errors.
23
- */
24
- const DEFAULT_RETRYABLE_STATUSES = [429, 500, 502, 503, 504];
25
- /**
26
- * Error thrown when all retry attempts have been exhausted.
27
- */
28
- export class RetryError extends Error {
29
- /** Number of attempts made before giving up */
30
- attempts;
31
- /** The last error that caused the final retry to fail */
32
- lastError;
33
- /**
34
- * Create a new RetryError
35
- * @param message - Human-readable error message
36
- * @param attempts - Number of retry attempts made
37
- * @param lastError - The error from the final attempt
38
- */
39
- constructor(message, attempts, lastError) {
40
- super(message);
41
- this.name = 'RetryError';
42
- this.attempts = attempts;
43
- this.lastError = lastError;
44
- // Maintain proper stack trace in V8 environments
45
- if (Error.captureStackTrace) {
46
- Error.captureStackTrace(this, RetryError);
47
- }
48
- }
49
- }
50
- /**
51
- * Calculate the delay before the next retry attempt.
52
- *
53
- * Uses exponential backoff: `baseDelay * 2^attempt`, capped at `maxDelay`.
54
- * When jitter is enabled, multiplies by a random factor between 0.5 and 1.5.
55
- *
56
- * @param attempt - Zero-based attempt number (0 = first retry)
57
- * @param baseDelay - Base delay in milliseconds
58
- * @param maxDelay - Maximum delay cap in milliseconds
59
- * @param jitter - Whether to apply random jitter
60
- * @returns Calculated delay in milliseconds
61
- *
62
- * @example
63
- * ```typescript
64
- * // First retry, base 1000ms, no jitter
65
- * calculateDelay(0, 1000, 30000, false); // 1000
66
- *
67
- * // Second retry, base 1000ms, no jitter
68
- * calculateDelay(1, 1000, 30000, false); // 2000
69
- *
70
- * // With jitter, result varies between 500-1500 for first retry
71
- * calculateDelay(0, 1000, 30000, true); // 500-1500
72
- * ```
73
- */
74
- export function calculateDelay(attempt, baseDelay, maxDelay, jitter) {
75
- // Exponential backoff: baseDelay * 2^attempt
76
- const exponentialDelay = baseDelay * Math.pow(2, attempt);
77
- // Cap at maxDelay
78
- const cappedDelay = Math.min(exponentialDelay, maxDelay);
79
- // Apply jitter: multiply by random factor between 0.5 and 1.5
80
- if (jitter) {
81
- const jitterFactor = 0.5 + Math.random();
82
- return Math.floor(cappedDelay * jitterFactor);
83
- }
84
- return cappedDelay;
85
- }
86
- /**
87
- * Determine if an error is transient and should be retried.
88
- *
89
- * Checks for:
90
- * - HTTP status codes: 429 (rate limit), 500, 502, 503, 504 (server errors)
91
- * - Network errors: ECONNRESET, ETIMEDOUT, ECONNREFUSED, etc.
92
- *
93
- * @param error - The error to check
94
- * @param retryableStatuses - HTTP status codes considered retryable
95
- * @returns True if the error is transient and should be retried
96
- *
97
- * @example
98
- * ```typescript
99
- * // HTTP 429 Too Many Requests
100
- * const rateLimitError = new Error('Rate limited');
101
- * (rateLimitError as any).status = 429;
102
- * isTransientError(rateLimitError); // true
103
- *
104
- * // Network error
105
- * const networkError = new Error('Connection reset');
106
- * (networkError as any).code = 'ECONNRESET';
107
- * isTransientError(networkError); // true
108
- *
109
- * // Client error (not retryable)
110
- * const clientError = new Error('Bad request');
111
- * (clientError as any).status = 400;
112
- * isTransientError(clientError); // false
113
- * ```
114
- */
115
- export function isTransientError(error, retryableStatuses = DEFAULT_RETRYABLE_STATUSES) {
116
- const errorWithStatus = error;
117
- // Check for HTTP status codes
118
- const statusCode = errorWithStatus.statusCode ?? errorWithStatus.status;
119
- if (statusCode !== undefined && retryableStatuses.includes(statusCode)) {
120
- return true;
121
- }
122
- // Check for network error codes
123
- const errorCode = errorWithStatus.code;
124
- if (errorCode !== undefined && TRANSIENT_ERROR_CODES.has(errorCode)) {
125
- return true;
126
- }
127
- return false;
128
- }
129
- /**
130
- * Sleep for a specified duration.
131
- * @param ms - Duration in milliseconds
132
- * @returns Promise that resolves after the duration
133
- */
134
- function sleep(ms) {
135
- return new Promise((resolve) => setTimeout(resolve, ms));
136
- }
137
- /**
138
- * Execute an async function with automatic retry on transient failures.
139
- *
140
- * Uses exponential backoff with optional jitter to retry failed operations.
141
- * Only retries on transient errors (rate limits, server errors, network issues).
142
- *
143
- * @typeParam T - The return type of the async function
144
- * @param fn - The async function to execute
145
- * @param options - Retry configuration options
146
- * @returns The result of the successful function call
147
- * @throws {RetryError} When all retry attempts are exhausted
148
- * @throws {Error} When a non-transient error occurs
149
- *
150
- * @example
151
- * ```typescript
152
- * // Basic usage
153
- * const result = await retry(() => fetchFromLLM(prompt));
154
- *
155
- * // With custom options
156
- * const result = await retry(
157
- * () => fetchFromLLM(prompt),
158
- * {
159
- * maxRetries: 5,
160
- * baseDelay: 2000,
161
- * onRetry: (error, attempt, delay) => {
162
- * console.log(`Retry ${attempt} after ${delay}ms: ${error.message}`);
163
- * }
164
- * }
165
- * );
166
- * ```
167
- */
168
- export async function retry(fn, options = {}) {
169
- const { maxRetries = 3, baseDelay = 1000, maxDelay = 30000, jitter = true, retryableStatuses = DEFAULT_RETRYABLE_STATUSES, onRetry, } = options;
170
- let lastError;
171
- let attempt = 0;
172
- // Total attempts = 1 initial + maxRetries
173
- const totalAttempts = maxRetries + 1;
174
- while (attempt < totalAttempts) {
175
- try {
176
- return await fn();
177
- }
178
- catch (error) {
179
- // Ensure we have an Error object
180
- const errorObj = error instanceof Error ? error : new Error(String(error));
181
- lastError = errorObj;
182
- // Check if we've exhausted retries
183
- if (attempt >= maxRetries) {
184
- throw new RetryError(`All ${totalAttempts} attempts failed. Last error: ${errorObj.message}`, totalAttempts, errorObj);
185
- }
186
- // Check if error is retryable
187
- if (!isTransientError(errorObj, retryableStatuses)) {
188
- // Non-transient error, don't retry
189
- throw errorObj;
190
- }
191
- // Calculate delay for next retry
192
- const delay = calculateDelay(attempt, baseDelay, maxDelay, jitter);
193
- // Invoke onRetry callback if provided
194
- if (onRetry) {
195
- onRetry(errorObj, attempt + 1, delay);
196
- }
197
- // Wait before retrying
198
- await sleep(delay);
199
- attempt++;
200
- }
201
- }
202
- // This should never be reached, but TypeScript needs it
203
- throw new RetryError(`All ${totalAttempts} attempts failed.`, totalAttempts, lastError ?? new Error('Unknown error'));
204
- }
205
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/providers/retry.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Retry Utility Tests
3
- *
4
- * Tests for exponential backoff retry logic.
5
- */
6
- export {};
7
- //# sourceMappingURL=retry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["../../src/providers/retry.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}