@evalops/maestro 0.10.22 → 0.10.24

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 (387) hide show
  1. package/README.md +4 -4
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +1 -1
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/keys.d.ts +2 -5
  7. package/dist/agent/keys.d.ts.map +1 -1
  8. package/dist/agent/keys.js +4 -5
  9. package/dist/agent/keys.js.map +1 -1
  10. package/dist/agent/modes.d.ts +2 -2
  11. package/dist/agent/modes.d.ts.map +1 -1
  12. package/dist/agent/modes.js +6 -7
  13. package/dist/agent/modes.js.map +1 -1
  14. package/dist/agent/providers/anthropic.d.ts.map +1 -1
  15. package/dist/agent/providers/anthropic.js +4 -4
  16. package/dist/agent/providers/anthropic.js.map +1 -1
  17. package/dist/agent/providers/google.js +1 -1
  18. package/dist/agent/swarm/executor.d.ts +2 -0
  19. package/dist/agent/swarm/executor.d.ts.map +1 -1
  20. package/dist/agent/swarm/executor.js +208 -35
  21. package/dist/agent/swarm/executor.js.map +1 -1
  22. package/dist/agent/swarm/types.d.ts +2 -0
  23. package/dist/agent/swarm/types.d.ts.map +1 -1
  24. package/dist/agent/swarm/types.js.map +1 -1
  25. package/dist/agent/tool-capability-types.d.ts +36 -0
  26. package/dist/agent/tool-capability-types.d.ts.map +1 -0
  27. package/dist/agent/tool-capability-types.js +2 -0
  28. package/dist/agent/tool-capability-types.js.map +1 -0
  29. package/dist/agent/transport/tool-execution-bridge.d.ts +13 -0
  30. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  31. package/dist/agent/transport/tool-execution-bridge.js +28 -15
  32. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  33. package/dist/agent/transport/transport-utils.d.ts.map +1 -1
  34. package/dist/agent/transport/transport-utils.js +2 -3
  35. package/dist/agent/transport/transport-utils.js.map +1 -1
  36. package/dist/agent/transport.js +1 -1
  37. package/dist/agent/transport.js.map +1 -1
  38. package/dist/agent/type-guards.d.ts +1 -1
  39. package/dist/agent/type-guards.js +1 -1
  40. package/dist/agent/type-guards.js.map +1 -1
  41. package/dist/agent/types.d.ts +5 -3
  42. package/dist/agent/types.d.ts.map +1 -1
  43. package/dist/agent/types.js +2 -2
  44. package/dist/agent/types.js.map +1 -1
  45. package/dist/app-server/daemon-lifecycle-api.d.ts +31 -0
  46. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -0
  47. package/dist/app-server/daemon-lifecycle-api.js +259 -0
  48. package/dist/app-server/daemon-lifecycle-api.js.map +1 -0
  49. package/dist/app-server/external-agent-import-api.d.ts +30 -0
  50. package/dist/app-server/external-agent-import-api.d.ts.map +1 -0
  51. package/dist/app-server/external-agent-import-api.js +553 -0
  52. package/dist/app-server/external-agent-import-api.js.map +1 -0
  53. package/dist/app-server/host-control-api.d.ts +30 -0
  54. package/dist/app-server/host-control-api.d.ts.map +1 -0
  55. package/dist/app-server/host-control-api.js +343 -0
  56. package/dist/app-server/host-control-api.js.map +1 -0
  57. package/dist/app-server/in-process-client.d.ts +2 -2
  58. package/dist/app-server/in-process-client.d.ts.map +1 -1
  59. package/dist/app-server/in-process-client.js.map +1 -1
  60. package/dist/app-server/network-governance-api.d.ts +26 -0
  61. package/dist/app-server/network-governance-api.d.ts.map +1 -0
  62. package/dist/app-server/network-governance-api.js +476 -0
  63. package/dist/app-server/network-governance-api.js.map +1 -0
  64. package/dist/app-server/plugin-bundle-api.d.ts +17 -0
  65. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -0
  66. package/dist/app-server/plugin-bundle-api.js +219 -0
  67. package/dist/app-server/plugin-bundle-api.js.map +1 -0
  68. package/dist/app-server/policy-control-api.d.ts +14 -0
  69. package/dist/app-server/policy-control-api.d.ts.map +1 -0
  70. package/dist/app-server/policy-control-api.js +200 -0
  71. package/dist/app-server/policy-control-api.js.map +1 -0
  72. package/dist/app-server/protocol-modes-api.d.ts +22 -0
  73. package/dist/app-server/protocol-modes-api.d.ts.map +1 -0
  74. package/dist/app-server/protocol-modes-api.js +124 -0
  75. package/dist/app-server/protocol-modes-api.js.map +1 -0
  76. package/dist/app-server/sandbox-proof-api.d.ts +21 -0
  77. package/dist/app-server/sandbox-proof-api.d.ts.map +1 -0
  78. package/dist/app-server/sandbox-proof-api.js +127 -0
  79. package/dist/app-server/sandbox-proof-api.js.map +1 -0
  80. package/dist/app-server/session-api.d.ts +93 -3
  81. package/dist/app-server/session-api.d.ts.map +1 -1
  82. package/dist/app-server/session-api.js +706 -18
  83. package/dist/app-server/session-api.js.map +1 -1
  84. package/dist/audit/logger.d.ts +1 -1
  85. package/dist/bootstrap/auth-setup.d.ts.map +1 -1
  86. package/dist/bootstrap/auth-setup.js +17 -2
  87. package/dist/bootstrap/auth-setup.js.map +1 -1
  88. package/dist/bootstrap/model-resolution-setup.d.ts.map +1 -1
  89. package/dist/bootstrap/model-resolution-setup.js +19 -4
  90. package/dist/bootstrap/model-resolution-setup.js.map +1 -1
  91. package/dist/cli/args.d.ts +2 -2
  92. package/dist/cli/args.d.ts.map +1 -1
  93. package/dist/cli/args.js +2 -2
  94. package/dist/cli/args.js.map +1 -1
  95. package/dist/cli/commands/a2a.d.ts.map +1 -1
  96. package/dist/cli/commands/a2a.js +226 -14
  97. package/dist/cli/commands/a2a.js.map +1 -1
  98. package/dist/cli/commands/anthropic.d.ts +1 -1
  99. package/dist/cli/commands/anthropic.d.ts.map +1 -1
  100. package/dist/cli/commands/anthropic.js +3 -68
  101. package/dist/cli/commands/anthropic.js.map +1 -1
  102. package/dist/cli/commands/modes.js +1 -1
  103. package/dist/cli/commands/modes.js.map +1 -1
  104. package/dist/cli/help.d.ts.map +1 -1
  105. package/dist/cli/help.js +5 -7
  106. package/dist/cli/help.js.map +1 -1
  107. package/dist/cli/rpc-mode.d.ts +1 -1
  108. package/dist/cli/rpc-mode.js +1 -1
  109. package/dist/cli/rpc-mode.js.map +1 -1
  110. package/dist/cli/session.js +1 -1
  111. package/dist/cli/session.js.map +1 -1
  112. package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -1
  113. package/dist/cli-tui/commands/command-catalog.js +7 -12
  114. package/dist/cli-tui/commands/command-catalog.js.map +1 -1
  115. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts +1 -1
  116. package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -1
  117. package/dist/cli-tui/commands/subcommands/auth-commands.js +4 -12
  118. package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -1
  119. package/dist/cli-tui/custom-editor.d.ts +1 -1
  120. package/dist/cli-tui/custom-editor.js +2 -2
  121. package/dist/cli-tui/custom-editor.js.map +1 -1
  122. package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
  123. package/dist/cli-tui/oauth/oauth-flow-controller.js +19 -23
  124. package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
  125. package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
  126. package/dist/cli-tui/selectors/model-selector.js +0 -1
  127. package/dist/cli-tui/selectors/model-selector.js.map +1 -1
  128. package/dist/cli-tui/selectors/oauth-selector-view.d.ts +2 -2
  129. package/dist/cli-tui/selectors/oauth-selector-view.d.ts.map +1 -1
  130. package/dist/cli-tui/selectors/oauth-selector-view.js.map +1 -1
  131. package/dist/cli-tui/selectors/oauth-selector.d.ts +2 -2
  132. package/dist/cli-tui/selectors/oauth-selector.d.ts.map +1 -1
  133. package/dist/cli-tui/selectors/oauth-selector.js +3 -4
  134. package/dist/cli-tui/selectors/oauth-selector.js.map +1 -1
  135. package/dist/cli-tui/tui-renderer/mcp-events-setup.js +1 -1
  136. package/dist/cli-tui/tui-renderer/mcp-events-setup.js.map +1 -1
  137. package/dist/cli-tui/tui-renderer.js +2 -2
  138. package/dist/cli-tui/tui-renderer.js.map +1 -1
  139. package/dist/cli-tui/utils/footer-utils.d.ts +1 -1
  140. package/dist/cli-tui/utils/footer-utils.js +1 -1
  141. package/dist/cli-tui/utils/footer-utils.js.map +1 -1
  142. package/dist/cli.js +15171 -14298
  143. package/dist/commands/prompts.d.ts +1 -1
  144. package/dist/commands/prompts.js +1 -1
  145. package/dist/commands/prompts.js.map +1 -1
  146. package/dist/config/constants.d.ts +2 -2
  147. package/dist/config/constants.d.ts.map +1 -1
  148. package/dist/config/constants.js +2 -2
  149. package/dist/config/constants.js.map +1 -1
  150. package/dist/config/index.d.ts +1 -1
  151. package/dist/config/index.js +1 -1
  152. package/dist/config/index.js.map +1 -1
  153. package/dist/config/toml-config.js +3 -3
  154. package/dist/config/toml-config.js.map +1 -1
  155. package/dist/db/client.d.ts +2 -2
  156. package/dist/db/client.js +2 -2
  157. package/dist/db/client.js.map +1 -1
  158. package/dist/db/migrate.d.ts +1 -1
  159. package/dist/db/migrate.js +1 -1
  160. package/dist/db/migrate.js.map +1 -1
  161. package/dist/db/schema.d.ts +2 -2
  162. package/dist/db/schema.js +1 -1
  163. package/dist/db/schema.js.map +1 -1
  164. package/dist/errors/index.d.ts +2 -2
  165. package/dist/errors/index.js +2 -2
  166. package/dist/errors/index.js.map +1 -1
  167. package/dist/main.d.ts +4 -5
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +17 -14
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/config.d.ts +15 -2
  172. package/dist/mcp/config.d.ts.map +1 -1
  173. package/dist/mcp/config.js +50 -26
  174. package/dist/mcp/config.js.map +1 -1
  175. package/dist/mcp/fathom-cua.d.ts.map +1 -1
  176. package/dist/mcp/fathom-cua.js +10 -0
  177. package/dist/mcp/fathom-cua.js.map +1 -1
  178. package/dist/mcp/manager.d.ts.map +1 -1
  179. package/dist/mcp/manager.js +32 -1
  180. package/dist/mcp/manager.js.map +1 -1
  181. package/dist/mcp/tool-bridge.d.ts.map +1 -1
  182. package/dist/mcp/tool-bridge.js +12 -3
  183. package/dist/mcp/tool-bridge.js.map +1 -1
  184. package/dist/mcp/tool-capabilities.d.ts +5 -0
  185. package/dist/mcp/tool-capabilities.d.ts.map +1 -0
  186. package/dist/mcp/tool-capabilities.js +271 -0
  187. package/dist/mcp/tool-capabilities.js.map +1 -0
  188. package/dist/mcp/types.d.ts +6 -1
  189. package/dist/mcp/types.d.ts.map +1 -1
  190. package/dist/mcp/types.js.map +1 -1
  191. package/dist/models/config-loader.d.ts +1 -1
  192. package/dist/models/factory-integration.d.ts +1 -1
  193. package/dist/models/factory-integration.js +1 -1
  194. package/dist/models/factory-integration.js.map +1 -1
  195. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts +58 -0
  196. package/dist/node_modules/@evalops/contracts/dist/artifacts.d.ts.map +1 -0
  197. package/dist/node_modules/@evalops/contracts/dist/artifacts.js +191 -0
  198. package/dist/node_modules/@evalops/contracts/dist/artifacts.js.map +1 -0
  199. package/dist/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +10 -10
  200. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +4 -3
  201. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  202. package/dist/node_modules/@evalops/contracts/dist/index.js +3 -2
  203. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  204. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts +1182 -14
  205. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.d.ts.map +1 -1
  206. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js +450 -1
  207. package/dist/node_modules/@evalops/contracts/dist/maestro-app-server.js.map +1 -1
  208. package/dist/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +1 -1
  209. package/dist/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +3 -3
  210. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  211. package/dist/node_modules/@evalops/tui/package.json +1 -1
  212. package/dist/oauth/connectors.d.ts +2 -2
  213. package/dist/oauth/connectors.d.ts.map +1 -1
  214. package/dist/oauth/connectors.js +3 -5
  215. package/dist/oauth/connectors.js.map +1 -1
  216. package/dist/oauth/github-copilot.d.ts +1 -1
  217. package/dist/oauth/github-copilot.js +1 -1
  218. package/dist/oauth/github-copilot.js.map +1 -1
  219. package/dist/oauth/index.d.ts +10 -8
  220. package/dist/oauth/index.d.ts.map +1 -1
  221. package/dist/oauth/index.js +54 -31
  222. package/dist/oauth/index.js.map +1 -1
  223. package/dist/oauth/openai.d.ts +1 -1
  224. package/dist/oauth/openai.js +2 -2
  225. package/dist/oauth/openai.js.map +1 -1
  226. package/dist/platform/a2a-completion-audit.d.ts +41 -0
  227. package/dist/platform/a2a-completion-audit.d.ts.map +1 -0
  228. package/dist/platform/a2a-completion-audit.js +177 -0
  229. package/dist/platform/a2a-completion-audit.js.map +1 -0
  230. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  231. package/dist/platform/a2a-task-ledger.js +17 -0
  232. package/dist/platform/a2a-task-ledger.js.map +1 -1
  233. package/dist/platform/a2a-telemetry-inspect.d.ts +58 -0
  234. package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -0
  235. package/dist/platform/a2a-telemetry-inspect.js +224 -0
  236. package/dist/platform/a2a-telemetry-inspect.js.map +1 -0
  237. package/dist/platform/agent-registry-client.d.ts +8 -0
  238. package/dist/platform/agent-registry-client.d.ts.map +1 -1
  239. package/dist/platform/agent-registry-client.js +9 -1
  240. package/dist/platform/agent-registry-client.js.map +1 -1
  241. package/dist/providers/api-keys.d.ts +2 -2
  242. package/dist/providers/api-keys.js +2 -2
  243. package/dist/providers/api-keys.js.map +1 -1
  244. package/dist/providers/auth.d.ts +3 -6
  245. package/dist/providers/auth.d.ts.map +1 -1
  246. package/dist/providers/auth.js +1 -40
  247. package/dist/providers/auth.js.map +1 -1
  248. package/dist/rpc/index.d.ts +2 -2
  249. package/dist/rpc/index.js +2 -2
  250. package/dist/rpc/index.js.map +1 -1
  251. package/dist/rpc/rpc-types.d.ts +1 -1
  252. package/dist/rpc/rpc-types.js +1 -1
  253. package/dist/rpc/rpc-types.js.map +1 -1
  254. package/dist/safety/nested-agent-guard.js +1 -1
  255. package/dist/safety/nested-agent-guard.js.map +1 -1
  256. package/dist/safety/policy.d.ts +2 -2
  257. package/dist/safety/policy.js +2 -2
  258. package/dist/safety/policy.js.map +1 -1
  259. package/dist/safety/validators/network-policy-validator.d.ts +8 -0
  260. package/dist/safety/validators/network-policy-validator.d.ts.map +1 -1
  261. package/dist/safety/validators/network-policy-validator.js +29 -4
  262. package/dist/safety/validators/network-policy-validator.js.map +1 -1
  263. package/dist/sandbox/local-sandbox.d.ts +1 -1
  264. package/dist/sandbox/local-sandbox.js +1 -1
  265. package/dist/sandbox/local-sandbox.js.map +1 -1
  266. package/dist/server/app-context.d.ts +2 -0
  267. package/dist/server/app-context.d.ts.map +1 -1
  268. package/dist/server/app-context.js.map +1 -1
  269. package/dist/server/handlers/attachments.d.ts.map +1 -1
  270. package/dist/server/handlers/attachments.js +1 -0
  271. package/dist/server/handlers/attachments.js.map +1 -1
  272. package/dist/server/handlers/models.d.ts.map +1 -1
  273. package/dist/server/handlers/models.js +3 -1
  274. package/dist/server/handlers/models.js.map +1 -1
  275. package/dist/server/handlers/session-artifacts.d.ts.map +1 -1
  276. package/dist/server/handlers/session-artifacts.js +13 -74
  277. package/dist/server/handlers/session-artifacts.js.map +1 -1
  278. package/dist/server/handlers/session-attachments.d.ts.map +1 -1
  279. package/dist/server/handlers/session-attachments.js +2 -0
  280. package/dist/server/handlers/session-attachments.js.map +1 -1
  281. package/dist/server/handlers/sessions.js +1 -1
  282. package/dist/server/handlers/sessions.js.map +1 -1
  283. package/dist/server/handlers/status.d.ts +2 -0
  284. package/dist/server/handlers/status.d.ts.map +1 -1
  285. package/dist/server/handlers/status.js +3 -2
  286. package/dist/server/handlers/status.js.map +1 -1
  287. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  288. package/dist/server/headless-runtime-service.js +32 -3
  289. package/dist/server/headless-runtime-service.js.map +1 -1
  290. package/dist/server/hosted-session-manager.d.ts +2 -0
  291. package/dist/server/hosted-session-manager.d.ts.map +1 -1
  292. package/dist/server/hosted-session-manager.js +9 -0
  293. package/dist/server/hosted-session-manager.js.map +1 -1
  294. package/dist/server/model-selection.d.ts.map +1 -1
  295. package/dist/server/model-selection.js +9 -1
  296. package/dist/server/model-selection.js.map +1 -1
  297. package/dist/server/rate-limiter.d.ts +1 -1
  298. package/dist/server/rate-limiter.js +1 -1
  299. package/dist/server/rate-limiter.js.map +1 -1
  300. package/dist/server/router.d.ts +2 -2
  301. package/dist/server/router.js.map +1 -1
  302. package/dist/server/session-serialization.d.ts +9 -9
  303. package/dist/server/session-serialization.js +15 -15
  304. package/dist/server/session-serialization.js.map +1 -1
  305. package/dist/session/manager.d.ts +5 -0
  306. package/dist/session/manager.d.ts.map +1 -1
  307. package/dist/session/manager.js +56 -8
  308. package/dist/session/manager.js.map +1 -1
  309. package/dist/session/session-catalog.d.ts +2 -0
  310. package/dist/session/session-catalog.d.ts.map +1 -1
  311. package/dist/session/session-catalog.js +6 -0
  312. package/dist/session/session-catalog.js.map +1 -1
  313. package/dist/session/session-context.d.ts +2 -0
  314. package/dist/session/session-context.d.ts.map +1 -1
  315. package/dist/session/session-context.js +15 -0
  316. package/dist/session/session-context.js.map +1 -1
  317. package/dist/session/types.d.ts +7 -0
  318. package/dist/session/types.d.ts.map +1 -1
  319. package/dist/session/types.js.map +1 -1
  320. package/dist/session/wire-format.generated.d.ts +1 -0
  321. package/dist/session/wire-format.generated.d.ts.map +1 -1
  322. package/dist/session/wire-format.generated.js +1 -0
  323. package/dist/session/wire-format.generated.js.map +1 -1
  324. package/dist/shared-memory/contract.d.ts +4 -4
  325. package/dist/shared-memory/contract.js +2 -2
  326. package/dist/shared-memory/contract.js.map +1 -1
  327. package/dist/telemetry/index.d.ts +2 -2
  328. package/dist/telemetry/index.d.ts.map +1 -1
  329. package/dist/telemetry/index.js +2 -2
  330. package/dist/telemetry/index.js.map +1 -1
  331. package/dist/telemetry/maestro-event-bus.d.ts +57 -0
  332. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  333. package/dist/telemetry/maestro-event-bus.js +59 -1
  334. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  335. package/dist/telemetry/maestro-event-catalog.d.ts +17 -1
  336. package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -1
  337. package/dist/telemetry/maestro-event-catalog.js +24 -0
  338. package/dist/telemetry/maestro-event-catalog.js.map +1 -1
  339. package/dist/telemetry/mcp-beacon.d.ts +2 -0
  340. package/dist/telemetry/mcp-beacon.d.ts.map +1 -1
  341. package/dist/telemetry/mcp-beacon.js +15 -0
  342. package/dist/telemetry/mcp-beacon.js.map +1 -1
  343. package/dist/telemetry/metrics.d.ts +62 -0
  344. package/dist/telemetry/metrics.d.ts.map +1 -1
  345. package/dist/telemetry/metrics.js +84 -0
  346. package/dist/telemetry/metrics.js.map +1 -1
  347. package/dist/telemetry.d.ts +44 -0
  348. package/dist/telemetry.d.ts.map +1 -1
  349. package/dist/telemetry.js +84 -2
  350. package/dist/telemetry.js.map +1 -1
  351. package/dist/theme/theme-loader.js +2 -2
  352. package/dist/theme/theme-loader.js.map +1 -1
  353. package/dist/theme/theme-schema.json +2 -2
  354. package/dist/theme/theme.d.ts +1 -1
  355. package/dist/theme/theme.js.map +1 -1
  356. package/dist/tools/background/task-types.d.ts +1 -1
  357. package/dist/tools/extract-document.d.ts +1 -0
  358. package/dist/tools/extract-document.d.ts.map +1 -1
  359. package/dist/tools/extract-document.js +2 -1
  360. package/dist/tools/extract-document.js.map +1 -1
  361. package/dist/tools/index.d.ts +55 -55
  362. package/dist/tools/index.js +1 -1
  363. package/dist/tools/index.js.map +1 -1
  364. package/dist/tools/tool-dsl.d.ts +1 -1
  365. package/dist/tools/tool-dsl.js +1 -1
  366. package/dist/tools/tool-dsl.js.map +1 -1
  367. package/dist/utils/document-extractor.d.ts +1 -0
  368. package/dist/utils/document-extractor.d.ts.map +1 -1
  369. package/dist/utils/document-extractor.js +320 -40
  370. package/dist/utils/document-extractor.js.map +1 -1
  371. package/dist/utils/logger.d.ts +1 -1
  372. package/dist/utils/logger.js +1 -1
  373. package/dist/utils/logger.js.map +1 -1
  374. package/dist/version.json +2 -2
  375. package/dist/web-server.d.ts +1 -1
  376. package/dist/web-server.d.ts.map +1 -1
  377. package/dist/web-server.js +12 -8
  378. package/dist/web-server.js.map +1 -1
  379. package/package.json +4 -2
  380. package/dist/oauth/anthropic.d.ts +0 -17
  381. package/dist/oauth/anthropic.d.ts.map +0 -1
  382. package/dist/oauth/anthropic.js +0 -81
  383. package/dist/oauth/anthropic.js.map +0 -1
  384. package/dist/providers/anthropic-auth.d.ts +0 -75
  385. package/dist/providers/anthropic-auth.d.ts.map +0 -1
  386. package/dist/providers/anthropic-auth.js +0 -221
  387. package/dist/providers/anthropic-auth.js.map +0 -1
