@qduc/term2 0.24.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/dist/agent.d.ts +3 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +2 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/app.d.ts +10 -0
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js +33 -6
  8. package/dist/app.js.map +1 -1
  9. package/dist/cli.js +43 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/mcp-login-command.d.ts +24 -0
  12. package/dist/commands/mcp-login-command.d.ts.map +1 -0
  13. package/dist/commands/mcp-login-command.js +65 -0
  14. package/dist/commands/mcp-login-command.js.map +1 -0
  15. package/dist/commands/mcp-status-command.d.ts +19 -0
  16. package/dist/commands/mcp-status-command.d.ts.map +1 -0
  17. package/dist/commands/mcp-status-command.js +19 -0
  18. package/dist/commands/mcp-status-command.js.map +1 -0
  19. package/dist/components/input/ApplicationInputSurface.d.ts +4 -0
  20. package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
  21. package/dist/components/input/ApplicationInputSurface.js +2 -0
  22. package/dist/components/input/ApplicationInputSurface.js.map +1 -1
  23. package/dist/components/input/McpMenuSession.d.ts +9 -0
  24. package/dist/components/input/McpMenuSession.d.ts.map +1 -0
  25. package/dist/components/input/McpMenuSession.js +370 -0
  26. package/dist/components/input/McpMenuSession.js.map +1 -0
  27. package/dist/components/input/ProviderMenuSession.d.ts.map +1 -1
  28. package/dist/components/input/ProviderMenuSession.js +0 -4
  29. package/dist/components/input/ProviderMenuSession.js.map +1 -1
  30. package/dist/components/input/SubagentPoolMenuSession.d.ts.map +1 -1
  31. package/dist/components/input/SubagentPoolMenuSession.js +0 -9
  32. package/dist/components/input/SubagentPoolMenuSession.js.map +1 -1
  33. package/dist/components/input/mcp-intent-host.d.ts +10 -0
  34. package/dist/components/input/mcp-intent-host.d.ts.map +1 -0
  35. package/dist/components/input/mcp-intent-host.js +31 -0
  36. package/dist/components/input/mcp-intent-host.js.map +1 -0
  37. package/dist/components/input/menu-bindings.d.ts +69 -0
  38. package/dist/components/input/menu-bindings.d.ts.map +1 -0
  39. package/dist/components/input/menu-bindings.js +110 -0
  40. package/dist/components/input/menu-bindings.js.map +1 -0
  41. package/dist/components/input/menu-controller.d.ts.map +1 -1
  42. package/dist/components/input/menu-controller.js +8 -5
  43. package/dist/components/input/menu-controller.js.map +1 -1
  44. package/dist/components/input/menu-registry.d.ts.map +1 -1
  45. package/dist/components/input/menu-registry.js +2 -0
  46. package/dist/components/input/menu-registry.js.map +1 -1
  47. package/dist/components/input/menu-types.d.ts +22 -7
  48. package/dist/components/input/menu-types.d.ts.map +1 -1
  49. package/dist/components/layout/BackgroundTasksPanel.d.ts +6 -0
  50. package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
  51. package/dist/components/layout/BackgroundTasksPanel.js +58 -64
  52. package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
  53. package/dist/components/layout/BottomArea.d.ts +6 -1
  54. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  55. package/dist/components/layout/BottomArea.js +9 -6
  56. package/dist/components/layout/BottomArea.js.map +1 -1
  57. package/dist/components/layout/StatusBar.d.ts.map +1 -1
  58. package/dist/components/layout/StatusBar.js +27 -18
  59. package/dist/components/layout/StatusBar.js.map +1 -1
  60. package/dist/components/menu/McpSelectionMenu.d.ts +15 -0
  61. package/dist/components/menu/McpSelectionMenu.d.ts.map +1 -0
  62. package/dist/components/menu/McpSelectionMenu.js +19 -0
  63. package/dist/components/menu/McpSelectionMenu.js.map +1 -0
  64. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  65. package/dist/components/menu/ModelSelectionMenu.js +16 -26
  66. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  67. package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
  68. package/dist/components/menu/ProviderSelectionMenu.js +8 -15
  69. package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
  70. package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -1
  71. package/dist/components/menu/SlashCommandMenu.js +2 -5
  72. package/dist/components/menu/SlashCommandMenu.js.map +1 -1
  73. package/dist/components/menu/SubagentPoolSelectionMenu.d.ts.map +1 -1
  74. package/dist/components/menu/SubagentPoolSelectionMenu.js +6 -11
  75. package/dist/components/menu/SubagentPoolSelectionMenu.js.map +1 -1
  76. package/dist/components/message/command-message-helpers.d.ts +2 -2
  77. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  78. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  79. package/dist/components/prompt/ApprovalPrompt.js +3 -0
  80. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  81. package/dist/contracts/conversation.d.ts +2 -0
  82. package/dist/contracts/conversation.d.ts.map +1 -1
  83. package/dist/contracts/conversation.js.map +1 -1
  84. package/dist/gateway/settings-rpc.d.ts +1 -0
  85. package/dist/gateway/settings-rpc.d.ts.map +1 -1
  86. package/dist/gateway/settings-rpc.js +1 -0
  87. package/dist/gateway/settings-rpc.js.map +1 -1
  88. package/dist/hooks/conversation-ui-reducer.d.ts +1 -1
  89. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  90. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  91. package/dist/hooks/settings-completion-config.js +2 -1
  92. package/dist/hooks/settings-completion-config.js.map +1 -1
  93. package/dist/hooks/use-app-commands.d.ts +9 -1
  94. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  95. package/dist/hooks/use-app-commands.js +14 -1
  96. package/dist/hooks/use-app-commands.js.map +1 -1
  97. package/dist/hooks/use-conversation.d.ts +1 -1
  98. package/dist/hooks/use-mcp-notices.d.ts +10 -0
  99. package/dist/hooks/use-mcp-notices.d.ts.map +1 -0
  100. package/dist/hooks/use-mcp-notices.js +47 -0
  101. package/dist/hooks/use-mcp-notices.js.map +1 -0
  102. package/dist/hooks/use-provider-selection.d.ts +1 -7
  103. package/dist/hooks/use-provider-selection.d.ts.map +1 -1
  104. package/dist/hooks/use-provider-selection.js +34 -87
  105. package/dist/hooks/use-provider-selection.js.map +1 -1
  106. package/dist/hooks/use-settings-value-completion.d.ts +3 -2
  107. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  108. package/dist/hooks/use-settings-value-completion.js +21 -3
  109. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  110. package/dist/hooks/use-shell-mode.d.ts +1 -0
  111. package/dist/hooks/use-shell-mode.d.ts.map +1 -1
  112. package/dist/hooks/use-shell-mode.js +1 -0
  113. package/dist/hooks/use-shell-mode.js.map +1 -1
  114. package/dist/hooks/use-subagent-pool-selection.d.ts +2 -10
  115. package/dist/hooks/use-subagent-pool-selection.d.ts.map +1 -1
  116. package/dist/hooks/use-subagent-pool-selection.js +5 -62
  117. package/dist/hooks/use-subagent-pool-selection.js.map +1 -1
  118. package/dist/lib/agent-client.d.ts +1 -0
  119. package/dist/lib/agent-client.d.ts.map +1 -1
  120. package/dist/lib/agent-client.js +2 -0
  121. package/dist/lib/agent-client.js.map +1 -1
  122. package/dist/lib/agent-configuration.d.ts +4 -0
  123. package/dist/lib/agent-configuration.d.ts.map +1 -1
  124. package/dist/lib/agent-configuration.js +8 -0
  125. package/dist/lib/agent-configuration.js.map +1 -1
  126. package/dist/lib/agent-factory.d.ts +2 -0
  127. package/dist/lib/agent-factory.d.ts.map +1 -1
  128. package/dist/lib/agent-factory.js +1 -0
  129. package/dist/lib/agent-factory.js.map +1 -1
  130. package/dist/lib/oauth-loopback.d.ts +79 -0
  131. package/dist/lib/oauth-loopback.d.ts.map +1 -0
  132. package/dist/lib/oauth-loopback.js +221 -0
  133. package/dist/lib/oauth-loopback.js.map +1 -0
  134. package/dist/non-interactive.d.ts +2 -0
  135. package/dist/non-interactive.d.ts.map +1 -1
  136. package/dist/non-interactive.js +19 -0
  137. package/dist/non-interactive.js.map +1 -1
  138. package/dist/providers/codex.provider.d.ts.map +1 -1
  139. package/dist/providers/codex.provider.js +4 -3
  140. package/dist/providers/codex.provider.js.map +1 -1
  141. package/dist/providers/index.d.ts +1 -1
  142. package/dist/providers/index.d.ts.map +1 -1
  143. package/dist/providers/index.js +1 -1
  144. package/dist/providers/index.js.map +1 -1
  145. package/dist/providers/oauth-pkce.d.ts +5 -1
  146. package/dist/providers/oauth-pkce.d.ts.map +1 -1
  147. package/dist/providers/oauth-pkce.js +28 -208
  148. package/dist/providers/oauth-pkce.js.map +1 -1
  149. package/dist/providers/openai-responses-model.d.ts.map +1 -1
  150. package/dist/providers/openai-responses-model.js +5 -1
  151. package/dist/providers/openai-responses-model.js.map +1 -1
  152. package/dist/providers/openrouter-decisions.d.ts +15 -0
  153. package/dist/providers/openrouter-decisions.d.ts.map +1 -0
  154. package/dist/providers/openrouter-decisions.js +25 -0
  155. package/dist/providers/openrouter-decisions.js.map +1 -0
  156. package/dist/providers/provider-service.d.ts +3 -1
  157. package/dist/providers/provider-service.d.ts.map +1 -1
  158. package/dist/providers/provider-service.js +4 -1
  159. package/dist/providers/provider-service.js.map +1 -1
  160. package/dist/providers/registry.d.ts +0 -6
  161. package/dist/providers/registry.d.ts.map +1 -1
  162. package/dist/providers/registry.js +0 -25
  163. package/dist/providers/registry.js.map +1 -1
  164. package/dist/services/approval/decision-shadow.d.ts +15 -0
  165. package/dist/services/approval/decision-shadow.d.ts.map +1 -0
  166. package/dist/services/approval/decision-shadow.js +77 -0
  167. package/dist/services/approval/decision-shadow.js.map +1 -0
  168. package/dist/services/approval/non-interactive-approval-policy.d.ts +5 -0
  169. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -1
  170. package/dist/services/approval/non-interactive-approval-policy.js +14 -0
  171. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  172. package/dist/services/approval/shell-auto-approval-evaluator.d.ts +5 -1
  173. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  174. package/dist/services/approval/shell-auto-approval-evaluator.js +80 -4
  175. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  176. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  177. package/dist/services/conversation/conversation-orchestrator.js +16 -2
  178. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  179. package/dist/services/conversation/conversation-orchestrator.types.d.ts +1 -1
  180. package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
  181. package/dist/services/conversation/session-browser.d.ts +4 -2
  182. package/dist/services/conversation/session-browser.d.ts.map +1 -1
  183. package/dist/services/conversation/session-browser.js +17 -6
  184. package/dist/services/conversation/session-browser.js.map +1 -1
  185. package/dist/services/conversation/session-index/session-index-database.d.ts.map +1 -1
  186. package/dist/services/conversation/session-index/session-index-database.js +24 -6
  187. package/dist/services/conversation/session-index/session-index-database.js.map +1 -1
  188. package/dist/services/mcp/mcp-config-controller.d.ts +32 -0
  189. package/dist/services/mcp/mcp-config-controller.d.ts.map +1 -0
  190. package/dist/services/mcp/mcp-config-controller.js +89 -0
  191. package/dist/services/mcp/mcp-config-controller.js.map +1 -0
  192. package/dist/services/mcp/mcp-config.d.ts +61 -0
  193. package/dist/services/mcp/mcp-config.d.ts.map +1 -0
  194. package/dist/services/mcp/mcp-config.js +232 -0
  195. package/dist/services/mcp/mcp-config.js.map +1 -0
  196. package/dist/services/mcp/mcp-connection-manager.d.ts +126 -0
  197. package/dist/services/mcp/mcp-connection-manager.d.ts.map +1 -0
  198. package/dist/services/mcp/mcp-connection-manager.js +488 -0
  199. package/dist/services/mcp/mcp-connection-manager.js.map +1 -0
  200. package/dist/services/mcp/mcp-oauth-login.d.ts +79 -0
  201. package/dist/services/mcp/mcp-oauth-login.d.ts.map +1 -0
  202. package/dist/services/mcp/mcp-oauth-login.js +126 -0
  203. package/dist/services/mcp/mcp-oauth-login.js.map +1 -0
  204. package/dist/services/mcp/mcp-oauth-provider.d.ts +77 -0
  205. package/dist/services/mcp/mcp-oauth-provider.d.ts.map +1 -0
  206. package/dist/services/mcp/mcp-oauth-provider.js +121 -0
  207. package/dist/services/mcp/mcp-oauth-provider.js.map +1 -0
  208. package/dist/services/mcp/mcp-oauth-store.d.ts +106 -0
  209. package/dist/services/mcp/mcp-oauth-store.d.ts.map +1 -0
  210. package/dist/services/mcp/mcp-oauth-store.js +278 -0
  211. package/dist/services/mcp/mcp-oauth-store.js.map +1 -0
  212. package/dist/services/mcp/mcp-status.d.ts +41 -0
  213. package/dist/services/mcp/mcp-status.d.ts.map +1 -0
  214. package/dist/services/mcp/mcp-status.js +69 -0
  215. package/dist/services/mcp/mcp-status.js.map +1 -0
  216. package/dist/services/mcp/mcp-stdio-launcher.d.ts +26 -0
  217. package/dist/services/mcp/mcp-stdio-launcher.d.ts.map +1 -0
  218. package/dist/services/mcp/mcp-stdio-launcher.js +8 -0
  219. package/dist/services/mcp/mcp-stdio-launcher.js.map +1 -0
  220. package/dist/services/mcp/mcp-tool-source.d.ts +77 -0
  221. package/dist/services/mcp/mcp-tool-source.d.ts.map +1 -0
  222. package/dist/services/mcp/mcp-tool-source.js +10 -0
  223. package/dist/services/mcp/mcp-tool-source.js.map +1 -0
  224. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts +25 -0
  225. package/dist/services/mcp/test-fixtures/fake-authorization-server.d.ts.map +1 -0
  226. package/dist/services/mcp/test-fixtures/fake-authorization-server.js +147 -0
  227. package/dist/services/mcp/test-fixtures/fake-authorization-server.js.map +1 -0
  228. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts +29 -0
  229. package/dist/services/mcp/test-fixtures/protected-mcp-server.d.ts.map +1 -0
  230. package/dist/services/mcp/test-fixtures/protected-mcp-server.js +87 -0
  231. package/dist/services/mcp/test-fixtures/protected-mcp-server.js.map +1 -0
  232. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts +19 -0
  233. package/dist/services/mcp/turn-stable-mcp-tool-source.d.ts.map +1 -0
  234. package/dist/services/mcp/turn-stable-mcp-tool-source.js +37 -0
  235. package/dist/services/mcp/turn-stable-mcp-tool-source.js.map +1 -0
  236. package/dist/services/models/decision-model-listing.d.ts +26 -0
  237. package/dist/services/models/decision-model-listing.d.ts.map +1 -0
  238. package/dist/services/models/decision-model-listing.js +61 -0
  239. package/dist/services/models/decision-model-listing.js.map +1 -0
  240. package/dist/services/models/model-catalog-session.d.ts +6 -1
  241. package/dist/services/models/model-catalog-session.d.ts.map +1 -1
  242. package/dist/services/models/model-catalog-session.js +9 -8
  243. package/dist/services/models/model-catalog-session.js.map +1 -1
  244. package/dist/services/profiles/registry.d.ts +1 -1
  245. package/dist/services/profiles/registry.d.ts.map +1 -1
  246. package/dist/services/profiles/registry.js +2 -1
  247. package/dist/services/profiles/registry.js.map +1 -1
  248. package/dist/services/providers/provider-management-session.d.ts +0 -1
  249. package/dist/services/providers/provider-management-session.d.ts.map +1 -1
  250. package/dist/services/providers/provider-management-session.js +0 -3
  251. package/dist/services/providers/provider-management-session.js.map +1 -1
  252. package/dist/services/settings/settings-merger.d.ts.map +1 -1
  253. package/dist/services/settings/settings-merger.js +0 -2
  254. package/dist/services/settings/settings-merger.js.map +1 -1
  255. package/dist/services/settings/settings-schema.d.ts +8 -3
  256. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  257. package/dist/services/settings/settings-schema.js +16 -8
  258. package/dist/services/settings/settings-schema.js.map +1 -1
  259. package/dist/services/settings/settings-sources.d.ts +2 -0
  260. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  261. package/dist/services/settings/settings-sources.js +2 -0
  262. package/dist/services/settings/settings-sources.js.map +1 -1
  263. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
  264. package/dist/services/settings/settings-ui-metadata.js +0 -1
  265. package/dist/services/settings/settings-ui-metadata.js.map +1 -1
  266. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +2 -2
  267. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  268. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +2 -1
  269. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  270. package/dist/services/shell/shell-interaction-session.d.ts +2 -0
  271. package/dist/services/shell/shell-interaction-session.d.ts.map +1 -1
  272. package/dist/services/shell/shell-interaction-session.js +11 -2
  273. package/dist/services/shell/shell-interaction-session.js.map +1 -1
  274. package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
  275. package/dist/services/subagents/mentor-runner.js +6 -8
  276. package/dist/services/subagents/mentor-runner.js.map +1 -1
  277. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  278. package/dist/tools/memory/memory-tools.d.ts.map +1 -1
  279. package/dist/tools/memory/memory-tools.js +3 -1
  280. package/dist/tools/memory/memory-tools.js.map +1 -1
  281. package/dist/tools/session-browser/session-browser-tools.d.ts +1 -1
  282. package/dist/tools/session-browser/session-browser-tools.d.ts.map +1 -1
  283. package/dist/tools/session-browser/session-browser-tools.js +4 -3
  284. package/dist/tools/session-browser/session-browser-tools.js.map +1 -1
  285. package/dist/tools/system/run-code/mcp-script-surface.d.ts +28 -0
  286. package/dist/tools/system/run-code/mcp-script-surface.d.ts.map +1 -0
  287. package/dist/tools/system/run-code/mcp-script-surface.js +165 -0
  288. package/dist/tools/system/run-code/mcp-script-surface.js.map +1 -0
  289. package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
  290. package/dist/tools/system/run-code/run-code-runtime.js +13 -1
  291. package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
  292. package/dist/tools/system/run-code/run-code.d.ts +3 -0
  293. package/dist/tools/system/run-code/run-code.d.ts.map +1 -1
  294. package/dist/tools/system/run-code/run-code.js +32 -4
  295. package/dist/tools/system/run-code/run-code.js.map +1 -1
  296. package/dist/utils/ai/provider-credentials.d.ts +8 -0
  297. package/dist/utils/ai/provider-credentials.d.ts.map +1 -1
  298. package/dist/utils/ai/provider-credentials.js +18 -0
  299. package/dist/utils/ai/provider-credentials.js.map +1 -1
  300. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  301. package/dist/utils/conversation/conversation-utils.d.ts +1 -5
  302. package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
  303. package/dist/utils/conversation/conversation-utils.js +4 -1
  304. package/dist/utils/conversation/conversation-utils.js.map +1 -1
  305. package/dist/utils/value-suggestions.d.ts +14 -0
  306. package/dist/utils/value-suggestions.d.ts.map +1 -1
  307. package/dist/utils/value-suggestions.js +31 -0
  308. package/dist/utils/value-suggestions.js.map +1 -1
  309. package/package.json +3 -1
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Config loading for MCP servers (plan Decision 4 + the M1-connection brief).
3
+ *
4
+ * Sources: user `mcp.json` next to term2's settings directory and project
5
+ * `<workspace root>/.mcp.json`. A user entry wins over a clashing project
6
+ * entry; `${VAR}` expansion runs against the process environment for user
7
+ * config only, so a repository can never route a secret to a URL it chose.
8
+ * Invalid entries resolve to config errors — the connection manager turns
9
+ * those into `failed` snapshots — so one bad line never blocks startup.
10
+ */
11
+ import { realpathSync } from 'node:fs';
12
+ import { readFile } from 'node:fs/promises';
13
+ import { isAbsolute, join, resolve } from 'node:path';
14
+ import { getActiveWorkspaceRoot } from '../workspace/active-workspace-root.js';
15
+ import { resolveSettingsDirectory } from '../settings/settings-path.js';
16
+ const USER_CONFIG_FILE_NAME = 'mcp.json';
17
+ const PROJECT_CONFIG_FILE_NAME = '.mcp.json';
18
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
19
+ const ENV_PATTERN = /\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
20
+ const expandValue = (value, env) => value.replace(ENV_PATTERN, (_whole, name) => env[name] ?? '');
21
+ /** Relative cwd paths run against the config file's context, never term2's process cwd. */
22
+ const resolveCwd = (cwd, cwdBase) => (isAbsolute(cwd) ? cwd : resolve(cwdBase, cwd));
23
+ const asStringRecord = (value) => {
24
+ if (!isRecord(value))
25
+ return undefined;
26
+ const out = {};
27
+ for (const [k, v] of Object.entries(value)) {
28
+ if (typeof v !== 'string')
29
+ return undefined;
30
+ out[k] = v;
31
+ }
32
+ return out;
33
+ };
34
+ const EMPTY_SOURCE = { entries: new Map(), projectOverrides: new Map(), nonInteractiveAllow: [] };
35
+ /** Canonical form for opt-in matching; falls back to the input when the path does not exist. */
36
+ export const realpathOrSelf = (path) => {
37
+ try {
38
+ return realpathSync(path);
39
+ }
40
+ catch {
41
+ return path;
42
+ }
43
+ };
44
+ const parseSourceFile = (sourceName, contents, note) => {
45
+ let root;
46
+ try {
47
+ root = JSON.parse(contents);
48
+ }
49
+ catch (error) {
50
+ note(`${sourceName} is not valid JSON and was ignored: ${error.message}`);
51
+ return EMPTY_SOURCE;
52
+ }
53
+ if (!isRecord(root)) {
54
+ note(`${sourceName} is not a JSON object and was ignored.`);
55
+ return EMPTY_SOURCE;
56
+ }
57
+ const entries = new Map();
58
+ const rawServers = root.mcpServers;
59
+ if (rawServers !== undefined) {
60
+ if (!isRecord(rawServers)) {
61
+ note(`${sourceName}: "mcpServers" is not an object and was ignored.`);
62
+ }
63
+ else {
64
+ for (const [name, entry] of Object.entries(rawServers))
65
+ entries.set(name, entry);
66
+ }
67
+ }
68
+ const projectOverrides = new Map();
69
+ const nonInteractiveAllow = Array.isArray(root.nonInteractiveAllow)
70
+ ? root.nonInteractiveAllow.filter((value) => typeof value === 'string')
71
+ : [];
72
+ const rawOverrides = root.projectServers;
73
+ if (rawOverrides !== undefined) {
74
+ if (!isRecord(rawOverrides)) {
75
+ note(`${sourceName}: "projectServers" is not an object and was ignored.`);
76
+ }
77
+ else {
78
+ for (const [rootPath, servers] of Object.entries(rawOverrides)) {
79
+ // Keys are workspace roots: relative paths must never be resolved
80
+ // against term2's process cwd, so they are ignored with a note.
81
+ if (!isAbsolute(rootPath)) {
82
+ note(`${sourceName}: "projectServers.${rootPath}" is not an absolute path and was ignored.`);
83
+ continue;
84
+ }
85
+ if (!isRecord(servers)) {
86
+ note(`${sourceName}: "projectServers.${rootPath}" is not an object and was ignored.`);
87
+ continue;
88
+ }
89
+ const byName = new Map();
90
+ for (const [name, value] of Object.entries(servers)) {
91
+ if (isRecord(value) && typeof value.enabled === 'boolean') {
92
+ byName.set(name, { enabled: value.enabled });
93
+ }
94
+ }
95
+ projectOverrides.set(rootPath, byName);
96
+ }
97
+ }
98
+ }
99
+ return { entries, projectOverrides, nonInteractiveAllow };
100
+ };
101
+ const resolveEntry = (name, provenance, entry, env,
102
+ /** User config expands `${VAR}`; project config is literal. */
103
+ expandVariables, projectEnabledOverride,
104
+ /** Relative `cwd` resolves against this: the config file's workspace (project) or settings dir (user). */
105
+ cwdBase) => {
106
+ const fail = (error) => ({
107
+ name,
108
+ provenance,
109
+ // Nothing is inferable when the entry itself is malformed; the manager
110
+ // never launches an errored entry, so this placeholder is inert.
111
+ transport: 'stdio',
112
+ projectEnabledOverride,
113
+ error,
114
+ });
115
+ if (!isRecord(entry))
116
+ return fail('entry is not an object');
117
+ const rawType = entry.type;
118
+ if (rawType !== undefined && rawType !== 'stdio' && rawType !== 'http' && rawType !== 'sse') {
119
+ return fail(`unknown type ${JSON.stringify(rawType)} (expected stdio, http, or sse)`);
120
+ }
121
+ const rawCommand = entry.command;
122
+ const rawUrl = entry.url;
123
+ if (rawCommand !== undefined && typeof rawCommand !== 'string')
124
+ return fail('command must be a string');
125
+ if (rawUrl !== undefined && typeof rawUrl !== 'string')
126
+ return fail('url must be a string');
127
+ let type = rawType;
128
+ if (type === undefined)
129
+ type = rawCommand !== undefined ? 'stdio' : rawUrl !== undefined ? 'http' : undefined;
130
+ if (type === undefined)
131
+ return fail('needs a command (stdio) or a url (http/sse)');
132
+ if (type === 'stdio' && rawCommand === undefined)
133
+ return fail('type "stdio" requires a command');
134
+ if (type !== 'stdio' && rawUrl === undefined)
135
+ return fail(`type "${type}" requires a url`);
136
+ const rawArgs = entry.args;
137
+ if (rawArgs !== undefined && (!Array.isArray(rawArgs) || rawArgs.some((a) => typeof a !== 'string'))) {
138
+ return fail('args must be an array of strings');
139
+ }
140
+ const rawEnv = asStringRecord(entry.env);
141
+ if (entry.env !== undefined && rawEnv === undefined)
142
+ return fail('env must be an object of strings');
143
+ const rawHeaders = asStringRecord(entry.headers);
144
+ if (entry.headers !== undefined && rawHeaders === undefined)
145
+ return fail('headers must be an object of strings');
146
+ const rawCwd = entry.cwd;
147
+ if (rawCwd !== undefined && typeof rawCwd !== 'string')
148
+ return fail('cwd must be a string');
149
+ const rawClientId = entry.clientId;
150
+ if (rawClientId !== undefined && typeof rawClientId !== 'string')
151
+ return fail('clientId must be a string');
152
+ const rawClientMetadataUrl = entry.clientMetadataUrl;
153
+ if (rawClientMetadataUrl !== undefined && typeof rawClientMetadataUrl !== 'string') {
154
+ return fail('clientMetadataUrl must be a string');
155
+ }
156
+ const rawRedirectPorts = entry.redirectPorts;
157
+ if (rawRedirectPorts !== undefined &&
158
+ (!Array.isArray(rawRedirectPorts) ||
159
+ rawRedirectPorts.some((p) => typeof p !== 'number' || !Number.isInteger(p) || p < 1 || p > 65535))) {
160
+ return fail('redirectPorts must be an array of port numbers');
161
+ }
162
+ const expandArg = (value) => (expandVariables ? expandValue(value, env) : value);
163
+ const transport = type === 'http' ? 'streamable-http' : type;
164
+ return {
165
+ name,
166
+ provenance,
167
+ transport,
168
+ ...(rawCommand !== undefined ? { command: expandArg(rawCommand) } : {}),
169
+ ...(rawArgs !== undefined ? { args: rawArgs.map(expandArg) } : {}),
170
+ ...(rawEnv !== undefined
171
+ ? { env: Object.fromEntries(Object.entries(rawEnv).map(([k, v]) => [k, expandArg(v)])) }
172
+ : {}),
173
+ ...(rawCwd !== undefined ? { cwd: resolveCwd(expandArg(rawCwd), cwdBase) } : {}),
174
+ ...(rawUrl !== undefined ? { url: expandArg(rawUrl) } : {}),
175
+ ...(rawHeaders !== undefined
176
+ ? { headers: Object.fromEntries(Object.entries(rawHeaders).map(([k, v]) => [k, expandArg(v)])) }
177
+ : {}),
178
+ ...(rawClientMetadataUrl !== undefined ? { clientMetadataUrl: expandArg(rawClientMetadataUrl) } : {}),
179
+ ...(rawClientId !== undefined ? { clientId: expandArg(rawClientId) } : {}),
180
+ ...(rawRedirectPorts !== undefined ? { redirectPorts: rawRedirectPorts } : {}),
181
+ projectEnabledOverride,
182
+ };
183
+ };
184
+ export async function loadMcpConfig(options = {}) {
185
+ const notes = [];
186
+ const note = (message) => {
187
+ notes.push(message);
188
+ options.onNote?.(message);
189
+ };
190
+ const read = options.files ?? ((path) => readFile(path, 'utf8'));
191
+ const env = options.env ?? process.env;
192
+ const settingsDir = options.settingsDir ?? resolveSettingsDirectory();
193
+ const workspaceRoot = options.workspaceRoot ?? getActiveWorkspaceRoot();
194
+ const userConfigPath = join(settingsDir, USER_CONFIG_FILE_NAME);
195
+ const projectConfigPath = join(workspaceRoot, PROJECT_CONFIG_FILE_NAME);
196
+ const loadSource = async (path, sourceName) => {
197
+ let contents;
198
+ try {
199
+ contents = await read(path);
200
+ }
201
+ catch (error) {
202
+ if (error.code === 'ENOENT')
203
+ return EMPTY_SOURCE;
204
+ note(`${sourceName} could not be read and was ignored: ${error.message}`);
205
+ return EMPTY_SOURCE;
206
+ }
207
+ return parseSourceFile(sourceName, contents, note);
208
+ };
209
+ const user = await loadSource(userConfigPath, userConfigPath);
210
+ const project = await loadSource(projectConfigPath, projectConfigPath);
211
+ // Opt-in matching compares the real path of the workspace with the real path
212
+ // of each projectServers key, so a symlinked session root still matches.
213
+ const workspaceKey = realpathOrSelf(workspaceRoot);
214
+ const servers = [];
215
+ for (const [name, entry] of user.entries) {
216
+ servers.push(resolveEntry(name, 'user', entry, env, true, undefined, settingsDir));
217
+ }
218
+ for (const [name, entry] of project.entries) {
219
+ if (user.entries.has(name)) {
220
+ note(`project server "${name}" from ${projectConfigPath} was dropped: a user entry with the same name wins.`);
221
+ continue;
222
+ }
223
+ let projectEnabledOverride;
224
+ for (const [rootPath, byName] of user.projectOverrides) {
225
+ if (realpathOrSelf(rootPath) === workspaceKey)
226
+ projectEnabledOverride = byName.get(name)?.enabled;
227
+ }
228
+ servers.push(resolveEntry(name, 'project', entry, env, false, projectEnabledOverride, workspaceRoot));
229
+ }
230
+ return { servers, notes, userConfigPath, nonInteractiveAllow: user.nonInteractiveAllow };
231
+ }
232
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../source/services/mcp/mcp-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGxE,MAAM,qBAAqB,GAAG,UAAU,CAAC;AACzC,MAAM,wBAAwB,GAAG,WAAW,CAAC;AAgE7C,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAqB,EAAE,CACrD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,MAAM,WAAW,GAAG,iCAAiC,CAAC;AAEtD,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,GAAsB,EAAU,EAAE,CACpE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAExE,2FAA2F;AAC3F,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,OAAe,EAAU,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAE7G,MAAM,cAAc,GAAG,CAAC,KAAc,EAAsC,EAAE;IAC5E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC5C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAgBF,MAAM,YAAY,GAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,gBAAgB,EAAE,IAAI,GAAG,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC;AAEhH,gGAAgG;AAChG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IACrD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,QAAgB,EAAE,IAAyB,EAAgB,EAAE;IACxG,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,GAAG,UAAU,uCAAwC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,UAAU,wCAAwC,CAAC,CAAC;QAC5D,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,UAAU,kDAAkD,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAqB,IAAI,GAAG,EAAE,CAAC;IACrD,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;QACxF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC;IACzC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,UAAU,sDAAsD,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/D,kEAAkE;gBAClE,gEAAgE;gBAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,UAAU,qBAAqB,QAAQ,4CAA4C,CAAC,CAAC;oBAC7F,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,UAAU,qBAAqB,QAAQ,qCAAqC,CAAC,CAAC;oBACtF,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;gBACrD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpD,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;wBAC1D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBACD,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CACnB,IAAY,EACZ,UAA+B,EAC/B,KAAc,EACd,GAAsB;AACtB,+DAA+D;AAC/D,eAAwB,EACxB,sBAA2C;AAC3C,0GAA0G;AAC1G,OAAe,EACU,EAAE;IAC3B,MAAM,IAAI,GAAG,CAAC,KAAa,EAA2B,EAAE,CAAC,CAAC;QACxD,IAAI;QACJ,UAAU;QACV,uEAAuE;QACvE,iEAAiE;QACjE,SAAS,EAAE,OAAO;QAClB,sBAAsB;QACtB,KAAK;KACN,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IACzB,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxG,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAE5F,IAAI,IAAI,GAAyC,OAA+C,CAAC;IACjG,IAAI,IAAI,KAAK,SAAS;QAAE,IAAI,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACnF,IAAI,IAAI,KAAK,OAAO,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjG,IAAI,IAAI,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;IAE3F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IACzB,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC5F,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC;IACnC,IAAI,WAAW,KAAK,SAAS,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3G,MAAM,oBAAoB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACrD,IAAI,oBAAoB,KAAK,SAAS,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC;IAC7C,IACE,gBAAgB,KAAK,SAAS;QAC9B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAC/B,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EACpG,CAAC;QACD,OAAO,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjG,MAAM,SAAS,GAAqB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,OAAO;QACL,IAAI;QACJ,UAAU;QACV,SAAS;QACT,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAG,OAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,MAAM,KAAK,SAAS;YACtB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACxF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,UAAU,KAAK,SAAS;YAC1B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YAChG,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrG,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,gBAA4B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,sBAAsB;KACvB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAO,GAAyB,EAAE;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,OAAe,EAAQ,EAAE;QACrC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,wBAAwB,EAAE,CAAC;IACtE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,sBAAsB,EAAE,CAAC;IACxE,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;IAExE,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,UAAkB,EAAyB,EAAE;QACnF,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,YAAY,CAAC;YAC5E,IAAI,CAAC,GAAG,UAAU,uCAAwC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,OAAO,eAAe,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAEvE,6EAA6E;IAC7E,yEAAyE;IACzE,MAAM,YAAY,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAEnD,MAAM,OAAO,GAA8B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,mBAAmB,IAAI,UAAU,iBAAiB,qDAAqD,CAAC,CAAC;YAC9G,SAAS;QACX,CAAC;QACD,IAAI,sBAA2C,CAAC;QAChD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvD,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,YAAY;gBAAE,sBAAsB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QACpG,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { McpCallError } from './mcp-tool-source.js';
2
+ import type { McpServerSnapshot, McpToolSource } from './mcp-tool-source.js';
3
+ export { McpCallError };
4
+ import { type ResolvedMcpServerConfig } from './mcp-config.js';
5
+ import { type StdioLauncher } from './mcp-stdio-launcher.js';
6
+ import type { McpOAuthStore } from './mcp-oauth-store.js';
7
+ export interface McpConnectionManagerOptions {
8
+ servers: readonly ResolvedMcpServerConfig[];
9
+ /** Path of the user config file, cited in the project-stdio opt-in error. */
10
+ userConfigPath?: string;
11
+ /** This session's workspace root, cited in the project-stdio opt-in error. */
12
+ workspaceRoot?: string;
13
+ /** Where stdio servers are actually spawned. Defaults to an unsandboxed spawn. */
14
+ stdioLauncher?: StdioLauncher;
15
+ /** Receives one notice per server that enters the failed state. */
16
+ onNotice?: (message: string) => void;
17
+ /**
18
+ * Credential storage for OAuth-protected HTTP servers. Without it no stored
19
+ * token is ever presented and such a server resolves to `needs-auth`.
20
+ */
21
+ oauthStore?: McpOAuthStore;
22
+ /**
23
+ * False in non-interactive runs, where no one can complete a browser login.
24
+ * A server needing one then resolves to `failed` with that reason, rather
25
+ * than to `needs-auth` naming a command that cannot be typed.
26
+ */
27
+ interactive?: boolean;
28
+ }
29
+ /** Everything `/mcp-login` needs to drive a flow for one configured server. */
30
+ export interface McpOAuthTarget {
31
+ readonly serverName: string;
32
+ readonly serverUrl: string;
33
+ readonly clientMetadataUrl?: string;
34
+ readonly clientId?: string;
35
+ readonly redirectPorts?: readonly number[];
36
+ }
37
+ export declare class McpConnectionManager implements McpToolSource {
38
+ private readonly connections;
39
+ private readonly listeners;
40
+ private readonly stdioLauncher;
41
+ private readonly userConfigPath?;
42
+ private readonly workspaceRoot?;
43
+ private readonly onNotice?;
44
+ private readonly oauthStore?;
45
+ private readonly interactive;
46
+ private readonly noticedFailures;
47
+ private snapshotCache;
48
+ private started;
49
+ private closed;
50
+ private settlePromise;
51
+ constructor(options: McpConnectionManagerOptions);
52
+ /** Begins connecting every server concurrently. Resolved configs never throw. */
53
+ start(): void;
54
+ /** Resolves once every connection started by `start()` left `connecting`. */
55
+ whenSettled(): Promise<void>;
56
+ snapshot(): readonly McpServerSnapshot[];
57
+ onCatalogChanged(listener: () => void): () => void;
58
+ callTool(server: string, tool: string, args: Record<string, unknown>, options: {
59
+ signal: AbortSignal;
60
+ timeoutMs?: number;
61
+ }): Promise<{
62
+ content: readonly unknown[];
63
+ structuredContent?: unknown;
64
+ isError: boolean;
65
+ }>;
66
+ close(): Promise<void>;
67
+ /** Reconciles edited config while preserving this stable tool-source object. */
68
+ replaceServers(configs: readonly ResolvedMcpServerConfig[]): Promise<void>;
69
+ /**
70
+ * Closes and clears this connection's client and transport, waiting for the
71
+ * closes to finish (bounded by the caller). Clearing first means a close()
72
+ * racing an in-flight connect can never double-close or re-await a torn-down
73
+ * client, and connectOne's post-await checks see the cleared state.
74
+ */
75
+ private teardown;
76
+ /** True once close() ran or this connection is being torn down. */
77
+ private isAbandoned;
78
+ private mapCallError;
79
+ private connectOne;
80
+ /**
81
+ * All three shapes mean the same thing: the server wants a credential this
82
+ * session does not have.
83
+ *
84
+ * The `SdkHttpError` case is not redundant — the transport only raises
85
+ * `UnauthorizedError` when an auth provider is attached, and one is attached
86
+ * only once a credential is stored. A server nobody has logged in to yet
87
+ * therefore reports its 401 as a plain HTTP error, which is precisely the
88
+ * case that must reach `needs-auth`.
89
+ */
90
+ private isAuthRequired;
91
+ /**
92
+ * Routes a server that asked for a login to the right resting state: an
93
+ * actionable `needs-auth` interactively, a `failed` that says why when no one
94
+ * can complete a browser flow (non-interactive) or when a project config is
95
+ * not allowed to start one (D2).
96
+ */
97
+ private markAuthRequired;
98
+ private connectStdio;
99
+ private connectHttp;
100
+ /**
101
+ * A provider that refreshes a stored credential but never starts a login, or
102
+ * `undefined` when there is nothing stored to refresh.
103
+ *
104
+ * D2: a project server that has not been opted in gets no provider at all, so
105
+ * a repository cannot cause even a discovery request to an issuer it chose.
106
+ */
107
+ private refreshOnlyAuthProvider;
108
+ /** Whether this server's config is allowed to hold or obtain OAuth credentials (D2). */
109
+ private oauthEligible;
110
+ /** The login details for a server, or undefined when it may not use OAuth. */
111
+ oauthTarget(name: string): McpOAuthTarget | undefined;
112
+ /**
113
+ * Re-runs one server's connection, used after `/mcp-login` stores a token.
114
+ *
115
+ * Clears the previous failure first so a re-entered failure is noticed (and
116
+ * announced) again rather than being swallowed as a duplicate.
117
+ */
118
+ reconnect(name: string): Promise<void>;
119
+ private connectClient;
120
+ private watchStdio;
121
+ private handleListChanged;
122
+ private refreshTools;
123
+ private markFailed;
124
+ private rebuildSnapshot;
125
+ }
126
+ //# sourceMappingURL=mcp-connection-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-connection-manager.d.ts","sourceRoot":"","sources":["../../../source/services/mcp/mcp-connection-manager.ts"],"names":[],"mappings":"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"}