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,347 @@
1
+ /**
2
+ * Configuration Manager for AgentRouter
3
+ *
4
+ * Handles loading, merging, validating, and watching configuration files.
5
+ * Supports multiple config sources with priority-based merging and
6
+ * environment variable interpolation.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ import { watch } from 'fs';
10
+ import { readFile, access, constants } from 'fs/promises';
11
+ import { parse as parseYAML } from 'yaml';
12
+ import { ConfigurationError, } from '../types.js';
13
+ import { DEFAULT_CONFIG, getAllConfigPaths } from './defaults.js';
14
+ import { ConfigMerger } from './merger.js';
15
+ import { ConfigValidator } from './validator.js';
16
+ /**
17
+ * Configuration manager with hot reload support.
18
+ * Extends EventEmitter for change notifications.
19
+ */
20
+ export class ConfigManager extends EventEmitter {
21
+ config;
22
+ validator;
23
+ merger;
24
+ configPaths;
25
+ watchers = [];
26
+ options;
27
+ loadedPaths = new Set();
28
+ /**
29
+ * Private constructor - use static load() method to create instances.
30
+ */
31
+ constructor(options = {}) {
32
+ super();
33
+ this.validator = new ConfigValidator();
34
+ this.merger = new ConfigMerger();
35
+ this.options = {
36
+ configPath: options.configPath ?? '',
37
+ watch: options.watch ?? true,
38
+ allowMissingEnv: options.allowMissingEnv ?? false,
39
+ };
40
+ // Build config paths list with CLI override at highest priority
41
+ const basePaths = getAllConfigPaths();
42
+ this.configPaths = this.options.configPath
43
+ ? [this.options.configPath, ...basePaths]
44
+ : basePaths;
45
+ }
46
+ /**
47
+ * Load configuration and create a ConfigManager instance.
48
+ * This is the primary way to create a ConfigManager.
49
+ *
50
+ * @param options - Configuration options
51
+ * @returns Promise resolving to initialized ConfigManager
52
+ * @throws ConfigurationError if config loading fails
53
+ */
54
+ static async load(options = {}) {
55
+ const manager = new ConfigManager(options);
56
+ await manager.loadConfig();
57
+ if (manager.options.watch) {
58
+ manager.watchConfig();
59
+ }
60
+ return manager;
61
+ }
62
+ /**
63
+ * Load and merge configuration from all sources.
64
+ * Config files are loaded in reverse priority order (lowest first)
65
+ * so that higher priority configs override lower ones.
66
+ */
67
+ async loadConfig() {
68
+ // Start with default config
69
+ let merged = structuredClone(DEFAULT_CONFIG);
70
+ this.loadedPaths.clear();
71
+ // Load configs in reverse priority order (lowest to highest)
72
+ // System configs first, then user configs, then project configs
73
+ const reversedPaths = [...this.configPaths].reverse();
74
+ for (const configPath of reversedPaths) {
75
+ try {
76
+ // Check if file exists
77
+ await access(configPath, constants.R_OK);
78
+ // Read and parse YAML
79
+ const content = await readFile(configPath, 'utf-8');
80
+ const parsed = parseYAML(content);
81
+ if (parsed === null || parsed === undefined) {
82
+ // Empty file, skip
83
+ continue;
84
+ }
85
+ // Validate as partial config (not all fields required)
86
+ this.validator.validatePartialConfig(parsed);
87
+ // Interpolate environment variables
88
+ const interpolated = this.interpolateEnv(parsed);
89
+ // Merge into accumulated config
90
+ merged = this.merger.merge(merged, interpolated);
91
+ this.loadedPaths.add(configPath);
92
+ }
93
+ catch (error) {
94
+ // ENOENT is expected for non-existent config files
95
+ if (error.code === 'ENOENT') {
96
+ continue;
97
+ }
98
+ // For explicitly provided config path, throw error
99
+ if (configPath === this.options.configPath) {
100
+ throw new ConfigurationError(`Failed to load config from ${configPath}: ${error.message}`, error);
101
+ }
102
+ // For other paths, log warning but continue
103
+ console.warn(`Warning: Failed to load config from ${configPath}:`, error.message);
104
+ }
105
+ }
106
+ // Final validation of merged config
107
+ this.config = this.validator.validate(merged);
108
+ }
109
+ /**
110
+ * Interpolate environment variables in configuration values.
111
+ * Replaces ${VAR_NAME} patterns with the corresponding env value.
112
+ *
113
+ * @param obj - Object to interpolate
114
+ * @returns Object with interpolated values
115
+ * @throws ConfigurationError if required env var is missing
116
+ */
117
+ interpolateEnv(obj) {
118
+ if (typeof obj === 'string') {
119
+ return obj.replace(/\$\{([^}]+)\}/g, (match, envVar) => {
120
+ const value = process.env[envVar];
121
+ if (value === undefined) {
122
+ if (this.options.allowMissingEnv) {
123
+ // Keep the placeholder for missing env vars
124
+ return match;
125
+ }
126
+ throw new ConfigurationError(`Environment variable ${envVar} is not set`);
127
+ }
128
+ return value;
129
+ });
130
+ }
131
+ if (Array.isArray(obj)) {
132
+ return obj.map((item) => this.interpolateEnv(item));
133
+ }
134
+ if (typeof obj === 'object' && obj !== null) {
135
+ return Object.fromEntries(Object.entries(obj).map(([key, value]) => [
136
+ key,
137
+ this.interpolateEnv(value),
138
+ ]));
139
+ }
140
+ return obj;
141
+ }
142
+ /**
143
+ * Watch loaded config files for changes.
144
+ * Emits 'change' event when config is successfully reloaded.
145
+ * Emits 'error' event when reload fails.
146
+ */
147
+ watchConfig() {
148
+ // Watch all paths that were successfully loaded
149
+ for (const configPath of this.loadedPaths) {
150
+ try {
151
+ const watcher = watch(configPath, async (eventType) => {
152
+ if (eventType === 'change') {
153
+ console.log(`Config file changed: ${configPath}`);
154
+ try {
155
+ await this.loadConfig();
156
+ this.emit('change', this.config);
157
+ }
158
+ catch (error) {
159
+ console.error('Failed to reload config:', error.message);
160
+ this.emit('error', error, configPath);
161
+ }
162
+ }
163
+ });
164
+ this.watchers.push(watcher);
165
+ }
166
+ catch {
167
+ // File might not exist or be watchable, that's okay
168
+ }
169
+ }
170
+ // Also watch paths that didn't exist - they might be created
171
+ for (const configPath of this.configPaths) {
172
+ if (this.loadedPaths.has(configPath)) {
173
+ continue; // Already watching
174
+ }
175
+ try {
176
+ const watcher = watch(configPath, async (eventType) => {
177
+ if (eventType === 'rename' || eventType === 'change') {
178
+ console.log(`Config file created: ${configPath}`);
179
+ try {
180
+ await this.loadConfig();
181
+ this.emit('change', this.config);
182
+ // Restart watchers to include new file
183
+ this.stopWatching();
184
+ this.watchConfig();
185
+ }
186
+ catch (error) {
187
+ console.error('Failed to reload config:', error.message);
188
+ this.emit('error', error, configPath);
189
+ }
190
+ }
191
+ });
192
+ this.watchers.push(watcher);
193
+ }
194
+ catch {
195
+ // File or directory doesn't exist, that's okay
196
+ }
197
+ }
198
+ }
199
+ /**
200
+ * Stop watching config files.
201
+ */
202
+ stopWatching() {
203
+ for (const watcher of this.watchers) {
204
+ watcher.close();
205
+ }
206
+ this.watchers = [];
207
+ }
208
+ /**
209
+ * Manually reload configuration.
210
+ * Useful when programmatically updating config files.
211
+ *
212
+ * @returns Promise resolving when reload is complete
213
+ * @throws ConfigurationError if reload fails
214
+ */
215
+ async reload() {
216
+ await this.loadConfig();
217
+ this.emit('change', this.config);
218
+ }
219
+ /**
220
+ * Close the ConfigManager and stop watching files.
221
+ * Should be called when shutting down.
222
+ */
223
+ close() {
224
+ this.stopWatching();
225
+ this.removeAllListeners();
226
+ }
227
+ /**
228
+ * Get the full configuration object.
229
+ *
230
+ * @returns Complete configuration
231
+ */
232
+ get() {
233
+ return this.config;
234
+ }
235
+ /**
236
+ * Get the version string from config.
237
+ *
238
+ * @returns Config version
239
+ */
240
+ getVersion() {
241
+ return this.config.version;
242
+ }
243
+ /**
244
+ * Get all role configurations.
245
+ *
246
+ * @returns Map of role names to role configs
247
+ */
248
+ getRoles() {
249
+ return this.config.roles;
250
+ }
251
+ /**
252
+ * Get a specific role configuration.
253
+ *
254
+ * @param roleName - Name of the role
255
+ * @returns Role configuration or undefined if not found
256
+ */
257
+ getRole(roleName) {
258
+ return this.config.roles[roleName];
259
+ }
260
+ /**
261
+ * Get all provider configurations.
262
+ *
263
+ * @returns Map of provider names to provider configs
264
+ */
265
+ getProviders() {
266
+ return this.config.providers;
267
+ }
268
+ /**
269
+ * Get a specific provider configuration.
270
+ *
271
+ * @param providerName - Name of the provider
272
+ * @returns Provider configuration or undefined if not found
273
+ */
274
+ getProvider(providerName) {
275
+ return this.config.providers[providerName];
276
+ }
277
+ /**
278
+ * Get default configuration values.
279
+ *
280
+ * @returns Default config values
281
+ */
282
+ getDefaults() {
283
+ return this.config.defaults;
284
+ }
285
+ /**
286
+ * Get list of available role names.
287
+ *
288
+ * @returns Array of role names
289
+ */
290
+ getRoleNames() {
291
+ return Object.keys(this.config.roles);
292
+ }
293
+ /**
294
+ * Get list of available provider names.
295
+ *
296
+ * @returns Array of provider names
297
+ */
298
+ getProviderNames() {
299
+ return Object.keys(this.config.providers);
300
+ }
301
+ /**
302
+ * Check if a role exists.
303
+ *
304
+ * @param roleName - Name of the role to check
305
+ * @returns True if role exists
306
+ */
307
+ hasRole(roleName) {
308
+ return roleName in this.config.roles;
309
+ }
310
+ /**
311
+ * Check if a provider exists.
312
+ *
313
+ * @param providerName - Name of the provider to check
314
+ * @returns True if provider exists
315
+ */
316
+ hasProvider(providerName) {
317
+ return providerName in this.config.providers;
318
+ }
319
+ /**
320
+ * Get the paths of all loaded config files.
321
+ *
322
+ * @returns Array of loaded config file paths
323
+ */
324
+ getLoadedPaths() {
325
+ return [...this.loadedPaths];
326
+ }
327
+ /**
328
+ * Get all config search paths (including unloaded).
329
+ *
330
+ * @returns Array of all config paths that are searched
331
+ */
332
+ getSearchPaths() {
333
+ return [...this.configPaths];
334
+ }
335
+ }
336
+ /**
337
+ * Convenience function to load configuration.
338
+ * Creates a ConfigManager and returns the config object.
339
+ *
340
+ * @param options - Configuration options
341
+ * @returns Promise resolving to the loaded Config
342
+ */
343
+ export async function loadConfig(options = {}) {
344
+ const manager = await ConfigManager.load({ ...options, watch: false });
345
+ return manager.get();
346
+ }
347
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Configuration Merger for AgentRouter
3
+ *
4
+ * Provides utilities for deep merging configuration objects.
5
+ * Used by ConfigManager to combine configs from multiple sources.
6
+ */
7
+ import type { Config } from '../types.js';
8
+ /**
9
+ * Configuration merger utility class.
10
+ * Handles deep merging of configuration objects with specific merge rules.
11
+ */
12
+ export declare class ConfigMerger {
13
+ /**
14
+ * Deep merge two configuration objects.
15
+ * Source values override target values.
16
+ * Objects are merged recursively, arrays are replaced.
17
+ *
18
+ * @param target - Base configuration
19
+ * @param source - Configuration to merge on top
20
+ * @returns Merged configuration
21
+ */
22
+ merge(target: Config, source: Partial<Config>): Config;
23
+ /**
24
+ * Merge default configuration values.
25
+ *
26
+ * @param target - Base defaults
27
+ * @param source - Defaults to merge
28
+ * @returns Merged defaults
29
+ */
30
+ private mergeDefaults;
31
+ /**
32
+ * Merge role configurations.
33
+ * Roles from source are merged into target.
34
+ * Individual role properties are deep merged.
35
+ *
36
+ * @param target - Base roles
37
+ * @param source - Roles to merge
38
+ * @returns Merged roles
39
+ */
40
+ private mergeRoles;
41
+ /**
42
+ * Merge a single role configuration.
43
+ *
44
+ * @param target - Base role config
45
+ * @param source - Role config to merge
46
+ * @returns Merged role config
47
+ */
48
+ private mergeRoleConfig;
49
+ /**
50
+ * Merge provider configurations.
51
+ * Providers from source are merged into target.
52
+ * Individual provider properties are deep merged.
53
+ *
54
+ * @param target - Base providers
55
+ * @param source - Providers to merge
56
+ * @returns Merged providers
57
+ */
58
+ private mergeProviders;
59
+ /**
60
+ * Merge a single provider configuration.
61
+ *
62
+ * @param target - Base provider config
63
+ * @param source - Provider config to merge
64
+ * @returns Merged provider config
65
+ */
66
+ private mergeProviderConfig;
67
+ }
68
+ /**
69
+ * Convenience function to merge two configs.
70
+ *
71
+ * @param target - Base configuration
72
+ * @param source - Configuration to merge on top
73
+ * @returns Merged configuration
74
+ */
75
+ export declare function mergeConfigs(target: Config, source: Partial<Config>): Config;
76
+ //# sourceMappingURL=merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/config/merger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAA6C,MAAM,aAAa,CAAC;AAErF;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAStD;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAarB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAsBlB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAqCvB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAsBtB;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;CA0C5B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAG5E"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Configuration Merger for AgentRouter
3
+ *
4
+ * Provides utilities for deep merging configuration objects.
5
+ * Used by ConfigManager to combine configs from multiple sources.
6
+ */
7
+ /**
8
+ * Configuration merger utility class.
9
+ * Handles deep merging of configuration objects with specific merge rules.
10
+ */
11
+ export class ConfigMerger {
12
+ /**
13
+ * Deep merge two configuration objects.
14
+ * Source values override target values.
15
+ * Objects are merged recursively, arrays are replaced.
16
+ *
17
+ * @param target - Base configuration
18
+ * @param source - Configuration to merge on top
19
+ * @returns Merged configuration
20
+ */
21
+ merge(target, source) {
22
+ return {
23
+ version: source.version ?? target.version,
24
+ defaults: this.mergeDefaults(target.defaults, source.defaults),
25
+ roles: this.mergeRoles(target.roles, source.roles),
26
+ providers: this.mergeProviders(target.providers, source.providers),
27
+ };
28
+ }
29
+ /**
30
+ * Merge default configuration values.
31
+ *
32
+ * @param target - Base defaults
33
+ * @param source - Defaults to merge
34
+ * @returns Merged defaults
35
+ */
36
+ mergeDefaults(target, source) {
37
+ if (!source) {
38
+ return { ...target };
39
+ }
40
+ return {
41
+ temperature: source.temperature ?? target.temperature,
42
+ max_tokens: source.max_tokens ?? target.max_tokens,
43
+ timeout_ms: source.timeout_ms ?? target.timeout_ms,
44
+ };
45
+ }
46
+ /**
47
+ * Merge role configurations.
48
+ * Roles from source are merged into target.
49
+ * Individual role properties are deep merged.
50
+ *
51
+ * @param target - Base roles
52
+ * @param source - Roles to merge
53
+ * @returns Merged roles
54
+ */
55
+ mergeRoles(target, source) {
56
+ if (!source) {
57
+ return { ...target };
58
+ }
59
+ const result = { ...target };
60
+ for (const [roleName, roleConfig] of Object.entries(source)) {
61
+ const existingRole = result[roleName];
62
+ if (existingRole) {
63
+ // Merge existing role
64
+ result[roleName] = this.mergeRoleConfig(existingRole, roleConfig);
65
+ }
66
+ else {
67
+ // Add new role
68
+ result[roleName] = { ...roleConfig };
69
+ }
70
+ }
71
+ return result;
72
+ }
73
+ /**
74
+ * Merge a single role configuration.
75
+ *
76
+ * @param target - Base role config
77
+ * @param source - Role config to merge
78
+ * @returns Merged role config
79
+ */
80
+ mergeRoleConfig(target, source) {
81
+ const result = {
82
+ provider: source.provider ?? target.provider,
83
+ model: source.model ?? target.model,
84
+ };
85
+ // Optional fields - only set if defined in either source or target
86
+ const systemPrompt = source.system_prompt ?? target.system_prompt;
87
+ if (systemPrompt !== undefined) {
88
+ result.system_prompt = systemPrompt;
89
+ }
90
+ const temperature = source.temperature ?? target.temperature;
91
+ if (temperature !== undefined) {
92
+ result.temperature = temperature;
93
+ }
94
+ const maxTokens = source.max_tokens ?? target.max_tokens;
95
+ if (maxTokens !== undefined) {
96
+ result.max_tokens = maxTokens;
97
+ }
98
+ const timeoutMs = source.timeout_ms ?? target.timeout_ms;
99
+ if (timeoutMs !== undefined) {
100
+ result.timeout_ms = timeoutMs;
101
+ }
102
+ // Fallback config - replace entirely if provided
103
+ if (source.fallback !== undefined) {
104
+ result.fallback = { ...source.fallback };
105
+ }
106
+ else if (target.fallback !== undefined) {
107
+ result.fallback = { ...target.fallback };
108
+ }
109
+ return result;
110
+ }
111
+ /**
112
+ * Merge provider configurations.
113
+ * Providers from source are merged into target.
114
+ * Individual provider properties are deep merged.
115
+ *
116
+ * @param target - Base providers
117
+ * @param source - Providers to merge
118
+ * @returns Merged providers
119
+ */
120
+ mergeProviders(target, source) {
121
+ if (!source) {
122
+ return { ...target };
123
+ }
124
+ const result = { ...target };
125
+ for (const [providerName, providerConfig] of Object.entries(source)) {
126
+ const existingProvider = result[providerName];
127
+ if (existingProvider) {
128
+ // Merge existing provider
129
+ result[providerName] = this.mergeProviderConfig(existingProvider, providerConfig);
130
+ }
131
+ else {
132
+ // Add new provider
133
+ result[providerName] = { ...providerConfig };
134
+ }
135
+ }
136
+ return result;
137
+ }
138
+ /**
139
+ * Merge a single provider configuration.
140
+ *
141
+ * @param target - Base provider config
142
+ * @param source - Provider config to merge
143
+ * @returns Merged provider config
144
+ */
145
+ mergeProviderConfig(target, source) {
146
+ const result = {};
147
+ // Merge all optional fields - only set if defined
148
+ const apiKey = source.api_key ?? target.api_key;
149
+ if (apiKey !== undefined) {
150
+ result.api_key = apiKey;
151
+ }
152
+ const baseUrl = source.base_url ?? target.base_url;
153
+ if (baseUrl !== undefined) {
154
+ result.base_url = baseUrl;
155
+ }
156
+ const organization = source.organization ?? target.organization;
157
+ if (organization !== undefined) {
158
+ result.organization = organization;
159
+ }
160
+ const project = source.project ?? target.project;
161
+ if (project !== undefined) {
162
+ result.project = project;
163
+ }
164
+ const location = source.location ?? target.location;
165
+ if (location !== undefined) {
166
+ result.location = location;
167
+ }
168
+ // Headers are merged (source overrides target keys)
169
+ if (source.headers || target.headers) {
170
+ result.headers = {
171
+ ...target.headers,
172
+ ...source.headers,
173
+ };
174
+ }
175
+ return result;
176
+ }
177
+ }
178
+ /**
179
+ * Convenience function to merge two configs.
180
+ *
181
+ * @param target - Base configuration
182
+ * @param source - Configuration to merge on top
183
+ * @returns Merged configuration
184
+ */
185
+ export function mergeConfigs(target, source) {
186
+ const merger = new ConfigMerger();
187
+ return merger.merge(target, source);
188
+ }
189
+ //# sourceMappingURL=merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/config/merger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * JSON Schema Export for AgentRouter Configuration
3
+ *
4
+ * Re-exports the configuration JSON Schema for external use,
5
+ * such as IDE validation, documentation generation, or schema.json files.
6
+ */
7
+ import { configSchema } from './validator.js';
8
+ /**
9
+ * JSON Schema for AgentRouter configuration.
10
+ * Can be used for:
11
+ * - IDE validation (VS Code, JetBrains)
12
+ * - Documentation generation
13
+ * - External tooling
14
+ */
15
+ export { configSchema };
16
+ /**
17
+ * Export as default for direct import.
18
+ */
19
+ export default configSchema;
20
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * JSON Schema Export for AgentRouter Configuration
3
+ *
4
+ * Re-exports the configuration JSON Schema for external use,
5
+ * such as IDE validation, documentation generation, or schema.json files.
6
+ */
7
+ import { configSchema } from './validator.js';
8
+ /**
9
+ * JSON Schema for AgentRouter configuration.
10
+ * Can be used for:
11
+ * - IDE validation (VS Code, JetBrains)
12
+ * - Documentation generation
13
+ * - External tooling
14
+ */
15
+ export { configSchema };
16
+ /**
17
+ * Export as default for direct import.
18
+ */
19
+ export default configSchema;
20
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,eAAe,YAAY,CAAC"}