mcp-agent-foundry 1.0.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 (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/install-skills.d.ts +11 -0
  4. package/dist/cli/install-skills.d.ts.map +1 -0
  5. package/dist/cli/install-skills.js +143 -0
  6. package/dist/cli/install-skills.js.map +1 -0
  7. package/dist/cli/recovery-commands.d.ts +41 -0
  8. package/dist/cli/recovery-commands.d.ts.map +1 -0
  9. package/dist/cli/recovery-commands.js +241 -0
  10. package/dist/cli/recovery-commands.js.map +1 -0
  11. package/dist/cli/setup-wizard.d.ts +25 -0
  12. package/dist/cli/setup-wizard.d.ts.map +1 -0
  13. package/dist/cli/setup-wizard.js +1417 -0
  14. package/dist/cli/setup-wizard.js.map +1 -0
  15. package/dist/cli/test-connection.d.ts +45 -0
  16. package/dist/cli/test-connection.d.ts.map +1 -0
  17. package/dist/cli/test-connection.js +317 -0
  18. package/dist/cli/test-connection.js.map +1 -0
  19. package/dist/cli.d.ts +75 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +704 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/defaults.d.ts +57 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +99 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/index.d.ts +14 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +22 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/manager.d.ts +184 -0
  32. package/dist/config/manager.d.ts.map +1 -0
  33. package/dist/config/manager.js +347 -0
  34. package/dist/config/manager.js.map +1 -0
  35. package/dist/config/merger.d.ts +76 -0
  36. package/dist/config/merger.d.ts.map +1 -0
  37. package/dist/config/merger.js +189 -0
  38. package/dist/config/merger.js.map +1 -0
  39. package/dist/config/schema.d.ts +20 -0
  40. package/dist/config/schema.d.ts.map +1 -0
  41. package/dist/config/schema.js +20 -0
  42. package/dist/config/schema.js.map +1 -0
  43. package/dist/config/validator.d.ts +254 -0
  44. package/dist/config/validator.d.ts.map +1 -0
  45. package/dist/config/validator.js +363 -0
  46. package/dist/config/validator.js.map +1 -0
  47. package/dist/config/worktree-defaults.d.ts +23 -0
  48. package/dist/config/worktree-defaults.d.ts.map +1 -0
  49. package/dist/config/worktree-defaults.js +78 -0
  50. package/dist/config/worktree-defaults.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +44 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/tools/compare-agents.d.ts +25 -0
  56. package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
  57. package/dist/mcp/tools/compare-agents.js +177 -0
  58. package/dist/mcp/tools/compare-agents.js.map +1 -0
  59. package/dist/mcp/tools/critique-plan.d.ts +26 -0
  60. package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
  61. package/dist/mcp/tools/critique-plan.js +162 -0
  62. package/dist/mcp/tools/critique-plan.js.map +1 -0
  63. package/dist/mcp/tools/design-feedback.d.ts +26 -0
  64. package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
  65. package/dist/mcp/tools/design-feedback.js +216 -0
  66. package/dist/mcp/tools/design-feedback.js.map +1 -0
  67. package/dist/mcp/tools/index.d.ts +50 -0
  68. package/dist/mcp/tools/index.d.ts.map +1 -0
  69. package/dist/mcp/tools/index.js +191 -0
  70. package/dist/mcp/tools/index.js.map +1 -0
  71. package/dist/mcp/tools/invoke-agent.d.ts +25 -0
  72. package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
  73. package/dist/mcp/tools/invoke-agent.js +141 -0
  74. package/dist/mcp/tools/invoke-agent.js.map +1 -0
  75. package/dist/mcp/tools/review-code.d.ts +25 -0
  76. package/dist/mcp/tools/review-code.d.ts.map +1 -0
  77. package/dist/mcp/tools/review-code.js +170 -0
  78. package/dist/mcp/tools/review-code.js.map +1 -0
  79. package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
  80. package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
  81. package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
  82. package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
  83. package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
  84. package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
  85. package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
  86. package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
  87. package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
  88. package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
  89. package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
  90. package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
  91. package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
  92. package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
  93. package/dist/mcp/tools/tasks/execute-task.js +284 -0
  94. package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
  95. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
  96. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
  97. package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
  98. package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
  99. package/dist/mcp/tools/tasks/index.d.ts +36 -0
  100. package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
  101. package/dist/mcp/tools/tasks/index.js +66 -0
  102. package/dist/mcp/tools/tasks/index.js.map +1 -0
  103. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
  104. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
  105. package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
  106. package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
  107. package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
  108. package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
  109. package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
  110. package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
  111. package/dist/mcp/tools/worktree/index.d.ts +41 -0
  112. package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
  113. package/dist/mcp/tools/worktree/index.js +69 -0
  114. package/dist/mcp/tools/worktree/index.js.map +1 -0
  115. package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
  116. package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
  117. package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
  118. package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
  119. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
  120. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
  121. package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
  122. package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
  123. package/dist/mcp/transport/stdio.d.ts +13 -0
  124. package/dist/mcp/transport/stdio.d.ts.map +1 -0
  125. package/dist/mcp/transport/stdio.js +15 -0
  126. package/dist/mcp/transport/stdio.js.map +1 -0
  127. package/dist/observability/logger.d.ts +137 -0
  128. package/dist/observability/logger.d.ts.map +1 -0
  129. package/dist/observability/logger.js +235 -0
  130. package/dist/observability/logger.js.map +1 -0
  131. package/dist/observability/metrics.d.ts +250 -0
  132. package/dist/observability/metrics.d.ts.map +1 -0
  133. package/dist/observability/metrics.js +364 -0
  134. package/dist/observability/metrics.js.map +1 -0
  135. package/dist/persistence/index.d.ts +9 -0
  136. package/dist/persistence/index.d.ts.map +1 -0
  137. package/dist/persistence/index.js +9 -0
  138. package/dist/persistence/index.js.map +1 -0
  139. package/dist/persistence/state-schema.d.ts +116 -0
  140. package/dist/persistence/state-schema.d.ts.map +1 -0
  141. package/dist/persistence/state-schema.js +28 -0
  142. package/dist/persistence/state-schema.js.map +1 -0
  143. package/dist/persistence/state-store.d.ts +111 -0
  144. package/dist/persistence/state-store.d.ts.map +1 -0
  145. package/dist/persistence/state-store.js +291 -0
  146. package/dist/persistence/state-store.js.map +1 -0
  147. package/dist/providers/anthropic.d.ts +164 -0
  148. package/dist/providers/anthropic.d.ts.map +1 -0
  149. package/dist/providers/anthropic.js +500 -0
  150. package/dist/providers/anthropic.js.map +1 -0
  151. package/dist/providers/base.d.ts +151 -0
  152. package/dist/providers/base.d.ts.map +1 -0
  153. package/dist/providers/base.js +227 -0
  154. package/dist/providers/base.js.map +1 -0
  155. package/dist/providers/gemini.d.ts +85 -0
  156. package/dist/providers/gemini.d.ts.map +1 -0
  157. package/dist/providers/gemini.js +414 -0
  158. package/dist/providers/gemini.js.map +1 -0
  159. package/dist/providers/kimi.d.ts +19 -0
  160. package/dist/providers/kimi.d.ts.map +1 -0
  161. package/dist/providers/kimi.js +20 -0
  162. package/dist/providers/kimi.js.map +1 -0
  163. package/dist/providers/manager.d.ts +160 -0
  164. package/dist/providers/manager.d.ts.map +1 -0
  165. package/dist/providers/manager.js +264 -0
  166. package/dist/providers/manager.js.map +1 -0
  167. package/dist/providers/ollama.d.ts +83 -0
  168. package/dist/providers/ollama.d.ts.map +1 -0
  169. package/dist/providers/ollama.js +453 -0
  170. package/dist/providers/ollama.js.map +1 -0
  171. package/dist/providers/openai.d.ts +96 -0
  172. package/dist/providers/openai.d.ts.map +1 -0
  173. package/dist/providers/openai.js +457 -0
  174. package/dist/providers/openai.js.map +1 -0
  175. package/dist/providers/zai.d.ts +19 -0
  176. package/dist/providers/zai.d.ts.map +1 -0
  177. package/dist/providers/zai.js +20 -0
  178. package/dist/providers/zai.js.map +1 -0
  179. package/dist/router/context-manager.d.ts +2 -0
  180. package/dist/router/context-manager.d.ts.map +1 -0
  181. package/dist/router/context-manager.js +3 -0
  182. package/dist/router/context-manager.js.map +1 -0
  183. package/dist/router/engine.d.ts +169 -0
  184. package/dist/router/engine.d.ts.map +1 -0
  185. package/dist/router/engine.js +435 -0
  186. package/dist/router/engine.js.map +1 -0
  187. package/dist/router/pattern-executor.d.ts +317 -0
  188. package/dist/router/pattern-executor.d.ts.map +1 -0
  189. package/dist/router/pattern-executor.js +571 -0
  190. package/dist/router/pattern-executor.js.map +1 -0
  191. package/dist/router/role-resolver.d.ts +59 -0
  192. package/dist/router/role-resolver.d.ts.map +1 -0
  193. package/dist/router/role-resolver.js +95 -0
  194. package/dist/router/role-resolver.js.map +1 -0
  195. package/dist/server.d.ts +32 -0
  196. package/dist/server.d.ts.map +1 -0
  197. package/dist/server.js +223 -0
  198. package/dist/server.js.map +1 -0
  199. package/dist/startup.d.ts +78 -0
  200. package/dist/startup.d.ts.map +1 -0
  201. package/dist/startup.js +107 -0
  202. package/dist/startup.js.map +1 -0
  203. package/dist/tasks/coordinator.d.ts +141 -0
  204. package/dist/tasks/coordinator.d.ts.map +1 -0
  205. package/dist/tasks/coordinator.js +331 -0
  206. package/dist/tasks/coordinator.js.map +1 -0
  207. package/dist/tasks/index.d.ts +13 -0
  208. package/dist/tasks/index.d.ts.map +1 -0
  209. package/dist/tasks/index.js +13 -0
  210. package/dist/tasks/index.js.map +1 -0
  211. package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
  212. package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
  213. package/dist/tasks/persistent-state-coordinator.js +371 -0
  214. package/dist/tasks/persistent-state-coordinator.js.map +1 -0
  215. package/dist/tasks/pipeline-manager.d.ts +103 -0
  216. package/dist/tasks/pipeline-manager.d.ts.map +1 -0
  217. package/dist/tasks/pipeline-manager.js +358 -0
  218. package/dist/tasks/pipeline-manager.js.map +1 -0
  219. package/dist/tasks/state-coordinator.d.ts +79 -0
  220. package/dist/tasks/state-coordinator.d.ts.map +1 -0
  221. package/dist/tasks/state-coordinator.js +200 -0
  222. package/dist/tasks/state-coordinator.js.map +1 -0
  223. package/dist/tasks/worker-mode.d.ts +65 -0
  224. package/dist/tasks/worker-mode.d.ts.map +1 -0
  225. package/dist/tasks/worker-mode.js +208 -0
  226. package/dist/tasks/worker-mode.js.map +1 -0
  227. package/dist/translation/errors.d.ts +203 -0
  228. package/dist/translation/errors.d.ts.map +1 -0
  229. package/dist/translation/errors.js +477 -0
  230. package/dist/translation/errors.js.map +1 -0
  231. package/dist/translation/index.d.ts +12 -0
  232. package/dist/translation/index.d.ts.map +1 -0
  233. package/dist/translation/index.js +32 -0
  234. package/dist/translation/index.js.map +1 -0
  235. package/dist/translation/messages.d.ts +295 -0
  236. package/dist/translation/messages.d.ts.map +1 -0
  237. package/dist/translation/messages.js +557 -0
  238. package/dist/translation/messages.js.map +1 -0
  239. package/dist/translation/streaming.d.ts +226 -0
  240. package/dist/translation/streaming.d.ts.map +1 -0
  241. package/dist/translation/streaming.js +520 -0
  242. package/dist/translation/streaming.js.map +1 -0
  243. package/dist/translation/tools.d.ts +209 -0
  244. package/dist/translation/tools.d.ts.map +1 -0
  245. package/dist/translation/tools.js +331 -0
  246. package/dist/translation/tools.js.map +1 -0
  247. package/dist/types.d.ts +747 -0
  248. package/dist/types.d.ts.map +1 -0
  249. package/dist/types.js +86 -0
  250. package/dist/types.js.map +1 -0
  251. package/dist/utils/circuit-breaker.d.ts +175 -0
  252. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  253. package/dist/utils/circuit-breaker.js +315 -0
  254. package/dist/utils/circuit-breaker.js.map +1 -0
  255. package/dist/utils/env.d.ts +2 -0
  256. package/dist/utils/env.d.ts.map +1 -0
  257. package/dist/utils/env.js +3 -0
  258. package/dist/utils/env.js.map +1 -0
  259. package/dist/utils/git.d.ts +58 -0
  260. package/dist/utils/git.d.ts.map +1 -0
  261. package/dist/utils/git.js +197 -0
  262. package/dist/utils/git.js.map +1 -0
  263. package/dist/utils/index.d.ts +9 -0
  264. package/dist/utils/index.d.ts.map +1 -0
  265. package/dist/utils/index.js +9 -0
  266. package/dist/utils/index.js.map +1 -0
  267. package/dist/utils/merge-ordering.d.ts +45 -0
  268. package/dist/utils/merge-ordering.d.ts.map +1 -0
  269. package/dist/utils/merge-ordering.js +128 -0
  270. package/dist/utils/merge-ordering.js.map +1 -0
  271. package/dist/utils/retry.d.ts +106 -0
  272. package/dist/utils/retry.d.ts.map +1 -0
  273. package/dist/utils/retry.js +188 -0
  274. package/dist/utils/retry.js.map +1 -0
  275. package/dist/worktrees/branch-manager.d.ts +55 -0
  276. package/dist/worktrees/branch-manager.d.ts.map +1 -0
  277. package/dist/worktrees/branch-manager.js +129 -0
  278. package/dist/worktrees/branch-manager.js.map +1 -0
  279. package/dist/worktrees/conflict-handler.d.ts +72 -0
  280. package/dist/worktrees/conflict-handler.d.ts.map +1 -0
  281. package/dist/worktrees/conflict-handler.js +287 -0
  282. package/dist/worktrees/conflict-handler.js.map +1 -0
  283. package/dist/worktrees/conflict-parser.d.ts +28 -0
  284. package/dist/worktrees/conflict-parser.d.ts.map +1 -0
  285. package/dist/worktrees/conflict-parser.js +140 -0
  286. package/dist/worktrees/conflict-parser.js.map +1 -0
  287. package/dist/worktrees/index.d.ts +20 -0
  288. package/dist/worktrees/index.d.ts.map +1 -0
  289. package/dist/worktrees/index.js +20 -0
  290. package/dist/worktrees/index.js.map +1 -0
  291. package/dist/worktrees/instructions.d.ts +20 -0
  292. package/dist/worktrees/instructions.d.ts.map +1 -0
  293. package/dist/worktrees/instructions.js +84 -0
  294. package/dist/worktrees/instructions.js.map +1 -0
  295. package/dist/worktrees/manager.d.ts +76 -0
  296. package/dist/worktrees/manager.d.ts.map +1 -0
  297. package/dist/worktrees/manager.js +277 -0
  298. package/dist/worktrees/manager.js.map +1 -0
  299. package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
  300. package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
  301. package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
  302. package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
  303. package/dist/worktrees/pool.d.ts +95 -0
  304. package/dist/worktrees/pool.d.ts.map +1 -0
  305. package/dist/worktrees/pool.js +271 -0
  306. package/dist/worktrees/pool.js.map +1 -0
  307. package/dist/worktrees/recovery.d.ts +94 -0
  308. package/dist/worktrees/recovery.d.ts.map +1 -0
  309. package/dist/worktrees/recovery.js +371 -0
  310. package/dist/worktrees/recovery.js.map +1 -0
  311. package/dist/worktrees/resource-manager.d.ts +74 -0
  312. package/dist/worktrees/resource-manager.d.ts.map +1 -0
  313. package/dist/worktrees/resource-manager.js +228 -0
  314. package/dist/worktrees/resource-manager.js.map +1 -0
  315. package/package.json +88 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Git Utilities for Agent Foundry
3
+ *
4
+ * Low-level git command execution using simple-git.
5
+ */
6
+ import { SimpleGit } from 'simple-git';
7
+ export declare function createGit(cwd: string): SimpleGit;
8
+ export declare function getRepoRoot(cwd: string): Promise<string>;
9
+ export declare function getCurrentBranch(cwd: string): Promise<string>;
10
+ export declare function branchExists(cwd: string, branchName: string): Promise<boolean>;
11
+ export declare function isCleanWorkingDirectory(cwd: string): Promise<boolean>;
12
+ export declare function isGitRepository(cwd: string): Promise<boolean>;
13
+ export declare function listWorktrees(cwd: string): Promise<Array<{
14
+ path: string;
15
+ head: string;
16
+ branch: string | null;
17
+ }>>;
18
+ export declare function createWorktree(cwd: string, path: string, branch: string, baseBranch?: string): Promise<void>;
19
+ export declare function removeWorktree(cwd: string, path: string, force?: boolean): Promise<void>;
20
+ export declare function pruneWorktrees(cwd: string): Promise<void>;
21
+ /**
22
+ * Check if the repository is in a merge conflict state.
23
+ */
24
+ export declare function isInMergeConflict(cwd: string): Promise<boolean>;
25
+ /**
26
+ * Get list of files with merge conflicts.
27
+ */
28
+ export declare function getConflictedFiles(cwd: string): Promise<string[]>;
29
+ /**
30
+ * Get merge head information (ours and theirs commits).
31
+ */
32
+ export declare function getMergeHeads(cwd: string): Promise<{
33
+ ours: string;
34
+ theirs: string;
35
+ oursRef: string;
36
+ theirsRef: string;
37
+ } | null>;
38
+ /**
39
+ * Stage a resolved file.
40
+ */
41
+ export declare function stageFile(cwd: string, filePath: string): Promise<void>;
42
+ /**
43
+ * Stage multiple resolved files.
44
+ */
45
+ export declare function stageFiles(cwd: string, filePaths: string[]): Promise<void>;
46
+ /**
47
+ * Complete a merge after resolving conflicts.
48
+ */
49
+ export declare function completeMerge(cwd: string, message?: string): Promise<string>;
50
+ /**
51
+ * Abort a merge in progress.
52
+ */
53
+ export declare function abortMerge(cwd: string): Promise<void>;
54
+ /**
55
+ * Check out a specific version of a file (ours or theirs).
56
+ */
57
+ export declare function checkoutFileVersion(cwd: string, filePath: string, version: 'ours' | 'theirs'): Promise<void>;
58
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAa,SAAS,EAAoB,MAAM,YAAY,CAAC;AAGpE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAQhD;AAGD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG9D;AAGD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAGD,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpF;AAGD,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI3E;AAGD,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE;AAGD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACvD,KAAK,CAAC;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC,CACH,CAoBA;AAGD,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAUf;AAGD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5F;AAGD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIvE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAAC,CAyBR;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,QAAQ,GACzB,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Git Utilities for Agent Foundry
3
+ *
4
+ * Low-level git command execution using simple-git.
5
+ */
6
+ import { simpleGit } from 'simple-git';
7
+ // Create a SimpleGit instance for a given working directory
8
+ export function createGit(cwd) {
9
+ const options = {
10
+ baseDir: cwd,
11
+ binary: 'git',
12
+ maxConcurrentProcesses: 6,
13
+ trimmed: true,
14
+ };
15
+ return simpleGit(options);
16
+ }
17
+ // Get the repository root directory
18
+ export async function getRepoRoot(cwd) {
19
+ const git = createGit(cwd);
20
+ return git.revparse(['--show-toplevel']);
21
+ }
22
+ // Get current branch name
23
+ export async function getCurrentBranch(cwd) {
24
+ const git = createGit(cwd);
25
+ return git.revparse(['--abbrev-ref', 'HEAD']);
26
+ }
27
+ // Check if a branch exists
28
+ export async function branchExists(cwd, branchName) {
29
+ const git = createGit(cwd);
30
+ try {
31
+ const branches = await git.branchLocal();
32
+ return branches.all.includes(branchName);
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ // Check if working directory is clean
39
+ export async function isCleanWorkingDirectory(cwd) {
40
+ const git = createGit(cwd);
41
+ const status = await git.status();
42
+ return status.isClean();
43
+ }
44
+ // Check if path is inside a git repository
45
+ export async function isGitRepository(cwd) {
46
+ const git = createGit(cwd);
47
+ try {
48
+ await git.revparse(['--git-dir']);
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ // Get list of worktrees
56
+ export async function listWorktrees(cwd) {
57
+ const git = createGit(cwd);
58
+ const result = await git.raw(['worktree', 'list', '--porcelain']);
59
+ const worktrees = [];
60
+ let current = null;
61
+ for (const line of result.split('\n')) {
62
+ if (line.startsWith('worktree ')) {
63
+ if (current)
64
+ worktrees.push(current);
65
+ current = { path: line.slice(9), head: '', branch: null };
66
+ }
67
+ else if (line.startsWith('HEAD ') && current) {
68
+ current.head = line.slice(5);
69
+ }
70
+ else if (line.startsWith('branch ') && current) {
71
+ current.branch = line.slice(7).replace('refs/heads/', '');
72
+ }
73
+ }
74
+ if (current)
75
+ worktrees.push(current);
76
+ return worktrees;
77
+ }
78
+ // Create a new worktree
79
+ export async function createWorktree(cwd, path, branch, baseBranch) {
80
+ const git = createGit(cwd);
81
+ if (baseBranch) {
82
+ // Create new branch from base
83
+ await git.raw(['worktree', 'add', '-b', branch, path, baseBranch]);
84
+ }
85
+ else {
86
+ // Create worktree with existing branch or new orphan
87
+ await git.raw(['worktree', 'add', path, branch]);
88
+ }
89
+ }
90
+ // Remove a worktree
91
+ export async function removeWorktree(cwd, path, force = false) {
92
+ const git = createGit(cwd);
93
+ const args = ['worktree', 'remove'];
94
+ if (force)
95
+ args.push('--force');
96
+ args.push(path);
97
+ await git.raw(args);
98
+ }
99
+ // Prune stale worktree references
100
+ export async function pruneWorktrees(cwd) {
101
+ const git = createGit(cwd);
102
+ await git.raw(['worktree', 'prune']);
103
+ }
104
+ /**
105
+ * Check if the repository is in a merge conflict state.
106
+ */
107
+ export async function isInMergeConflict(cwd) {
108
+ const git = createGit(cwd);
109
+ try {
110
+ const status = await git.status();
111
+ return status.conflicted.length > 0;
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ /**
118
+ * Get list of files with merge conflicts.
119
+ */
120
+ export async function getConflictedFiles(cwd) {
121
+ const git = createGit(cwd);
122
+ const status = await git.status();
123
+ return status.conflicted;
124
+ }
125
+ /**
126
+ * Get merge head information (ours and theirs commits).
127
+ */
128
+ export async function getMergeHeads(cwd) {
129
+ const git = createGit(cwd);
130
+ try {
131
+ // MERGE_HEAD exists during a merge conflict
132
+ const theirsCommit = await git.raw(['rev-parse', 'MERGE_HEAD']).catch(() => null);
133
+ if (!theirsCommit)
134
+ return null;
135
+ const oursCommit = await git.raw(['rev-parse', 'HEAD']);
136
+ // Try to get branch names
137
+ const oursRef = await git.raw(['rev-parse', '--abbrev-ref', 'HEAD']).catch(() => 'HEAD');
138
+ const theirsRef = await git
139
+ .raw(['name-rev', '--name-only', 'MERGE_HEAD'])
140
+ .catch(() => 'MERGE_HEAD');
141
+ return {
142
+ ours: oursCommit.trim(),
143
+ theirs: theirsCommit.trim(),
144
+ oursRef: oursRef.trim(),
145
+ theirsRef: theirsRef.trim().replace(/^remotes\//, ''),
146
+ };
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ /**
153
+ * Stage a resolved file.
154
+ */
155
+ export async function stageFile(cwd, filePath) {
156
+ const git = createGit(cwd);
157
+ await git.add(filePath);
158
+ }
159
+ /**
160
+ * Stage multiple resolved files.
161
+ */
162
+ export async function stageFiles(cwd, filePaths) {
163
+ const git = createGit(cwd);
164
+ await git.add(filePaths);
165
+ }
166
+ /**
167
+ * Complete a merge after resolving conflicts.
168
+ */
169
+ export async function completeMerge(cwd, message) {
170
+ const git = createGit(cwd);
171
+ // Check if there are still conflicts
172
+ const status = await git.status();
173
+ if (status.conflicted.length > 0) {
174
+ throw new Error(`Cannot complete merge: ${status.conflicted.length} files still have conflicts`);
175
+ }
176
+ // Commit the merge
177
+ const commitMsg = message || 'Merge conflict resolved';
178
+ await git.commit(commitMsg);
179
+ // Get the merge commit hash
180
+ const log = await git.log({ maxCount: 1 });
181
+ return log.latest?.hash || '';
182
+ }
183
+ /**
184
+ * Abort a merge in progress.
185
+ */
186
+ export async function abortMerge(cwd) {
187
+ const git = createGit(cwd);
188
+ await git.raw(['merge', '--abort']);
189
+ }
190
+ /**
191
+ * Check out a specific version of a file (ours or theirs).
192
+ */
193
+ export async function checkoutFileVersion(cwd, filePath, version) {
194
+ const git = createGit(cwd);
195
+ await git.raw(['checkout', `--${version}`, filePath]);
196
+ }
197
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utility exports for Agent Foundry
3
+ */
4
+ export * from './circuit-breaker.js';
5
+ export * from './env.js';
6
+ export * from './git.js';
7
+ export * from './merge-ordering.js';
8
+ export * from './retry.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Utility exports for Agent Foundry
3
+ */
4
+ export * from './circuit-breaker.js';
5
+ export * from './env.js';
6
+ export * from './git.js';
7
+ export * from './merge-ordering.js';
8
+ export * from './retry.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC;AACrC,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Merge Ordering Utility
3
+ *
4
+ * Computes the order in which worktrees should be merged based on
5
+ * pipeline step dependencies using topological sort.
6
+ */
7
+ export interface StepDependency {
8
+ id: string;
9
+ dependsOn: string[];
10
+ }
11
+ /**
12
+ * Compute merge order for pipeline steps using topological sort.
13
+ * Returns array of arrays - each inner array contains steps that can merge in parallel.
14
+ *
15
+ * @param steps - Array of steps with their dependencies
16
+ * @returns Batched merge order (steps in each batch have no dependencies on each other)
17
+ * @throws Error if circular dependency detected
18
+ */
19
+ export declare function computeMergeOrder(steps: StepDependency[]): string[][];
20
+ /**
21
+ * Validate that all dependencies exist in the step list.
22
+ *
23
+ * @param steps - Array of steps with their dependencies
24
+ * @returns Array of missing dependency errors
25
+ */
26
+ export declare function validateDependencies(steps: StepDependency[]): string[];
27
+ /**
28
+ * Get all steps that depend on a given step (direct and transitive).
29
+ * Useful for determining impact of a step failure.
30
+ *
31
+ * @param stepId - The step to find dependents for
32
+ * @param steps - All steps in the pipeline
33
+ * @returns Array of step IDs that depend on the given step
34
+ */
35
+ export declare function getDependents(stepId: string, steps: StepDependency[]): string[];
36
+ /**
37
+ * Check if merging a step is safe (all its dependencies are already merged).
38
+ *
39
+ * @param stepId - The step to check
40
+ * @param steps - All steps in the pipeline
41
+ * @param mergedSteps - Set of already merged step IDs
42
+ * @returns true if safe to merge
43
+ */
44
+ export declare function canMergeStep(stepId: string, steps: StepDependency[], mergedSteps: Set<string>): boolean;
45
+ //# sourceMappingURL=merge-ordering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-ordering.d.ts","sourceRoot":"","sources":["../../src/utils/merge-ordering.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,EAAE,CAyDrE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAatE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,GACtB,MAAM,EAAE,CA2BV;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,CAKT"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Merge Ordering Utility
3
+ *
4
+ * Computes the order in which worktrees should be merged based on
5
+ * pipeline step dependencies using topological sort.
6
+ */
7
+ /**
8
+ * Compute merge order for pipeline steps using topological sort.
9
+ * Returns array of arrays - each inner array contains steps that can merge in parallel.
10
+ *
11
+ * @param steps - Array of steps with their dependencies
12
+ * @returns Batched merge order (steps in each batch have no dependencies on each other)
13
+ * @throws Error if circular dependency detected
14
+ */
15
+ export function computeMergeOrder(steps) {
16
+ const stepMap = new Map();
17
+ const inDegree = new Map();
18
+ const adjacency = new Map();
19
+ // Initialize
20
+ for (const step of steps) {
21
+ stepMap.set(step.id, step);
22
+ inDegree.set(step.id, 0);
23
+ adjacency.set(step.id, []);
24
+ }
25
+ // Build graph
26
+ for (const step of steps) {
27
+ for (const dep of step.dependsOn) {
28
+ if (stepMap.has(dep)) {
29
+ adjacency.get(dep).push(step.id);
30
+ inDegree.set(step.id, (inDegree.get(step.id) || 0) + 1);
31
+ }
32
+ }
33
+ }
34
+ // Kahn's algorithm with batching
35
+ const result = [];
36
+ let processed = 0;
37
+ while (processed < steps.length) {
38
+ // Find all nodes with in-degree 0
39
+ const batch = [];
40
+ for (const [id, degree] of inDegree) {
41
+ if (degree === 0 && stepMap.has(id)) {
42
+ batch.push(id);
43
+ }
44
+ }
45
+ if (batch.length === 0) {
46
+ // Find the cycle for error message
47
+ const remaining = Array.from(stepMap.keys());
48
+ throw new Error(`Circular dependency detected among steps: ${remaining.join(', ')}`);
49
+ }
50
+ // Remove processed nodes and update in-degrees
51
+ for (const id of batch) {
52
+ for (const dependent of adjacency.get(id) || []) {
53
+ inDegree.set(dependent, (inDegree.get(dependent) || 1) - 1);
54
+ }
55
+ stepMap.delete(id);
56
+ inDegree.delete(id);
57
+ }
58
+ result.push(batch);
59
+ processed += batch.length;
60
+ }
61
+ return result;
62
+ }
63
+ /**
64
+ * Validate that all dependencies exist in the step list.
65
+ *
66
+ * @param steps - Array of steps with their dependencies
67
+ * @returns Array of missing dependency errors
68
+ */
69
+ export function validateDependencies(steps) {
70
+ const stepIds = new Set(steps.map((s) => s.id));
71
+ const errors = [];
72
+ for (const step of steps) {
73
+ for (const dep of step.dependsOn) {
74
+ if (!stepIds.has(dep)) {
75
+ errors.push(`Step "${step.id}" depends on unknown step "${dep}"`);
76
+ }
77
+ }
78
+ }
79
+ return errors;
80
+ }
81
+ /**
82
+ * Get all steps that depend on a given step (direct and transitive).
83
+ * Useful for determining impact of a step failure.
84
+ *
85
+ * @param stepId - The step to find dependents for
86
+ * @param steps - All steps in the pipeline
87
+ * @returns Array of step IDs that depend on the given step
88
+ */
89
+ export function getDependents(stepId, steps) {
90
+ const dependents = new Set();
91
+ const adjacency = new Map();
92
+ // Build forward adjacency (step -> steps that depend on it)
93
+ for (const step of steps) {
94
+ for (const dep of step.dependsOn) {
95
+ if (!adjacency.has(dep)) {
96
+ adjacency.set(dep, []);
97
+ }
98
+ adjacency.get(dep).push(step.id);
99
+ }
100
+ }
101
+ // BFS to find all transitive dependents
102
+ const queue = [stepId];
103
+ while (queue.length > 0) {
104
+ const current = queue.shift();
105
+ for (const dependent of adjacency.get(current) || []) {
106
+ if (!dependents.has(dependent)) {
107
+ dependents.add(dependent);
108
+ queue.push(dependent);
109
+ }
110
+ }
111
+ }
112
+ return Array.from(dependents);
113
+ }
114
+ /**
115
+ * Check if merging a step is safe (all its dependencies are already merged).
116
+ *
117
+ * @param stepId - The step to check
118
+ * @param steps - All steps in the pipeline
119
+ * @param mergedSteps - Set of already merged step IDs
120
+ * @returns true if safe to merge
121
+ */
122
+ export function canMergeStep(stepId, steps, mergedSteps) {
123
+ const step = steps.find((s) => s.id === stepId);
124
+ if (!step)
125
+ return false;
126
+ return step.dependsOn.every((dep) => mergedSteps.has(dep));
127
+ }
128
+ //# sourceMappingURL=merge-ordering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-ordering.js","sourceRoot":"","sources":["../../src/utils/merge-ordering.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Retry Utility with Exponential Backoff
3
+ *
4
+ * Provides configurable retry logic with:
5
+ * - Exponential backoff with jitter
6
+ * - Configurable retry predicates
7
+ * - Rate limit awareness (respects retryAfterMs)
8
+ * - Callbacks for retry events
9
+ */
10
+ /**
11
+ * Configuration options for retry behavior.
12
+ */
13
+ export interface RetryOptions {
14
+ /** Maximum number of retry attempts (default: 3) */
15
+ maxAttempts?: number;
16
+ /** Initial delay in milliseconds before first retry (default: 1000) */
17
+ initialDelayMs?: number;
18
+ /** Maximum delay in milliseconds between retries (default: 30000) */
19
+ maxDelayMs?: number;
20
+ /** Multiplier for exponential backoff (default: 2) */
21
+ backoffMultiplier?: number;
22
+ /** Jitter factor to randomize delays (default: 0.1 = 10%) */
23
+ jitterFactor?: number;
24
+ /**
25
+ * Predicate to determine if an error should be retried.
26
+ * @param error The error that occurred
27
+ * @param attempt The current attempt number (1-indexed)
28
+ * @returns true if the operation should be retried
29
+ */
30
+ shouldRetry?: (error: Error, attempt: number) => boolean;
31
+ /**
32
+ * Callback invoked before each retry attempt.
33
+ * @param error The error that triggered the retry
34
+ * @param attempt The attempt number that just failed (1-indexed)
35
+ * @param delayMs The delay before the next attempt
36
+ */
37
+ onRetry?: (error: Error, attempt: number, delayMs: number) => void;
38
+ }
39
+ /**
40
+ * Determines if an error is retryable by default.
41
+ *
42
+ * Retryable errors:
43
+ * - RateLimitError (429 responses)
44
+ * - TimeoutError (request timeouts)
45
+ * - ProviderError with 5xx status codes (server errors)
46
+ *
47
+ * @param error The error to check
48
+ * @returns true if the error is retryable
49
+ */
50
+ export declare function isRetryableError(error: Error): boolean;
51
+ /**
52
+ * Calculates the delay before the next retry attempt using exponential backoff with jitter.
53
+ *
54
+ * Formula: delay = min(initialDelay * (multiplier ^ attempt), maxDelay) * (1 +/- jitter)
55
+ *
56
+ * @param attempt The attempt number (0-indexed, where 0 is the first retry)
57
+ * @param options Retry configuration options
58
+ * @returns The delay in milliseconds before the next attempt
59
+ */
60
+ export declare function calculateDelay(attempt: number, options: Pick<RetryOptions, 'initialDelayMs' | 'maxDelayMs' | 'backoffMultiplier' | 'jitterFactor'>): number;
61
+ /**
62
+ * Executes a function with automatic retry on failure using exponential backoff.
63
+ *
64
+ * @param fn The async function to execute and potentially retry
65
+ * @param options Configuration options for retry behavior
66
+ * @returns The result of the function if successful
67
+ * @throws The last error encountered if all retry attempts fail
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * const result = await retry(
72
+ * () => provider.complete(request),
73
+ * {
74
+ * maxAttempts: 5,
75
+ * initialDelayMs: 500,
76
+ * onRetry: (error, attempt, delay) => {
77
+ * console.log(`Attempt ${attempt} failed, retrying in ${delay}ms`);
78
+ * }
79
+ * }
80
+ * );
81
+ * ```
82
+ */
83
+ export declare function retry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
84
+ /**
85
+ * Creates a retryable version of an async function.
86
+ *
87
+ * This higher-order function wraps any async function with retry logic,
88
+ * allowing you to create pre-configured retryable operations.
89
+ *
90
+ * @param fn The async function to wrap
91
+ * @param options Configuration options for retry behavior
92
+ * @returns A new function that executes with retry logic
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const retryableComplete = withRetry(
97
+ * () => provider.complete(request),
98
+ * { maxAttempts: 5 }
99
+ * );
100
+ *
101
+ * // Later, execute with retry
102
+ * const result = await retryableComplete();
103
+ * ```
104
+ */
105
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): () => Promise<T>;
106
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACzD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAiCD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAiBtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,GAAG,cAAc,CAAC,GAClG,MAAM,CAoBR;AAkCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,CAAC,CAAC,CA0CZ;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,MAAM,OAAO,CAAC,CAAC,CAAC,CAElB"}