@@ -8,11 +8,11 @@
8
8
  * ## Configuration Sources (precedence order)
9
9
  *
10
10
  * 1. **Enterprise**: `~/.maestro/enterprise/mcp.json` (highest; legacy
11
- * Composer enterprise MCP config remains a fallback)
11
+ * `.composer` enterprise MCP config remains a fallback)
12
12
  * 2. **Plugin**: Programmatically provided servers
13
13
  * 3. **Project**: `.maestro/mcp.json` in project root
14
14
  * 4. **Local**: `.maestro/mcp.local.json` (git-ignored)
15
- * 5. **User**: `~/.maestro/mcp.json` (lowest; legacy Composer user MCP config
15
+ * 5. **User**: `~/.maestro/mcp.json` (lowest; legacy `.composer` user MCP config
16
16
  * remains a fallback)
17
17
  *
18
18
  * ## Configuration Format
@@ -191,14 +191,35 @@ export function inferRemoteMcpTransport(url) {
191
191
  return isSseUrl(url) ? "sse" : "http";
192
192
  }
193
193
  export function addMcpServerToConfig(options) {
194
- const path = getWritableMcpConfigPath(options.scope, options.projectRoot);
195
- const validatedServer = mcpServerSchema.parse({
196
- ...options.server,
197
- transport: options.server.transport ??
198
- (options.server.url
199
- ? inferRemoteMcpTransport(options.server.url)
200
- : "stdio"),
194
+ return addMcpServersToConfig({
195
+ projectRoot: options.projectRoot,
196
+ scope: options.scope,
197
+ servers: [options.server],
201
198
  });
199
+ }
200
+ export function validateMcpServersForConfig(options) {
201
+ const { path } = prepareMcpServersConfigUpdate(options);
202
+ return { path };
203
+ }
204
+ export function addMcpServersToConfig(options) {
205
+ const { path, nextConfig } = prepareMcpServersConfigUpdate(options);
206
+ writeJsonFile(path, nextConfig);
207
+ return { path };
208
+ }
209
+ function prepareMcpServersConfigUpdate(options) {
210
+ const path = getWritableMcpConfigPath(options.scope, options.projectRoot);
211
+ const validatedServers = options.servers.map((server) => mcpServerSchema.parse({
212
+ ...server,
213
+ transport: server.transport ??
214
+ (server.url ? inferRemoteMcpTransport(server.url) : "stdio"),
215
+ }));
216
+ const seenNames = new Set();
217
+ for (const server of validatedServers) {
218
+ if (seenNames.has(server.name)) {
219
+ throw new Error(`MCP server "${server.name}" is listed more than once`);
220
+ }
221
+ seenNames.add(server.name);
222
+ }
202
223
  const existing = readJsonFile(path, { fallback: {} });
203
224
  const parsed = mcpConfigSchema.safeParse(existing);
204
225
  if (!parsed.success) {
@@ -210,29 +231,32 @@ export function addMcpServerToConfig(options) {
210
231
  const existingServers = isRecord(nextConfig.mcpServers)
211
232
  ? nextConfig.mcpServers
212
233
  : {};
213
- if (Object.prototype.hasOwnProperty.call(existingServers, validatedServer.name)) {
214
- throw new Error(`MCP server "${validatedServer.name}" already exists in ${path}`);
234
+ const nextServers = { ...existingServers };
235
+ for (const server of validatedServers) {
236
+ if (Object.prototype.hasOwnProperty.call(nextServers, server.name)) {
237
+ throw new Error(`MCP server "${server.name}" already exists in ${path}`);
238
+ }
239
+ nextServers[server.name] = buildPersistedServerConfig(server);
215
240
  }
216
- nextConfig.mcpServers = {
217
- ...existingServers,
218
- [validatedServer.name]: buildPersistedServerConfig(validatedServer),
219
- };
241
+ nextConfig.mcpServers = nextServers;
220
242
  }
221
243
  else {
222
244
  const servers = nextConfig.servers ?? [];
223
- if (servers.some((server) => server.name === validatedServer.name)) {
224
- throw new Error(`MCP server "${validatedServer.name}" already exists in ${path}`);
245
+ const existingNames = new Set(servers.map((server) => server.name));
246
+ const nextServers = [...servers];
247
+ for (const server of validatedServers) {
248
+ if (existingNames.has(server.name)) {
249
+ throw new Error(`MCP server "${server.name}" already exists in ${path}`);
250
+ }
251
+ existingNames.add(server.name);
252
+ nextServers.push({
253
+ ...buildPersistedServerConfig(server),
254
+ name: server.name,
255
+ });
225
256
  }
226
- nextConfig.servers = [
227
- ...servers,
228
- {
229
- ...buildPersistedServerConfig(validatedServer),
230
- name: validatedServer.name,
231
- },
232
- ];
257
+ nextConfig.servers = nextServers;
233
258
  }
234
- writeJsonFile(path, nextConfig);
235
- return { path };
259
+ return { path, nextConfig };
236
260
  }
237
261
  export function addMcpAuthPresetToConfig(options) {
238
262
  const path = getWritableMcpConfigPath(options.scope, options.projectRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAGN,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,8BAA8B,EAC9B,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AAUrB,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAE1C,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAChD,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAEpD,MAAM,+BAA+B,GAAG,GAAkB,EAAE,CAC3D,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAEzD,MAAM,8BAA8B,GAAG,GAAW,EAAE,CACnD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAEpD,MAAM,uBAAuB,GAAG,GAAW,EAAE,CAC5C,+BAA+B,EAAE,IAAI,8BAA8B,EAAE,CAAC;AAEvE,MAAM,yBAAyB,GAAG,GAAkB,EAAE,CACrD,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAEnD,MAAM,wBAAwB,GAAG,GAAW,EAAE,CAC7C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAEtC,MAAM,iBAAiB,GAAG,GAAW,EAAE,CACtC,yBAAyB,EAAE,IAAI,wBAAwB,EAAE,CAAC;AAE3D,MAAM,6BAA6B,GAAG,GAAW,EAAE,CAClD,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAE3D,MAAM,uBAAuB,GAAG,GAAW,EAAE,CAC5C,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAE7C,SAAS,YAAY,CAAC,IAAY;IACjC,IAAI,CAAC;QACJ,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAe;IACjD,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC;AAC9C,CAAC;AAED,MAAM,2BAA2B,GAAG,GAAa,EAAE;IAClD,MAAM,YAAY,GAAG,yBAAyB,EAAE,CAAC;IACjD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,WAAW,CAAC,CAAC,wBAAwB,EAAE,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,iCAAiC,GAAG,GAAa,EAAE;IACxD,MAAM,YAAY,GAAG,+BAA+B,EAAE,CAAC;IACvD,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,WAAW,CAAC;QAClB,8BAA8B,EAAE;QAChC,6BAA6B,EAAE;KAC/B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,GAAW,EAAE,CAC/C,yBAAyB,CAAC,2BAA2B,EAAE,CAAC,CAAC;AAE1D,MAAM,gCAAgC,GAAG,GAAW,EAAE,CACrD,yBAAyB,CAAC,iCAAiC,EAAE,CAAC,CAAC;AAwDhE,MAAM,UAAU,aAAa,CAC5B,WAAoB,EACpB,UAA0B,EAAE;IAE5B,MAAM,OAAO,GAAG,eAAe,CAAC,0BAA0B,EAAE,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,eAAe,CACpC,gCAAgC,EAAE,EAClC,YAAY,CACZ,CAAC;IACF,MAAM,UAAU,GAAG,WAAW;QAC7B,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAE,SAAS,CAAC;QACvE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,WAAW;QAC3B,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC;QACnE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAiB;QAC/B,OAAO,EAAE;YACR,GAAG,2BAA2B,EAAE;YAChC,GAAG,yBAAyB,EAAE;YAC9B,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;SAChC;QACD,WAAW,EAAE,EAAE;QACf,iBAAiB,EAAE,EAAE;KACrB,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA+B,CAAC;IACjE,MAAM,uBAAuB,GAA6C,EAAE,CAAC;IAC7E,IAAI,qBAA2D,CAAC;IAChE,+DAA+D;IAC/D,4EAA4E;IAC5E,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YAC1C,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAClC,8EAA8E;YAC9E,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3B,SAAS;YACV,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3E,uBAAuB,CAAC,UAAU,CAAC,GAAG;gBACrC,GAAG,CAAC,uBAAuB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC9C,GAAG,OAAO;aACV,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,qBAAqB,EAAE,CAAC;YAC/B,qBAAqB,GAAG,GAAG,CAAC,qBAAqB,CAAC;QACnD,CAAC;IACF,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB;QACzC,CAAC,CAAC,qBAAqB,CAAC,oBAAoB,CAAC;QAC7C,CAAC,CAAC,SAAS,CAAC;IAEb,OAAO;QACN,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACnD,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QAC3D,iBAAiB,EAChB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,SAAS;QACb,qBAAqB;QACrB,SAAS;KACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,WAAoB;IAClD,MAAM,KAAK,GAAG;QACb,0BAA0B,EAAE;QAC5B,gCAAgC,EAAE;KAClC,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,KAAuB,EACvB,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;IAE3B,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,MAAM;YACV,OAAO,0BAA0B,EAAE,CAAC;QACrC,KAAK,SAAS;YACb,OAAO,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAClD,KAAK,OAAO;YACX,OAAO,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACjD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAClD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA4B;IAGhE,MAAM,IAAI,GAAG,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC;QAC7C,GAAG,OAAO,CAAC,MAAM;QACjB,SAAS,EACR,OAAO,CAAC,MAAM,CAAC,SAAS;YACxB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;gBAClB,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC7C,CAAC,CAAC,OAAO,CAAC;KACZ,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,YAAY,CAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACd,yBAAyB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAqB,CAAC;IACpE,MAAM,eAAe,GACpB,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YACtD,CAAC,CAAC,UAAU,CAAC,UAAU;YACvB,CAAC,CAAC,EAAE,CAAC;QACN,IACC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CACnC,eAAe,EACf,eAAe,CAAC,IAAI,CACpB,EACA,CAAC;YACF,MAAM,IAAI,KAAK,CACd,eAAe,eAAe,CAAC,IAAI,uBAAuB,IAAI,EAAE,CAChE,CAAC;QACH,CAAC;QACD,UAAU,CAAC,UAAU,GAAG;YACvB,GAAG,eAAe;YAClB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,0BAA0B,CAAC,eAAe,CAAC;SACnE,CAAC;IACH,CAAC;SAAM,CAAC;QACP,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CACd,eAAe,eAAe,CAAC,IAAI,uBAAuB,IAAI,EAAE,CAChE,CAAC;QACH,CAAC;QACD,UAAU,CAAC,OAAO,GAAG;YACpB,GAAG,OAAO;YACV;gBACC,GAAG,0BAA0B,CAAC,eAAe,CAAC;gBAC9C,IAAI,EAAE,eAAe,CAAC,IAAI;aAC1B;SACD,CAAC;IACH,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgC;IAGxE,MAAM,IAAI,GAAG,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,YAAY,CAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACd,yBAAyB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAqB,CAAC;IACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;QACvD,CAAC,CAAC,UAAU,CAAC,WAAW;QACxB,CAAC,CAAC,EAAE,CAAC;IACN,IACC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,CAAC,EAC1E,CAAC;QACF,MAAM,IAAI,KAAK,CACd,oBAAoB,eAAe,CAAC,IAAI,uBAAuB,IAAI,EAAE,CACrE,CAAC;IACH,CAAC;IAED,UAAU,CAAC,WAAW,GAAG;QACxB,GAAG,eAAe;QAClB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,8BAA8B,CAAC,eAAe,CAAC;KACvE,CAAC;IAEF,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAA+B;IAIxE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,4BAA4B,CACzC,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,EACb,WAAW,CACX,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAqB,CAAC;IAC/D,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,CAAC,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC5C,OAAmC;IAKnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,sCAAsC,CACnD,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,EACb,WAAW,CACX,CAAC;IACF,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAqB,CAAC;IAC/D,MAAM,OAAO,GAAG,iCAAiC,CAChD,UAAU,EACV,OAAO,CAAC,IAAI,EACZ,QAAQ,CACR,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA+B;IAItE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,4BAA4B,CACzC,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,EACb,WAAW,CACX,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC;QAC7C,GAAG,OAAO,CAAC,MAAM;QACjB,SAAS,EACR,OAAO,CAAC,MAAM,CAAC,SAAS;YACxB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;gBAClB,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;gBAC7C,CAAC,CAAC,OAAO,CAAC;KACZ,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAqB,CAAC;IAC/D,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE;QAC3E,MAAM,EAAE,eAAe;KACvB,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,CAAC,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAC1C,OAAmC;IAKnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,sCAAsC,CACnD,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,EACb,WAAW,CACX,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAqB,CAAC;IAC/D,MAAM,OAAO,GAAG,iCAAiC,CAChD,UAAU,EACV,OAAO,CAAC,IAAI,EACZ,QAAQ,EACR;QACC,MAAM,EAAE,eAAe;KACvB,CACD,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAe;IACrD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBACjC,KAAK;gBACL,IAAI;gBACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aAC3D,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,MAAM,WAAW,GAA0B,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC/D,IAAI,UAAU;oBAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClE,MAAM,MAAM,GAAsC,QAAQ,CAAC,GAAG,CAAC;oBAC9D,CAAC,CAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAqB;oBACtC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACxD,IAAI,UAAU;oBAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnE,MAAM,MAAM,GAA0C,QAAQ,CAAC,GAAG,CAAC;oBAClE,CAAC,CAAE,EAAE,GAAG,GAAG,EAAE,IAAI,EAAyB;oBAC1C,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACZ,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC5D,IAAI,UAAU;oBAAE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;QACF,CAAC;QACD,OAAO;YACN,OAAO;YACP,WAAW;YACX,iBAAiB,EAAE,0BAA0B,CAC5C,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAC7B,KAAK,EACL,IAAI,CACJ;YACD,qBAAqB,EAAE,8BAA8B,CACpD,MAAM,CAAC,IAAI,CAAC,qBAAqB,EACjC,KAAK,EACL,IAAI,CACJ;SACD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;YAC9C,IAAI;YACJ,KAAK;YACL,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACvD,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAChE,CAAC;AACF,CAAC;AAED,SAAS,8BAA8B,CACtC,GAAY,EACZ,KAAe,EACf,IAAY;IAEZ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,8BAA8B,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;QAChD,KAAK;QACL,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACnE,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,0BAA0B,CAClC,GAAY,EACZ,KAAe,EACf,IAAY;IAEZ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;YAC5C,KAAK;YACL,IAAI;YACJ,KAAK,EAAE,6CAA6C;SACpD,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,iBAAiB,GAA6C,EAAE,CAAC;IACvE,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBAClD,KAAK;gBACL,IAAI;gBACJ,UAAU;gBACV,KAAK,EAAE,8CAA8C;aACrD,CAAC,CAAC;YACH,SAAS;QACV,CAAC;QACD,MAAM,YAAY,GAA6B,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;oBAClD,KAAK;oBACL,IAAI;oBACJ,UAAU;oBACV,KAAK;oBACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;iBACnE,CAAC,CAAC;gBACH,SAAS;YACV,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,iBAAiB,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAC9C,CAAC;IACF,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC1B,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAAuB,EACvB,WAAmB;IAKnB,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACd,yBAAyB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAChG,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,4BAA4B,CACpC,IAAY,EACZ,KAAmC,EACnC,WAAmB;IAEnB,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,CAC3D,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAChC,CAAC;IACF,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,+BAA+B,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACd,eAAe,IAAI,mBAAmB,YAAY,CAAC,KAAK,IAAI,YAAY,mCAAmC,CAC3G,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,SAAS,sCAAsC,CAC9C,IAAY,EACZ,KAAmC,EACnC,WAAmB;IAEnB,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,IAAI,CAC/D,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAChC,CAAC;IACF,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,+BAA+B,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACd,oBAAoB,IAAI,mBAAmB,YAAY,CAAC,KAAK,IAAI,YAAY,mCAAmC,CAChH,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,SAAS,uBAAuB,CAC/B,MAAwB,EACxB,IAAY,EACZ,IAAyB,EACzB,OAAuD;IAEvD,IACC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;QAC3B,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,EAC5D,CAAC;QACF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,OAAQ,CAAC,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACzE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAChB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;oBACvB,GAAG,0BAA0B,CAAC,OAAQ,CAAC,MAAM,CAAC;oBAC9C,IAAI,EAAE,OAAQ,CAAC,MAAM,CAAC,IAAI;iBAC1B,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,iCAAiC,CACzC,MAAwB,EACxB,IAAY,EACZ,IAAyB,EACzB,OAEC;IAED,IACC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;QAC5B,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,EAC7D,CAAC;QACF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,8BAA8B,CACxD,OAAQ,CAAC,MAAM,CACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CACvB,MAAsB,EACtB,IAAY,EACZ,KAAe;IAEf,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAEjE,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACvC,KAAK;YACL,IAAI;YACJ,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,QAAQ,GACb,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ;QAC3D,CAAC,CAAE,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAClD,CAAC;YACD,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SACf,CAAC,CACyB;QAC7B,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,YAAY,GACjB,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ;QACnE,CAAC,CAAE,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACtD,CAAC;YACD,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SACf,CAAC,CACyB;QAC7B,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACN,GAAG,SAAS,CAAC,IAAI;QACjB,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE,YAAY;QACrB,SAAS;QACT,KAAK;QACL,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI;QACnE,yBAAyB,EACxB,SAAS,CAAC,IAAI,CAAC,yBAAyB,KAAK,IAAI;KAClD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAA0B,EAC1B,IAAY,EACZ,KAAe;IAEf,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;YAC5C,KAAK;YACL,IAAI;YACJ,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,YAAY,GACjB,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ;QACnE,CAAC,CAAE,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACtD,CAAC;YACD,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SACf,CAAC,CACyB;QAC7B,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACN,GAAG,SAAS,CAAC,IAAI;QACjB,OAAO,EAAE,YAAY;QACrB,KAAK;KACL,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACxB,MAAsB;IAEtB,IACC,MAAM,CAAC,SAAS;QAChB,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO;YAC5B,MAAM,CAAC,SAAS,KAAK,MAAM;YAC3B,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,EAC3B,CAAC;QACF,OAAO,MAAM,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC/B,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO,KAAK,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,SAAS,0BAA0B,CAClC,MAAyC;IAEzC,OAAO;QACN,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;KAC3D,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CACtC,MAA6C;IAE7C,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;KACnC,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,eAAe,CACvB,KAA2B;IAE3B,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CACnB,KAAyB,EACzB,OAAwD;IAExD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,IAAa,EAAE,EAAE;QAChE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjD,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,mDAAmD,EAAE;YACjE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI;YAC5B,QAAQ,EAAE,IAAI;SACd,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACvB,MAGC;IAED,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CACjC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3D,OAAO;QACN,GAAG,MAAM;QACT,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;YAChB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC,CAAC,SAAS;QACZ,GAAG,EAAE,MAAM,CAAC,GAAG;YACd,CAAC,CAAC,MAAM,CAAC,WAAW,CAClB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1C,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE;aACnD,CAAC,CACF;YACF,CAAC,CAAC,SAAS;QACZ,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACtB,CAAC,CAAC,MAAM,CAAC,WAAW,CAClB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GACb,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrD,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAqB,CAAC;YAC1C,CAAC,CAAC,CACF;YACF,CAAC,CAAC,SAAS;QACZ,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;QACrC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;KACvB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAA6C;IAE7C,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE,CACjC,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/D,OAAO;QACN,GAAG,MAAM;QACT,OAAO,EAAE,MAAM,CAAC,OAAO;YACtB,CAAC,CAAC,MAAM,CAAC,WAAW,CAClB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GACb,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrD,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAqB,CAAC;YAC1C,CAAC,CAAC,CACF;YACF,CAAC,CAAC,SAAS;QACZ,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;KAC3C,CAAC;AACH,CAAC","sourcesContent":["/**\n * MCP Configuration - Model Context Protocol Server Management\n *\n * This module handles loading and merging MCP (Model Context Protocol)\n * server configurations from multiple sources. MCP servers extend the\n * agent's capabilities with additional tools and integrations.\n *\n * ## Configuration Sources (precedence order)\n *\n * 1. **Enterprise**: `~/.maestro/enterprise/mcp.json` (highest; legacy\n * Composer enterprise MCP config remains a fallback)\n * 2. **Plugin**: Programmatically provided servers\n * 3. **Project**: `.maestro/mcp.json` in project root\n * 4. **Local**: `.maestro/mcp.local.json` (git-ignored)\n * 5. **User**: `~/.maestro/mcp.json` (lowest; legacy Composer user MCP config\n * remains a fallback)\n *\n * ## Configuration Format\n *\n * ```json\n * {\n * \"servers\": [\n * {\n * \"name\": \"my-server\",\n * \"transport\": \"stdio\",\n * \"command\": \"node\",\n * \"args\": [\"path/to/server.js\"],\n * \"env\": { \"API_KEY\": \"${MY_API_KEY}\" }\n * }\n * ],\n * \"mcpServers\": {\n * \"another-server\": {\n * \"command\": \"python\",\n * \"args\": [\"-m\", \"my_mcp_server\"]\n * }\n * }\n * }\n * ```\n *\n * ## Transport Types\n *\n * | Transport | Description |\n * |-----------|------------------------------------------|\n * | stdio | Communicate via stdin/stdout (default) |\n * | http | HTTP-based transport |\n * | sse | Server-Sent Events transport |\n *\n * ## Environment Variable Expansion\n *\n * Supports `${VAR}` and `${VAR:-default}` syntax in:\n * - command, args, url, cwd, headersHelper\n * - env values\n * - headers\n *\n * @module mcp/config\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { z } from \"zod\";\nimport { PATHS } from \"../config/constants.js\";\nimport { readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getHomeDir, resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { uniquePaths } from \"../utils/path-utils.js\";\nimport { defaultEnvValidators, evaluateEnvValidators } from \"./env-limits.js\";\nimport { getFathomCuaPluginServers } from \"./fathom-cua.js\";\nimport { getPlatformMcpPluginServers } from \"./platform-plugin.js\";\nimport {\n\ttype McpAuthPresetInput,\n\ttype McpServerInput,\n\tmcpAuthPresetSchema,\n\tmcpConfigSchema,\n\tmcpServerSchema,\n\tmcpWorkspaceTrustDefaultSchema,\n\tmcpWorkspaceTrustEntrySchema,\n} from \"./schema.js\";\nimport type {\n\tMcpAuthPresetConfig,\n\tMcpConfig,\n\tMcpScope,\n\tMcpServerConfig,\n\tMcpWorkspaceTrustDefault,\n\tMcpWorkspaceTrustEntry,\n} from \"./types.js\";\n\nconst logger = createLogger(\"mcp:config\");\n\nconst PROJECT_CONFIG_NAME = \".maestro/mcp.json\";\nconst LOCAL_CONFIG_NAME = \".maestro/mcp.local.json\";\n\nconst getEnterpriseConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_ENTERPRISE_MCP_PATH);\n\nconst getDefaultEnterpriseConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"enterprise\", \"mcp.json\");\n\nconst getEnterpriseConfigPath = (): string =>\n\tgetEnterpriseConfigPathOverride() ?? getDefaultEnterpriseConfigPath();\n\nconst getUserConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_USER_MCP_PATH);\n\nconst getDefaultUserConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"mcp.json\");\n\nconst getUserConfigPath = (): string =>\n\tgetUserConfigPathOverride() ?? getDefaultUserConfigPath();\n\nconst getLegacyEnterpriseConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"enterprise\", \"mcp.json\");\n\nconst getLegacyUserConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"mcp.json\");\n\nfunction isConfigFile(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction selectEffectiveConfigPath(paths: string[]): string {\n\treturn paths.find(isConfigFile) ?? paths[0]!;\n}\n\nconst getUserConfigPathCandidates = (): string[] => {\n\tconst overridePath = getUserConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([getDefaultUserConfigPath(), getLegacyUserConfigPath()]);\n};\n\nconst getEnterpriseConfigPathCandidates = (): string[] => {\n\tconst overridePath = getEnterpriseConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([\n\t\tgetDefaultEnterpriseConfigPath(),\n\t\tgetLegacyEnterpriseConfigPath(),\n\t]);\n};\n\nconst getEffectiveUserConfigPath = (): string =>\n\tselectEffectiveConfigPath(getUserConfigPathCandidates());\n\nconst getEffectiveEnterpriseConfigPath = (): string =>\n\tselectEffectiveConfigPath(getEnterpriseConfigPathCandidates());\n\ntype ParsedConfig = {\n\tservers: McpServerConfig[];\n\tauthPresets: McpAuthPresetConfig[];\n\ttrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]>;\n\tworkspaceTrustDefault?: McpWorkspaceTrustDefault;\n};\ntype RawMcpConfigFile = z.infer<typeof mcpConfigSchema>;\ntype PersistedMcpAuthPresetConfig = Omit<McpAuthPresetInput, \"name\">;\ntype PersistedMcpServerConfig = Omit<McpServerInput, \"name\">;\nexport type WritableMcpScope = Exclude<McpScope, \"enterprise\" | \"plugin\">;\n\nexport interface LoadMcpOptions {\n\tpluginServers?: McpServerConfig[];\n\tincludeEnvLimits?: boolean;\n}\n\nexport interface AddMcpServerOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface AddMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport interface RemoveMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface RemoveMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface UpdateMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface UpdateMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport function loadMcpConfig(\n\tprojectRoot?: string,\n\toptions: LoadMcpOptions = {},\n): McpConfig {\n\tconst userCfg = parseConfigFile(getEffectiveUserConfigPath(), \"user\");\n\tconst enterpriseCfg = parseConfigFile(\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t\t\"enterprise\",\n\t);\n\tconst projectCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, PROJECT_CONFIG_NAME), \"project\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst localCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, LOCAL_CONFIG_NAME), \"local\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst pluginCfg: ParsedConfig = {\n\t\tservers: [\n\t\t\t...getPlatformMcpPluginServers(),\n\t\t\t...getFathomCuaPluginServers(),\n\t\t\t...(options.pluginServers ?? []),\n\t\t],\n\t\tauthPresets: [],\n\t\ttrustedWorkspaces: {},\n\t};\n\n\tconst merged = new Map<string, McpServerConfig>();\n\tconst mergedAuthPresets = new Map<string, McpAuthPresetConfig>();\n\tconst mergedTrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tlet workspaceTrustDefault: McpWorkspaceTrustDefault | undefined;\n\t// precedence: enterprise -> plugin -> project -> local -> user\n\t// lower precedence first, higher precedence last so later overrides earlier\n\tfor (const src of [userCfg, localCfg, projectCfg, pluginCfg, enterpriseCfg]) {\n\t\tfor (const authPreset of src.authPresets) {\n\t\t\tmergedAuthPresets.set(authPreset.name, authPreset);\n\t\t}\n\t\tfor (const server of src.servers) {\n\t\t\t// A higher-precedence config can explicitly disable a server defined earlier.\n\t\t\tif (server.enabled === false || server.disabled === true) {\n\t\t\t\tmerged.delete(server.name);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged.set(server.name, server);\n\t\t}\n\t\tfor (const [serverName, entries] of Object.entries(src.trustedWorkspaces)) {\n\t\t\tmergedTrustedWorkspaces[serverName] = [\n\t\t\t\t...(mergedTrustedWorkspaces[serverName] ?? []),\n\t\t\t\t...entries,\n\t\t\t];\n\t\t}\n\t\tif (src.workspaceTrustDefault) {\n\t\t\tworkspaceTrustDefault = src.workspaceTrustDefault;\n\t\t}\n\t}\n\n\tconst envLimits = options.includeEnvLimits\n\t\t? evaluateEnvValidators(defaultEnvValidators)\n\t\t: undefined;\n\n\treturn {\n\t\tservers: Array.from(merged.values()),\n\t\tauthPresets: Array.from(mergedAuthPresets.values()),\n\t\tprojectRoot: projectRoot ? resolve(projectRoot) : undefined,\n\t\ttrustedWorkspaces:\n\t\t\tObject.keys(mergedTrustedWorkspaces).length > 0\n\t\t\t\t? mergedTrustedWorkspaces\n\t\t\t\t: undefined,\n\t\tworkspaceTrustDefault,\n\t\tenvLimits,\n\t};\n}\n\nexport function getConfigPaths(projectRoot?: string): string[] {\n\tconst paths = [\n\t\tgetEffectiveUserConfigPath(),\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t];\n\tif (projectRoot) {\n\t\tpaths.push(resolve(projectRoot, PROJECT_CONFIG_NAME));\n\t\tpaths.push(resolve(projectRoot, LOCAL_CONFIG_NAME));\n\t}\n\treturn paths;\n}\n\nexport function getWritableMcpConfigPath(\n\tscope: WritableMcpScope,\n\tprojectRoot = process.cwd(),\n): string {\n\tswitch (scope) {\n\t\tcase \"user\":\n\t\t\treturn getEffectiveUserConfigPath();\n\t\tcase \"project\":\n\t\t\treturn resolve(projectRoot, PROJECT_CONFIG_NAME);\n\t\tcase \"local\":\n\t\t\treturn resolve(projectRoot, LOCAL_CONFIG_NAME);\n\t}\n}\n\nexport function inferRemoteMcpTransport(url: string): \"http\" | \"sse\" {\n\treturn isSseUrl(url) ? \"sse\" : \"http\";\n}\n\nexport function addMcpServerToConfig(options: AddMcpServerOptions): {\n\tpath: string;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedServer = mcpServerSchema.parse({\n\t\t...options.server,\n\t\ttransport:\n\t\t\toptions.server.transport ??\n\t\t\t(options.server.url\n\t\t\t\t? inferRemoteMcpTransport(options.server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst hasObjectFormat =\n\t\tisRecord(nextConfig.mcpServers) || !Array.isArray(nextConfig.servers);\n\tif (hasObjectFormat) {\n\t\tconst existingServers = isRecord(nextConfig.mcpServers)\n\t\t\t? nextConfig.mcpServers\n\t\t\t: {};\n\t\tif (\n\t\t\tObject.prototype.hasOwnProperty.call(\n\t\t\t\texistingServers,\n\t\t\t\tvalidatedServer.name,\n\t\t\t)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`MCP server \"${validatedServer.name}\" already exists in ${path}`,\n\t\t\t);\n\t\t}\n\t\tnextConfig.mcpServers = {\n\t\t\t...existingServers,\n\t\t\t[validatedServer.name]: buildPersistedServerConfig(validatedServer),\n\t\t};\n\t} else {\n\t\tconst servers = nextConfig.servers ?? [];\n\t\tif (servers.some((server) => server.name === validatedServer.name)) {\n\t\t\tthrow new Error(\n\t\t\t\t`MCP server \"${validatedServer.name}\" already exists in ${path}`,\n\t\t\t);\n\t\t}\n\t\tnextConfig.servers = [\n\t\t\t...servers,\n\t\t\t{\n\t\t\t\t...buildPersistedServerConfig(validatedServer),\n\t\t\t\tname: validatedServer.name,\n\t\t\t},\n\t\t];\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nexport function addMcpAuthPresetToConfig(options: AddMcpAuthPresetOptions): {\n\tpath: string;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst existingPresets = isRecord(nextConfig.authPresets)\n\t\t? nextConfig.authPresets\n\t\t: {};\n\tif (\n\t\tObject.prototype.hasOwnProperty.call(existingPresets, validatedPreset.name)\n\t) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${validatedPreset.name}\" already exists in ${path}`,\n\t\t);\n\t}\n\n\tnextConfig.authPresets = {\n\t\t...existingPresets,\n\t\t[validatedPreset.name]: buildPersistedAuthPresetConfig(validatedPreset),\n\t};\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nexport function removeMcpServerFromConfig(options: RemoveMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpConfig(nextConfig, options.name, \"remove\");\n\tif (!removed) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function removeMcpAuthPresetFromConfig(\n\toptions: RemoveMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"remove\",\n\t);\n\tif (!removed) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpServerInConfig(options: UpdateMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.server.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP servers is not supported by /mcp edit.\");\n\t}\n\n\tconst validatedServer = mcpServerSchema.parse({\n\t\t...options.server,\n\t\ttransport:\n\t\t\toptions.server.transport ??\n\t\t\t(options.server.url\n\t\t\t\t? inferRemoteMcpTransport(options.server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpConfig(nextConfig, options.name, \"update\", {\n\t\tserver: validatedServer,\n\t});\n\tif (!updated) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpAuthPresetInConfig(\n\toptions: UpdateMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.preset.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP auth presets is not supported.\");\n\t}\n\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"update\",\n\t\t{\n\t\t\tpreset: validatedPreset,\n\t\t},\n\t);\n\tif (!updated) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nfunction parseConfigFile(path: string, scope: McpScope): ParsedConfig {\n\tif (!isConfigFile(path)) {\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n\ttry {\n\t\tconst content = readFileSync(path, \"utf-8\");\n\t\tconst json = JSON.parse(content);\n\t\tconst parsed = mcpConfigSchema.safeParse(json);\n\t\tif (!parsed.success) {\n\t\t\tlogger.warn(\"Invalid MCP config\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\terror: parsed.error.issues.map((e) => e.message).join(\"; \"),\n\t\t\t});\n\t\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t\t}\n\n\t\tconst servers: McpServerConfig[] = [];\n\t\tconst authPresets: McpAuthPresetConfig[] = [];\n\t\tif (Array.isArray(parsed.data.servers)) {\n\t\t\tfor (const server of parsed.data.servers) {\n\t\t\t\tconst normalized = normalizeServer(server, server.name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.mcpServers) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.mcpServers)) {\n\t\t\t\tconst merged: McpServerInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpServerInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeServer(merged, name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.authPresets) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.authPresets)) {\n\t\t\t\tconst merged: McpAuthPresetInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpAuthPresetInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeAuthPreset(merged, name, scope);\n\t\t\t\tif (normalized) authPresets.push(normalized);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tservers,\n\t\t\tauthPresets,\n\t\t\ttrustedWorkspaces: normalizeTrustedWorkspaces(\n\t\t\t\tparsed.data.trustedWorkspaces,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t\tworkspaceTrustDefault: normalizeWorkspaceTrustDefault(\n\t\t\t\tparsed.data.workspaceTrustDefault,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t};\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to parse MCP config file\", {\n\t\t\tpath,\n\t\t\tscope,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n}\n\nfunction normalizeWorkspaceTrustDefault(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): McpWorkspaceTrustDefault | undefined {\n\tif (raw === undefined) {\n\t\treturn undefined;\n\t}\n\tconst parsed = mcpWorkspaceTrustDefaultSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\tlogger.warn(\"Invalid MCP workspaceTrustDefault\", {\n\t\tscope,\n\t\tpath,\n\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t});\n\treturn undefined;\n}\n\nfunction normalizeTrustedWorkspaces(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): Record<string, McpWorkspaceTrustEntry[]> {\n\tif (raw === undefined) {\n\t\treturn {};\n\t}\n\tif (!isRecord(raw)) {\n\t\tlogger.warn(\"Invalid MCP trustedWorkspaces\", {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\terror: \"expected an object keyed by MCP server name\",\n\t\t});\n\t\treturn {};\n\t}\n\tconst trustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tfor (const [serverName, entries] of Object.entries(raw)) {\n\t\tif (!Array.isArray(entries)) {\n\t\t\tlogger.warn(\"Invalid MCP trustedWorkspaces entry\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\tserverName,\n\t\t\t\terror: \"expected an array of workspace trust entries\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst validEntries: McpWorkspaceTrustEntry[] = [];\n\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\tconst parsed = mcpWorkspaceTrustEntrySchema.safeParse(entry);\n\t\t\tif (!parsed.success) {\n\t\t\t\tlogger.warn(\"Invalid MCP trusted workspace entry\", {\n\t\t\t\t\tscope,\n\t\t\t\t\tpath,\n\t\t\t\t\tserverName,\n\t\t\t\t\tindex,\n\t\t\t\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalidEntries.push(parsed.data);\n\t\t}\n\t\tif (validEntries.length > 0) {\n\t\t\ttrustedWorkspaces[serverName] = validEntries;\n\t\t}\n\t}\n\treturn trustedWorkspaces;\n}\n\nfunction readWritableMcpConfig(\n\tscope: WritableMcpScope,\n\tprojectRoot: string,\n): {\n\tpath: string;\n\tconfig: RawMcpConfigFile;\n} {\n\tconst path = getWritableMcpConfigPath(scope, projectRoot);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\treturn { path, config: parsed.data };\n}\n\nfunction resolveWritableMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activeServer = loadMcpConfig(projectRoot).servers.find(\n\t\t(server) => server.name === name,\n\t);\n\tif (!activeServer) {\n\t\tthrow new Error(`MCP server \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activeServer.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${name}\" is managed by ${activeServer.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activeServer.scope;\n}\n\nfunction resolveWritableAuthPresetMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activePreset = loadMcpConfig(projectRoot).authPresets.find(\n\t\t(preset) => preset.name === name,\n\t);\n\tif (!activePreset) {\n\t\tthrow new Error(`MCP auth preset \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activePreset.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${name}\" is managed by ${activePreset.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activePreset.scope;\n}\n\nfunction mutateWritableMcpConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: { server: McpServerInput & { name: string } },\n): boolean {\n\tif (\n\t\tisRecord(config.mcpServers) &&\n\t\tObject.prototype.hasOwnProperty.call(config.mcpServers, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.mcpServers[name];\n\t\t} else {\n\t\t\tconfig.mcpServers[name] = buildPersistedServerConfig(options!.server);\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(config.servers)) {\n\t\tconst index = config.servers.findIndex((server) => server.name === name);\n\t\tif (index >= 0) {\n\t\t\tif (mode === \"remove\") {\n\t\t\t\tconfig.servers.splice(index, 1);\n\t\t\t} else {\n\t\t\t\tconfig.servers[index] = {\n\t\t\t\t\t...buildPersistedServerConfig(options!.server),\n\t\t\t\t\tname: options!.server.name,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction mutateWritableMcpAuthPresetConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: {\n\t\tpreset: McpAuthPresetInput & { name: string };\n\t},\n): boolean {\n\tif (\n\t\tisRecord(config.authPresets) &&\n\t\tObject.prototype.hasOwnProperty.call(config.authPresets, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.authPresets[name];\n\t\t} else {\n\t\t\tconfig.authPresets[name] = buildPersistedAuthPresetConfig(\n\t\t\t\toptions!.preset,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction normalizeServer(\n\tserver: McpServerInput,\n\tname: string,\n\tscope: McpScope,\n): McpServerConfig | null {\n\tconst transport = resolveTransport(server);\n\tconst expanded = expandServerEnv({ ...server, name, transport });\n\n\tconst validated = mcpServerSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP server entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanEnv =\n\t\tvalidated.data.env && typeof validated.data.env === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\tenv: cleanEnv,\n\t\theaders: cleanHeaders,\n\t\ttransport,\n\t\tscope,\n\t\tenabled: validated.data.enabled ?? validated.data.disabled !== true,\n\t\tsupportsParallelToolCalls:\n\t\t\tvalidated.data.supportsParallelToolCalls === true,\n\t};\n}\n\nfunction normalizeAuthPreset(\n\tpreset: McpAuthPresetInput,\n\tname: string,\n\tscope: McpScope,\n): McpAuthPresetConfig | null {\n\tconst expanded = expandAuthPresetEnv({ ...preset, name });\n\tconst validated = mcpAuthPresetSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP auth preset entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\theaders: cleanHeaders,\n\t\tscope,\n\t};\n}\n\nfunction resolveTransport(\n\tserver: McpServerInput,\n): McpServerConfig[\"transport\"] {\n\tif (\n\t\tserver.transport &&\n\t\t(server.transport === \"stdio\" ||\n\t\t\tserver.transport === \"http\" ||\n\t\t\tserver.transport === \"sse\")\n\t) {\n\t\treturn server.transport;\n\t}\n\tif (server.url) {\n\t\treturn isSseUrl(server.url) ? \"sse\" : \"http\";\n\t}\n\treturn \"stdio\";\n}\n\nfunction isSseUrl(rawUrl: string): boolean {\n\ttry {\n\t\tconst parsed = new URL(rawUrl);\n\t\tif (parsed.hostname.startsWith(\"sse.\")) return true;\n\t\tconst path = parsed.pathname || \"\";\n\t\tif (path.endsWith(\"/sse\")) return true;\n\t\tif (path.includes(\"/sse/\")) return true;\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction buildPersistedServerConfig(\n\tserver: McpServerInput & { name: string },\n): PersistedMcpServerConfig {\n\treturn {\n\t\ttransport: server.transport,\n\t\tcommand: server.command,\n\t\targs: server.args,\n\t\tenv: server.env,\n\t\tcwd: server.cwd,\n\t\turl: server.url,\n\t\theaders: server.headers,\n\t\theadersHelper: server.headersHelper,\n\t\tauthPreset: server.authPreset,\n\t\ttimeout: server.timeout,\n\t\tenabled: server.enabled,\n\t\tdisabled: server.disabled,\n\t\tsupportsParallelToolCalls: server.supportsParallelToolCalls,\n\t};\n}\n\nfunction buildPersistedAuthPresetConfig(\n\tpreset: McpAuthPresetInput & { name: string },\n): PersistedMcpAuthPresetConfig {\n\treturn {\n\t\theaders: preset.headers,\n\t\theadersHelper: preset.headersHelper,\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isWritableScope(\n\tvalue: McpScope | undefined,\n): value is WritableMcpScope {\n\treturn value === \"local\" || value === \"project\" || value === \"user\";\n}\n\nfunction expandValue(\n\tvalue: string | undefined,\n\tcontext: { kind: \"server\" | \"authPreset\"; name: string },\n): string | undefined {\n\tif (!value) return value;\n\treturn value.replace(/\\$\\{([^}]+)\\}/g, (_match, expr: unknown) => {\n\t\tconst [name, fallback] = String(expr).split(\":-\");\n\t\tconst val = name ? process.env[name] : undefined;\n\t\tif (val !== undefined) return val;\n\t\tif (fallback !== undefined) return fallback;\n\t\tlogger.debug(\"Missing environment variable during MCP expansion\", {\n\t\t\t[context.kind]: context.name,\n\t\t\tvariable: name,\n\t\t});\n\t\treturn _match;\n\t});\n}\n\nfunction expandServerEnv(\n\tserver: McpServerInput & {\n\t\ttransport: McpServerConfig[\"transport\"];\n\t\tname: string;\n\t},\n): McpServerInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"server\", name: server.name });\n\n\treturn {\n\t\t...server,\n\t\tcommand: expand(server.command),\n\t\targs: server.args\n\t\t\t? server.args.map((v) => expand(String(v)) ?? \"\")\n\t\t\t: undefined,\n\t\tenv: server.env\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\",\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\turl: expand(server.url),\n\t\theaders: server.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(server.headersHelper),\n\t\tauthPreset: expand(server.authPreset),\n\t\tcwd: expand(server.cwd),\n\t};\n}\n\nfunction expandAuthPresetEnv(\n\tpreset: McpAuthPresetInput & { name: string },\n): McpAuthPresetInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"authPreset\", name: preset.name });\n\n\treturn {\n\t\t...preset,\n\t\theaders: preset.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(preset.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(preset.headersHelper),\n\t};\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Configuration - Model Context Protocol Server Management\n *\n * This module handles loading and merging MCP (Model Context Protocol)\n * server configurations from multiple sources. MCP servers extend the\n * agent's capabilities with additional tools and integrations.\n *\n * ## Configuration Sources (precedence order)\n *\n * 1. **Enterprise**: `~/.maestro/enterprise/mcp.json` (highest; legacy\n * `.composer` enterprise MCP config remains a fallback)\n * 2. **Plugin**: Programmatically provided servers\n * 3. **Project**: `.maestro/mcp.json` in project root\n * 4. **Local**: `.maestro/mcp.local.json` (git-ignored)\n * 5. **User**: `~/.maestro/mcp.json` (lowest; legacy `.composer` user MCP config\n * remains a fallback)\n *\n * ## Configuration Format\n *\n * ```json\n * {\n * \"servers\": [\n * {\n * \"name\": \"my-server\",\n * \"transport\": \"stdio\",\n * \"command\": \"node\",\n * \"args\": [\"path/to/server.js\"],\n * \"env\": { \"API_KEY\": \"${MY_API_KEY}\" }\n * }\n * ],\n * \"mcpServers\": {\n * \"another-server\": {\n * \"command\": \"python\",\n * \"args\": [\"-m\", \"my_mcp_server\"]\n * }\n * }\n * }\n * ```\n *\n * ## Transport Types\n *\n * | Transport | Description |\n * |-----------|------------------------------------------|\n * | stdio | Communicate via stdin/stdout (default) |\n * | http | HTTP-based transport |\n * | sse | Server-Sent Events transport |\n *\n * ## Environment Variable Expansion\n *\n * Supports `${VAR}` and `${VAR:-default}` syntax in:\n * - command, args, url, cwd, headersHelper\n * - env values\n * - headers\n *\n * @module mcp/config\n */\n\nimport { readFileSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { z } from \"zod\";\nimport { PATHS } from \"../config/constants.js\";\nimport { readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { getHomeDir, resolveEnvPath } from \"../utils/path-expansion.js\";\nimport { uniquePaths } from \"../utils/path-utils.js\";\nimport { defaultEnvValidators, evaluateEnvValidators } from \"./env-limits.js\";\nimport { getFathomCuaPluginServers } from \"./fathom-cua.js\";\nimport { getPlatformMcpPluginServers } from \"./platform-plugin.js\";\nimport {\n\ttype McpAuthPresetInput,\n\ttype McpServerInput,\n\tmcpAuthPresetSchema,\n\tmcpConfigSchema,\n\tmcpServerSchema,\n\tmcpWorkspaceTrustDefaultSchema,\n\tmcpWorkspaceTrustEntrySchema,\n} from \"./schema.js\";\nimport type {\n\tMcpAuthPresetConfig,\n\tMcpConfig,\n\tMcpScope,\n\tMcpServerConfig,\n\tMcpWorkspaceTrustDefault,\n\tMcpWorkspaceTrustEntry,\n} from \"./types.js\";\n\nconst logger = createLogger(\"mcp:config\");\n\nconst PROJECT_CONFIG_NAME = \".maestro/mcp.json\";\nconst LOCAL_CONFIG_NAME = \".maestro/mcp.local.json\";\n\nconst getEnterpriseConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_ENTERPRISE_MCP_PATH);\n\nconst getDefaultEnterpriseConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"enterprise\", \"mcp.json\");\n\nconst getEnterpriseConfigPath = (): string =>\n\tgetEnterpriseConfigPathOverride() ?? getDefaultEnterpriseConfigPath();\n\nconst getUserConfigPathOverride = (): string | null =>\n\tresolveEnvPath(process.env.MAESTRO_USER_MCP_PATH);\n\nconst getDefaultUserConfigPath = (): string =>\n\tjoin(PATHS.MAESTRO_HOME, \"mcp.json\");\n\nconst getUserConfigPath = (): string =>\n\tgetUserConfigPathOverride() ?? getDefaultUserConfigPath();\n\nconst getLegacyEnterpriseConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"enterprise\", \"mcp.json\");\n\nconst getLegacyUserConfigPath = (): string =>\n\tjoin(getHomeDir(), \".composer\", \"mcp.json\");\n\nfunction isConfigFile(path: string): boolean {\n\ttry {\n\t\treturn statSync(path).isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction selectEffectiveConfigPath(paths: string[]): string {\n\treturn paths.find(isConfigFile) ?? paths[0]!;\n}\n\nconst getUserConfigPathCandidates = (): string[] => {\n\tconst overridePath = getUserConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([getDefaultUserConfigPath(), getLegacyUserConfigPath()]);\n};\n\nconst getEnterpriseConfigPathCandidates = (): string[] => {\n\tconst overridePath = getEnterpriseConfigPathOverride();\n\tif (overridePath) {\n\t\treturn [overridePath];\n\t}\n\treturn uniquePaths([\n\t\tgetDefaultEnterpriseConfigPath(),\n\t\tgetLegacyEnterpriseConfigPath(),\n\t]);\n};\n\nconst getEffectiveUserConfigPath = (): string =>\n\tselectEffectiveConfigPath(getUserConfigPathCandidates());\n\nconst getEffectiveEnterpriseConfigPath = (): string =>\n\tselectEffectiveConfigPath(getEnterpriseConfigPathCandidates());\n\ntype ParsedConfig = {\n\tservers: McpServerConfig[];\n\tauthPresets: McpAuthPresetConfig[];\n\ttrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]>;\n\tworkspaceTrustDefault?: McpWorkspaceTrustDefault;\n};\ntype RawMcpConfigFile = z.infer<typeof mcpConfigSchema>;\ntype PersistedMcpAuthPresetConfig = Omit<McpAuthPresetInput, \"name\">;\ntype PersistedMcpServerConfig = Omit<McpServerInput, \"name\">;\nexport type WritableMcpScope = Exclude<McpScope, \"enterprise\" | \"plugin\">;\n\nexport interface LoadMcpOptions {\n\tpluginServers?: McpServerConfig[];\n\tincludeEnvLimits?: boolean;\n}\n\nexport interface AddMcpServerOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface AddMcpServersOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tservers: Array<McpServerInput & { name: string }>;\n}\n\nexport interface AddMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope: WritableMcpScope;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport interface RemoveMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface RemoveMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n}\n\nexport interface UpdateMcpServerOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tserver: McpServerInput & { name: string };\n}\n\nexport interface UpdateMcpAuthPresetOptions {\n\tprojectRoot?: string;\n\tscope?: WritableMcpScope;\n\tname: string;\n\tpreset: McpAuthPresetInput & { name: string };\n}\n\nexport function loadMcpConfig(\n\tprojectRoot?: string,\n\toptions: LoadMcpOptions = {},\n): McpConfig {\n\tconst userCfg = parseConfigFile(getEffectiveUserConfigPath(), \"user\");\n\tconst enterpriseCfg = parseConfigFile(\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t\t\"enterprise\",\n\t);\n\tconst projectCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, PROJECT_CONFIG_NAME), \"project\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst localCfg = projectRoot\n\t\t? parseConfigFile(resolve(projectRoot, LOCAL_CONFIG_NAME), \"local\")\n\t\t: { servers: [], authPresets: [], trustedWorkspaces: {} };\n\tconst pluginCfg: ParsedConfig = {\n\t\tservers: [\n\t\t\t...getPlatformMcpPluginServers(),\n\t\t\t...getFathomCuaPluginServers(),\n\t\t\t...(options.pluginServers ?? []),\n\t\t],\n\t\tauthPresets: [],\n\t\ttrustedWorkspaces: {},\n\t};\n\n\tconst merged = new Map<string, McpServerConfig>();\n\tconst mergedAuthPresets = new Map<string, McpAuthPresetConfig>();\n\tconst mergedTrustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tlet workspaceTrustDefault: McpWorkspaceTrustDefault | undefined;\n\t// precedence: enterprise -> plugin -> project -> local -> user\n\t// lower precedence first, higher precedence last so later overrides earlier\n\tfor (const src of [userCfg, localCfg, projectCfg, pluginCfg, enterpriseCfg]) {\n\t\tfor (const authPreset of src.authPresets) {\n\t\t\tmergedAuthPresets.set(authPreset.name, authPreset);\n\t\t}\n\t\tfor (const server of src.servers) {\n\t\t\t// A higher-precedence config can explicitly disable a server defined earlier.\n\t\t\tif (server.enabled === false || server.disabled === true) {\n\t\t\t\tmerged.delete(server.name);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmerged.set(server.name, server);\n\t\t}\n\t\tfor (const [serverName, entries] of Object.entries(src.trustedWorkspaces)) {\n\t\t\tmergedTrustedWorkspaces[serverName] = [\n\t\t\t\t...(mergedTrustedWorkspaces[serverName] ?? []),\n\t\t\t\t...entries,\n\t\t\t];\n\t\t}\n\t\tif (src.workspaceTrustDefault) {\n\t\t\tworkspaceTrustDefault = src.workspaceTrustDefault;\n\t\t}\n\t}\n\n\tconst envLimits = options.includeEnvLimits\n\t\t? evaluateEnvValidators(defaultEnvValidators)\n\t\t: undefined;\n\n\treturn {\n\t\tservers: Array.from(merged.values()),\n\t\tauthPresets: Array.from(mergedAuthPresets.values()),\n\t\tprojectRoot: projectRoot ? resolve(projectRoot) : undefined,\n\t\ttrustedWorkspaces:\n\t\t\tObject.keys(mergedTrustedWorkspaces).length > 0\n\t\t\t\t? mergedTrustedWorkspaces\n\t\t\t\t: undefined,\n\t\tworkspaceTrustDefault,\n\t\tenvLimits,\n\t};\n}\n\nexport function getConfigPaths(projectRoot?: string): string[] {\n\tconst paths = [\n\t\tgetEffectiveUserConfigPath(),\n\t\tgetEffectiveEnterpriseConfigPath(),\n\t];\n\tif (projectRoot) {\n\t\tpaths.push(resolve(projectRoot, PROJECT_CONFIG_NAME));\n\t\tpaths.push(resolve(projectRoot, LOCAL_CONFIG_NAME));\n\t}\n\treturn paths;\n}\n\nexport function getWritableMcpConfigPath(\n\tscope: WritableMcpScope,\n\tprojectRoot = process.cwd(),\n): string {\n\tswitch (scope) {\n\t\tcase \"user\":\n\t\t\treturn getEffectiveUserConfigPath();\n\t\tcase \"project\":\n\t\t\treturn resolve(projectRoot, PROJECT_CONFIG_NAME);\n\t\tcase \"local\":\n\t\t\treturn resolve(projectRoot, LOCAL_CONFIG_NAME);\n\t}\n}\n\nexport function inferRemoteMcpTransport(url: string): \"http\" | \"sse\" {\n\treturn isSseUrl(url) ? \"sse\" : \"http\";\n}\n\nexport function addMcpServerToConfig(options: AddMcpServerOptions): {\n\tpath: string;\n} {\n\treturn addMcpServersToConfig({\n\t\tprojectRoot: options.projectRoot,\n\t\tscope: options.scope,\n\t\tservers: [options.server],\n\t});\n}\n\nexport function validateMcpServersForConfig(options: AddMcpServersOptions): {\n\tpath: string;\n} {\n\tconst { path } = prepareMcpServersConfigUpdate(options);\n\treturn { path };\n}\n\nexport function addMcpServersToConfig(options: AddMcpServersOptions): {\n\tpath: string;\n} {\n\tconst { path, nextConfig } = prepareMcpServersConfigUpdate(options);\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nfunction prepareMcpServersConfigUpdate(options: AddMcpServersOptions): {\n\tpath: string;\n\tnextConfig: RawMcpConfigFile;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedServers = options.servers.map((server) =>\n\t\tmcpServerSchema.parse({\n\t\t\t...server,\n\t\t\ttransport:\n\t\t\t\tserver.transport ??\n\t\t\t\t(server.url ? inferRemoteMcpTransport(server.url) : \"stdio\"),\n\t\t}),\n\t);\n\tconst seenNames = new Set<string>();\n\tfor (const server of validatedServers) {\n\t\tif (seenNames.has(server.name)) {\n\t\t\tthrow new Error(`MCP server \"${server.name}\" is listed more than once`);\n\t\t}\n\t\tseenNames.add(server.name);\n\t}\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst hasObjectFormat =\n\t\tisRecord(nextConfig.mcpServers) || !Array.isArray(nextConfig.servers);\n\tif (hasObjectFormat) {\n\t\tconst existingServers = isRecord(nextConfig.mcpServers)\n\t\t\t? nextConfig.mcpServers\n\t\t\t: {};\n\t\tconst nextServers = { ...existingServers };\n\t\tfor (const server of validatedServers) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(nextServers, server.name)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`MCP server \"${server.name}\" already exists in ${path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tnextServers[server.name] = buildPersistedServerConfig(server);\n\t\t}\n\t\tnextConfig.mcpServers = nextServers;\n\t} else {\n\t\tconst servers = nextConfig.servers ?? [];\n\t\tconst existingNames = new Set(servers.map((server) => server.name));\n\t\tconst nextServers = [...servers];\n\t\tfor (const server of validatedServers) {\n\t\t\tif (existingNames.has(server.name)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`MCP server \"${server.name}\" already exists in ${path}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\texistingNames.add(server.name);\n\t\t\tnextServers.push({\n\t\t\t\t...buildPersistedServerConfig(server),\n\t\t\t\tname: server.name,\n\t\t\t});\n\t\t}\n\t\tnextConfig.servers = nextServers;\n\t}\n\treturn { path, nextConfig };\n}\n\nexport function addMcpAuthPresetToConfig(options: AddMcpAuthPresetOptions): {\n\tpath: string;\n} {\n\tconst path = getWritableMcpConfigPath(options.scope, options.projectRoot);\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst nextConfig = structuredClone(parsed.data) as RawMcpConfigFile;\n\tconst existingPresets = isRecord(nextConfig.authPresets)\n\t\t? nextConfig.authPresets\n\t\t: {};\n\tif (\n\t\tObject.prototype.hasOwnProperty.call(existingPresets, validatedPreset.name)\n\t) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${validatedPreset.name}\" already exists in ${path}`,\n\t\t);\n\t}\n\n\tnextConfig.authPresets = {\n\t\t...existingPresets,\n\t\t[validatedPreset.name]: buildPersistedAuthPresetConfig(validatedPreset),\n\t};\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path };\n}\n\nexport function removeMcpServerFromConfig(options: RemoveMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpConfig(nextConfig, options.name, \"remove\");\n\tif (!removed) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function removeMcpAuthPresetFromConfig(\n\toptions: RemoveMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst removed = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"remove\",\n\t);\n\tif (!removed) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpServerInConfig(options: UpdateMcpServerOptions): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.server.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP servers is not supported by /mcp edit.\");\n\t}\n\n\tconst validatedServer = mcpServerSchema.parse({\n\t\t...options.server,\n\t\ttransport:\n\t\t\toptions.server.transport ??\n\t\t\t(options.server.url\n\t\t\t\t? inferRemoteMcpTransport(options.server.url)\n\t\t\t\t: \"stdio\"),\n\t});\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpConfig(nextConfig, options.name, \"update\", {\n\t\tserver: validatedServer,\n\t});\n\tif (!updated) {\n\t\tthrow new Error(`MCP server \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nexport function updateMcpAuthPresetInConfig(\n\toptions: UpdateMcpAuthPresetOptions,\n): {\n\tpath: string;\n\tscope: WritableMcpScope;\n} {\n\tconst projectRoot = options.projectRoot ?? process.cwd();\n\tconst scope = resolveWritableAuthPresetMutationScope(\n\t\toptions.name,\n\t\toptions.scope,\n\t\tprojectRoot,\n\t);\n\tif (options.preset.name !== options.name) {\n\t\tthrow new Error(\"Renaming MCP auth presets is not supported.\");\n\t}\n\n\tconst validatedPreset = mcpAuthPresetSchema.parse(options.preset);\n\tconst { path, config } = readWritableMcpConfig(scope, projectRoot);\n\tconst nextConfig = structuredClone(config) as RawMcpConfigFile;\n\tconst updated = mutateWritableMcpAuthPresetConfig(\n\t\tnextConfig,\n\t\toptions.name,\n\t\t\"update\",\n\t\t{\n\t\t\tpreset: validatedPreset,\n\t\t},\n\t);\n\tif (!updated) {\n\t\tthrow new Error(`MCP auth preset \"${options.name}\" not found in ${path}`);\n\t}\n\n\twriteJsonFile(path, nextConfig);\n\treturn { path, scope };\n}\n\nfunction parseConfigFile(path: string, scope: McpScope): ParsedConfig {\n\tif (!isConfigFile(path)) {\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n\ttry {\n\t\tconst content = readFileSync(path, \"utf-8\");\n\t\tconst json = JSON.parse(content);\n\t\tconst parsed = mcpConfigSchema.safeParse(json);\n\t\tif (!parsed.success) {\n\t\t\tlogger.warn(\"Invalid MCP config\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\terror: parsed.error.issues.map((e) => e.message).join(\"; \"),\n\t\t\t});\n\t\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t\t}\n\n\t\tconst servers: McpServerConfig[] = [];\n\t\tconst authPresets: McpAuthPresetConfig[] = [];\n\t\tif (Array.isArray(parsed.data.servers)) {\n\t\t\tfor (const server of parsed.data.servers) {\n\t\t\t\tconst normalized = normalizeServer(server, server.name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.mcpServers) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.mcpServers)) {\n\t\t\t\tconst merged: McpServerInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpServerInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeServer(merged, name, scope);\n\t\t\t\tif (normalized) servers.push(normalized);\n\t\t\t}\n\t\t}\n\t\tif (parsed.data.authPresets) {\n\t\t\tfor (const [name, raw] of Object.entries(parsed.data.authPresets)) {\n\t\t\t\tconst merged: McpAuthPresetInput | { name: string } = isRecord(raw)\n\t\t\t\t\t? ({ ...raw, name } as McpAuthPresetInput)\n\t\t\t\t\t: { name };\n\t\t\t\tconst normalized = normalizeAuthPreset(merged, name, scope);\n\t\t\t\tif (normalized) authPresets.push(normalized);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tservers,\n\t\t\tauthPresets,\n\t\t\ttrustedWorkspaces: normalizeTrustedWorkspaces(\n\t\t\t\tparsed.data.trustedWorkspaces,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t\tworkspaceTrustDefault: normalizeWorkspaceTrustDefault(\n\t\t\t\tparsed.data.workspaceTrustDefault,\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t),\n\t\t};\n\t} catch (error) {\n\t\tlogger.warn(\"Failed to parse MCP config file\", {\n\t\t\tpath,\n\t\t\tscope,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\tstack: error instanceof Error ? error.stack : undefined,\n\t\t});\n\t\treturn { servers: [], authPresets: [], trustedWorkspaces: {} };\n\t}\n}\n\nfunction normalizeWorkspaceTrustDefault(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): McpWorkspaceTrustDefault | undefined {\n\tif (raw === undefined) {\n\t\treturn undefined;\n\t}\n\tconst parsed = mcpWorkspaceTrustDefaultSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\tlogger.warn(\"Invalid MCP workspaceTrustDefault\", {\n\t\tscope,\n\t\tpath,\n\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t});\n\treturn undefined;\n}\n\nfunction normalizeTrustedWorkspaces(\n\traw: unknown,\n\tscope: McpScope,\n\tpath: string,\n): Record<string, McpWorkspaceTrustEntry[]> {\n\tif (raw === undefined) {\n\t\treturn {};\n\t}\n\tif (!isRecord(raw)) {\n\t\tlogger.warn(\"Invalid MCP trustedWorkspaces\", {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\terror: \"expected an object keyed by MCP server name\",\n\t\t});\n\t\treturn {};\n\t}\n\tconst trustedWorkspaces: Record<string, McpWorkspaceTrustEntry[]> = {};\n\tfor (const [serverName, entries] of Object.entries(raw)) {\n\t\tif (!Array.isArray(entries)) {\n\t\t\tlogger.warn(\"Invalid MCP trustedWorkspaces entry\", {\n\t\t\t\tscope,\n\t\t\t\tpath,\n\t\t\t\tserverName,\n\t\t\t\terror: \"expected an array of workspace trust entries\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst validEntries: McpWorkspaceTrustEntry[] = [];\n\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\tconst parsed = mcpWorkspaceTrustEntrySchema.safeParse(entry);\n\t\t\tif (!parsed.success) {\n\t\t\t\tlogger.warn(\"Invalid MCP trusted workspace entry\", {\n\t\t\t\t\tscope,\n\t\t\t\t\tpath,\n\t\t\t\t\tserverName,\n\t\t\t\t\tindex,\n\t\t\t\t\terror: parsed.error.issues.map((issue) => issue.message).join(\"; \"),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvalidEntries.push(parsed.data);\n\t\t}\n\t\tif (validEntries.length > 0) {\n\t\t\ttrustedWorkspaces[serverName] = validEntries;\n\t\t}\n\t}\n\treturn trustedWorkspaces;\n}\n\nfunction readWritableMcpConfig(\n\tscope: WritableMcpScope,\n\tprojectRoot: string,\n): {\n\tpath: string;\n\tconfig: RawMcpConfigFile;\n} {\n\tconst path = getWritableMcpConfigPath(scope, projectRoot);\n\tconst existing = readJsonFile<unknown>(path, { fallback: {} });\n\tconst parsed = mcpConfigSchema.safeParse(existing);\n\tif (!parsed.success) {\n\t\tthrow new Error(\n\t\t\t`Invalid MCP config at ${path}: ${parsed.error.issues.map((issue) => issue.message).join(\"; \")}`,\n\t\t);\n\t}\n\treturn { path, config: parsed.data };\n}\n\nfunction resolveWritableMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activeServer = loadMcpConfig(projectRoot).servers.find(\n\t\t(server) => server.name === name,\n\t);\n\tif (!activeServer) {\n\t\tthrow new Error(`MCP server \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activeServer.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP server \"${name}\" is managed by ${activeServer.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activeServer.scope;\n}\n\nfunction resolveWritableAuthPresetMutationScope(\n\tname: string,\n\tscope: WritableMcpScope | undefined,\n\tprojectRoot: string,\n): WritableMcpScope {\n\tif (scope) {\n\t\treturn scope;\n\t}\n\n\tconst activePreset = loadMcpConfig(projectRoot).authPresets.find(\n\t\t(preset) => preset.name === name,\n\t);\n\tif (!activePreset) {\n\t\tthrow new Error(`MCP auth preset \"${name}\" not found in merged config.`);\n\t}\n\tif (!isWritableScope(activePreset.scope)) {\n\t\tthrow new Error(\n\t\t\t`MCP auth preset \"${name}\" is managed by ${activePreset.scope ?? \"an unknown\"} scope and cannot be edited here.`,\n\t\t);\n\t}\n\treturn activePreset.scope;\n}\n\nfunction mutateWritableMcpConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: { server: McpServerInput & { name: string } },\n): boolean {\n\tif (\n\t\tisRecord(config.mcpServers) &&\n\t\tObject.prototype.hasOwnProperty.call(config.mcpServers, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.mcpServers[name];\n\t\t} else {\n\t\t\tconfig.mcpServers[name] = buildPersistedServerConfig(options!.server);\n\t\t}\n\t\treturn true;\n\t}\n\n\tif (Array.isArray(config.servers)) {\n\t\tconst index = config.servers.findIndex((server) => server.name === name);\n\t\tif (index >= 0) {\n\t\t\tif (mode === \"remove\") {\n\t\t\t\tconfig.servers.splice(index, 1);\n\t\t\t} else {\n\t\t\t\tconfig.servers[index] = {\n\t\t\t\t\t...buildPersistedServerConfig(options!.server),\n\t\t\t\t\tname: options!.server.name,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nfunction mutateWritableMcpAuthPresetConfig(\n\tconfig: RawMcpConfigFile,\n\tname: string,\n\tmode: \"remove\" | \"update\",\n\toptions?: {\n\t\tpreset: McpAuthPresetInput & { name: string };\n\t},\n): boolean {\n\tif (\n\t\tisRecord(config.authPresets) &&\n\t\tObject.prototype.hasOwnProperty.call(config.authPresets, name)\n\t) {\n\t\tif (mode === \"remove\") {\n\t\t\tdelete config.authPresets[name];\n\t\t} else {\n\t\t\tconfig.authPresets[name] = buildPersistedAuthPresetConfig(\n\t\t\t\toptions!.preset,\n\t\t\t);\n\t\t}\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction normalizeServer(\n\tserver: McpServerInput,\n\tname: string,\n\tscope: McpScope,\n): McpServerConfig | null {\n\tconst transport = resolveTransport(server);\n\tconst expanded = expandServerEnv({ ...server, name, transport });\n\n\tconst validated = mcpServerSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP server entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanEnv =\n\t\tvalidated.data.env && typeof validated.data.env === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\tenv: cleanEnv,\n\t\theaders: cleanHeaders,\n\t\ttransport,\n\t\tscope,\n\t\tenabled: validated.data.enabled ?? validated.data.disabled !== true,\n\t\tsupportsParallelToolCalls:\n\t\t\tvalidated.data.supportsParallelToolCalls === true,\n\t};\n}\n\nfunction normalizeAuthPreset(\n\tpreset: McpAuthPresetInput,\n\tname: string,\n\tscope: McpScope,\n): McpAuthPresetConfig | null {\n\tconst expanded = expandAuthPresetEnv({ ...preset, name });\n\tconst validated = mcpAuthPresetSchema.safeParse(expanded);\n\tif (!validated.success) {\n\t\tlogger.warn(\"Invalid MCP auth preset entry\", {\n\t\t\tscope,\n\t\t\tname,\n\t\t\terror: validated.error.issues.map((e) => e.message).join(\"; \"),\n\t\t});\n\t\treturn null;\n\t}\n\n\tconst cleanHeaders =\n\t\tvalidated.data.headers && typeof validated.data.headers === \"object\"\n\t\t\t? (Object.fromEntries(\n\t\t\t\t\tObject.entries(validated.data.headers).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\tString(v ?? \"\"),\n\t\t\t\t\t]),\n\t\t\t\t) as Record<string, string>)\n\t\t\t: undefined;\n\n\treturn {\n\t\t...validated.data,\n\t\theaders: cleanHeaders,\n\t\tscope,\n\t};\n}\n\nfunction resolveTransport(\n\tserver: McpServerInput,\n): McpServerConfig[\"transport\"] {\n\tif (\n\t\tserver.transport &&\n\t\t(server.transport === \"stdio\" ||\n\t\t\tserver.transport === \"http\" ||\n\t\t\tserver.transport === \"sse\")\n\t) {\n\t\treturn server.transport;\n\t}\n\tif (server.url) {\n\t\treturn isSseUrl(server.url) ? \"sse\" : \"http\";\n\t}\n\treturn \"stdio\";\n}\n\nfunction isSseUrl(rawUrl: string): boolean {\n\ttry {\n\t\tconst parsed = new URL(rawUrl);\n\t\tif (parsed.hostname.startsWith(\"sse.\")) return true;\n\t\tconst path = parsed.pathname || \"\";\n\t\tif (path.endsWith(\"/sse\")) return true;\n\t\tif (path.includes(\"/sse/\")) return true;\n\t\treturn false;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction buildPersistedServerConfig(\n\tserver: McpServerInput & { name: string },\n): PersistedMcpServerConfig {\n\treturn {\n\t\ttransport: server.transport,\n\t\tcommand: server.command,\n\t\targs: server.args,\n\t\tenv: server.env,\n\t\tcwd: server.cwd,\n\t\turl: server.url,\n\t\theaders: server.headers,\n\t\theadersHelper: server.headersHelper,\n\t\tauthPreset: server.authPreset,\n\t\ttimeout: server.timeout,\n\t\tenabled: server.enabled,\n\t\tdisabled: server.disabled,\n\t\tsupportsParallelToolCalls: server.supportsParallelToolCalls,\n\t};\n}\n\nfunction buildPersistedAuthPresetConfig(\n\tpreset: McpAuthPresetInput & { name: string },\n): PersistedMcpAuthPresetConfig {\n\treturn {\n\t\theaders: preset.headers,\n\t\theadersHelper: preset.headersHelper,\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isWritableScope(\n\tvalue: McpScope | undefined,\n): value is WritableMcpScope {\n\treturn value === \"local\" || value === \"project\" || value === \"user\";\n}\n\nfunction expandValue(\n\tvalue: string | undefined,\n\tcontext: { kind: \"server\" | \"authPreset\"; name: string },\n): string | undefined {\n\tif (!value) return value;\n\treturn value.replace(/\\$\\{([^}]+)\\}/g, (_match, expr: unknown) => {\n\t\tconst [name, fallback] = String(expr).split(\":-\");\n\t\tconst val = name ? process.env[name] : undefined;\n\t\tif (val !== undefined) return val;\n\t\tif (fallback !== undefined) return fallback;\n\t\tlogger.debug(\"Missing environment variable during MCP expansion\", {\n\t\t\t[context.kind]: context.name,\n\t\t\tvariable: name,\n\t\t});\n\t\treturn _match;\n\t});\n}\n\nfunction expandServerEnv(\n\tserver: McpServerInput & {\n\t\ttransport: McpServerConfig[\"transport\"];\n\t\tname: string;\n\t},\n): McpServerInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"server\", name: server.name });\n\n\treturn {\n\t\t...server,\n\t\tcommand: expand(server.command),\n\t\targs: server.args\n\t\t\t? server.args.map((v) => expand(String(v)) ?? \"\")\n\t\t\t: undefined,\n\t\tenv: server.env\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.env).map(([k, v]) => [\n\t\t\t\t\t\tk,\n\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\",\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\turl: expand(server.url),\n\t\theaders: server.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(server.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(server.headersHelper),\n\t\tauthPreset: expand(server.authPreset),\n\t\tcwd: expand(server.cwd),\n\t};\n}\n\nfunction expandAuthPresetEnv(\n\tpreset: McpAuthPresetInput & { name: string },\n): McpAuthPresetInput {\n\tconst expand = (value?: string) =>\n\t\texpandValue(value, { kind: \"authPreset\", name: preset.name });\n\n\treturn {\n\t\t...preset,\n\t\theaders: preset.headers\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(preset.headers).map(([k, v]) => {\n\t\t\t\t\t\tconst expanded =\n\t\t\t\t\t\t\texpand(typeof v === \"string\" ? v : undefined) ?? \"\";\n\t\t\t\t\t\treturn [k, expanded] as [string, string];\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: undefined,\n\t\theadersHelper: expand(preset.headersHelper),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fathom-cua.d.ts","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwKlD,wBAAgB,yBAAyB,IAAI,eAAe,EAAE,CAK7D"}
1
+ {"version":3,"file":"fathom-cua.d.ts","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmLlD,wBAAgB,yBAAyB,IAAI,eAAe,EAAE,CAK7D"}
@@ -53,7 +53,12 @@ const DISABLE_IPC_ENV_VARS = [
53
53
  "MAESTRO_FATHOM_CUA_DISABLE_IPC",
54
54
  "FATHOM_CUA_DISABLE_IPC",
55
55
  ];
56
+ const TOOL_PROFILE_ENV_VARS = [
57
+ "MAESTRO_FATHOM_CUA_TOOL_PROFILE",
58
+ "FATHOM_CUA_TOOL_PROFILE",
59
+ ];
56
60
  const DEFAULT_SERVER_NAME = "fathom-cua";
61
+ const DEFAULT_TOOL_PROFILE = "canonical";
57
62
  function envFlagEnabled(names) {
58
63
  const value = getEnvValue(names);
59
64
  if (!value) {
@@ -96,6 +101,9 @@ function appendFlag(args, flag, value) {
96
101
  args.push(flag, value);
97
102
  }
98
103
  }
104
+ function resolveToolProfile() {
105
+ return getEnvValue(TOOL_PROFILE_ENV_VARS)?.trim() || DEFAULT_TOOL_PROFILE;
106
+ }
99
107
  function resolveFathomRepo() {
100
108
  const configured = getEnvValue(REPO_ENV_VARS);
101
109
  if (configured) {
@@ -125,6 +133,8 @@ function buildFathomCuaServer() {
125
133
  const ipcRoot = getEnvValue(IPC_ROOT_ENV_VARS);
126
134
  const sessionId = getEnvValue(SESSION_ID_ENV_VARS);
127
135
  const turnId = getEnvValue(TURN_ID_ENV_VARS);
136
+ const toolProfile = resolveToolProfile();
137
+ appendFlag(args, "-tool-profile", toolProfile);
128
138
  appendFlag(args, "-workspace-id", workspaceId);
129
139
  appendFlag(args, "-helper-endpoint", helperEndpoint);
130
140
  appendFlag(args, "-ipc-root", ipcRoot);
@@ -1 +1 @@
1
- {"version":3,"file":"fathom-cua.js","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getEnvValue } from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst logger = createLogger(\"mcp:fathom-cua\");\n\nconst DISABLED_VALUES = new Set([\"0\", \"false\", \"no\", \"off\"]);\nconst ENABLED_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_ENABLED\",\n\t\"FATHOM_CUA_MCP_ENABLED\",\n] as const;\nconst NAME_ENV_VARS = [\"MAESTRO_FATHOM_CUA_MCP_NAME\", \"FATHOM_CUA_MCP_NAME\"];\nconst COMMAND_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_COMMAND\",\n\t\"FATHOM_CUA_CLIENT_COMMAND\",\n] as const;\nconst ARGS_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_ARGS_JSON\",\n\t\"FATHOM_CUA_CLIENT_ARGS_JSON\",\n] as const;\nconst REPO_ENV_VARS = [\"MAESTRO_FATHOM_CUA_REPO\", \"FATHOM_CUA_REPO\"] as const;\nconst CWD_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_CWD\",\n\t\"FATHOM_CUA_CLIENT_CWD\",\n] as const;\nconst WORKSPACE_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_WORKSPACE_ID\",\n\t\"FATHOM_CUA_WORKSPACE_ID\",\n\t\"MAESTRO_WORKSPACE_ID\",\n\t\"MAESTRO_EVALOPS_WORKSPACE_ID\",\n\t\"EVALOPS_WORKSPACE_ID\",\n] as const;\nconst HELPER_ENDPOINT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_HELPER_ENDPOINT\",\n\t\"FATHOM_CUA_HELPER_ENDPOINT\",\n] as const;\nconst IPC_ROOT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_IPC_ROOT\",\n] as const;\nconst SESSION_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_SESSION_ID\",\n\t\"FATHOM_CUA_SESSION_ID\",\n\t\"MAESTRO_SESSION_ID\",\n] as const;\nconst TURN_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_TURN_ID\",\n\t\"FATHOM_CUA_TURN_ID\",\n\t\"MAESTRO_AGENT_RUN_ID\",\n\t\"MAESTRO_REQUEST_ID\",\n] as const;\nconst DISABLE_IPC_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_DISABLE_IPC\",\n\t\"FATHOM_CUA_DISABLE_IPC\",\n] as const;\nconst DEFAULT_SERVER_NAME = \"fathom-cua\";\n\nfunction envFlagEnabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn !DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction envFlagDisabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction parseArgsJson(raw: string | undefined): string[] {\n\tif (!raw) {\n\t\treturn [];\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (!Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected an array\");\n\t\t}\n\t\treturn parsed.map((item) => {\n\t\t\tif (typeof item !== \"string\") {\n\t\t\t\tthrow new Error(\"expected only string arguments\");\n\t\t\t}\n\t\t\treturn item;\n\t\t});\n\t} catch (error) {\n\t\tlogger.warn(\"Ignoring invalid Fathom CUA MCP args JSON\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t\treturn [];\n\t}\n}\n\nfunction appendFlag(\n\targs: string[],\n\tflag: string,\n\tvalue: string | undefined,\n): void {\n\tif (value) {\n\t\targs.push(flag, value);\n\t}\n}\n\nfunction resolveFathomRepo(): string | undefined {\n\tconst configured = getEnvValue(REPO_ENV_VARS);\n\tif (configured) {\n\t\treturn configured;\n\t}\n\n\tconst candidates = [\n\t\tjoin(process.cwd(), \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"..\", \"fathom\"),\n\t];\n\treturn candidates.find((candidate) =>\n\t\texistsSync(join(candidate, \"cmd\", \"fathom-client\", \"main.go\")),\n\t);\n}\n\nfunction buildFathomCuaServer(): McpServerConfig {\n\tconst repo = resolveFathomRepo();\n\tconst configuredCommand = getEnvValue(COMMAND_ENV_VARS);\n\tconst configuredCwd = getEnvValue(CWD_ENV_VARS);\n\tconst command = configuredCommand ?? (repo ? \"go\" : \"fathom-client\");\n\tconst cwd = configuredCwd ?? (configuredCommand ? undefined : repo);\n\tconst extraArgs = parseArgsJson(getEnvValue(ARGS_ENV_VARS));\n\tconst args = configuredCommand\n\t\t? [...extraArgs]\n\t\t: repo\n\t\t\t? [\"run\", \"./cmd/fathom-client\", ...extraArgs]\n\t\t\t: [...extraArgs];\n\tconst workspaceId = getEnvValue(WORKSPACE_ENV_VARS);\n\tconst helperEndpoint = getEnvValue(HELPER_ENDPOINT_ENV_VARS);\n\tconst ipcRoot = getEnvValue(IPC_ROOT_ENV_VARS);\n\tconst sessionId = getEnvValue(SESSION_ID_ENV_VARS);\n\tconst turnId = getEnvValue(TURN_ID_ENV_VARS);\n\n\tappendFlag(args, \"-workspace-id\", workspaceId);\n\tappendFlag(args, \"-helper-endpoint\", helperEndpoint);\n\tappendFlag(args, \"-ipc-root\", ipcRoot);\n\tappendFlag(args, \"-session-id\", sessionId);\n\tappendFlag(args, \"-turn-id\", turnId);\n\tif (envFlagEnabled(DISABLE_IPC_ENV_VARS)) {\n\t\targs.push(\"-disable-ipc\");\n\t}\n\n\tconst env = Object.fromEntries(\n\t\tObject.entries({\n\t\t\tFATHOM_CALLER_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_WORKSPACE_ID: workspaceId,\n\t\t\tFATHOM_IPC_ROOT: ipcRoot,\n\t\t}).filter((entry): entry is [string, string] => Boolean(entry[1])),\n\t);\n\n\treturn {\n\t\tname: getEnvValue(NAME_ENV_VARS) ?? DEFAULT_SERVER_NAME,\n\t\ttransport: \"stdio\",\n\t\tcommand,\n\t\targs,\n\t\tcwd,\n\t\tenv,\n\t\tscope: \"plugin\",\n\t};\n}\n\nexport function getFathomCuaPluginServers(): McpServerConfig[] {\n\tif (envFlagDisabled(ENABLED_ENV_VARS) || !envFlagEnabled(ENABLED_ENV_VARS)) {\n\t\treturn [];\n\t}\n\treturn [buildFathomCuaServer()];\n}\n"]}
1
+ {"version":3,"file":"fathom-cua.js","sourceRoot":"","sources":["../../src/mcp/fathom-cua.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getEnvValue } from \"../platform/client.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport type { McpServerConfig } from \"./types.js\";\n\nconst logger = createLogger(\"mcp:fathom-cua\");\n\nconst DISABLED_VALUES = new Set([\"0\", \"false\", \"no\", \"off\"]);\nconst ENABLED_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_ENABLED\",\n\t\"FATHOM_CUA_MCP_ENABLED\",\n] as const;\nconst NAME_ENV_VARS = [\"MAESTRO_FATHOM_CUA_MCP_NAME\", \"FATHOM_CUA_MCP_NAME\"];\nconst COMMAND_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_COMMAND\",\n\t\"FATHOM_CUA_CLIENT_COMMAND\",\n] as const;\nconst ARGS_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_ARGS_JSON\",\n\t\"FATHOM_CUA_CLIENT_ARGS_JSON\",\n] as const;\nconst REPO_ENV_VARS = [\"MAESTRO_FATHOM_CUA_REPO\", \"FATHOM_CUA_REPO\"] as const;\nconst CWD_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_CLIENT_CWD\",\n\t\"FATHOM_CUA_CLIENT_CWD\",\n] as const;\nconst WORKSPACE_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_WORKSPACE_ID\",\n\t\"FATHOM_CUA_WORKSPACE_ID\",\n\t\"MAESTRO_WORKSPACE_ID\",\n\t\"MAESTRO_EVALOPS_WORKSPACE_ID\",\n\t\"EVALOPS_WORKSPACE_ID\",\n] as const;\nconst HELPER_ENDPOINT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_HELPER_ENDPOINT\",\n\t\"FATHOM_CUA_HELPER_ENDPOINT\",\n] as const;\nconst IPC_ROOT_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_CUA_IPC_ROOT\",\n\t\"FATHOM_IPC_ROOT\",\n] as const;\nconst SESSION_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_SESSION_ID\",\n\t\"FATHOM_CUA_SESSION_ID\",\n\t\"MAESTRO_SESSION_ID\",\n] as const;\nconst TURN_ID_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_TURN_ID\",\n\t\"FATHOM_CUA_TURN_ID\",\n\t\"MAESTRO_AGENT_RUN_ID\",\n\t\"MAESTRO_REQUEST_ID\",\n] as const;\nconst DISABLE_IPC_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_DISABLE_IPC\",\n\t\"FATHOM_CUA_DISABLE_IPC\",\n] as const;\nconst TOOL_PROFILE_ENV_VARS = [\n\t\"MAESTRO_FATHOM_CUA_TOOL_PROFILE\",\n\t\"FATHOM_CUA_TOOL_PROFILE\",\n] as const;\nconst DEFAULT_SERVER_NAME = \"fathom-cua\";\nconst DEFAULT_TOOL_PROFILE = \"canonical\";\n\nfunction envFlagEnabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn !DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction envFlagDisabled(names: readonly string[]): boolean {\n\tconst value = getEnvValue(names);\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn DISABLED_VALUES.has(value.trim().toLowerCase());\n}\n\nfunction parseArgsJson(raw: string | undefined): string[] {\n\tif (!raw) {\n\t\treturn [];\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (!Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected an array\");\n\t\t}\n\t\treturn parsed.map((item) => {\n\t\t\tif (typeof item !== \"string\") {\n\t\t\t\tthrow new Error(\"expected only string arguments\");\n\t\t\t}\n\t\t\treturn item;\n\t\t});\n\t} catch (error) {\n\t\tlogger.warn(\"Ignoring invalid Fathom CUA MCP args JSON\", {\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t});\n\t\treturn [];\n\t}\n}\n\nfunction appendFlag(\n\targs: string[],\n\tflag: string,\n\tvalue: string | undefined,\n): void {\n\tif (value) {\n\t\targs.push(flag, value);\n\t}\n}\n\nfunction resolveToolProfile(): string {\n\treturn getEnvValue(TOOL_PROFILE_ENV_VARS)?.trim() || DEFAULT_TOOL_PROFILE;\n}\n\nfunction resolveFathomRepo(): string | undefined {\n\tconst configured = getEnvValue(REPO_ENV_VARS);\n\tif (configured) {\n\t\treturn configured;\n\t}\n\n\tconst candidates = [\n\t\tjoin(process.cwd(), \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"fathom\"),\n\t\tjoin(process.cwd(), \"..\", \"..\", \"..\", \"fathom\"),\n\t];\n\treturn candidates.find((candidate) =>\n\t\texistsSync(join(candidate, \"cmd\", \"fathom-client\", \"main.go\")),\n\t);\n}\n\nfunction buildFathomCuaServer(): McpServerConfig {\n\tconst repo = resolveFathomRepo();\n\tconst configuredCommand = getEnvValue(COMMAND_ENV_VARS);\n\tconst configuredCwd = getEnvValue(CWD_ENV_VARS);\n\tconst command = configuredCommand ?? (repo ? \"go\" : \"fathom-client\");\n\tconst cwd = configuredCwd ?? (configuredCommand ? undefined : repo);\n\tconst extraArgs = parseArgsJson(getEnvValue(ARGS_ENV_VARS));\n\tconst args = configuredCommand\n\t\t? [...extraArgs]\n\t\t: repo\n\t\t\t? [\"run\", \"./cmd/fathom-client\", ...extraArgs]\n\t\t\t: [...extraArgs];\n\tconst workspaceId = getEnvValue(WORKSPACE_ENV_VARS);\n\tconst helperEndpoint = getEnvValue(HELPER_ENDPOINT_ENV_VARS);\n\tconst ipcRoot = getEnvValue(IPC_ROOT_ENV_VARS);\n\tconst sessionId = getEnvValue(SESSION_ID_ENV_VARS);\n\tconst turnId = getEnvValue(TURN_ID_ENV_VARS);\n\tconst toolProfile = resolveToolProfile();\n\n\tappendFlag(args, \"-tool-profile\", toolProfile);\n\tappendFlag(args, \"-workspace-id\", workspaceId);\n\tappendFlag(args, \"-helper-endpoint\", helperEndpoint);\n\tappendFlag(args, \"-ipc-root\", ipcRoot);\n\tappendFlag(args, \"-session-id\", sessionId);\n\tappendFlag(args, \"-turn-id\", turnId);\n\tif (envFlagEnabled(DISABLE_IPC_ENV_VARS)) {\n\t\targs.push(\"-disable-ipc\");\n\t}\n\n\tconst env = Object.fromEntries(\n\t\tObject.entries({\n\t\t\tFATHOM_CALLER_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_PRODUCT: \"maestro\",\n\t\t\tFATHOM_CUA_WORKSPACE_ID: workspaceId,\n\t\t\tFATHOM_IPC_ROOT: ipcRoot,\n\t\t}).filter((entry): entry is [string, string] => Boolean(entry[1])),\n\t);\n\n\treturn {\n\t\tname: getEnvValue(NAME_ENV_VARS) ?? DEFAULT_SERVER_NAME,\n\t\ttransport: \"stdio\",\n\t\tcommand,\n\t\targs,\n\t\tcwd,\n\t\tenv,\n\t\tscope: \"plugin\",\n\t};\n}\n\nexport function getFathomCuaPluginServers(): McpServerConfig[] {\n\tif (envFlagDisabled(ENABLED_ENV_VARS) || !envFlagEnabled(ENABLED_ENV_VARS)) {\n\t\treturn [];\n\t}\n\treturn [buildFathomCuaServer()];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/mcp/manager.ts"],"names":[],"mappings":"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"}
@@ -50,6 +50,7 @@ import { getHomeDir } from "../utils/path-expansion.js";
50
50
  import { buildMcpElicitationToolCallId, getCurrentMcpClientToolService, normalizeMcpElicitationArgs, parseMcpElicitationClientToolResult, } from "./elicitation.js";
51
51
  import { getMcpRemoteHost, getOfficialMcpRegistryMatch, } from "./official-registry.js";
52
52
  import { getProjectMcpServerApprovalStatus } from "./project-approvals.js";
53
+ import { classifyToolCapability, summarizeToolCapabilities, } from "./tool-capabilities.js";
53
54
  import { ensureMcpWorkspaceTrusted } from "./workspace-trust.js";
54
55
  const logger = createLogger("mcp:manager");
55
56
  const execFileAsync = promisify(execFile);
@@ -155,6 +156,24 @@ function summarizeServerParallelSafety(config, connected) {
155
156
  : {}),
156
157
  };
157
158
  }
159
+ function toolsWithCapabilityStatus(serverName, tools, parallelSafetyByTool) {
160
+ return tools.map((tool) => ({
161
+ ...tool,
162
+ capability: classifyToolCapability({
163
+ server: serverName,
164
+ toolName: tool.name,
165
+ annotations: capabilityAnnotations(tool, parallelSafetyByTool?.get(tool.name)),
166
+ }),
167
+ }));
168
+ }
169
+ function capabilityAnnotations(tool, parallelSafety) {
170
+ const annotations = asRecord(tool.annotations);
171
+ if (parallelSafety?.readOnlyHint !== true ||
172
+ annotations?.readOnlyHint !== undefined) {
173
+ return annotations;
174
+ }
175
+ return { ...annotations, readOnlyHint: true };
176
+ }
158
177
  function arraysEqual(left, right) {
159
178
  if (left === right) {
160
179
  return true;
@@ -572,6 +591,9 @@ export class McpClientManager extends EventEmitter {
572
591
  serverCapabilities,
573
592
  tools,
574
593
  });
594
+ const toolCapabilitySummary = summarizeToolCapabilities(toolsWithCapabilityStatus(name, tools, parallelSafetyByTool)
595
+ .map((tool) => tool.capability)
596
+ .filter((capability) => capability !== undefined));
575
597
  this.servers.set(name, {
576
598
  config,
577
599
  client,
@@ -595,6 +617,7 @@ export class McpClientManager extends EventEmitter {
595
617
  toolCount: tools.length,
596
618
  resourceCount: resources.length,
597
619
  promptCount: prompts.length,
620
+ toolCapabilitySummary,
598
621
  isReconnect,
599
622
  clientVersion: getPackageVersion(),
600
623
  }).catch(() => undefined);
@@ -884,6 +907,9 @@ export class McpClientManager extends EventEmitter {
884
907
  // Include configured but not connected servers
885
908
  for (const config of this.config.servers) {
886
909
  const connected = this.servers.get(config.name);
910
+ const tools = connected
911
+ ? toolsWithCapabilityStatus(config.name, connected.tools, connected.parallelSafetyByTool)
912
+ : [];
887
913
  const projectApproval = approvalMap.get(config.name);
888
914
  const resolvedAuth = resolveRemoteAuthConfig(config, authPresetMap);
889
915
  const remoteUrl = config.transport === "http" || config.transport === "sse"
@@ -901,7 +927,12 @@ export class McpClientManager extends EventEmitter {
901
927
  : this.lastErrors.get(config.name),
902
928
  scope: config.scope,
903
929
  transport: config.transport,
904
- tools: connected?.tools ?? [],
930
+ tools,
931
+ toolCapabilitySummary: tools.length > 0
932
+ ? summarizeToolCapabilities(tools
933
+ .map((tool) => tool.capability)
934
+ .filter((capability) => capability !== undefined))
935
+ : undefined,
905
936
  resources: connected?.resources ?? [],
906
937
  prompts: connected?.prompts ?? [],
907
938
  promptDetails: connected && connected.promptDetails.length > 0