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,216 @@
1
+ /**
2
+ * design_feedback MCP Tool
3
+ *
4
+ * Convenience tool for getting UI/UX design feedback on components,
5
+ * layouts, or user flows. This is a shorthand for invoking the
6
+ * designer role with a structured design review task.
7
+ */
8
+ import { z } from "zod";
9
+ // ============================================================================
10
+ // Constants
11
+ // ============================================================================
12
+ /**
13
+ * Design review types supported by this tool
14
+ */
15
+ const DESIGN_REVIEW_TYPES = ["component", "layout", "flow", "accessibility"];
16
+ /**
17
+ * Tool description for design_feedback
18
+ */
19
+ const TOOL_DESCRIPTION = "Get UI/UX design feedback on components, layouts, or user flows. Use this to get expert design critique and improvement suggestions from the designer agent.";
20
+ // ============================================================================
21
+ // Input Schema
22
+ // ============================================================================
23
+ /**
24
+ * Zod schema shape for design_feedback input validation.
25
+ * Uses raw shape format as expected by MCP SDK's registerTool.
26
+ */
27
+ const designFeedbackInputSchemaShape = {
28
+ design: z
29
+ .string()
30
+ .min(1)
31
+ .describe("Description of the design, component, or user flow to review"),
32
+ type: z
33
+ .enum(DESIGN_REVIEW_TYPES)
34
+ .optional()
35
+ .describe("Type of design review: 'component' for UI components, 'layout' for page layouts, 'flow' for user flows, 'accessibility' for a11y review"),
36
+ context: z
37
+ .string()
38
+ .optional()
39
+ .describe("Additional context such as target users, platform, or design constraints"),
40
+ };
41
+ // ============================================================================
42
+ // Task Builder
43
+ // ============================================================================
44
+ /**
45
+ * Builds a structured task string for the designer agent
46
+ *
47
+ * @param input - Validated design feedback input
48
+ * @returns Formatted task string for the designer role
49
+ */
50
+ function buildDesignTask(input) {
51
+ const typeLabel = input.type ?? "general";
52
+ const typeDescriptions = {
53
+ component: "UI component",
54
+ layout: "page layout",
55
+ flow: "user flow",
56
+ accessibility: "accessibility (a11y)",
57
+ general: "design",
58
+ };
59
+ const reviewType = typeDescriptions[typeLabel] ?? "design";
60
+ let task = `Please provide a detailed ${reviewType} review for the following:\n\n${input.design}`;
61
+ if (input.type === "accessibility") {
62
+ task += `\n\nFocus your review on:
63
+ - WCAG compliance (AA or AAA)
64
+ - Screen reader compatibility
65
+ - Keyboard navigation
66
+ - Color contrast and visual accessibility
67
+ - Focus states and indicators
68
+ - Accessible naming and labels`;
69
+ }
70
+ else if (input.type === "component") {
71
+ task += `\n\nFocus your review on:
72
+ - Visual hierarchy and composition
73
+ - Interaction patterns and states
74
+ - Consistency with design system principles
75
+ - Responsive behavior
76
+ - Edge cases and error states`;
77
+ }
78
+ else if (input.type === "layout") {
79
+ task += `\n\nFocus your review on:
80
+ - Visual hierarchy and information architecture
81
+ - Spacing, alignment, and grid usage
82
+ - Responsive design considerations
83
+ - Content prioritization
84
+ - Navigation patterns`;
85
+ }
86
+ else if (input.type === "flow") {
87
+ task += `\n\nFocus your review on:
88
+ - User journey clarity
89
+ - Number of steps and cognitive load
90
+ - Error handling and recovery paths
91
+ - Progressive disclosure
92
+ - Call-to-action effectiveness`;
93
+ }
94
+ return task;
95
+ }
96
+ // ============================================================================
97
+ // Response Formatter
98
+ // ============================================================================
99
+ /**
100
+ * Formats an AgentResponse for MCP text output
101
+ *
102
+ * @param response - The response from the agent invocation
103
+ * @param reviewType - The type of design review performed
104
+ * @returns Formatted string with header, metadata, and content
105
+ */
106
+ function formatDesignFeedbackResponse(response, reviewType) {
107
+ const typeLabel = reviewType !== undefined && reviewType !== "" ? ` (${reviewType})` : "";
108
+ const header = `## Design Feedback${typeLabel}\n`;
109
+ const meta = `*Provider: ${response.provider} | Model: ${response.model} | Duration: ${String(response.metadata.durationMs)}ms*\n\n`;
110
+ const content = response.content
111
+ .filter((block) => block.type === "text")
112
+ .map((block) => block.text ?? "")
113
+ .join("\n");
114
+ return header + meta + content;
115
+ }
116
+ // ============================================================================
117
+ // Tool Registration
118
+ // ============================================================================
119
+ /**
120
+ * Registers the design_feedback tool with the MCP server
121
+ *
122
+ * @param server - MCP server instance
123
+ * @param router - RouterEngine for agent invocation
124
+ * @param logger - Logger instance for structured logging
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * const server = new McpServer({ name: 'agent-router', version: '0.1.0' });
129
+ * const router = new RouterEngine(config, providers, logger);
130
+ * registerDesignFeedbackTool(server, router, logger);
131
+ * ```
132
+ */
133
+ export function registerDesignFeedbackTool(server, router, logger) {
134
+ // Use type assertion to work around Zod version compatibility issues
135
+ // between zod 3.25+ and the MCP SDK's ZodRawShapeCompat type
136
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
137
+ const inputSchema = designFeedbackInputSchemaShape;
138
+ server.registerTool("design_feedback", {
139
+ title: "Design Feedback",
140
+ description: TOOL_DESCRIPTION,
141
+ inputSchema,
142
+ },
143
+ /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
144
+ async (args) => {
145
+ // Type-safe access with explicit casting after validation
146
+ const { design, type, context } = args;
147
+ logger.info("design_feedback called", {
148
+ reviewType: type ?? "general",
149
+ designLength: design.length,
150
+ hasContext: context !== undefined,
151
+ });
152
+ try {
153
+ const startTime = Date.now();
154
+ // Build input object, only including optional properties if defined
155
+ // (required by exactOptionalPropertyTypes)
156
+ const buildInput = { design };
157
+ if (type !== undefined) {
158
+ buildInput.type = type;
159
+ }
160
+ if (context !== undefined) {
161
+ buildInput.context = context;
162
+ }
163
+ // Build the task string for the designer agent
164
+ const task = buildDesignTask(buildInput);
165
+ // Invoke the designer role with optional context
166
+ const invokeInput = context !== undefined
167
+ ? { role: "designer", task, context }
168
+ : { role: "designer", task };
169
+ const response = await router.invokeAgent(invokeInput);
170
+ const durationMs = Date.now() - startTime;
171
+ logger.info("design_feedback completed", {
172
+ reviewType: type ?? "general",
173
+ provider: response.provider,
174
+ model: response.model,
175
+ durationMs,
176
+ traceId: response.metadata.traceId,
177
+ });
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: formatDesignFeedbackResponse(response, type),
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ catch (error) {
188
+ const errorMessage = error instanceof Error ? error.message : String(error);
189
+ // Only pass error to logger if it's an Error instance
190
+ if (error instanceof Error) {
191
+ logger.error("design_feedback failed", {
192
+ reviewType: type ?? "general",
193
+ error,
194
+ errorMessage,
195
+ });
196
+ }
197
+ else {
198
+ logger.error("design_feedback failed", {
199
+ reviewType: type ?? "general",
200
+ errorMessage,
201
+ });
202
+ }
203
+ // Return error as text content for MCP compatibility
204
+ return {
205
+ content: [
206
+ {
207
+ type: "text",
208
+ text: `## Error Getting Design Feedback\n\n${errorMessage}`,
209
+ },
210
+ ],
211
+ };
212
+ }
213
+ });
214
+ logger.debug("Registered design_feedback tool", { reviewTypes: DESIGN_REVIEW_TYPES });
215
+ }
216
+ //# sourceMappingURL=design-feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-feedback.js","sourceRoot":"","sources":["../../../src/mcp/tools/design-feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * MCP Tool Registry
3
+ *
4
+ * Registers all AgentRouter tools with the MCP server.
5
+ * Each tool provides access to specialized agent capabilities.
6
+ */
7
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import type { Logger } from "../../observability/logger.js";
9
+ import type { RouterEngine } from "../../router/engine.js";
10
+ import type { TaskCoordinator, PipelineManager, StateCoordinator } from "../../tasks/index.js";
11
+ import type { WorktreeManager } from "../../worktrees/manager.js";
12
+ import type { ResourceManager } from "../../worktrees/resource-manager.js";
13
+ /**
14
+ * Registers all AgentRouter tools with the MCP server.
15
+ *
16
+ * Tools registered:
17
+ * - invoke_agent: Invoke a specialized agent by role
18
+ * - list_agents: List all available agent roles
19
+ * - compare_agents: Run same task through multiple agents
20
+ * - review_code: Get code review feedback
21
+ * - design_feedback: Get UI/UX design feedback
22
+ * - critique_plan: Get critical feedback on plans (shorthand for critic role)
23
+ *
24
+ * When task integration is enabled:
25
+ * - execute_task: Execute a task with automatic worktree allocation for coder roles
26
+ * - create_routed_task: Generate TaskCreate instructions
27
+ * - execute_pipeline: Create multi-provider task pipelines
28
+ * - claim_next_task: Claim available tasks for workers
29
+ * - get_pipeline_status: Query pipeline execution status
30
+ *
31
+ * When worktree support is enabled:
32
+ * - resolve_conflicts: Resolve git merge conflicts using various strategies
33
+ *
34
+ * @param server - The MCP server instance
35
+ * @param router - The router engine for agent invocation
36
+ * @param logger - Logger for tool operations
37
+ * @param taskCoordinator - Optional TaskCoordinator for task lifecycle management
38
+ * @param pipelineManager - Optional PipelineManager for pipeline execution
39
+ * @param worktreeManager - Optional WorktreeManager for isolated git worktrees
40
+ * @param stateCoordinator - Optional StateCoordinator for unified state management
41
+ * @param resourceManager - Optional ResourceManager for worktree resource management
42
+ */
43
+ export declare function registerTools(server: McpServer, router: RouterEngine, logger: Logger, taskCoordinator?: TaskCoordinator, pipelineManager?: PipelineManager, worktreeManager?: WorktreeManager, stateCoordinator?: StateCoordinator, resourceManager?: ResourceManager): void;
44
+ export { registerInvokeAgentTool } from "./invoke-agent.js";
45
+ export { registerCompareAgentsTool } from "./compare-agents.js";
46
+ export { registerCritiquePlanTool } from "./critique-plan.js";
47
+ export { registerDesignFeedbackTool } from "./design-feedback.js";
48
+ export { registerReviewCodeTool } from "./review-code.js";
49
+ export { registerWorktreeTools, registerWorktreeManagementTools, registerResolveConflictsTool, registerListWorktreesTool, registerCleanupWorktreesTool, registerGetWorktreeStatusTool, } from "./worktree/index.js";
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAM3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,eAAe,EACjC,eAAe,CAAC,EAAE,eAAe,EACjC,eAAe,CAAC,EAAE,eAAe,EACjC,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,eAAe,CAAC,EAAE,eAAe,GAChC,IAAI,CAuEN;AAqHD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,4BAA4B,EAC5B,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * MCP Tool Registry
3
+ *
4
+ * Registers all AgentRouter tools with the MCP server.
5
+ * Each tool provides access to specialized agent capabilities.
6
+ */
7
+ import { registerCompareAgentsTool } from "./compare-agents.js";
8
+ import { registerCritiquePlanTool } from "./critique-plan.js";
9
+ import { registerDesignFeedbackTool } from "./design-feedback.js";
10
+ import { registerInvokeAgentTool } from "./invoke-agent.js";
11
+ import { registerReviewCodeTool } from "./review-code.js";
12
+ import { registerTaskTools } from "./tasks/index.js";
13
+ import { registerWorktreeTools, registerWorktreeManagementTools } from "./worktree/index.js";
14
+ // ============================================================================
15
+ // Tool Registration
16
+ // ============================================================================
17
+ /**
18
+ * Registers all AgentRouter tools with the MCP server.
19
+ *
20
+ * Tools registered:
21
+ * - invoke_agent: Invoke a specialized agent by role
22
+ * - list_agents: List all available agent roles
23
+ * - compare_agents: Run same task through multiple agents
24
+ * - review_code: Get code review feedback
25
+ * - design_feedback: Get UI/UX design feedback
26
+ * - critique_plan: Get critical feedback on plans (shorthand for critic role)
27
+ *
28
+ * When task integration is enabled:
29
+ * - execute_task: Execute a task with automatic worktree allocation for coder roles
30
+ * - create_routed_task: Generate TaskCreate instructions
31
+ * - execute_pipeline: Create multi-provider task pipelines
32
+ * - claim_next_task: Claim available tasks for workers
33
+ * - get_pipeline_status: Query pipeline execution status
34
+ *
35
+ * When worktree support is enabled:
36
+ * - resolve_conflicts: Resolve git merge conflicts using various strategies
37
+ *
38
+ * @param server - The MCP server instance
39
+ * @param router - The router engine for agent invocation
40
+ * @param logger - Logger for tool operations
41
+ * @param taskCoordinator - Optional TaskCoordinator for task lifecycle management
42
+ * @param pipelineManager - Optional PipelineManager for pipeline execution
43
+ * @param worktreeManager - Optional WorktreeManager for isolated git worktrees
44
+ * @param stateCoordinator - Optional StateCoordinator for unified state management
45
+ * @param resourceManager - Optional ResourceManager for worktree resource management
46
+ */
47
+ export function registerTools(server, router, logger, taskCoordinator, pipelineManager, worktreeManager, stateCoordinator, resourceManager) {
48
+ logger.info("Registering AgentRouter tools");
49
+ // Register invoke_agent tool
50
+ registerInvokeAgentTool(server, router, logger);
51
+ // Register list_agents tool
52
+ registerListAgentsTool(server, router, logger);
53
+ // Register compare_agents tool
54
+ registerCompareAgentsTool(server, router, logger);
55
+ // Register review_code tool
56
+ registerReviewCodeTool(server, router, logger);
57
+ // Register design_feedback tool
58
+ registerDesignFeedbackTool(server, router, logger);
59
+ // Register critique_plan tool
60
+ registerCritiquePlanTool(server, router, logger);
61
+ // Register task-aware tools if task integration is enabled
62
+ if (taskCoordinator && pipelineManager) {
63
+ registerTaskTools(server, router, taskCoordinator, pipelineManager, logger, worktreeManager);
64
+ logger.info("Task-aware tools registered", {
65
+ worktreeSupport: !!worktreeManager,
66
+ });
67
+ }
68
+ // Register worktree tools if worktree support is enabled
69
+ if (worktreeManager) {
70
+ registerWorktreeTools(server, logger, worktreeManager, stateCoordinator);
71
+ logger.info("Worktree tools registered", {
72
+ stateCoordinatorAvailable: !!stateCoordinator,
73
+ });
74
+ }
75
+ // Register worktree management tools if resource manager is available
76
+ if (resourceManager) {
77
+ registerWorktreeManagementTools(server, logger, resourceManager);
78
+ logger.info("Worktree management tools registered");
79
+ }
80
+ const tools = [
81
+ "invoke_agent",
82
+ "list_agents",
83
+ "compare_agents",
84
+ "review_code",
85
+ "design_feedback",
86
+ "critique_plan",
87
+ ];
88
+ if (taskCoordinator && pipelineManager) {
89
+ tools.push("create_routed_task", "claim_next_task", "execute_task", "get_pipeline_status", "execute_pipeline");
90
+ }
91
+ if (worktreeManager) {
92
+ tools.push("resolve_conflicts");
93
+ }
94
+ if (resourceManager) {
95
+ tools.push("list_worktrees", "cleanup_worktrees", "get_worktree_status");
96
+ }
97
+ logger.info("AgentRouter tools registered successfully", { tools });
98
+ }
99
+ // ============================================================================
100
+ // list_agents Tool Implementation
101
+ // ============================================================================
102
+ /**
103
+ * Registers the list_agents tool.
104
+ *
105
+ * This tool returns a list of all available agent roles with their
106
+ * configurations, including provider, model, and fallback status.
107
+ *
108
+ * @param server - MCP server instance
109
+ * @param router - RouterEngine for role information
110
+ * @param logger - Logger instance for structured logging
111
+ */
112
+ function registerListAgentsTool(server, router, logger) {
113
+ server.registerTool("list_agents", {
114
+ title: "List Agents",
115
+ description: "List all available agent roles and their configurations. " +
116
+ "Returns role names, providers, models, and whether fallbacks are configured.",
117
+ inputSchema: {},
118
+ }, async () => {
119
+ logger.debug("Executing list_agents tool");
120
+ try {
121
+ // Get role information from the router
122
+ const roles = router.listRoles();
123
+ const roleConfigs = roles.map((roleName) => {
124
+ const config = router.resolveRole(roleName);
125
+ return {
126
+ name: roleName,
127
+ provider: config.provider,
128
+ model: config.model,
129
+ hasFallback: !!config.fallback,
130
+ description: getRoleDescription(roleName),
131
+ };
132
+ });
133
+ logger.debug("list_agents completed", { roleCount: roles.length });
134
+ // Format the response as readable text
135
+ const formattedList = roleConfigs
136
+ .map((role) => `- **${role.name}**: ${role.description}\n` +
137
+ ` Provider: ${role.provider} | Model: ${role.model}` +
138
+ (role.hasFallback ? " | Fallback: configured" : ""))
139
+ .join("\n\n");
140
+ return {
141
+ content: [
142
+ {
143
+ type: "text",
144
+ text: `# Available Agent Roles\n\n${formattedList}\n\n` +
145
+ `---\n*Total: ${roles.length} agents configured*`,
146
+ },
147
+ ],
148
+ };
149
+ }
150
+ catch (error) {
151
+ const errorMessage = error instanceof Error ? error.message : String(error);
152
+ logger.error("list_agents failed", { errorMessage });
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: `## Error Listing Agents\n\n${errorMessage}`,
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ });
163
+ logger.debug("Registered list_agents tool");
164
+ }
165
+ // ============================================================================
166
+ // Helper Functions
167
+ // ============================================================================
168
+ /**
169
+ * Get a human-readable description for a role.
170
+ * These are predefined descriptions for the standard roles.
171
+ */
172
+ function getRoleDescription(role) {
173
+ const descriptions = {
174
+ coder: "Expert software engineer for code generation and implementation tasks",
175
+ critic: "Skeptical senior architect for reviewing plans and challenging assumptions",
176
+ designer: "UI/UX specialist for design feedback and user experience evaluation",
177
+ researcher: "Research specialist for fact-finding and information gathering",
178
+ reviewer: "Code review expert for quality, security, and best practices",
179
+ };
180
+ return descriptions[role] ?? "Custom agent role";
181
+ }
182
+ // ============================================================================
183
+ // Exports
184
+ // ============================================================================
185
+ export { registerInvokeAgentTool } from "./invoke-agent.js";
186
+ export { registerCompareAgentsTool } from "./compare-agents.js";
187
+ export { registerCritiquePlanTool } from "./critique-plan.js";
188
+ export { registerDesignFeedbackTool } from "./design-feedback.js";
189
+ export { registerReviewCodeTool } from "./review-code.js";
190
+ export { registerWorktreeTools, registerWorktreeManagementTools, registerResolveConflictsTool, registerListWorktreesTool, registerCleanupWorktreesTool, registerGetWorktreeStatusTool, } from "./worktree/index.js";
191
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * invoke_agent MCP Tool
3
+ *
4
+ * Invokes a specialized AI agent for a specific task.
5
+ * Available roles: coder, critic, designer, researcher, reviewer
6
+ */
7
+ import { type McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import type { Logger } from "../../observability/logger.js";
9
+ import type { RouterEngine } from "../../router/engine.js";
10
+ /**
11
+ * Registers the invoke_agent tool with the MCP server
12
+ *
13
+ * @param server - MCP server instance
14
+ * @param router - RouterEngine for agent invocation
15
+ * @param logger - Logger instance for structured logging
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const server = new McpServer({ name: 'agent-router', version: '0.1.0' });
20
+ * const router = new RouterEngine(config, providers, logger);
21
+ * registerInvokeAgentTool(server, router, logger);
22
+ * ```
23
+ */
24
+ export declare function registerInvokeAgentTool(server: McpServer, router: RouterEngine, logger: Logger): void;
25
+ //# sourceMappingURL=invoke-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke-agent.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/invoke-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA0E3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CA8EN"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * invoke_agent MCP Tool
3
+ *
4
+ * Invokes a specialized AI agent for a specific task.
5
+ * Available roles: coder, critic, designer, researcher, reviewer
6
+ */
7
+ import { z } from "zod";
8
+ // ============================================================================
9
+ // Constants
10
+ // ============================================================================
11
+ /**
12
+ * Available agent roles
13
+ */
14
+ const AGENT_ROLES = ["coder", "critic", "designer", "orchestrator", "researcher", "reviewer"];
15
+ /**
16
+ * Tool description for invoke_agent
17
+ */
18
+ const TOOL_DESCRIPTION = "Invoke a specialized AI agent for a specific task. Available roles: coder (code generation), critic (plan review, assumption challenging), designer (UI/UX feedback), orchestrator (task synthesis, document improvement), researcher (fact-finding), reviewer (code review).";
19
+ // ============================================================================
20
+ // Input Schema
21
+ // ============================================================================
22
+ /**
23
+ * Zod schema shape for invoke_agent input validation.
24
+ * Uses raw shape format as expected by MCP SDK's registerTool.
25
+ */
26
+ const invokeAgentInputSchemaShape = {
27
+ role: z
28
+ .enum(AGENT_ROLES)
29
+ .describe("The agent role to invoke. Use 'critic' for plan/PRD review, 'designer' for UI/UX feedback, 'reviewer' for code review."),
30
+ task: z.string().min(1).describe("The task description or question for the agent"),
31
+ context: z
32
+ .string()
33
+ .optional()
34
+ .describe("Optional additional context from the current conversation"),
35
+ };
36
+ // ============================================================================
37
+ // Response Formatter
38
+ // ============================================================================
39
+ /**
40
+ * Formats an AgentResponse for MCP text output
41
+ *
42
+ * @param response - The response from the agent invocation
43
+ * @returns Formatted string with header, metadata, and content
44
+ */
45
+ function formatAgentResponse(response) {
46
+ const header = `## ${response.role.toUpperCase()} Agent Response\n`;
47
+ const meta = `*Provider: ${response.provider} | Model: ${response.model} | Duration: ${String(response.metadata.durationMs)}ms*\n\n`;
48
+ const content = response.content
49
+ .filter((block) => block.type === "text")
50
+ .map((block) => block.text ?? "")
51
+ .join("\n");
52
+ return header + meta + content;
53
+ }
54
+ // ============================================================================
55
+ // Tool Registration
56
+ // ============================================================================
57
+ /**
58
+ * Registers the invoke_agent tool with the MCP server
59
+ *
60
+ * @param server - MCP server instance
61
+ * @param router - RouterEngine for agent invocation
62
+ * @param logger - Logger instance for structured logging
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const server = new McpServer({ name: 'agent-router', version: '0.1.0' });
67
+ * const router = new RouterEngine(config, providers, logger);
68
+ * registerInvokeAgentTool(server, router, logger);
69
+ * ```
70
+ */
71
+ export function registerInvokeAgentTool(server, router, logger) {
72
+ // Use type assertion to work around Zod version compatibility issues
73
+ // between zod 3.25+ and the MCP SDK's ZodRawShapeCompat type
74
+ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
75
+ const inputSchema = invokeAgentInputSchemaShape;
76
+ server.registerTool("invoke_agent", {
77
+ title: "Invoke Agent",
78
+ description: TOOL_DESCRIPTION,
79
+ inputSchema,
80
+ },
81
+ /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment */
82
+ async (args) => {
83
+ // Type-safe access with explicit casting after validation
84
+ const { role, task, context } = args;
85
+ logger.info("invoke_agent called", {
86
+ role,
87
+ taskLength: task.length,
88
+ hasContext: context !== undefined,
89
+ });
90
+ try {
91
+ const startTime = Date.now();
92
+ // Build input with optional context only if provided
93
+ const invokeInput = context !== undefined ? { role, task, context } : { role, task };
94
+ const response = await router.invokeAgent(invokeInput);
95
+ const durationMs = Date.now() - startTime;
96
+ logger.info("invoke_agent completed", {
97
+ role,
98
+ provider: response.provider,
99
+ model: response.model,
100
+ durationMs,
101
+ traceId: response.metadata.traceId,
102
+ });
103
+ return {
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: formatAgentResponse(response),
108
+ },
109
+ ],
110
+ };
111
+ }
112
+ catch (error) {
113
+ const errorMessage = error instanceof Error ? error.message : String(error);
114
+ // Only pass error to logger if it's an Error instance
115
+ if (error instanceof Error) {
116
+ logger.error("invoke_agent failed", {
117
+ role,
118
+ error,
119
+ errorMessage,
120
+ });
121
+ }
122
+ else {
123
+ logger.error("invoke_agent failed", {
124
+ role,
125
+ errorMessage,
126
+ });
127
+ }
128
+ // Return error as text content for MCP compatibility
129
+ return {
130
+ content: [
131
+ {
132
+ type: "text",
133
+ text: `## Error Invoking ${role.toUpperCase()} Agent\n\n${errorMessage}`,
134
+ },
135
+ ],
136
+ };
137
+ }
138
+ });
139
+ logger.debug("Registered invoke_agent tool", { roles: AGENT_ROLES });
140
+ }
141
+ //# sourceMappingURL=invoke-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke-agent.js","sourceRoot":"","sources":["../../../src/mcp/tools/invoke-agent.ts"],"names":[],"mappings":"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"}