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,169 @@
1
+ /**
2
+ * Router Engine
3
+ *
4
+ * The main orchestration logic for AgentRouter.
5
+ * Responsible for resolving roles to configurations and executing
6
+ * agent invocations against the appropriate providers.
7
+ *
8
+ * Key responsibilities:
9
+ * - Invoking agents by role with proper message construction
10
+ * - Comparing responses from multiple agents in parallel
11
+ * - Handling fallback providers when primary fails
12
+ * - Logging request/response metadata for observability
13
+ */
14
+ import { type Logger } from '../observability/logger.js';
15
+ import { type Config, type InvokeAgentInput, type AgentResponse, type AgentConfig } from '../types.js';
16
+ import type { ProviderManager } from '../providers/manager.js';
17
+ /**
18
+ * Options for configuring the RouterEngine.
19
+ */
20
+ export interface RouterEngineOptions {
21
+ /** Whether to enable fallback providers (default: true) */
22
+ enableFallback?: boolean;
23
+ /** Maximum retries before attempting fallback (default: 0) */
24
+ maxRetries?: number;
25
+ }
26
+ /**
27
+ * Result of a comparison operation for a single role.
28
+ */
29
+ export interface ComparisonResult {
30
+ role: string;
31
+ status: 'fulfilled' | 'rejected';
32
+ response?: AgentResponse;
33
+ error?: Error;
34
+ }
35
+ /**
36
+ * Main routing engine for AgentRouter.
37
+ *
38
+ * Handles:
39
+ * - Role resolution to provider configurations
40
+ * - Message building with system prompts and context
41
+ * - Agent invocation with proper error handling
42
+ * - Parallel comparison of multiple agents
43
+ * - Fallback execution when primary providers fail
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const engine = new RouterEngine(config, providerManager, logger);
48
+ *
49
+ * // Invoke a single agent
50
+ * const response = await engine.invokeAgent({
51
+ * role: 'coder',
52
+ * task: 'Write a function to sort an array',
53
+ * context: 'Using TypeScript',
54
+ * });
55
+ *
56
+ * // Compare multiple agents
57
+ * const results = await engine.compareAgents(
58
+ * ['coder', 'reviewer'],
59
+ * 'Review this code for bugs'
60
+ * );
61
+ * ```
62
+ */
63
+ export declare class RouterEngine {
64
+ private roleResolver;
65
+ private readonly providers;
66
+ private readonly logger;
67
+ private readonly options;
68
+ /**
69
+ * Create a new RouterEngine instance.
70
+ *
71
+ * @param config - Configuration object with role and provider definitions
72
+ * @param providers - Provider manager for accessing LLM providers
73
+ * @param logger - Logger instance for observability
74
+ * @param options - Optional configuration for the engine
75
+ */
76
+ constructor(config: Config, providers: ProviderManager, logger: Logger, options?: RouterEngineOptions);
77
+ /**
78
+ * Invoke an agent by role.
79
+ *
80
+ * Flow:
81
+ * 1. Generate trace ID for request correlation
82
+ * 2. Log request start with role and task preview
83
+ * 3. Resolve role to agent configuration
84
+ * 4. Build messages array (system prompt + context + task)
85
+ * 5. Get provider from ProviderManager
86
+ * 6. Call provider.complete()
87
+ * 7. Log response with duration and token usage
88
+ * 8. Return AgentResponse
89
+ * 9. On error: try fallback if configured, otherwise throw
90
+ *
91
+ * @param input - Input parameters including role, task, and optional context
92
+ * @returns Promise resolving to the agent's response
93
+ * @throws ProviderError if the provider fails and no fallback is available
94
+ */
95
+ invokeAgent(input: InvokeAgentInput): Promise<AgentResponse>;
96
+ /**
97
+ * Compare responses from multiple agents for the same task.
98
+ *
99
+ * Executes all agents in parallel using Promise.allSettled to ensure
100
+ * all results are collected even if some fail.
101
+ *
102
+ * @param roles - Array of role names to invoke
103
+ * @param task - The task to send to all agents
104
+ * @returns Map of role names to their responses (only includes successful results)
105
+ */
106
+ compareAgents(roles: string[], task: string): Promise<Map<string, AgentResponse>>;
107
+ /**
108
+ * Update the configuration.
109
+ * This recreates the RoleResolver with the new configuration.
110
+ *
111
+ * @param config - New configuration object
112
+ */
113
+ updateConfig(config: Config): void;
114
+ /**
115
+ * Get the list of available roles.
116
+ *
117
+ * @returns Array of role names
118
+ */
119
+ listRoles(): string[];
120
+ /**
121
+ * Check if a role is configured.
122
+ *
123
+ * @param role - Role name to check
124
+ * @returns True if the role exists
125
+ */
126
+ hasRole(role: string): boolean;
127
+ /**
128
+ * Resolve a role to its full agent configuration.
129
+ *
130
+ * @param role - Role name to resolve
131
+ * @returns Resolved agent configuration with all defaults applied
132
+ * @throws Error if the role does not exist
133
+ */
134
+ resolveRole(role: string): AgentConfig;
135
+ /**
136
+ * Build the messages array for a completion request.
137
+ *
138
+ * Message structure:
139
+ * 1. System prompt (if configured) - wrapped in <system> tags
140
+ * 2. Context (if provided) - wrapped in <context> tags
141
+ * 3. Task - the actual user request
142
+ *
143
+ * @param agentConfig - Resolved agent configuration
144
+ * @param input - Input parameters with task and optional context
145
+ * @returns Array of messages for the completion request
146
+ */
147
+ private buildMessages;
148
+ /**
149
+ * Invoke an agent using its fallback configuration.
150
+ *
151
+ * @param input - Original input parameters
152
+ * @param originalConfig - Original agent configuration (contains fallback)
153
+ * @param traceId - Trace ID for correlation
154
+ * @param startTime - Original start time for duration calculation
155
+ * @returns Promise resolving to the agent's response
156
+ */
157
+ private invokeWithFallback;
158
+ }
159
+ /**
160
+ * Create a RouterEngine instance with default options.
161
+ *
162
+ * @param config - Configuration object
163
+ * @param providers - Provider manager
164
+ * @param logger - Logger instance
165
+ * @param options - Optional engine configuration
166
+ * @returns Configured RouterEngine instance
167
+ */
168
+ export declare function createRouterEngine(config: Config, providers: ProviderManager, logger: Logger, options?: RouterEngineOptions): RouterEngine;
169
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/router/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAmB,KAAM,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAiB,KACtB,MAAM,EAAC,KACP,gBAAgB,EAAC,KACjB,aAAa,EAAC,KACd,WAAW,EAGZ,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO/D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD;;;;;;;OAOG;gBAED,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB;IAWnC;;;;;;;;;;;;;;;;;OAiBG;IACG,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAgHlE;;;;;;;;;OASG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAkEvF;;;;;OAKG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASlC;;;;OAIG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;;;OAMG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAQtC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IAoCrB;;;;;;;;OAQG;YACW,kBAAkB;CAoGjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAEd"}
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Router Engine
3
+ *
4
+ * The main orchestration logic for AgentRouter.
5
+ * Responsible for resolving roles to configurations and executing
6
+ * agent invocations against the appropriate providers.
7
+ *
8
+ * Key responsibilities:
9
+ * - Invoking agents by role with proper message construction
10
+ * - Comparing responses from multiple agents in parallel
11
+ * - Handling fallback providers when primary fails
12
+ * - Logging request/response metadata for observability
13
+ */
14
+ import { generateTraceId } from '../observability/logger.js';
15
+ import { ProviderError, } from '../types.js';
16
+ import { RoleResolver } from './role-resolver.js';
17
+ // ============================================================================
18
+ // RouterEngine Class
19
+ // ============================================================================
20
+ /**
21
+ * Main routing engine for AgentRouter.
22
+ *
23
+ * Handles:
24
+ * - Role resolution to provider configurations
25
+ * - Message building with system prompts and context
26
+ * - Agent invocation with proper error handling
27
+ * - Parallel comparison of multiple agents
28
+ * - Fallback execution when primary providers fail
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * const engine = new RouterEngine(config, providerManager, logger);
33
+ *
34
+ * // Invoke a single agent
35
+ * const response = await engine.invokeAgent({
36
+ * role: 'coder',
37
+ * task: 'Write a function to sort an array',
38
+ * context: 'Using TypeScript',
39
+ * });
40
+ *
41
+ * // Compare multiple agents
42
+ * const results = await engine.compareAgents(
43
+ * ['coder', 'reviewer'],
44
+ * 'Review this code for bugs'
45
+ * );
46
+ * ```
47
+ */
48
+ export class RouterEngine {
49
+ roleResolver;
50
+ providers;
51
+ logger;
52
+ options;
53
+ /**
54
+ * Create a new RouterEngine instance.
55
+ *
56
+ * @param config - Configuration object with role and provider definitions
57
+ * @param providers - Provider manager for accessing LLM providers
58
+ * @param logger - Logger instance for observability
59
+ * @param options - Optional configuration for the engine
60
+ */
61
+ constructor(config, providers, logger, options = {}) {
62
+ this.roleResolver = new RoleResolver(config);
63
+ this.providers = providers;
64
+ this.logger = logger;
65
+ this.options = {
66
+ enableFallback: options.enableFallback ?? true,
67
+ maxRetries: options.maxRetries ?? 0,
68
+ };
69
+ }
70
+ /**
71
+ * Invoke an agent by role.
72
+ *
73
+ * Flow:
74
+ * 1. Generate trace ID for request correlation
75
+ * 2. Log request start with role and task preview
76
+ * 3. Resolve role to agent configuration
77
+ * 4. Build messages array (system prompt + context + task)
78
+ * 5. Get provider from ProviderManager
79
+ * 6. Call provider.complete()
80
+ * 7. Log response with duration and token usage
81
+ * 8. Return AgentResponse
82
+ * 9. On error: try fallback if configured, otherwise throw
83
+ *
84
+ * @param input - Input parameters including role, task, and optional context
85
+ * @returns Promise resolving to the agent's response
86
+ * @throws ProviderError if the provider fails and no fallback is available
87
+ */
88
+ async invokeAgent(input) {
89
+ const startTime = Date.now();
90
+ const traceId = generateTraceId();
91
+ this.logger.info('Invoking agent', {
92
+ traceId,
93
+ role: input.role,
94
+ taskPreview: input.task.substring(0, 100) + (input.task.length > 100 ? '...' : ''),
95
+ hasContext: !!input.context,
96
+ hasTools: !!input.tools?.length,
97
+ });
98
+ try {
99
+ // 1. Resolve role to agent configuration
100
+ const agentConfig = this.roleResolver.resolve(input.role);
101
+ this.logger.debug('Role resolved', {
102
+ traceId,
103
+ role: input.role,
104
+ provider: agentConfig.provider,
105
+ model: agentConfig.model,
106
+ temperature: agentConfig.temperature,
107
+ maxTokens: agentConfig.max_tokens,
108
+ });
109
+ // 2. Build messages with system prompt and context
110
+ const messages = this.buildMessages(agentConfig, input);
111
+ // 3. Get provider for this agent
112
+ const provider = this.providers.get(agentConfig.provider);
113
+ // 4. Build completion request
114
+ const request = {
115
+ model: agentConfig.model,
116
+ messages,
117
+ temperature: agentConfig.temperature,
118
+ max_tokens: agentConfig.max_tokens,
119
+ timeout_ms: agentConfig.timeout_ms,
120
+ };
121
+ // Only add tools if provided (exactOptionalPropertyTypes compliance)
122
+ if (input.tools && input.tools.length > 0) {
123
+ request.tools = input.tools;
124
+ }
125
+ // 5. Execute request
126
+ const response = await provider.complete(request);
127
+ // 6. Calculate duration and log success
128
+ const durationMs = Date.now() - startTime;
129
+ this.logger.info('Agent response received', {
130
+ traceId,
131
+ role: input.role,
132
+ provider: agentConfig.provider,
133
+ model: agentConfig.model,
134
+ durationMs,
135
+ inputTokens: response.usage?.input_tokens,
136
+ outputTokens: response.usage?.output_tokens,
137
+ stopReason: response.stop_reason,
138
+ });
139
+ // 7. Return formatted response
140
+ const result = {
141
+ role: input.role,
142
+ provider: agentConfig.provider,
143
+ model: agentConfig.model,
144
+ content: response.content,
145
+ metadata: {
146
+ traceId,
147
+ durationMs,
148
+ },
149
+ };
150
+ // Only add usage if provided (exactOptionalPropertyTypes compliance)
151
+ if (response.usage) {
152
+ result.usage = response.usage;
153
+ }
154
+ return result;
155
+ }
156
+ catch (error) {
157
+ const durationMs = Date.now() - startTime;
158
+ const errorMessage = error instanceof Error ? error.message : String(error);
159
+ this.logger.error('Agent invocation failed', {
160
+ traceId,
161
+ role: input.role,
162
+ durationMs,
163
+ errorMessage,
164
+ });
165
+ // Try fallback if configured and enabled
166
+ if (this.options.enableFallback) {
167
+ const agentConfig = this.roleResolver.resolve(input.role);
168
+ if (agentConfig.fallback) {
169
+ this.logger.info('Attempting fallback provider', {
170
+ traceId,
171
+ role: input.role,
172
+ fallbackProvider: agentConfig.fallback.provider,
173
+ fallbackModel: agentConfig.fallback.model,
174
+ });
175
+ return this.invokeWithFallback(input, agentConfig, traceId, startTime);
176
+ }
177
+ }
178
+ // Re-throw if no fallback available
179
+ throw error;
180
+ }
181
+ }
182
+ /**
183
+ * Compare responses from multiple agents for the same task.
184
+ *
185
+ * Executes all agents in parallel using Promise.allSettled to ensure
186
+ * all results are collected even if some fail.
187
+ *
188
+ * @param roles - Array of role names to invoke
189
+ * @param task - The task to send to all agents
190
+ * @returns Map of role names to their responses (only includes successful results)
191
+ */
192
+ async compareAgents(roles, task) {
193
+ const traceId = generateTraceId();
194
+ const startTime = Date.now();
195
+ this.logger.info('Starting agent comparison', {
196
+ traceId,
197
+ roles,
198
+ taskPreview: task.substring(0, 100) + (task.length > 100 ? '...' : ''),
199
+ });
200
+ const results = new Map();
201
+ // Execute all agents in parallel
202
+ const promises = roles.map(async (role) => {
203
+ try {
204
+ const response = await this.invokeAgent({ role, task });
205
+ return { role, status: 'fulfilled', response };
206
+ }
207
+ catch (error) {
208
+ return {
209
+ role,
210
+ status: 'rejected',
211
+ error: error instanceof Error ? error : new Error(String(error)),
212
+ };
213
+ }
214
+ });
215
+ const responses = await Promise.allSettled(promises);
216
+ // Process results
217
+ for (const result of responses) {
218
+ if (result.status === 'fulfilled') {
219
+ const { role, status, response, error } = result.value;
220
+ if (status === 'fulfilled' && response) {
221
+ results.set(role, response);
222
+ }
223
+ else if (status === 'rejected' && error) {
224
+ this.logger.error('Agent comparison failed for role', {
225
+ traceId,
226
+ role,
227
+ errorMessage: error.message,
228
+ });
229
+ }
230
+ }
231
+ else {
232
+ // This shouldn't happen since we catch errors in the promise,
233
+ // but handle it just in case
234
+ const errorMessage = result.reason instanceof Error ? result.reason.message : String(result.reason);
235
+ this.logger.error('Unexpected error in agent comparison', {
236
+ traceId,
237
+ errorMessage,
238
+ });
239
+ }
240
+ }
241
+ const durationMs = Date.now() - startTime;
242
+ this.logger.info('Agent comparison completed', {
243
+ traceId,
244
+ totalRoles: roles.length,
245
+ successfulRoles: results.size,
246
+ failedRoles: roles.length - results.size,
247
+ durationMs,
248
+ });
249
+ return results;
250
+ }
251
+ /**
252
+ * Update the configuration.
253
+ * This recreates the RoleResolver with the new configuration.
254
+ *
255
+ * @param config - New configuration object
256
+ */
257
+ updateConfig(config) {
258
+ this.logger.info('Updating router configuration', {
259
+ version: config.version,
260
+ roleCount: Object.keys(config.roles).length,
261
+ });
262
+ this.roleResolver = new RoleResolver(config);
263
+ }
264
+ /**
265
+ * Get the list of available roles.
266
+ *
267
+ * @returns Array of role names
268
+ */
269
+ listRoles() {
270
+ return this.roleResolver.listRoles();
271
+ }
272
+ /**
273
+ * Check if a role is configured.
274
+ *
275
+ * @param role - Role name to check
276
+ * @returns True if the role exists
277
+ */
278
+ hasRole(role) {
279
+ return this.roleResolver.hasRole(role);
280
+ }
281
+ /**
282
+ * Resolve a role to its full agent configuration.
283
+ *
284
+ * @param role - Role name to resolve
285
+ * @returns Resolved agent configuration with all defaults applied
286
+ * @throws Error if the role does not exist
287
+ */
288
+ resolveRole(role) {
289
+ return this.roleResolver.resolve(role);
290
+ }
291
+ // ==========================================================================
292
+ // Private Methods
293
+ // ==========================================================================
294
+ /**
295
+ * Build the messages array for a completion request.
296
+ *
297
+ * Message structure:
298
+ * 1. System prompt (if configured) - wrapped in <system> tags
299
+ * 2. Context (if provided) - wrapped in <context> tags
300
+ * 3. Task - the actual user request
301
+ *
302
+ * @param agentConfig - Resolved agent configuration
303
+ * @param input - Input parameters with task and optional context
304
+ * @returns Array of messages for the completion request
305
+ */
306
+ buildMessages(agentConfig, input) {
307
+ const messages = [];
308
+ // Add system prompt if configured
309
+ // Note: Some providers handle system prompts differently
310
+ // The translation layer will convert this appropriately
311
+ if (agentConfig.system_prompt) {
312
+ messages.push({
313
+ role: 'user',
314
+ content: `<system>\n${agentConfig.system_prompt}\n</system>`,
315
+ });
316
+ // Add assistant acknowledgment for better prompt structure
317
+ messages.push({
318
+ role: 'assistant',
319
+ content: 'I understand my role and will respond accordingly. Please provide your request.',
320
+ });
321
+ }
322
+ // Add context if provided
323
+ if (input.context) {
324
+ messages.push({
325
+ role: 'user',
326
+ content: `<context>\n${input.context}\n</context>`,
327
+ });
328
+ }
329
+ // Add the actual task
330
+ messages.push({
331
+ role: 'user',
332
+ content: input.task,
333
+ });
334
+ return messages;
335
+ }
336
+ /**
337
+ * Invoke an agent using its fallback configuration.
338
+ *
339
+ * @param input - Original input parameters
340
+ * @param originalConfig - Original agent configuration (contains fallback)
341
+ * @param traceId - Trace ID for correlation
342
+ * @param startTime - Original start time for duration calculation
343
+ * @returns Promise resolving to the agent's response
344
+ */
345
+ async invokeWithFallback(input, originalConfig, traceId, startTime) {
346
+ const fallbackConfig = originalConfig.fallback;
347
+ const fallbackStartTime = Date.now();
348
+ try {
349
+ // Build a synthetic agent config from the fallback
350
+ const syntheticConfig = {
351
+ provider: fallbackConfig.provider,
352
+ model: fallbackConfig.model,
353
+ // Inherit other settings from original config
354
+ temperature: originalConfig.temperature,
355
+ max_tokens: originalConfig.max_tokens,
356
+ timeout_ms: originalConfig.timeout_ms,
357
+ // No nested fallback to prevent infinite recursion
358
+ };
359
+ // Only add system_prompt if defined (exactOptionalPropertyTypes compliance)
360
+ if (originalConfig.system_prompt) {
361
+ syntheticConfig.system_prompt = originalConfig.system_prompt;
362
+ }
363
+ // Build messages with the synthetic config
364
+ const messages = this.buildMessages(syntheticConfig, input);
365
+ // Get the fallback provider
366
+ const provider = this.providers.get(fallbackConfig.provider);
367
+ // Build completion request
368
+ const request = {
369
+ model: fallbackConfig.model,
370
+ messages,
371
+ temperature: syntheticConfig.temperature,
372
+ max_tokens: syntheticConfig.max_tokens,
373
+ timeout_ms: syntheticConfig.timeout_ms,
374
+ };
375
+ // Only add tools if provided (exactOptionalPropertyTypes compliance)
376
+ if (input.tools && input.tools.length > 0) {
377
+ request.tools = input.tools;
378
+ }
379
+ // Execute request
380
+ const response = await provider.complete(request);
381
+ const durationMs = Date.now() - startTime;
382
+ const fallbackDurationMs = Date.now() - fallbackStartTime;
383
+ this.logger.info('Fallback agent response received', {
384
+ traceId,
385
+ role: input.role,
386
+ provider: fallbackConfig.provider,
387
+ model: fallbackConfig.model,
388
+ durationMs,
389
+ fallbackDurationMs,
390
+ inputTokens: response.usage?.input_tokens,
391
+ outputTokens: response.usage?.output_tokens,
392
+ });
393
+ const result = {
394
+ role: input.role,
395
+ provider: fallbackConfig.provider,
396
+ model: fallbackConfig.model,
397
+ content: response.content,
398
+ metadata: {
399
+ traceId,
400
+ durationMs,
401
+ },
402
+ };
403
+ // Only add usage if provided (exactOptionalPropertyTypes compliance)
404
+ if (response.usage) {
405
+ result.usage = response.usage;
406
+ }
407
+ return result;
408
+ }
409
+ catch (fallbackError) {
410
+ const durationMs = Date.now() - startTime;
411
+ const errorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
412
+ this.logger.error('Fallback invocation also failed', {
413
+ traceId,
414
+ role: input.role,
415
+ fallbackProvider: fallbackConfig.provider,
416
+ durationMs,
417
+ errorMessage,
418
+ });
419
+ throw new ProviderError(`Both primary and fallback providers failed for role '${input.role}'`, fallbackConfig.provider, undefined, fallbackError instanceof Error ? fallbackError : undefined);
420
+ }
421
+ }
422
+ }
423
+ /**
424
+ * Create a RouterEngine instance with default options.
425
+ *
426
+ * @param config - Configuration object
427
+ * @param providers - Provider manager
428
+ * @param logger - Logger instance
429
+ * @param options - Optional engine configuration
430
+ * @returns Configured RouterEngine instance
431
+ */
432
+ export function createRouterEngine(config, providers, logger, options) {
433
+ return new RouterEngine(config, providers, logger, options);
434
+ }
435
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/router/engine.ts"],"names":[],"mappings":"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"}