@akon-labs/nexus-cli 0.1.9 → 0.1.11-rc.2

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 (369) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +1 -0
  3. package/README.md +3 -2
  4. package/dist/app-bridge.bundle.js +67 -0
  5. package/dist/cli/require-login.d.ts.map +1 -1
  6. package/dist/cli/require-login.js +2 -2
  7. package/dist/cli/require-login.js.map +1 -1
  8. package/dist/cli.js +20866 -1882
  9. package/dist/core/agent-session.d.ts +3 -1
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +5 -1
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/auto-model.d.ts +1 -1
  14. package/dist/core/auto-model.d.ts.map +1 -1
  15. package/dist/core/auto-model.js +1 -1
  16. package/dist/core/auto-model.js.map +1 -1
  17. package/dist/core/extensions/index.d.ts +1 -1
  18. package/dist/core/extensions/index.d.ts.map +1 -1
  19. package/dist/core/extensions/index.js.map +1 -1
  20. package/dist/core/extensions/loader.d.ts.map +1 -1
  21. package/dist/core/extensions/loader.js +6 -0
  22. package/dist/core/extensions/loader.js.map +1 -1
  23. package/dist/core/extensions/runner.d.ts +7 -1
  24. package/dist/core/extensions/runner.d.ts.map +1 -1
  25. package/dist/core/extensions/runner.js +14 -0
  26. package/dist/core/extensions/runner.js.map +1 -1
  27. package/dist/core/extensions/types.d.ts +18 -0
  28. package/dist/core/extensions/types.d.ts.map +1 -1
  29. package/dist/core/extensions/types.js.map +1 -1
  30. package/dist/core/model-resolver.d.ts +2 -2
  31. package/dist/core/model-resolver.d.ts.map +1 -1
  32. package/dist/core/model-resolver.js +3 -3
  33. package/dist/core/model-resolver.js.map +1 -1
  34. package/dist/core/package-manager.d.ts +15 -0
  35. package/dist/core/package-manager.d.ts.map +1 -1
  36. package/dist/core/package-manager.js +50 -0
  37. package/dist/core/package-manager.js.map +1 -1
  38. package/dist/core/sdk.d.ts.map +1 -1
  39. package/dist/core/sdk.js +1 -1
  40. package/dist/core/sdk.js.map +1 -1
  41. package/dist/core/slash-commands.d.ts.map +1 -1
  42. package/dist/core/slash-commands.js +3 -3
  43. package/dist/core/slash-commands.js.map +1 -1
  44. package/dist/core/system-prompt.d.ts.map +1 -1
  45. package/dist/core/system-prompt.js +1 -1
  46. package/dist/core/system-prompt.js.map +1 -1
  47. package/dist/core/tools/find.d.ts.map +1 -1
  48. package/dist/core/tools/find.js +1 -1
  49. package/dist/core/tools/find.js.map +1 -1
  50. package/dist/core/tools/grep.d.ts.map +1 -1
  51. package/dist/core/tools/grep.js +1 -1
  52. package/dist/core/tools/grep.js.map +1 -1
  53. package/dist/core/tools/index.d.ts +1 -1
  54. package/dist/core/tools/index.d.ts.map +1 -1
  55. package/dist/core/tools/index.js +5 -5
  56. package/dist/core/tools/index.js.map +1 -1
  57. package/dist/core/tools/websearch.d.ts.map +1 -1
  58. package/dist/core/tools/websearch.js +3 -3
  59. package/dist/core/tools/websearch.js.map +1 -1
  60. package/dist/extensions/gitnexus/config.d.ts +15 -1
  61. package/dist/extensions/gitnexus/config.d.ts.map +1 -1
  62. package/dist/extensions/gitnexus/config.js +86 -2
  63. package/dist/extensions/gitnexus/config.js.map +1 -1
  64. package/dist/extensions/gitnexus/gateway.d.ts +6 -6
  65. package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
  66. package/dist/extensions/gitnexus/gateway.js +4 -4
  67. package/dist/extensions/gitnexus/gateway.js.map +1 -1
  68. package/dist/extensions/gitnexus/index.d.ts.map +1 -1
  69. package/dist/extensions/gitnexus/index.js +6 -4
  70. package/dist/extensions/gitnexus/index.js.map +1 -1
  71. package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
  72. package/dist/extensions/gitnexus/observatory.js +2 -2
  73. package/dist/extensions/gitnexus/observatory.js.map +1 -1
  74. package/dist/extensions/index.d.ts.map +1 -1
  75. package/dist/extensions/index.js +3 -0
  76. package/dist/extensions/index.js.map +1 -1
  77. package/dist/extensions/mcp/abort.d.ts +3 -0
  78. package/dist/extensions/mcp/abort.d.ts.map +1 -0
  79. package/dist/extensions/mcp/abort.js +41 -0
  80. package/dist/extensions/mcp/abort.js.map +1 -0
  81. package/dist/extensions/mcp/agent-dir.d.ts +6 -0
  82. package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
  83. package/dist/extensions/mcp/agent-dir.js +18 -0
  84. package/dist/extensions/mcp/agent-dir.js.map +1 -0
  85. package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
  86. package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
  87. package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
  88. package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
  89. package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
  90. package/dist/extensions/mcp/commands.d.ts +47 -0
  91. package/dist/extensions/mcp/commands.d.ts.map +1 -0
  92. package/dist/extensions/mcp/commands.js +821 -0
  93. package/dist/extensions/mcp/commands.js.map +1 -0
  94. package/dist/extensions/mcp/config.d.ts +123 -38
  95. package/dist/extensions/mcp/config.d.ts.map +1 -1
  96. package/dist/extensions/mcp/config.js +1035 -70
  97. package/dist/extensions/mcp/config.js.map +1 -1
  98. package/dist/extensions/mcp/consent-manager.d.ts +14 -0
  99. package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
  100. package/dist/extensions/mcp/consent-manager.js +60 -0
  101. package/dist/extensions/mcp/consent-manager.js.map +1 -0
  102. package/dist/extensions/mcp/direct-tools.d.ts +11 -0
  103. package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
  104. package/dist/extensions/mcp/direct-tools.js +562 -0
  105. package/dist/extensions/mcp/direct-tools.js.map +1 -0
  106. package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
  107. package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
  108. package/dist/extensions/mcp/elicitation-handler.js +320 -0
  109. package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
  110. package/dist/extensions/mcp/error-signal.d.ts +16 -0
  111. package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
  112. package/dist/extensions/mcp/error-signal.js +22 -0
  113. package/dist/extensions/mcp/error-signal.js.map +1 -0
  114. package/dist/extensions/mcp/errors.d.ts +104 -0
  115. package/dist/extensions/mcp/errors.d.ts.map +1 -0
  116. package/dist/extensions/mcp/errors.js +171 -0
  117. package/dist/extensions/mcp/errors.js.map +1 -0
  118. package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
  119. package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
  120. package/dist/extensions/mcp/glimpse-ui.js +67 -0
  121. package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
  122. package/dist/extensions/mcp/host-html-template.d.ts +17 -0
  123. package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
  124. package/dist/extensions/mcp/host-html-template.js +442 -0
  125. package/dist/extensions/mcp/host-html-template.js.map +1 -0
  126. package/dist/extensions/mcp/index.d.ts +20 -15
  127. package/dist/extensions/mcp/index.d.ts.map +1 -1
  128. package/dist/extensions/mcp/index.js +1113 -82
  129. package/dist/extensions/mcp/index.js.map +1 -1
  130. package/dist/extensions/mcp/init.d.ts +28 -0
  131. package/dist/extensions/mcp/init.d.ts.map +1 -0
  132. package/dist/extensions/mcp/init.js +631 -0
  133. package/dist/extensions/mcp/init.js.map +1 -0
  134. package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
  135. package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
  136. package/dist/extensions/mcp/json-schema-validator.js +53 -0
  137. package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
  138. package/dist/extensions/mcp/lifecycle.d.ts +56 -0
  139. package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
  140. package/dist/extensions/mcp/lifecycle.js +395 -0
  141. package/dist/extensions/mcp/lifecycle.js.map +1 -0
  142. package/dist/extensions/mcp/logger.d.ts +52 -0
  143. package/dist/extensions/mcp/logger.d.ts.map +1 -0
  144. package/dist/extensions/mcp/logger.js +134 -0
  145. package/dist/extensions/mcp/logger.js.map +1 -0
  146. package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
  147. package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
  148. package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
  149. package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
  150. package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
  151. package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
  152. package/dist/extensions/mcp/mcp-auth.js +897 -0
  153. package/dist/extensions/mcp/mcp-auth.js.map +1 -0
  154. package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
  155. package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
  156. package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
  157. package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
  158. package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
  159. package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
  160. package/dist/extensions/mcp/mcp-callback-server.js +454 -0
  161. package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
  162. package/dist/extensions/mcp/mcp-code.d.ts +48 -0
  163. package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
  164. package/dist/extensions/mcp/mcp-code.js +358 -0
  165. package/dist/extensions/mcp/mcp-code.js.map +1 -0
  166. package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
  167. package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
  168. package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
  169. package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
  170. package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
  171. package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
  172. package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
  173. package/dist/extensions/mcp/mcp-output-guard.js +343 -0
  174. package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
  175. package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
  176. package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
  177. package/dist/extensions/mcp/mcp-panel.js +973 -0
  178. package/dist/extensions/mcp/mcp-panel.js.map +1 -0
  179. package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
  180. package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
  181. package/dist/extensions/mcp/mcp-probe.js +155 -0
  182. package/dist/extensions/mcp/mcp-probe.js.map +1 -0
  183. package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
  184. package/dist/extensions/mcp/mcp-setup-panel.d.ts +146 -0
  185. package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
  186. package/dist/extensions/mcp/mcp-setup-panel.js +1104 -0
  187. package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
  188. package/dist/extensions/mcp/mcp-status.d.ts +12 -0
  189. package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
  190. package/dist/extensions/mcp/mcp-status.js +98 -0
  191. package/dist/extensions/mcp/mcp-status.js.map +1 -0
  192. package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
  193. package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
  194. package/dist/extensions/mcp/mcp-trace.js +252 -0
  195. package/dist/extensions/mcp/mcp-trace.js.map +1 -0
  196. package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
  197. package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
  198. package/dist/extensions/mcp/metadata-cache.js +318 -0
  199. package/dist/extensions/mcp/metadata-cache.js.map +1 -0
  200. package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
  201. package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
  202. package/dist/extensions/mcp/npx-resolver.js +505 -0
  203. package/dist/extensions/mcp/npx-resolver.js.map +1 -0
  204. package/dist/extensions/mcp/oauth.d.ts +21 -0
  205. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  206. package/dist/extensions/mcp/oauth.js +15 -0
  207. package/dist/extensions/mcp/oauth.js.map +1 -0
  208. package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
  209. package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
  210. package/dist/extensions/mcp/onboarding-state.js +65 -0
  211. package/dist/extensions/mcp/onboarding-state.js.map +1 -0
  212. package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
  213. package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
  214. package/dist/extensions/mcp/package-mcp-loader.js +170 -0
  215. package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
  216. package/dist/extensions/mcp/panel-keys.d.ts +21 -0
  217. package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
  218. package/dist/extensions/mcp/panel-keys.js +29 -0
  219. package/dist/extensions/mcp/panel-keys.js.map +1 -0
  220. package/dist/extensions/mcp/prompts.d.ts +63 -0
  221. package/dist/extensions/mcp/prompts.d.ts.map +1 -0
  222. package/dist/extensions/mcp/prompts.js +297 -0
  223. package/dist/extensions/mcp/prompts.js.map +1 -0
  224. package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
  225. package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
  226. package/dist/extensions/mcp/proxy-modes.js +1421 -0
  227. package/dist/extensions/mcp/proxy-modes.js.map +1 -0
  228. package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
  229. package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
  230. package/dist/extensions/mcp/request-headers-command.js +334 -0
  231. package/dist/extensions/mcp/request-headers-command.js.map +1 -0
  232. package/dist/extensions/mcp/resource-tools.d.ts +2 -0
  233. package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
  234. package/dist/extensions/mcp/resource-tools.js +15 -0
  235. package/dist/extensions/mcp/resource-tools.js.map +1 -0
  236. package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
  237. package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
  238. package/dist/extensions/mcp/runtime-owner.js +84 -0
  239. package/dist/extensions/mcp/runtime-owner.js.map +1 -0
  240. package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
  241. package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
  242. package/dist/extensions/mcp/sampling-handler.js +229 -0
  243. package/dist/extensions/mcp/sampling-handler.js.map +1 -0
  244. package/dist/extensions/mcp/search-ranking.d.ts +25 -0
  245. package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
  246. package/dist/extensions/mcp/search-ranking.js +234 -0
  247. package/dist/extensions/mcp/search-ranking.js.map +1 -0
  248. package/dist/extensions/mcp/server-manager.d.ts +116 -0
  249. package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
  250. package/dist/extensions/mcp/server-manager.js +1052 -0
  251. package/dist/extensions/mcp/server-manager.js.map +1 -0
  252. package/dist/extensions/mcp/session-recovery.d.ts +27 -0
  253. package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
  254. package/dist/extensions/mcp/session-recovery.js +140 -0
  255. package/dist/extensions/mcp/session-recovery.js.map +1 -0
  256. package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
  257. package/dist/extensions/mcp/state.d.ts +62 -0
  258. package/dist/extensions/mcp/state.d.ts.map +1 -0
  259. package/dist/extensions/mcp/state.js +2 -0
  260. package/dist/extensions/mcp/state.js.map +1 -0
  261. package/dist/extensions/mcp/tool-approval.d.ts +11 -0
  262. package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
  263. package/dist/extensions/mcp/tool-approval.js +156 -0
  264. package/dist/extensions/mcp/tool-approval.js.map +1 -0
  265. package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
  266. package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
  267. package/dist/extensions/mcp/tool-metadata.js +264 -0
  268. package/dist/extensions/mcp/tool-metadata.js.map +1 -0
  269. package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
  270. package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
  271. package/dist/extensions/mcp/tool-registrar.js +229 -0
  272. package/dist/extensions/mcp/tool-registrar.js.map +1 -0
  273. package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
  274. package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
  275. package/dist/extensions/mcp/tool-result-renderer.js +345 -0
  276. package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
  277. package/dist/extensions/mcp/ts-shape.d.ts +3 -0
  278. package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
  279. package/dist/extensions/mcp/ts-shape.js +160 -0
  280. package/dist/extensions/mcp/ts-shape.js.map +1 -0
  281. package/dist/extensions/mcp/types.d.ts +521 -0
  282. package/dist/extensions/mcp/types.d.ts.map +1 -0
  283. package/dist/extensions/mcp/types.js +294 -0
  284. package/dist/extensions/mcp/types.js.map +1 -0
  285. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
  286. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
  287. package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
  288. package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
  289. package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
  290. package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
  291. package/dist/extensions/mcp/ui-resource-handler.js +210 -0
  292. package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
  293. package/dist/extensions/mcp/ui-server.d.ts +52 -0
  294. package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
  295. package/dist/extensions/mcp/ui-server.js +740 -0
  296. package/dist/extensions/mcp/ui-server.js.map +1 -0
  297. package/dist/extensions/mcp/ui-session.d.ts +40 -0
  298. package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
  299. package/dist/extensions/mcp/ui-session.js +477 -0
  300. package/dist/extensions/mcp/ui-session.js.map +1 -0
  301. package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
  302. package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
  303. package/dist/extensions/mcp/ui-stream-types.js +61 -0
  304. package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
  305. package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
  306. package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
  307. package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
  308. package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
  309. package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
  310. package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
  311. package/dist/extensions/mcp/unix-socket-transport.js +85 -0
  312. package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
  313. package/dist/extensions/mcp/utils.d.ts +32 -0
  314. package/dist/extensions/mcp/utils.d.ts.map +1 -0
  315. package/dist/extensions/mcp/utils.js +336 -0
  316. package/dist/extensions/mcp/utils.js.map +1 -0
  317. package/dist/extensions/subagent/index.d.ts +62 -1
  318. package/dist/extensions/subagent/index.d.ts.map +1 -1
  319. package/dist/extensions/subagent/index.js +195 -9
  320. package/dist/extensions/subagent/index.js.map +1 -1
  321. package/dist/extensions/subagent-render.d.ts +3 -0
  322. package/dist/extensions/subagent-render.d.ts.map +1 -0
  323. package/dist/extensions/subagent-render.js +39 -0
  324. package/dist/extensions/subagent-render.js.map +1 -0
  325. package/dist/extensions/web-access.d.ts.map +1 -1
  326. package/dist/extensions/web-access.js +1 -1
  327. package/dist/extensions/web-access.js.map +1 -1
  328. package/dist/index.d.ts +2 -0
  329. package/dist/index.d.ts.map +1 -1
  330. package/dist/index.js +20992 -2003
  331. package/dist/index.js.map +1 -1
  332. package/dist/mcp-keyring-helper.cjs +89 -0
  333. package/dist/mcp-script-worker.mjs +130 -0
  334. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  335. package/dist/modes/interactive/components/model-selector.js +1 -1
  336. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  337. package/dist/modes/interactive/components/response-separator.d.ts +1 -1
  338. package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
  339. package/dist/modes/interactive/components/response-separator.js +1 -1
  340. package/dist/modes/interactive/components/response-separator.js.map +1 -1
  341. package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
  342. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  343. package/dist/modes/interactive/components/tool-execution.js +12 -2
  344. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  345. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  346. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  347. package/dist/modes/interactive/interactive-mode.js +14 -8
  348. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  349. package/dist/rpc-entry.js +20866 -1882
  350. package/dist/skills/mcp-scripting/SKILL.md +38 -0
  351. package/dist/utils/hidden-spawn.d.ts +29 -0
  352. package/dist/utils/hidden-spawn.d.ts.map +1 -0
  353. package/dist/utils/hidden-spawn.js +101 -0
  354. package/dist/utils/hidden-spawn.js.map +1 -0
  355. package/dist/vendor/ai.js +110 -35
  356. package/docs/mcp.md +178 -0
  357. package/docs/pi-subagents.md +75 -0
  358. package/docs/quickstart.md +1 -1
  359. package/docs/usage.md +2 -1
  360. package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
  361. package/native/win32/build.mjs +95 -0
  362. package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
  363. package/native/win32/src/hidden-spawn.c +157 -0
  364. package/npm-shrinkwrap.json +728 -6
  365. package/package.json +21 -6
  366. package/dist/extensions/mcp/client.d.ts +0 -86
  367. package/dist/extensions/mcp/client.d.ts.map +0 -1
  368. package/dist/extensions/mcp/client.js +0 -275
  369. package/dist/extensions/mcp/client.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/extensions/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OverlayHandle } from \"@earendil-works/pi-tui\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport {\n\tensureCompatibilityImports,\n\tgetMcpDiscoverySummary,\n\tgetMcpStandardConfigSummary,\n\tgetProjectConfigPath,\n\tgetServerProvenance,\n\ttype KnownServerPreset,\n\tpreviewCompatibilityImports,\n\tpreviewSharedServerEntry,\n\tpreviewStarterProjectConfig,\n\twriteDirectToolsConfig,\n\twriteProjectServerDisabledOverride,\n\twriteSharedServerEntry,\n\twriteStarterProjectConfig,\n} from \"./config.ts\";\nimport {\n\tclearFailure,\n\tgetFailureAgeSeconds,\n\tgetFailureMessage,\n\tmarkKeepAliveAfterConnect,\n\tnotifyToolMetadataUpdated,\n\trecordFailure,\n\tupdateMetadataCache,\n\tupdateStatusBar,\n} from \"./init.ts\";\nimport { getAuthStorageOptions, inspectAuthForUrl } from \"./mcp-auth.ts\";\nimport { authenticate, type McpOAuthRuntime, removeAuth, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { inspectBearerTokenForUrl, removeBearerToken } from \"./mcp-bearer-store.ts\";\nimport { createMcpPanel } from \"./mcp-panel.ts\";\nimport { createMcpSetupPanel } from \"./mcp-setup-panel.ts\";\nimport { loadMetadataCache, reconstructPromptMetadata } from \"./metadata-cache.ts\";\nimport {\n\tloadOnboardingState,\n\tmarkSharedConfigHintShown,\n\tmarkSetupCompleted as persistSetupCompleted,\n} from \"./onboarding-state.ts\";\nimport { isAbortError } from \"./runtime-owner.ts\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport { buildToolMetadata } from \"./tool-metadata.ts\";\nimport {\n\ttype ImportKind,\n\tisServerDisabled,\n\ttype McpAuthResult,\n\ttype McpConfig,\n\ttype McpPanelCallbacks,\n\ttype McpPanelResult,\n\ttype ServerEntry,\n} from \"./types.ts\";\nimport { openPath, resolveServerUrl, sanitizeTerminalText } from \"./utils.ts\";\n\nfunction terminalHyperlink(label: string, url: string): string {\n\treturn `\\u001B]8;;${sanitizeTerminalText(url)}\\u001B\\\\${sanitizeTerminalText(label)}\\u001B]8;;\\u001B\\\\`;\n}\n\n/**\n * True when this run mode can display a `ctx.ui.custom()` overlay.\n *\n * `ctx.hasUI` only reports that *some* UI context is bound. In rpc/print mode\n * that context is a headless stub whose `custom()` returns immediately without\n * ever invoking the factory or the `done` callback, so a panel awaited through\n * `new Promise(resolve => ctx.ui.custom(...))` never settles and the command\n * hangs. Overlay panels therefore additionally require `ctx.mode === \"tui\"`.\n */\nfunction canRenderPanel(ctx: ExtensionContext): boolean {\n\treturn ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function showStatus(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\n\tconst lines: string[] = [\"MCP Server Status:\", \"\"];\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tif (isServerDisabled(definition)) {\n\t\t\tlines.push(`⊘ ${name}: disabled (run /mcp enable ${name}, then /reload)`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst connection = state.manager.getConnection(name);\n\t\tconst metadata = state.toolMetadata.get(name);\n\t\tconst toolCount = metadata?.length ?? 0;\n\t\tconst failedAgo = getFailureAgeSeconds(state, name);\n\t\tlet status = \"not connected\";\n\t\tlet statusIcon = \"○\";\n\t\tlet failed = false;\n\n\t\tif (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tstatusIcon = \"✓\";\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs auth\";\n\t\t\tstatusIcon = \"⚠\";\n\t\t} else if (failedAgo !== null) {\n\t\t\tconst reason = sanitizeTerminalText(getFailureMessage(state, name) ?? \"\");\n\t\t\tstatus = reason ? `failed ${failedAgo}s ago — ${reason}` : `failed ${failedAgo}s ago`;\n\t\t\tstatusIcon = \"✗\";\n\t\t\tfailed = true;\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\tconst toolSuffix = failed ? \"\" : ` (${toolCount} tools${status === \"cached\" ? \", cached\" : \"\"})`;\n\t\tlines.push(`${statusIcon} ${name}: ${status}${toolSuffix}`);\n\t}\n\n\tif (Object.keys(state.config.mcpServers).length === 0) {\n\t\tlines.push(\"No MCP servers configured\");\n\t\tlines.push(\"Run /mcp setup to adopt imports or scaffold .nexus/mcp.json\");\n\t}\n\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function showPrompts(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\tconst allPrompts = [...(state.promptMetadata?.values() ?? [])].flat();\n\tconst failedPromptServers = [...(state.manager.getAllConnections?.() ?? [])]\n\t\t.filter(([, connection]) => connection.status === \"connected\" && connection.promptDiscoveryFailed)\n\t\t.map(([serverName]) => serverName)\n\t\t.sort();\n\tif (allPrompts.length === 0) {\n\t\tconst failureNote =\n\t\t\tfailedPromptServers.length > 0 ? ` Prompt discovery failed for: ${failedPromptServers.join(\", \")}.` : \"\";\n\t\tctx.ui.notify(\n\t\t\t`No MCP prompts available. Prompts are discovered when servers with the \\`prompts\\` capability connect.${failureNote}`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn;\n\t}\n\tconst lines = [\"MCP Prompts:\", \"\"];\n\tconst grouped = new Map<string, typeof allPrompts>();\n\tfor (const prompt of allPrompts) {\n\t\tconst list = grouped.get(prompt.serverName) ?? [];\n\t\tlist.push(prompt);\n\t\tgrouped.set(prompt.serverName, list);\n\t}\n\tfor (const [serverName, prompts] of [...grouped.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n\t\tlines.push(`${serverName}:`);\n\t\tfor (const prompt of prompts.sort((a, b) => a.commandName.localeCompare(b.commandName))) {\n\t\t\tconst args = prompt.arguments\n\t\t\t\t.map((argument) => (argument.required ? `<${argument.name}>` : `[${argument.name}]`))\n\t\t\t\t.join(\" \");\n\t\t\tlines.push(` /${prompt.commandName}${args ? ` ${args}` : \"\"}`);\n\t\t\tif (prompt.description) lines.push(` ${prompt.description}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\tlines.push(`Total: ${allPrompts.length} prompt${allPrompts.length === 1 ? \"\" : \"s\"}`);\n\tif (failedPromptServers.length > 0) {\n\t\tlines.push(\n\t\t\t`Prompt discovery failed for: ${failedPromptServers.join(\", \")}. Cached prompt metadata may be stale.`,\n\t\t);\n\t}\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function showTools(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\n\tconst allTools = [...state.toolMetadata.entries()]\n\t\t.filter(([serverName]) => !isServerDisabled(state.config.mcpServers[serverName]))\n\t\t.flatMap(([, metadata]) => metadata.map((m) => m.name));\n\n\tif (allTools.length === 0) {\n\t\tctx.ui.notify(\"No MCP tools available\", \"info\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"MCP Tools:\", \"\", ...allTools.map((t) => ` ${t}`), \"\", `Total: ${allTools.length} tools`];\n\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function reconnectServer(state: McpExtensionState, ctx: ExtensionContext, name: string): Promise<boolean> {\n\tconst definition = state.config.mcpServers[name];\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst signal = state.owner?.signal;\n\tif (!definition) {\n\t\tif (ui) {\n\t\t\tui.notify(`Server \"${name}\" not found in config`, \"error\");\n\t\t}\n\t\treturn false;\n\t}\n\tif (isServerDisabled(definition)) {\n\t\tif (ui) ui.notify(`MCP: ${name} is disabled. Run /mcp enable ${name}, then /reload.`, \"warning\");\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tawait state.manager.close(name);\n\t\tstate.owner?.throwIfInactive();\n\t\tconst connection = signal\n\t\t\t? await state.manager.connect(name, definition, signal)\n\t\t\t: await state.manager.connect(name, definition);\n\t\tstate.owner?.throwIfInactive();\n\t\tif (connection.status === \"needs-auth\") {\n\t\t\tif (ui) {\n\t\t\t\tui.notify(`MCP: ${name} requires OAuth. Run /mcp-auth ${name} first.`, \"warning\");\n\t\t\t}\n\t\t\tupdateStatusBar(state);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst prefix = state.config.settings?.toolPrefix ?? \"server\";\n\t\tconst { metadata, failedTools } = buildToolMetadata(\n\t\t\tconnection.tools,\n\t\t\tconnection.resources,\n\t\t\tdefinition,\n\t\t\tname,\n\t\t\tprefix,\n\t\t\tstate.config.mcpServers,\n\t\t\tstate.toolMetadata,\n\t\t);\n\t\tstate.toolMetadata.set(name, metadata);\n\t\tif (!connection.promptDiscoveryFailed) {\n\t\t\tstate.promptMetadata?.set(name, reconstructPromptMetadata(name, connection.prompts ?? [], prefix, definition));\n\t\t\tstate.promptMetadataLive?.add(name);\n\t\t}\n\t\tif (connection.instructions) {\n\t\t\tstate.serverInstructions.set(name, connection.instructions);\n\t\t} else {\n\t\t\tstate.serverInstructions.delete(name);\n\t\t}\n\t\tupdateMetadataCache(state, name);\n\t\tnotifyToolMetadataUpdated(state, name, \"command-reconnect\");\n\t\tmarkKeepAliveAfterConnect(state, name);\n\t\tclearFailure(state, name);\n\n\t\tif (ui) {\n\t\t\tui.notify(\n\t\t\t\t`MCP: Reconnected to ${name} (${connection.tools.length} tools, ${connection.resources.length} resources)`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tif (failedTools.length > 0) {\n\t\t\t\tui.notify(`MCP: ${name} - ${failedTools.length} tools skipped`, \"warning\");\n\t\t\t}\n\t\t}\n\t\tupdateStatusBar(state);\n\t\treturn true;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (isAbortError(error, signal)) throw error;\n\t\trecordFailure(state, name, message);\n\t\tif (ui) {\n\t\t\tui.notify(`MCP: Failed to reconnect to ${name}: ${sanitizeTerminalText(message)}`, \"error\");\n\t\t}\n\t\tupdateStatusBar(state);\n\t\treturn false;\n\t}\n}\n\nexport async function reconnectServers(\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n\ttargetServer?: string,\n): Promise<void> {\n\tif (targetServer && !state.config.mcpServers[targetServer]) {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(`Server \"${targetServer}\" not found in config`, \"error\");\n\t\t}\n\t\treturn;\n\t}\n\n\tconst names = targetServer ? [targetServer] : Object.keys(state.config.mcpServers);\n\tfor (const name of names) {\n\t\tawait reconnectServer(state, ctx, name);\n\t}\n\n\tupdateStatusBar(state);\n}\n\n/** Whether stored OAuth tokens actually exist for a server — independent of whether it's currently connected. */\nfunction isSignedInForOAuth(serverName: string, definition: ServerEntry, state: McpExtensionState): boolean {\n\ttry {\n\t\tconst serverUrl = resolveServerUrl(definition);\n\t\tif (!serverUrl) return false;\n\t\tconst authStatus = inspectAuthForUrl(serverName, serverUrl, state.authStorageOptions);\n\t\treturn authStatus.status !== \"absent\" && authStatus.status !== \"unavailable\" && !!authStatus.entry.tokens;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function authenticateServer(\n\tserverName: string,\n\tconfig: McpConfig,\n\tctx: ExtensionContext,\n\tsignal?: AbortSignal,\n\truntime?: McpOAuthRuntime,\n\tnexus?: ExtensionAPI,\n): Promise<McpAuthResult> {\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst cwd = ctx.cwd;\n\tsignal ??= ctx.signal;\n\tif (!ui) return { ok: false, message: \"OAuth authentication requires an interactive session.\" };\n\n\tconst definition = config.mcpServers[serverName];\n\tif (!definition) {\n\t\tconst message = `Server \"${serverName}\" not found in config`;\n\t\tui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\tif (isServerDisabled(definition)) {\n\t\tconst message = `Server \"${serverName}\" is disabled. Run /mcp enable ${serverName}, then /reload.`;\n\t\tui.notify(message, \"warning\");\n\t\treturn { ok: false, message };\n\t}\n\n\tif (!supportsOAuth(definition)) {\n\t\tconst message = `Server \"${serverName}\" does not use OAuth authentication. Set \"auth\": \"oauth\" or omit auth for auto-detection.`;\n\t\tui.notify(\n\t\t\t`Server \"${serverName}\" does not use OAuth authentication.\\n` +\n\t\t\t\t`Set \"auth\": \"oauth\" or omit auth for auto-detection.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn { ok: false, message };\n\t}\n\n\ttry {\n\t\tconst serverUrl = resolveServerUrl(definition);\n\t\tif (!serverUrl) {\n\t\t\tconst message = `Server \"${serverName}\" has no URL configured (OAuth requires HTTP transport)`;\n\t\t\tui.notify(message, \"error\");\n\t\t\treturn { ok: false, message };\n\t\t}\n\n\t\tui.setStatus(\"mcp-auth\", `Authenticating ${serverName}...`);\n\t\tconst authStorageOptions = getAuthStorageOptions(config.settings?.oauthDir, cwd);\n\t\tconst status = await authenticate(serverName, serverUrl, definition, {\n\t\t\t...(authStorageOptions.baseDir ? { authStorageOptions } : {}),\n\t\t\tonAuthorizationUrl: async (authorizationUrl) => {\n\t\t\t\t// Best-effort: launch the user's browser straight to the authorization page\n\t\t\t\t// instead of relying on them to click (or copy) the link printed below.\n\t\t\t\tif (!nexus) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait openPath(nexus, authorizationUrl);\n\t\t\t\t} catch {\n\t\t\t\t\t// The link is still shown in the prompt text below; nothing else to do here.\n\t\t\t\t}\n\t\t\t},\n\t\t\tonAuthorizationInput: async (authorizationUrl, inputSignal) => {\n\t\t\t\tif (inputSignal.aborted) return undefined;\n\t\t\t\treturn ui.input(\n\t\t\t\t\t`Complete ${serverName} OAuth\\n\\n` +\n\t\t\t\t\t\t`${terminalHyperlink(\"Open authorization page\", authorizationUrl)}\\n${authorizationUrl}\\n\\n` +\n\t\t\t\t\t\t\"Approve access, then paste the full localhost callback URL below.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ signal: inputSignal },\n\t\t\t\t);\n\t\t\t},\n\t\t\t...(signal ? { signal } : {}),\n\t\t\t...(runtime ? { runtime } : {}),\n\t\t});\n\t\tif (signal?.aborted) signal.throwIfAborted();\n\n\t\tif (status === \"authenticated\") {\n\t\t\tconst message = `OAuth authentication successful for \"${serverName}\".`;\n\t\t\tui.notify(message, \"info\");\n\t\t\treturn { ok: true, message };\n\t\t}\n\n\t\tconst message = `OAuth authentication failed for \"${serverName}\".`;\n\t\tui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tui.notify(`Failed to authenticate \"${serverName}\": ${message}`, \"error\");\n\t\treturn { ok: false, message };\n\t} finally {\n\t\tif (!signal?.aborted) ui.setStatus(\"mcp-auth\", undefined);\n\t}\n}\n\nexport async function logoutServer(\n\tserverName: string,\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n): Promise<{ ok: boolean; message: string }> {\n\tconst definition = state.config.mcpServers[serverName];\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tif (!definition) {\n\t\tconst message = `Server \"${serverName}\" not found in config`;\n\t\tif (ui) ui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tconst signal = state.owner?.signal;\n\ttry {\n\t\tawait removeAuth(serverName, {\n\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\tsignal,\n\t\t\truntime: state.oauthRuntime,\n\t\t});\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) {\n\t\t\tui.notify(`Failed to clear OAuth credentials for \"${serverName}\": ${sanitizeTerminalText(message)}`, \"error\");\n\t\t}\n\t\treturn { ok: false, message };\n\t}\n\n\tstate.owner?.throwIfInactive();\n\ttry {\n\t\tawait state.manager.close(serverName);\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) {\n\t\t\tui.notify(\n\t\t\t\t`OAuth credentials were cleared for \"${serverName}\", but its connection could not be closed: ${sanitizeTerminalText(message)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { ok: false, message };\n\t}\n\n\tstate.owner?.throwIfInactive();\n\tupdateStatusBar(state);\n\n\tconst message = `OAuth credentials cleared for \"${serverName}\". Run /mcp-auth ${serverName} to authenticate again.`;\n\tif (ui) ui.notify(message, \"info\");\n\treturn { ok: true, message };\n}\n\nfunction validateBearerTokenStoreServer(\n\tserverName: string,\n\tstate: McpExtensionState,\n): { ok: true; serverUrl: string } | { ok: false; message: string; type: \"error\" | \"warning\" } {\n\tconst safeName = sanitizeTerminalText(serverName);\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) return { ok: false, message: `Server \"${safeName}\" not found in config`, type: \"error\" };\n\tif (isServerDisabled(definition))\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage: `Server \"${safeName}\" is disabled. Run /mcp enable ${safeName}, then /reload.`,\n\t\t\ttype: \"warning\",\n\t\t};\n\tif (definition.auth !== \"bearer\" || definition.bearerTokenStore !== true) {\n\t\treturn { ok: false, message: `Server \"${safeName}\" is not configured for bearerTokenStore.`, type: \"error\" };\n\t}\n\t// resolveServerUrl embeds the interpolated URL in its exceptions; redact it\n\t// because the URL can carry userinfo or interpolated secrets.\n\tlet serverUrl: string | undefined;\n\ttry {\n\t\tserverUrl = resolveServerUrl(definition);\n\t} catch {\n\t\treturn { ok: false, message: `Server \"${safeName}\" has an invalid or unresolvable URL.`, type: \"error\" };\n\t}\n\tif (!serverUrl) return { ok: false, message: `Server \"${safeName}\" has no URL configured.`, type: \"error\" };\n\treturn { ok: true, serverUrl };\n}\n\nexport async function manageBearerToken(\n\taction: \"set\" | \"remove\" | \"status\",\n\tserverName: string,\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n): Promise<{ ok: boolean; message: string }> {\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst safeName = sanitizeTerminalText(serverName);\n\tconst validation = validateBearerTokenStoreServer(serverName, state);\n\tif (!validation.ok) {\n\t\tif (ui) ui.notify(validation.message, validation.type);\n\t\treturn { ok: false, message: validation.message };\n\t}\n\n\tif (action === \"set\") {\n\t\tconst message = `Nexus will not collect bearer tokens through an unmasked prompt. Configure bearerTokenEnv for \"${safeName}\" in MCP config, then reload.`;\n\t\tif (ui) ui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tif (action === \"status\") {\n\t\tconst status = inspectBearerTokenForUrl(serverName, validation.serverUrl);\n\t\tconst message =\n\t\t\tstatus.status === \"present\"\n\t\t\t\t? `Bearer token is stored for \"${safeName}\".`\n\t\t\t\t: status.status === \"url-mismatch\"\n\t\t\t\t\t? `Bearer token is stored for \"${safeName}\", but its URL does not match the current server URL.`\n\t\t\t\t\t: status.status === \"unavailable\"\n\t\t\t\t\t\t? status.message\n\t\t\t\t\t\t: `No bearer token is stored for \"${safeName}\".`;\n\t\tif (ui) ui.notify(message, status.status === \"unavailable\" ? \"error\" : \"info\");\n\t\treturn { ok: status.status !== \"unavailable\", message };\n\t}\n\n\ttry {\n\t\tremoveBearerToken(serverName);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) ui.notify(`Failed to remove bearer token for \"${safeName}\": ${sanitizeTerminalText(message)}`, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tconst message = `Bearer token removed for \"${safeName}\".`;\n\tif (ui) ui.notify(message, \"info\");\n\treturn { ok: true, message };\n}\n\ntype ParsedAddServer = { ok: true; name: string; entry: ServerEntry } | { ok: false; error: string };\n\nconst ADD_SERVER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction parseKeyValueFlag(\n\tflag: string,\n\traw: string | undefined,\n): { ok: true; key: string; value: string } | { ok: false; error: string } {\n\tconst eq = raw?.indexOf(\"=\") ?? -1;\n\tif (!raw || eq <= 0) return { ok: false, error: `${flag} expects KEY=VALUE, got \"${raw ?? \"\"}\".` };\n\treturn { ok: true, key: raw.slice(0, eq), value: raw.slice(eq + 1) };\n}\n\n/**\n * Parses `/mcp add <name> ...` arguments. Mirrors the rest of /mcp's naive\n * whitespace-split argument handling (no quoting support) rather than\n * inventing a shell-quote parser just for this subcommand.\n */\nexport function parseAddServerArgs(argv: string[]): ParsedAddServer {\n\tconst name = argv[0];\n\tif (!name) return { ok: false, error: \"Missing server name.\" };\n\tif (!ADD_SERVER_NAME_PATTERN.test(name)) {\n\t\treturn { ok: false, error: `Invalid server name \"${name}\" — use letters, digits, \".\", \"_\", \"-\".` };\n\t}\n\n\tconst rest = argv.slice(1);\n\tconst env: Record<string, string> = {};\n\tconst headers: Record<string, string> = {};\n\tlet cwd: string | undefined;\n\tlet url: string | undefined;\n\tlet auth: \"oauth\" | \"bearer\" | undefined;\n\tlet bearerTokenEnv: string | undefined;\n\tlet commandArgv: string[] | undefined;\n\n\tlet i = 0;\n\twhile (i < rest.length) {\n\t\tconst token = rest[i];\n\t\tif (token === \"--\") {\n\t\t\tcommandArgv = rest.slice(i + 1);\n\t\t\tbreak;\n\t\t}\n\t\tif (token === \"--url\") {\n\t\t\turl = rest[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--env\" || token === \"--header\") {\n\t\t\tconst parsed = parseKeyValueFlag(token, rest[i + 1]);\n\t\t\tif (!parsed.ok) return parsed;\n\t\t\t(token === \"--env\" ? env : headers)[parsed.key] = parsed.value;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--cwd\") {\n\t\t\tcwd = rest[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--auth\") {\n\t\t\tconst value = rest[i + 1];\n\t\t\tif (value !== \"oauth\" && value !== \"bearer\") {\n\t\t\t\treturn { ok: false, error: `--auth expects \"oauth\" or \"bearer\", got \"${value ?? \"\"}\".` };\n\t\t\t}\n\t\t\tauth = value;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--bearer-env\") {\n\t\t\tbearerTokenEnv = rest[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\treturn { ok: false, error: `Unrecognized argument \"${token}\".` };\n\t}\n\n\tif (url && commandArgv) {\n\t\treturn { ok: false, error: \"Use either --url (remote server) or -- <command> (local server), not both.\" };\n\t}\n\tif (!url && !commandArgv) {\n\t\treturn { ok: false, error: \"Specify a server type: --url <url> (remote), or -- <command> [args...] (local).\" };\n\t}\n\n\tif (commandArgv) {\n\t\tconst [command, ...args] = commandArgv;\n\t\tif (!command) return { ok: false, error: \"Missing command after --.\" };\n\t\tconst entry: ServerEntry = { command, ...(args.length ? { args } : {}) };\n\t\tif (Object.keys(env).length) entry.env = env;\n\t\tif (cwd) entry.cwd = cwd;\n\t\treturn { ok: true, name, entry };\n\t}\n\n\tconst entry: ServerEntry = { url: url as string };\n\tif (Object.keys(headers).length) entry.headers = headers;\n\tif (bearerTokenEnv) {\n\t\tentry.bearerTokenEnv = bearerTokenEnv;\n\t\tentry.auth = auth ?? \"bearer\";\n\t} else if (auth) {\n\t\tentry.auth = auth;\n\t}\n\treturn { ok: true, name, entry };\n}\n\nexport const ADD_SERVER_USAGE = [\n\t\"Usage:\",\n\t\" /mcp add <name> -- <command> [args...] local server, runs over stdio\",\n\t\" /mcp add <name> --url <url> remote server over HTTP\",\n\t\"\",\n\t\"Flags:\",\n\t\" --env KEY=VALUE extra environment variable (local, repeatable)\",\n\t\" --cwd <path> working directory (local)\",\n\t\" --header KEY=VALUE extra HTTP header (remote, repeatable)\",\n\t\" --auth oauth|bearer auth mode (remote; default is OAuth auto-detection)\",\n\t\" --bearer-env <VAR> read a bearer token from this env var (remote)\",\n\t\"\",\n\t\"For fields not covered here (lifecycle, includeTools, ...), edit the config\",\n\t'file directly — /mcp setup, then \"Open detected config paths\".',\n].join(\"\\n\");\n\n/** Adds a server to the project's shared MCP config. Reused by both `/mcp add` and any UI entry point. */\nexport function addCustomServer(cwd: string, name: string, entry: ServerEntry): { path: string } {\n\tconst path = writeSharedServerEntry(getProjectConfigPath(cwd), name, entry);\n\treturn { path };\n}\n\nexport interface PanelFlowResult {\n\tconfigChanged: boolean;\n}\n\nfunction buildSharedConfigNoticeLines(\n\tconfigOverridePath: string | undefined,\n\tcwd: string,\n): { lines: string[]; fingerprint: string | null } {\n\tconst discovery = getMcpStandardConfigSummary(configOverridePath, cwd);\n\tconst onboardingState = loadOnboardingState();\n\tif (!discovery.hasSharedServers || onboardingState.sharedConfigHintShown) {\n\t\treturn { lines: [], fingerprint: null };\n\t}\n\n\tconst sharedSources = discovery.sources.filter((source) => source.kind === \"shared\" && source.serverCount > 0);\n\tconst sourceList = sharedSources.map((source) => source.path).join(\", \");\n\treturn {\n\t\tlines: [\n\t\t\t`Using MCP configuration from ${sourceList}.`,\n\t\t\t\"Nexus writes compatibility imports and MCP-specific overrides only to Nexus configuration files.\",\n\t\t],\n\t\tfingerprint: discovery.fingerprint,\n\t};\n}\n\nexport async function openMcpSetup(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n\tmode: \"empty\" | \"setup\" = \"setup\",\n\toptions: { includeHostConfigs?: boolean } = {},\n): Promise<PanelFlowResult> {\n\tif (!ctx.hasUI) return { configChanged: false };\n\tif (!canRenderPanel(ctx)) {\n\t\tctx.ui.notify(\n\t\t\t`The interactive MCP setup panel is only available in the terminal UI (current mode: ${ctx.mode}). Edit .nexus/mcp.json directly, or run /mcp status to review servers.`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn { configChanged: false };\n\t}\n\tif (state.programmaticConfig) {\n\t\tctx.ui.notify(\"MCP setup is unavailable when config is supplied by createMcpAdapter().\", \"info\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst discovery = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options);\n\tconst onboardingState = loadOnboardingState();\n\tconst installedServers = Object.entries(state.config.mcpServers).map(([name, definition]) => {\n\t\tconst authCapable = supportsOAuth(definition);\n\t\treturn {\n\t\t\tname,\n\t\t\tdisabled: isServerDisabled(definition),\n\t\t\tkind: (definition.command ? \"stdio\" : \"http\") as \"stdio\" | \"http\",\n\t\t\tauthCapable,\n\t\t\tsignedIn: authCapable ? isSignedInForOAuth(name, definition, state) : false,\n\t\t};\n\t});\n\tlet configChanged = false;\n\tlet overlayHandle: OverlayHandle | undefined;\n\n\tconst callbacks = {\n\t\tpreviewImports: (imports: ImportKind[]) => previewCompatibilityImports(imports, configOverridePath),\n\t\tpreviewStarterProject: () => previewStarterProjectConfig(ctx.cwd),\n\t\tpreviewRepoPrompt: () => {\n\t\t\tconst repoPrompt = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options).repoPrompt;\n\t\t\tif (!repoPrompt.entry || !repoPrompt.targetPath || !repoPrompt.serverName) return null;\n\t\t\treturn previewSharedServerEntry(repoPrompt.targetPath, repoPrompt.serverName, repoPrompt.entry);\n\t\t},\n\t\tpreviewKnownServer: (preset: KnownServerPreset) =>\n\t\t\tpreviewSharedServerEntry(getProjectConfigPath(ctx.cwd), preset.id, preset.entry),\n\t\tadoptImports: async (imports: ImportKind[]) => {\n\t\t\tconst result = ensureCompatibilityImports(imports, configOverridePath);\n\t\t\tif (result.added.length > 0) configChanged = true;\n\t\t\treturn result;\n\t\t},\n\t\tscaffoldProjectConfig: async () => {\n\t\t\tconst path = writeStarterProjectConfig(ctx.cwd);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path };\n\t\t},\n\t\taddRepoPrompt: async () => {\n\t\t\tconst repoPrompt = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options).repoPrompt;\n\t\t\tif (!repoPrompt.entry || !repoPrompt.targetPath || !repoPrompt.serverName) {\n\t\t\t\tthrow new Error(\"RepoPrompt is not available to add from this setup screen.\");\n\t\t\t}\n\t\t\tconst path = writeSharedServerEntry(repoPrompt.targetPath, repoPrompt.serverName, repoPrompt.entry);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path, serverName: repoPrompt.serverName };\n\t\t},\n\t\taddKnownServer: async (preset: KnownServerPreset) => {\n\t\t\tconst path = writeSharedServerEntry(getProjectConfigPath(ctx.cwd), preset.id, preset.entry);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path, serverName: preset.name };\n\t\t},\n\t\topenPath: async (targetPath: string) => {\n\t\t\tawait openPath(nexus, targetPath);\n\t\t},\n\t\tmarkSetupCompleted: () => {\n\t\t\tpersistSetupCompleted(discovery.fingerprint);\n\t\t},\n\t\tseedEditor: (text: string) => {\n\t\t\tif (ctx.hasUI) ctx.ui.setEditorText(text);\n\t\t},\n\t\ttoggleServerDisabled: async (serverName: string, disabled: boolean) => {\n\t\t\tconst result = writeProjectServerDisabledOverride(configOverridePath, ctx.cwd, serverName, disabled);\n\t\t\tif (result.changed) configChanged = true;\n\t\t\treturn { path: result.path, changed: result.changed };\n\t\t},\n\t\tauthenticateServer: async (serverName: string, fallbackEntry?: ServerEntry) => {\n\t\t\t// A server added this session isn't in the live config until /reload —\n\t\t\t// hand authenticateServer a synthetic config with just that one entry\n\t\t\t// merged in, rather than making the user reload first.\n\t\t\tconst effectiveConfig: McpConfig =\n\t\t\t\tstate.config.mcpServers[serverName] || !fallbackEntry\n\t\t\t\t\t? state.config\n\t\t\t\t\t: { ...state.config, mcpServers: { ...state.config.mcpServers, [serverName]: fallbackEntry } };\n\t\t\t// The auth prompt (the actual link, and the \"paste the callback URL\"\n\t\t\t// input) renders as a *separate* overlay. Without hiding this one first,\n\t\t\t// it stays drawn on top and the auth prompt is invisible underneath it.\n\t\t\toverlayHandle?.setHidden(true);\n\t\t\ttry {\n\t\t\t\tconst result = await authenticateServer(\n\t\t\t\t\tserverName,\n\t\t\t\t\teffectiveConfig,\n\t\t\t\t\tctx,\n\t\t\t\t\tctx.signal,\n\t\t\t\t\tstate.oauthRuntime,\n\t\t\t\t\tnexus,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tok: result.ok,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tresult.message ??\n\t\t\t\t\t\t(result.ok ? `Signed in to \"${serverName}\".` : `Sign-in failed for \"${serverName}\".`),\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\toverlayHandle?.setHidden(false);\n\t\t\t\toverlayHandle?.focus();\n\t\t\t}\n\t\t},\n\t};\n\n\treturn new Promise<PanelFlowResult>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpSetupPanel(\n\t\t\t\t\tdiscovery,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\t{ mode, onboardingState, keybindings, installedServers },\n\t\t\t\t\ttui,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\tresolve({ configChanged });\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 92, maxHeight: \"90%\" },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n}\n\nfunction buildMcpPanelCallbacks(\n\tstate: McpExtensionState,\n\tconfig: McpConfig,\n\tctx: ExtensionContext,\n\tnexus: ExtensionAPI,\n\tgetOverlayHandle?: () => OverlayHandle | undefined,\n): McpPanelCallbacks {\n\t// Panel-only diagnostics keep status inspection from mutating connection\n\t// failure state while allowing the existing panel failure UI to show why the\n\t// credential store could not be inspected.\n\tconst authStatusFailures = new Map<string, string>();\n\n\treturn {\n\t\treconnect: (serverName: string) => reconnectServer(state, ctx, serverName),\n\t\tcanAuthenticate: (serverName: string) => {\n\t\t\tconst definition = config.mcpServers[serverName];\n\t\t\treturn definition ? !isServerDisabled(definition) && supportsOAuth(definition) : false;\n\t\t},\n\t\tauthenticate: async (serverName: string) => {\n\t\t\tconst overlay = getOverlayHandle?.();\n\t\t\toverlay?.setHidden(true);\n\t\t\ttry {\n\t\t\t\treturn await authenticateServer(serverName, config, ctx, state.owner?.signal, state.oauthRuntime, nexus);\n\t\t\t} finally {\n\t\t\t\toverlay?.setHidden(false);\n\t\t\t\toverlay?.focus();\n\t\t\t}\n\t\t},\n\t\tgetConnectionStatus: (serverName: string) => {\n\t\t\tauthStatusFailures.delete(serverName);\n\t\t\tconst definition = config.mcpServers[serverName];\n\t\t\tif (isServerDisabled(definition)) return \"disabled\";\n\t\t\tconst connection = state.manager.getConnection(serverName);\n\t\t\tlet serverUrl: string | undefined;\n\t\t\ttry {\n\t\t\t\tserverUrl = definition ? resolveServerUrl(definition) : undefined;\n\t\t\t} catch {\n\t\t\t\treturn \"failed\";\n\t\t\t}\n\t\t\tif (\n\t\t\t\tdefinition?.auth === \"oauth\" &&\n\t\t\t\tserverUrl &&\n\t\t\t\tdefinition.oauth !== false &&\n\t\t\t\tdefinition.oauth?.grantType !== \"client_credentials\"\n\t\t\t) {\n\t\t\t\tconst authStatus = inspectAuthForUrl(serverName, serverUrl, state.authStorageOptions);\n\t\t\t\tif (authStatus.status === \"unavailable\") {\n\t\t\t\t\tauthStatusFailures.set(serverName, authStatus.message);\n\t\t\t\t\treturn \"failed\";\n\t\t\t\t}\n\t\t\t\tif (authStatus.status === \"absent\" || !authStatus.entry.tokens) {\n\t\t\t\t\treturn \"needs-auth\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (connection?.status === \"needs-auth\") return \"needs-auth\";\n\t\t\tif (connection?.status === \"connected\") return \"connected\";\n\t\t\tif (getFailureAgeSeconds(state, serverName) !== null) return \"failed\";\n\t\t\treturn \"idle\";\n\t\t},\n\t\tgetFailureMessage: (serverName: string) =>\n\t\t\tauthStatusFailures.get(serverName) ?? getFailureMessage(state, serverName),\n\t\trefreshCacheAfterReconnect: (serverName: string) => {\n\t\t\tconst freshCache = loadMetadataCache();\n\t\t\treturn freshCache?.servers?.[serverName] ?? null;\n\t\t},\n\t};\n}\n\nexport async function openMcpPanel(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n\tonDirectToolsConfigChanged?: (changes: Map<string, true | string[] | false>) => void | Promise<void>,\n): Promise<PanelFlowResult> {\n\tif (state.programmaticConfig) {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(\n\t\t\t\t\"MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tawait showStatus(state, ctx);\n\t\t}\n\t\treturn { configChanged: false };\n\t}\n\tif (!canRenderPanel(ctx)) {\n\t\t// No overlay here, but the same information is available as text.\n\t\tawait showStatus(state, ctx);\n\t\treturn { configChanged: false };\n\t}\n\tif (Object.keys(state.config.mcpServers).length === 0) {\n\t\treturn openMcpSetup(state, nexus, ctx, configOverridePath, \"empty\", { includeHostConfigs: false });\n\t}\n\n\tconst config = state.config;\n\tconst cache = loadMetadataCache();\n\tconst configPath = (nexus.getFlag(\"mcp-config\") as string | undefined) ?? configOverridePath;\n\tconst provenanceMap = getServerProvenance(configPath, ctx.cwd);\n\tconst { lines: noticeLines, fingerprint } = buildSharedConfigNoticeLines(configPath, ctx.cwd);\n\n\tlet overlayHandle: OverlayHandle | undefined;\n\tconst callbacks = buildMcpPanelCallbacks(state, config, ctx, nexus, () => overlayHandle);\n\n\tlet configChanged = false;\n\n\tawait new Promise<void>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpPanel(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcache,\n\t\t\t\t\tprovenanceMap,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\ttui,\n\t\t\t\t\t(result: McpPanelResult) => {\n\t\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\t\tif (!result.cancelled && result.changes.size > 0) {\n\t\t\t\t\t\t\t\twriteDirectToolsConfig(result.changes, provenanceMap);\n\t\t\t\t\t\t\t\tconfigChanged = true;\n\t\t\t\t\t\t\t\tawait onDirectToolsConfigChanged?.(result.changes);\n\t\t\t\t\t\t\t\tctx.ui.notify(\"Direct tools updated for this session.\", \"info\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t})().catch((error) => {\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tctx.ui.notify(`Direct tools updated, but live refresh failed: ${message}`, \"error\");\n\t\t\t\t\t\t\tconfigChanged = true;\n\t\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{ noticeLines, keybindings },\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 82 },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n\n\tif (noticeLines.length > 0 && fingerprint) {\n\t\tmarkSharedConfigHintShown(fingerprint);\n\t}\n\n\treturn { configChanged };\n}\n\nexport async function openMcpAuthPanel(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n): Promise<PanelFlowResult> {\n\tif (!ctx.hasUI) return { configChanged: false };\n\tif (!canRenderPanel(ctx)) {\n\t\tctx.ui.notify(\n\t\t\t`The interactive MCP auth panel is only available in the terminal UI (current mode: ${ctx.mode}). Use /mcp-auth <server> to authenticate a specific server.`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn { configChanged: false };\n\t}\n\tif (state.programmaticConfig) {\n\t\tctx.ui.notify(\"Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.\", \"info\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst config = state.config;\n\tconst oauthServers = Object.entries(config.mcpServers).filter(\n\t\t([, definition]) => !isServerDisabled(definition) && supportsOAuth(definition),\n\t);\n\tif (oauthServers.length === 0) {\n\t\tctx.ui.notify(\"No OAuth-capable MCP servers are configured.\", \"warning\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst cache = loadMetadataCache();\n\tconst configPath = (nexus.getFlag(\"mcp-config\") as string | undefined) ?? configOverridePath;\n\tconst provenanceMap = getServerProvenance(configPath, ctx.cwd);\n\tlet overlayHandle: OverlayHandle | undefined;\n\tconst callbacks = buildMcpPanelCallbacks(state, config, ctx, nexus, () => overlayHandle);\n\tawait new Promise<void>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpPanel(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcache,\n\t\t\t\t\tprovenanceMap,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\ttui,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tauthOnly: true,\n\t\t\t\t\t\tkeybindings,\n\t\t\t\t\t\tnoticeLines: [\"Select an OAuth MCP server and press Enter or ctrl+a to authenticate.\"],\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 82 },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n\n\treturn { configChanged: false };\n}\n"]}
@@ -1,41 +1,126 @@
1
+ import { type AgentPluginSummary } from "./agent-plugin-loader.ts";
2
+ import { type HostConfigDiscovery, type ImportKind, type McpConfig, type ServerEntry, type ServerProvenance } from "./types.ts";
3
+ export interface KnownServerPreset {
4
+ id: string;
5
+ name: string;
6
+ summary: string;
7
+ entry: ServerEntry;
8
+ /** Optional "learn more" link shown in the setup panel. Not used for anything functional. */
9
+ docsUrl?: string;
10
+ }
11
+ export declare const KNOWN_SERVER_PRESETS: readonly KnownServerPreset[];
12
+ interface ConfigSourceSpec {
13
+ id: "nexus-global" | "nexus-project";
14
+ label: string;
15
+ readPath: string;
16
+ writePath: string;
17
+ kind: "user" | "project" | "import";
18
+ importKind?: string;
19
+ shared: boolean;
20
+ scope: "global" | "project";
21
+ }
22
+ export interface ConfigDiscoveryPath {
23
+ label: string;
24
+ path: string;
25
+ exists: boolean;
26
+ }
27
+ export interface DiscoveredImportConfig {
28
+ kind: ImportKind;
29
+ path: string;
30
+ }
31
+ export interface ConfigDiscoverySource extends ConfigDiscoveryPath {
32
+ id: ConfigSourceSpec["id"];
33
+ scope: ConfigSourceSpec["scope"];
34
+ kind: "shared" | "nexus";
35
+ serverCount: number;
36
+ }
37
+ export interface ImportConfigSummary extends DiscoveredImportConfig {
38
+ serverCount: number;
39
+ }
40
+ export interface HostConfigSummary extends ImportConfigSummary {
41
+ active: boolean;
42
+ }
43
+ export interface McpConfigConflict {
44
+ serverName: string;
45
+ sources: Array<{
46
+ kind: "shared" | "nexus" | "host";
47
+ path: string;
48
+ }>;
49
+ winner: {
50
+ kind: "shared" | "nexus" | "host";
51
+ path: string;
52
+ };
53
+ }
54
+ export interface RepoPromptDiscovery {
55
+ configured: boolean;
56
+ configuredPath?: string;
57
+ executablePath?: string;
58
+ targetPath?: string;
59
+ serverName?: string;
60
+ entry?: ServerEntry;
61
+ }
62
+ export interface McpDiscoverySummary {
63
+ sources: ConfigDiscoverySource[];
64
+ imports: ImportConfigSummary[];
65
+ hostConfigs: HostConfigSummary[];
66
+ hostConfigDiscovery: HostConfigDiscovery;
67
+ agentPlugins: AgentPluginSummary[];
68
+ conflicts: McpConfigConflict[];
69
+ hasAnyConfig: boolean;
70
+ hasAnyDetectedPaths: boolean;
71
+ hasSharedServers: boolean;
72
+ hasNexusOwnedServers: boolean;
73
+ totalServerCount: number;
74
+ fingerprint: string;
75
+ repoPrompt: RepoPromptDiscovery;
76
+ }
77
+ export interface McpStandardConfigSummary {
78
+ sources: ConfigDiscoverySource[];
79
+ hasSharedServers: boolean;
80
+ fingerprint: string;
81
+ }
82
+ export interface ConfigWritePreview {
83
+ path: string;
84
+ existed: boolean;
85
+ changed: boolean;
86
+ beforeText: string;
87
+ afterText: string;
88
+ diffText: string;
89
+ }
90
+ export declare function getNexusGlobalConfigPath(overridePath?: string): string;
91
+ export declare function getGenericGlobalConfigPath(): string;
92
+ export declare function getProjectConfigPath(cwd?: string): string;
93
+ export declare function getProjectNexusConfigPath(cwd?: string): string;
94
+ export declare function getConfigDiscoveryPaths(overridePath?: string, cwd?: string): ConfigDiscoveryPath[];
95
+ export declare function findAvailableImportConfigs(cwd?: string): DiscoveredImportConfig[];
96
+ export declare function getMcpStandardConfigSummary(overridePath?: string, cwd?: string): McpStandardConfigSummary;
97
+ export declare function getMcpDiscoverySummary(overridePath?: string, cwd?: string, options?: {
98
+ includeHostConfigs?: boolean;
99
+ }): McpDiscoverySummary;
100
+ export declare function cloneMcpConfig(config: McpConfig): McpConfig;
101
+ export declare function loadMcpConfig(overridePath?: string, cwd?: string, includeProject?: boolean): McpConfig;
102
+ export interface ServerDisabledOverrideResult {
103
+ path: string;
104
+ changed: boolean;
105
+ }
1
106
  /**
2
- * MCP server configuration.
3
- *
4
- * The file format is Claude Code's `mcpServers` map, deliberately: users
5
- * already have these configs, and copying one over should just work. A server
6
- * is stdio when it has `command` and HTTP when it has `url`.
7
- *
8
- * Project config wins over user config for the same server name, so a repo can
9
- * pin a server its contributors need without editing anyone's home directory.
107
+ * Persist only the disabled field in the project Nexus layer. Enabling writes an
108
+ * explicit false only when a lower-precedence source is itself disabled; this
109
+ * writer never copies a server definition or its credentials into the file.
10
110
  */
11
- export interface McpStdioServer {
12
- type: "stdio";
13
- name: string;
14
- command: string;
15
- args: string[];
16
- env: Record<string, string>;
17
- cwd?: string;
18
- enabled: boolean;
19
- }
20
- export interface McpHttpServer {
21
- type: "http";
22
- name: string;
23
- url: string;
24
- headers: Record<string, string>;
25
- enabled: boolean;
26
- }
27
- export type McpServerConfig = McpStdioServer | McpHttpServer;
28
- export interface McpConfigResult {
29
- servers: McpServerConfig[];
30
- /** Human-readable problems; surfaced rather than thrown, so one bad entry cannot block startup. */
31
- diagnostics: string[];
32
- }
33
- /** Parse one `mcpServers` entry. Returns a diagnostic string when unusable. */
34
- export declare function parseServerEntry(name: string, raw: unknown): McpServerConfig | string;
35
- /** Parse a whole config document. */
36
- export declare function parseMcpConfig(text: string, source: string): McpConfigResult;
37
- /** Config paths, lowest precedence first: user config, then this project's. */
38
- export declare function mcpConfigPaths(cwd: string, home?: string): string[];
39
- /** Load and merge user then project config. Later files win on name collisions. */
40
- export declare function loadMcpConfig(cwd: string, readFile?: (path: string) => string, home?: string): McpConfigResult;
111
+ export declare function writeProjectServerDisabledOverride(overridePath: string | undefined, cwd: string, serverName: string, disabled: boolean): ServerDisabledOverrideResult;
112
+ export declare function previewCompatibilityImports(importKinds: ImportKind[], overridePath?: string): ConfigWritePreview;
113
+ export declare function ensureCompatibilityImports(importKinds: ImportKind[], overridePath?: string): {
114
+ path: string;
115
+ added: ImportKind[];
116
+ };
117
+ export declare function buildStarterProjectConfig(): McpConfig;
118
+ export declare function previewStarterProjectConfig(cwd?: string): ConfigWritePreview;
119
+ export declare function writeStarterProjectConfig(cwd?: string): string;
120
+ export declare function previewSharedServerEntry(filePath: string, serverName: string, entry: ServerEntry): ConfigWritePreview;
121
+ export declare function writeSharedServerEntry(filePath: string, serverName: string, entry: ServerEntry): string;
122
+ export declare function getServerProvenance(overridePath?: string, cwd?: string): Map<string, ServerProvenance>;
123
+ export declare function writeDirectToolsConfig(changes: Map<string, true | string[] | false>, provenance: Map<string, ServerProvenance>): void;
124
+ export declare function resolveConfiguredOAuthDir(raw: unknown, cwd?: string): string | undefined;
125
+ export {};
41
126
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/config.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AAEH,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,aAAa,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mGAAmG;IACnG,WAAW,EAAE,MAAM,EAAE,CAAC;CACtB;AAWD,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,MAAM,CAyBrF;AAED,qCAAqC;AACrC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAkB5E;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,EAAE,CAE9E;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAA6C,EACzE,IAAI,CAAC,EAAE,MAAM,GACX,eAAe,CAejB","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\n\n/**\n * MCP server configuration.\n *\n * The file format is Claude Code's `mcpServers` map, deliberately: users\n * already have these configs, and copying one over should just work. A server\n * is stdio when it has `command` and HTTP when it has `url`.\n *\n * Project config wins over user config for the same server name, so a repo can\n * pin a server its contributors need without editing anyone's home directory.\n */\n\nexport interface McpStdioServer {\n\ttype: \"stdio\";\n\tname: string;\n\tcommand: string;\n\targs: string[];\n\tenv: Record<string, string>;\n\tcwd?: string;\n\tenabled: boolean;\n}\n\nexport interface McpHttpServer {\n\ttype: \"http\";\n\tname: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tenabled: boolean;\n}\n\nexport type McpServerConfig = McpStdioServer | McpHttpServer;\n\nexport interface McpConfigResult {\n\tservers: McpServerConfig[];\n\t/** Human-readable problems; surfaced rather than thrown, so one bad entry cannot block startup. */\n\tdiagnostics: string[];\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n\tif (!value || typeof value !== \"object\") return {};\n\tconst out: Record<string, string> = {};\n\tfor (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (typeof item === \"string\") out[key] = item;\n\t}\n\treturn out;\n}\n\n/** Parse one `mcpServers` entry. Returns a diagnostic string when unusable. */\nexport function parseServerEntry(name: string, raw: unknown): McpServerConfig | string {\n\tif (!raw || typeof raw !== \"object\") return `MCP server \"${name}\": entry is not an object`;\n\tconst entry = raw as Record<string, unknown>;\n\t// `disabled` is the Claude Code spelling; accept `enabled` too so either reads naturally.\n\tconst enabled = entry.disabled === true ? false : entry.enabled !== false;\n\n\tif (typeof entry.command === \"string\" && entry.command.trim()) {\n\t\treturn {\n\t\t\ttype: \"stdio\",\n\t\t\tname,\n\t\t\tcommand: entry.command.trim(),\n\t\t\targs: Array.isArray(entry.args) ? entry.args.filter((a): a is string => typeof a === \"string\") : [],\n\t\t\tenv: stringRecord(entry.env),\n\t\t\tcwd: typeof entry.cwd === \"string\" ? entry.cwd : undefined,\n\t\t\tenabled,\n\t\t};\n\t}\n\n\tconst url =\n\t\ttypeof entry.url === \"string\" ? entry.url : typeof entry.httpUrl === \"string\" ? entry.httpUrl : undefined;\n\tif (url?.trim()) {\n\t\treturn { type: \"http\", name, url: url.trim(), headers: stringRecord(entry.headers), enabled };\n\t}\n\n\treturn `MCP server \"${name}\": needs either \"command\" (stdio) or \"url\" (http)`;\n}\n\n/** Parse a whole config document. */\nexport function parseMcpConfig(text: string, source: string): McpConfigResult {\n\tconst diagnostics: string[] = [];\n\tlet document: unknown;\n\ttry {\n\t\tdocument = JSON.parse(text);\n\t} catch (error) {\n\t\treturn { servers: [], diagnostics: [`${source}: ${error instanceof Error ? error.message : String(error)}`] };\n\t}\n\tconst map = (document as { mcpServers?: unknown } | null)?.mcpServers;\n\tif (!map || typeof map !== \"object\") return { servers: [], diagnostics };\n\n\tconst servers: McpServerConfig[] = [];\n\tfor (const [name, raw] of Object.entries(map as Record<string, unknown>)) {\n\t\tconst parsed = parseServerEntry(name, raw);\n\t\tif (typeof parsed === \"string\") diagnostics.push(`${source}: ${parsed}`);\n\t\telse servers.push(parsed);\n\t}\n\treturn { servers, diagnostics };\n}\n\n/** Config paths, lowest precedence first: user config, then this project's. */\nexport function mcpConfigPaths(cwd: string, home: string = homedir()): string[] {\n\treturn [join(home, \".config\", \"nexus\", \"mcp.json\"), join(cwd, CONFIG_DIR_NAME, \"mcp.json\")];\n}\n\n/** Load and merge user then project config. Later files win on name collisions. */\nexport function loadMcpConfig(\n\tcwd: string,\n\treadFile: (path: string) => string = (path) => readFileSync(path, \"utf8\"),\n\thome?: string,\n): McpConfigResult {\n\tconst byName = new Map<string, McpServerConfig>();\n\tconst diagnostics: string[] = [];\n\tfor (const path of mcpConfigPaths(cwd, home)) {\n\t\tlet text: string;\n\t\ttry {\n\t\t\ttext = readFile(path);\n\t\t} catch {\n\t\t\tcontinue; // Absent config is the normal case, not an error.\n\t\t}\n\t\tconst parsed = parseMcpConfig(text, path);\n\t\tdiagnostics.push(...parsed.diagnostics);\n\t\tfor (const server of parsed.servers) byName.set(server.name, server);\n\t}\n\treturn { servers: [...byName.values()], diagnostics };\n}\n"]}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["// config.ts - Config loading with import support\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse as parseToml } from \"smol-toml\";\nimport stripJsonComments from \"strip-json-comments\";\nimport { getConfigDirName } from \"./agent-dir.ts\";\nimport { type AgentPluginSummary, getAgentPluginSummaries, loadAgentPluginConfigs } from \"./agent-plugin-loader.ts\";\nimport { loadPackageMcpConfigs } from \"./package-mcp-loader.ts\";\nimport {\n\ttype HostConfigDiscovery,\n\ttype ImportKind,\n\tisServerDisabled,\n\ttype McpConfig,\n\ttype McpSettings,\n\ttype ServerEntry,\n\ttype ServerProvenance,\n} from \"./types.ts\";\nimport { toStringRecord } from \"./utils.ts\";\n\nconst NEXUS_GLOBAL_CONFIG_PATH = join(homedir(), \".config\", \"nexus\", \"mcp.json\");\nconst PROJECT_CONFIG_NAME = \"mcp.json\";\nconst REPOPROMPT_BINARY_CANDIDATES = [\n\tjoin(homedir(), \"RepoPrompt\", \"repoprompt_cli\"),\n\t\"/Applications/Repo Prompt.app/Contents/MacOS/repoprompt-mcp\",\n];\n\nexport interface KnownServerPreset {\n\tid: string;\n\tname: string;\n\tsummary: string;\n\tentry: ServerEntry;\n\t/** Optional \"learn more\" link shown in the setup panel. Not used for anything functional. */\n\tdocsUrl?: string;\n}\n\nexport const KNOWN_SERVER_PRESETS: readonly KnownServerPreset[] = [\n\t{\n\t\tid: \"deepwiki\",\n\t\tname: \"DeepWiki\",\n\t\tsummary: \"Ask questions about public GitHub repositories.\",\n\t\tentry: { url: \"https://mcp.deepwiki.com/mcp\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://docs.devin.ai/work-with-devin/deepwiki-mcp\",\n\t},\n\t{\n\t\tid: \"context7\",\n\t\tname: \"Context7\",\n\t\tsummary: \"Look up current library documentation and examples.\",\n\t\tentry: { url: \"https://mcp.context7.com/mcp\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://context7.com\",\n\t},\n\t{\n\t\tid: \"notion\",\n\t\tname: \"Notion\",\n\t\tsummary: \"Search and work with your Notion workspace.\",\n\t\tentry: { url: \"https://mcp.notion.com/mcp\", auth: \"oauth\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://developers.notion.com/docs/mcp\",\n\t},\n\t{\n\t\tid: \"github\",\n\t\tname: \"GitHub\",\n\t\tsummary: \"Work with GitHub through your Copilot account.\",\n\t\tentry: { url: \"https://api.githubcopilot.com/mcp\", auth: \"oauth\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://github.com/github/github-mcp-server\",\n\t},\n\t{\n\t\tid: \"chrome-devtools\",\n\t\tname: \"Chrome DevTools\",\n\t\tsummary: \"Inspect and automate a local Chrome browser.\",\n\t\tentry: { command: \"npx\", args: [\"-y\", \"chrome-devtools-mcp@1.6.0\"] },\n\t\tdocsUrl: \"https://github.com/ChromeDevTools/chrome-devtools-mcp\",\n\t},\n];\n\nconst IMPORT_PATHS: Record<ImportKind, string[]> = {\n\tcursor: [join(homedir(), \".cursor\", \"mcp.json\")],\n\t\"claude-code\": [\n\t\tjoin(homedir(), \".claude\", \"mcp.json\"),\n\t\tjoin(homedir(), \".claude.json\"),\n\t\tjoin(homedir(), \".claude\", \"claude_desktop_config.json\"),\n\t],\n\t\"claude-desktop\": [join(homedir(), \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")],\n\tcodex: [join(homedir(), \".codex\", \"config.toml\"), join(homedir(), \".codex\", \"config.json\")],\n\topencode: [join(homedir(), \".config\", \"opencode\", \"opencode.json\"), \"./opencode.json\"],\n\twindsurf: [join(homedir(), \".windsurf\", \"mcp.json\")],\n\tvscode: [\".vscode/mcp.json\"],\n};\n\ninterface ConfigSourceSpec {\n\tid: \"nexus-global\" | \"nexus-project\";\n\tlabel: string;\n\treadPath: string;\n\twritePath: string;\n\tkind: \"user\" | \"project\" | \"import\";\n\timportKind?: string;\n\tshared: boolean;\n\tscope: \"global\" | \"project\";\n}\n\nexport interface ConfigDiscoveryPath {\n\tlabel: string;\n\tpath: string;\n\texists: boolean;\n}\n\nexport interface DiscoveredImportConfig {\n\tkind: ImportKind;\n\tpath: string;\n}\n\nexport interface ConfigDiscoverySource extends ConfigDiscoveryPath {\n\tid: ConfigSourceSpec[\"id\"];\n\tscope: ConfigSourceSpec[\"scope\"];\n\tkind: \"shared\" | \"nexus\";\n\tserverCount: number;\n}\n\nexport interface ImportConfigSummary extends DiscoveredImportConfig {\n\tserverCount: number;\n}\n\nexport interface HostConfigSummary extends ImportConfigSummary {\n\tactive: boolean;\n}\n\nexport interface McpConfigConflict {\n\tserverName: string;\n\tsources: Array<{ kind: \"shared\" | \"nexus\" | \"host\"; path: string }>;\n\twinner: { kind: \"shared\" | \"nexus\" | \"host\"; path: string };\n}\n\nexport interface RepoPromptDiscovery {\n\tconfigured: boolean;\n\tconfiguredPath?: string;\n\texecutablePath?: string;\n\ttargetPath?: string;\n\tserverName?: string;\n\tentry?: ServerEntry;\n}\n\nexport interface McpDiscoverySummary {\n\tsources: ConfigDiscoverySource[];\n\timports: ImportConfigSummary[];\n\thostConfigs: HostConfigSummary[];\n\thostConfigDiscovery: HostConfigDiscovery;\n\tagentPlugins: AgentPluginSummary[];\n\tconflicts: McpConfigConflict[];\n\thasAnyConfig: boolean;\n\thasAnyDetectedPaths: boolean;\n\thasSharedServers: boolean;\n\thasNexusOwnedServers: boolean;\n\ttotalServerCount: number;\n\tfingerprint: string;\n\trepoPrompt: RepoPromptDiscovery;\n}\n\nexport interface McpStandardConfigSummary {\n\tsources: ConfigDiscoverySource[];\n\thasSharedServers: boolean;\n\tfingerprint: string;\n}\n\nexport interface ConfigWritePreview {\n\tpath: string;\n\texisted: boolean;\n\tchanged: boolean;\n\tbeforeText: string;\n\tafterText: string;\n\tdiffText: string;\n}\n\nexport function getNexusGlobalConfigPath(overridePath?: string): string {\n\treturn overridePath ? resolve(overridePath) : NEXUS_GLOBAL_CONFIG_PATH;\n}\n\nexport function getGenericGlobalConfigPath(): string {\n\treturn NEXUS_GLOBAL_CONFIG_PATH;\n}\n\nexport function getProjectConfigPath(cwd = process.cwd()): string {\n\treturn resolve(cwd, getConfigDirName(), PROJECT_CONFIG_NAME);\n}\n\nexport function getProjectNexusConfigPath(cwd = process.cwd()): string {\n\treturn getProjectConfigPath(cwd);\n}\n\nexport function getConfigDiscoveryPaths(overridePath?: string, cwd = process.cwd()): ConfigDiscoveryPath[] {\n\treturn getConfigSources(overridePath, cwd).map((source) => ({\n\t\tlabel: source.label,\n\t\tpath: source.readPath,\n\t\texists: existsSync(source.readPath),\n\t}));\n}\n\nexport function findAvailableImportConfigs(cwd = process.cwd()): DiscoveredImportConfig[] {\n\tconst discovered: DiscoveredImportConfig[] = [];\n\n\tfor (const importKind of Object.keys(IMPORT_PATHS) as ImportKind[]) {\n\t\tconst importPath = resolveImportPath(importKind, cwd);\n\t\tif (importPath) {\n\t\t\tdiscovered.push({ kind: importKind, path: importPath });\n\t\t}\n\t}\n\n\treturn discovered;\n}\n\nfunction getConfigSourceSummaries(sourceSpecs: ConfigSourceSpec[]): ConfigDiscoverySource[] {\n\treturn sourceSpecs.map((source) => {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\treturn {\n\t\t\tid: source.id,\n\t\t\tlabel: source.label,\n\t\t\tpath: source.readPath,\n\t\t\texists: existsSync(source.readPath),\n\t\t\tscope: source.scope,\n\t\t\tkind: source.shared ? \"shared\" : \"nexus\",\n\t\t\tserverCount: loaded ? Object.keys(loaded.mcpServers).length : 0,\n\t\t} satisfies ConfigDiscoverySource;\n\t});\n}\n\nexport function getMcpStandardConfigSummary(overridePath?: string, cwd = process.cwd()): McpStandardConfigSummary {\n\tconst sources = getConfigSourceSummaries(getConfigSources(overridePath, cwd));\n\treturn {\n\t\tsources,\n\t\thasSharedServers: sources.some((source) => source.kind === \"shared\" && source.serverCount > 0),\n\t\tfingerprint: JSON.stringify({ sources: sources.map((source) => [source.id, source.exists, source.serverCount]) }),\n\t};\n}\n\nexport function getMcpDiscoverySummary(\n\toverridePath?: string,\n\tcwd = process.cwd(),\n\toptions: { includeHostConfigs?: boolean } = {},\n): McpDiscoverySummary {\n\tconst sourceSpecs = getConfigSources(overridePath, cwd);\n\tconst sources = getConfigSourceSummaries(sourceSpecs);\n\tconst includeHostConfigs = options.includeHostConfigs !== false;\n\n\tconst imports = includeHostConfigs\n\t\t? (Object.keys(IMPORT_PATHS) as ImportKind[])\n\t\t\t\t.map((kind) => {\n\t\t\t\t\tconst imported = loadImportedConfig(kind, cwd, `Failed to inspect imported MCP config from ${kind}:`);\n\t\t\t\t\tif (!imported) return null;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tpath: imported.path,\n\t\t\t\t\t\tserverCount: Object.keys(extractServers(imported.value, kind)).length,\n\t\t\t\t\t} satisfies ImportConfigSummary;\n\t\t\t\t})\n\t\t\t\t.filter((value): value is ImportConfigSummary => value !== null)\n\t\t: [];\n\tconst hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd);\n\tconst hostConfigs = imports.map((entry) => ({ ...entry, active: hostConfigDiscovery === \"on\" }));\n\tconst settings = getMergedSettings(overridePath, cwd);\n\tconst agentPlugins = getAgentPluginSummaries(settings?.agentPluginPaths, cwd);\n\tconst totalServerCount =\n\t\tsources.reduce((sum, source) => sum + source.serverCount, 0) +\n\t\tagentPlugins.reduce((sum, plugin) => sum + plugin.serverCount, 0);\n\tconst hasSharedServers =\n\t\tsources.some((source) => source.kind === \"shared\" && source.serverCount > 0) ||\n\t\tagentPlugins.some((plugin) => plugin.serverCount > 0);\n\tconst hasNexusOwnedServers = sources.some((source) => source.kind === \"nexus\" && source.serverCount > 0);\n\tconst hasAnyDetectedPaths = sources.some((source) => source.exists) || imports.length > 0 || agentPlugins.length > 0;\n\tconst hasAnyConfig = totalServerCount > 0 || imports.some((entry) => entry.serverCount > 0) || hasAnyDetectedPaths;\n\n\tconst summaryWithoutRepoPrompt = {\n\t\tsources,\n\t\timports,\n\t\thostConfigs,\n\t\thostConfigDiscovery,\n\t\tagentPlugins,\n\t\tconflicts: getConfigConflicts(sourceSpecs, imports, cwd),\n\t\thasAnyConfig,\n\t\thasAnyDetectedPaths,\n\t\thasSharedServers,\n\t\thasNexusOwnedServers,\n\t\ttotalServerCount,\n\t};\n\n\tconst fingerprint = JSON.stringify({\n\t\tsources: sources.map((source) => [source.id, source.exists, source.serverCount]),\n\t\timports: imports.map((entry) => [entry.kind, entry.path, entry.serverCount]),\n\t\tagentPlugins: agentPlugins.map((entry) => [entry.path, entry.name, entry.serverCount]),\n\t\thostConfigDiscovery,\n\t\tconflicts: summaryWithoutRepoPrompt.conflicts,\n\t});\n\n\treturn {\n\t\t...summaryWithoutRepoPrompt,\n\t\tfingerprint,\n\t\trepoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd),\n\t};\n}\n\nexport function cloneMcpConfig(config: McpConfig): McpConfig {\n\treturn structuredClone(config);\n}\n\nexport function loadMcpConfig(overridePath?: string, cwd = process.cwd(), includeProject = true): McpConfig {\n\tconst sourceSpecs = getConfigSources(overridePath, cwd, includeProject);\n\tconst hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd, includeProject);\n\t// Host files are a lower-precedence fallback. This ordering means an opt-in\n\t// discovery cannot override a shared or Nexus-owned definition, and all normal\n\t// URL-bound credential stripping remains in mergeServerMaps.\n\tlet config: McpConfig = hostConfigDiscovery === \"on\" ? loadDiscoveredHostConfigs(cwd) : { mcpServers: {} };\n\n\tfor (const source of sourceSpecs) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (!loaded) continue;\n\t\tconfig = mergeConfigs(config, expandImports(loaded, cwd));\n\t}\n\n\tconst packageConfig = loadPackageMcpConfigs(cwd, includeProject);\n\tconst pluginConfig = loadAgentPluginConfigs(config.settings?.agentPluginPaths, cwd);\n\tconst packageServers = Object.fromEntries(\n\t\tObject.entries(packageConfig.mcpServers).filter(([name]) => !Object.hasOwn(pluginConfig.mcpServers, name)),\n\t);\n\treturn mergeConfigs({ mcpServers: packageServers }, mergeConfigs(pluginConfig, config));\n}\n\nfunction getMergedSettings(overridePath?: string, cwd = process.cwd(), includeProject = true): McpSettings | undefined {\n\tlet settings: McpSettings | undefined;\n\tfor (const source of getConfigSources(overridePath, cwd, includeProject)) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (loaded?.settings) settings = { ...settings, ...loaded.settings };\n\t}\n\treturn settings;\n}\n\nfunction getConfiguredHostConfigDiscovery(\n\toverridePath?: string,\n\tcwd = process.cwd(),\n\tincludeProject = true,\n): HostConfigDiscovery {\n\tlet configured: HostConfigDiscovery = \"off\";\n\tconst settings = getMergedSettings(overridePath, cwd, includeProject);\n\tconst value = settings?.hostConfigDiscovery;\n\tif (value === \"off\" || value === \"prompt\" || value === \"on\") configured = value;\n\treturn configured;\n}\n\nfunction loadDiscoveredHostConfigs(cwd: string): McpConfig {\n\tlet config: McpConfig = { mcpServers: {} };\n\tfor (const importKind of Object.keys(IMPORT_PATHS) as ImportKind[]) {\n\t\tconst imported = loadImportedConfig(\n\t\t\timportKind,\n\t\t\tcwd,\n\t\t\t`Failed to discover imported MCP config from ${importKind}:`,\n\t\t);\n\t\tif (!imported) continue;\n\t\tconfig = mergeConfigs(config, {\n\t\t\tmcpServers: extractServers(imported.value, importKind),\n\t\t});\n\t}\n\treturn config;\n}\n\nfunction getConfigConflicts(\n\tsourceSpecs: ConfigSourceSpec[],\n\timports: ImportConfigSummary[],\n\tcwd: string,\n): McpConfigConflict[] {\n\tconst seen = new Map<string, Array<{ kind: \"shared\" | \"nexus\" | \"host\"; path: string }>>();\n\tconst record = (name: string, source: { kind: \"shared\" | \"nexus\" | \"host\"; path: string }): void => {\n\t\tconst entries = seen.get(name) ?? [];\n\t\tif (!entries.some((entry) => entry.kind === source.kind && entry.path === source.path)) entries.push(source);\n\t\tseen.set(name, entries);\n\t};\n\n\t// Host candidates are listed first because, when enabled, they are the\n\t// lowest-precedence fallback. The fixed IMPORT_PATHS order is deterministic.\n\tfor (const entry of imports) {\n\t\tconst imported = loadImportedConfig(entry.kind, cwd, `Failed to inspect imported MCP config from ${entry.kind}:`);\n\t\tif (!imported) continue;\n\t\tfor (const name of Object.keys(extractServers(imported.value, entry.kind))) {\n\t\t\trecord(name, { kind: \"host\", path: imported.path });\n\t\t}\n\t}\n\tfor (const source of sourceSpecs) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (!loaded) continue;\n\t\tif (loaded.imports?.length) {\n\t\t\tfor (const importKind of loaded.imports) {\n\t\t\t\tconst imported = loadImportedConfig(\n\t\t\t\t\timportKind,\n\t\t\t\t\tcwd,\n\t\t\t\t\t`Failed to inspect imported MCP config from ${importKind}:`,\n\t\t\t\t);\n\t\t\t\tif (!imported) continue;\n\t\t\t\tfor (const name of Object.keys(extractServers(imported.value, importKind))) {\n\t\t\t\t\trecord(name, { kind: \"host\", path: imported.path });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const name of Object.keys(loaded.mcpServers)) {\n\t\t\trecord(name, {\n\t\t\t\tkind: source.shared ? \"shared\" : \"nexus\",\n\t\t\t\tpath: source.readPath,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn [...seen.entries()]\n\t\t.filter(([, sources]) => sources.length > 1)\n\t\t.map(([serverName, sources]) => ({ serverName, sources, winner: sources[sources.length - 1]! }))\n\t\t.sort((left, right) => left.serverName.localeCompare(right.serverName));\n}\n\nfunction getConfigSources(overridePath?: string, cwd = process.cwd(), includeProject = true): ConfigSourceSpec[] {\n\tconst userPath = getNexusGlobalConfigPath(overridePath);\n\tconst sources: ConfigSourceSpec[] = [\n\t\t{\n\t\t\tid: \"nexus-global\",\n\t\t\tlabel: \"Nexus global MCP\",\n\t\t\treadPath: userPath,\n\t\t\twritePath: userPath,\n\t\t\tkind: \"user\",\n\t\t\tshared: false,\n\t\t\tscope: \"global\",\n\t\t},\n\t];\n\n\tconst projectPath = getProjectConfigPath(cwd);\n\tif (includeProject && projectPath !== userPath) {\n\t\tsources.push({\n\t\t\tid: \"nexus-project\",\n\t\t\tlabel: \"Nexus project MCP\",\n\t\t\treadPath: projectPath,\n\t\t\twritePath: projectPath,\n\t\t\tkind: \"project\",\n\t\t\tshared: false,\n\t\t\tscope: \"project\",\n\t\t});\n\t}\n\n\treturn sources;\n}\n\nfunction mergeConfigs(base: McpConfig, next: McpConfig): McpConfig {\n\tconst imports = mergeImports(base.imports, next.imports);\n\tconst settings = next.settings ? { ...base.settings, ...next.settings } : base.settings;\n\treturn {\n\t\tmcpServers: mergeServerMaps(base.mcpServers, next.mcpServers),\n\t\t...(imports !== undefined ? { imports } : {}),\n\t\t...(settings !== undefined ? { settings } : {}),\n\t};\n}\n\n// Credential-bearing fields whose value is bound to a specific server `url`.\n// When a higher-precedence config source repoints an existing server at a\n// different url, these MUST NOT be inherited from the lower-precedence entry —\n// otherwise the original endpoint's credentials would be shipped to the new\n// url. See the SECURITY note in mergeServerMaps.\nconst URL_BOUND_AUTH_FIELDS = [\n\t\"headers\",\n\t\"bearerToken\",\n\t\"bearerTokenEnv\",\n\t\"bearerTokenStore\",\n\t\"requestHeadersCommand\",\n] as const;\n\nfunction mergeServerMaps(\n\tbase: Record<string, ServerEntry>,\n\tnext: Record<string, ServerEntry>,\n): Record<string, ServerEntry> {\n\tconst merged = { ...base };\n\tfor (const [name, definition] of Object.entries(next)) {\n\t\tconst existing = merged[name];\n\t\t// SECURITY (credential/url binding): the merge is per-field, so a\n\t\t// higher-precedence source that supplies only a new `url` for an existing\n\t\t// server would otherwise retain the lower-precedence entry's auth material\n\t\t// (Authorization header, bearer token, OAuth config) and send it to the new\n\t\t// url — a credential-exfiltration vector when the higher-precedence source\n\t\t// is less trusted than the one that first defined the server. Bind auth to\n\t\t// the url that supplied it: when the url changes, drop inherited auth\n\t\t// material before merging. Auth explicitly re-supplied by `definition` still\n\t\t// applies (it is spread last). Behaviour is unchanged when the url is\n\t\t// identical or the override omits `url` (partial overrides still inherit).\n\t\tlet baseEntry: ServerEntry = existing ?? {};\n\t\tif (existing && typeof definition.command === \"string\") {\n\t\t\tbaseEntry = { ...existing };\n\t\t\tfor (const field of [\n\t\t\t\t\"url\",\n\t\t\t\t\"headers\",\n\t\t\t\t\"requestHeadersCommand\",\n\t\t\t\t\"auth\",\n\t\t\t\t\"bearerToken\",\n\t\t\t\t\"bearerTokenEnv\",\n\t\t\t\t\"oauth\",\n\t\t\t\t\"httpTransport\",\n\t\t\t\t\"socket\",\n\t\t\t] as const) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t} else if (existing && typeof definition.url === \"string\") {\n\t\t\tbaseEntry = { ...existing };\n\t\t\tfor (const field of [\"command\", \"args\", \"env\", \"cwd\", \"pluginDataDir\", \"literalEnv\", \"socket\"] as const) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t} else if (existing && typeof definition.socket === \"string\") {\n\t\t\tbaseEntry = { ...existing };\n\t\t\tfor (const field of [\n\t\t\t\t\"command\",\n\t\t\t\t\"args\",\n\t\t\t\t\"env\",\n\t\t\t\t\"cwd\",\n\t\t\t\t\"pluginDataDir\",\n\t\t\t\t\"literalEnv\",\n\t\t\t\t\"url\",\n\t\t\t\t\"headers\",\n\t\t\t\t\"requestHeadersCommand\",\n\t\t\t\t\"auth\",\n\t\t\t\t\"bearerToken\",\n\t\t\t\t\"bearerTokenEnv\",\n\t\t\t\t\"oauth\",\n\t\t\t\t\"httpTransport\",\n\t\t\t] as const) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t}\n\t\tif (existing && typeof definition.url === \"string\" && definition.url !== existing.url) {\n\t\t\tif (baseEntry === existing) baseEntry = { ...existing };\n\t\t\tfor (const field of URL_BOUND_AUTH_FIELDS) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t\tif (baseEntry.oauth !== false) {\n\t\t\t\tdelete baseEntry.oauth;\n\t\t\t}\n\t\t}\n\t\tmerged[name] = { ...baseEntry, ...definition };\n\t}\n\treturn merged;\n}\n\nfunction mergeImports(left: ImportKind[] | undefined, right: ImportKind[] | undefined): ImportKind[] | undefined {\n\tconst merged = [...(left ?? []), ...(right ?? [])];\n\tif (merged.length === 0) return undefined;\n\treturn [...new Set(merged)];\n}\n\nfunction expandImports(config: McpConfig, cwd = process.cwd()): McpConfig {\n\tif (!config.imports?.length) return config;\n\n\tconst importedServers: Record<string, ServerEntry> = {};\n\tfor (const importKind of config.imports) {\n\t\tconst imported = loadImportedConfig(importKind, cwd, `Failed to import MCP config from ${importKind}:`);\n\t\tif (!imported) continue;\n\n\t\tconst servers = extractServers(imported.value, importKind);\n\t\tfor (const [name, definition] of Object.entries(servers)) {\n\t\t\tif (!importedServers[name]) {\n\t\t\t\timportedServers[name] = definition;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\timports: config.imports,\n\t\t...(config.settings !== undefined ? { settings: config.settings } : {}),\n\t\tmcpServers: mergeServerMaps(importedServers, config.mcpServers),\n\t};\n}\n\nfunction resolveImportCandidates(importKind: ImportKind, cwd: string): string[] {\n\treturn (IMPORT_PATHS[importKind] ?? []).map((candidate) => {\n\t\tif (importKind === \"opencode\" && candidate === \"./opencode.json\") {\n\t\t\tconst start = resolve(cwd);\n\t\t\tlet gitRoot: string | undefined;\n\t\t\tlet current = start;\n\t\t\twhile (true) {\n\t\t\t\tif (existsSync(join(current, \".git\"))) {\n\t\t\t\t\tgitRoot = current;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst parent = dirname(current);\n\t\t\t\tif (parent === current) break;\n\t\t\t\tcurrent = parent;\n\t\t\t}\n\n\t\t\tif (!gitRoot) return join(start, \"opencode.json\");\n\t\t\tcurrent = start;\n\t\t\twhile (true) {\n\t\t\t\tconst projectConfig = join(current, \"opencode.json\");\n\t\t\t\tif (existsSync(projectConfig) || current === gitRoot) return projectConfig;\n\t\t\t\tcurrent = dirname(current);\n\t\t\t}\n\t\t}\n\t\treturn candidate.startsWith(\".\") ? resolve(cwd, candidate) : candidate;\n\t});\n}\n\nfunction parseJsonConfig(raw: string): unknown {\n\treturn JSON.parse(stripJsonComments(raw, { trailingCommas: true }));\n}\n\nfunction readImportedConfig(path: string): unknown {\n\tconst raw = readFileSync(path, \"utf-8\");\n\treturn path.endsWith(\".toml\") ? parseToml(raw) : parseJsonConfig(raw);\n}\n\nfunction loadImportedConfig(\n\timportKind: ImportKind,\n\tcwd: string,\n\twarningPrefix: string,\n): { path: string; value: unknown } | null {\n\tif (importKind === \"opencode\") {\n\t\tlet merged: Record<string, unknown> = {};\n\t\tlet highestPrecedencePath: string | undefined;\n\n\t\tfor (const path of resolveImportCandidates(importKind, cwd)) {\n\t\t\tif (!existsSync(path)) continue;\n\n\t\t\ttry {\n\t\t\t\tconst value = readImportedConfig(path);\n\t\t\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\t\t\tmerged = mergeOpenCodeConfigs(merged, value as Record<string, unknown>);\n\t\t\t\t\thighestPrecedencePath = path;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(warningPrefix, error);\n\t\t\t}\n\t\t}\n\n\t\treturn highestPrecedencePath ? { path: highestPrecedencePath, value: merged } : null;\n\t}\n\n\tfor (const path of resolveImportCandidates(importKind, cwd)) {\n\t\tif (!existsSync(path)) continue;\n\n\t\ttry {\n\t\t\treturn { path, value: readImportedConfig(path) };\n\t\t} catch (error) {\n\t\t\tconsole.warn(warningPrefix, error);\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction resolveImportPath(importKind: ImportKind, cwd = process.cwd()): string | null {\n\treturn (\n\t\tloadImportedConfig(importKind, cwd, `Failed to discover imported MCP config from ${importKind}:`)?.path ?? null\n\t);\n}\n\nfunction readValidatedConfig(path: string, label: string): McpConfig | null {\n\tif (!existsSync(path)) return null;\n\n\ttry {\n\t\treturn validateConfig(parseJsonConfig(readFileSync(path, \"utf-8\")));\n\t} catch (error) {\n\t\tconsole.warn(`Failed to load ${label}:`, error);\n\t\treturn null;\n\t}\n}\n\nfunction validateConfig(raw: unknown): McpConfig {\n\tif (!isRecord(raw)) {\n\t\treturn { mcpServers: {} };\n\t}\n\n\treturn {\n\t\tmcpServers: toServerEntries(raw.mcpServers ?? raw[\"mcp-servers\"]),\n\t\t...(Array.isArray(raw.imports) ? { imports: raw.imports as ImportKind[] } : {}),\n\t\t...(raw.settings !== undefined ? { settings: raw.settings as McpSettings } : {}),\n\t};\n}\n\nfunction toServerEntries(servers: unknown): Record<string, ServerEntry> {\n\tif (!isRecord(servers)) return {};\n\tconst entries: Record<string, ServerEntry> = {};\n\tfor (const [name, entry] of Object.entries(servers)) {\n\t\tif (isServerEntry(entry)) entries[name] = entry;\n\t}\n\treturn entries;\n}\n\nfunction isServerEntry(value: unknown): value is ServerEntry {\n\treturn isRecord(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeOpenCodeConfigs(base: Record<string, unknown>, next: Record<string, unknown>): Record<string, unknown> {\n\tconst baseMcp = base.mcp;\n\tconst nextMcp = next.mcp;\n\tconst mergedMcp: Record<string, unknown> = {\n\t\t...(baseMcp && typeof baseMcp === \"object\" && !Array.isArray(baseMcp) ? baseMcp : {}),\n\t};\n\n\tif (nextMcp && typeof nextMcp === \"object\" && !Array.isArray(nextMcp)) {\n\t\tfor (const [name, nextEntry] of Object.entries(nextMcp)) {\n\t\t\tconst baseEntry = mergedMcp[name];\n\t\t\tif (\n\t\t\t\tbaseEntry &&\n\t\t\t\ttypeof baseEntry === \"object\" &&\n\t\t\t\t!Array.isArray(baseEntry) &&\n\t\t\t\tnextEntry &&\n\t\t\t\ttypeof nextEntry === \"object\" &&\n\t\t\t\t!Array.isArray(nextEntry)\n\t\t\t) {\n\t\t\t\tconst safeBase = { ...(baseEntry as Record<string, unknown>) };\n\t\t\t\tconst override = nextEntry as Record<string, unknown>;\n\t\t\t\tif (typeof override.type === \"string\" && override.type !== safeBase.type) {\n\t\t\t\t\tfor (const field of [\"command\", \"environment\", \"cwd\", \"url\", \"headers\", \"auth\", \"oauth\"])\n\t\t\t\t\t\tdelete safeBase[field];\n\t\t\t\t}\n\t\t\t\tif (typeof override.url === \"string\" && override.url !== safeBase.url) {\n\t\t\t\t\tdelete safeBase.headers;\n\t\t\t\t\tdelete safeBase.auth;\n\t\t\t\t\tdelete safeBase.oauth;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(override.command)) {\n\t\t\t\t\tconst baseCommand = safeBase.command;\n\t\t\t\t\tconst commandChanged =\n\t\t\t\t\t\t!Array.isArray(baseCommand) ||\n\t\t\t\t\t\toverride.command.length !== baseCommand.length ||\n\t\t\t\t\t\toverride.command.some((value, index) => value !== baseCommand[index]);\n\t\t\t\t\tif (commandChanged) {\n\t\t\t\t\t\tdelete safeBase.environment;\n\t\t\t\t\t\tdelete safeBase.cwd;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst mergedEntry = { ...safeBase, ...override };\n\t\t\t\tfor (const field of [\"environment\", \"headers\", \"oauth\"]) {\n\t\t\t\t\tconst baseField = safeBase[field];\n\t\t\t\t\tconst nextField = override[field];\n\t\t\t\t\tif (\n\t\t\t\t\t\tbaseField &&\n\t\t\t\t\t\ttypeof baseField === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(baseField) &&\n\t\t\t\t\t\tnextField &&\n\t\t\t\t\t\ttypeof nextField === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(nextField)\n\t\t\t\t\t) {\n\t\t\t\t\t\tmergedEntry[field] = {\n\t\t\t\t\t\t\t...(baseField as Record<string, unknown>),\n\t\t\t\t\t\t\t...(nextField as Record<string, unknown>),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmergedMcp[name] = mergedEntry;\n\t\t\t} else {\n\t\t\t\tmergedMcp[name] = nextEntry;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { ...base, ...next, mcp: mergedMcp };\n}\n\nfunction extractServers(config: unknown, kind: ImportKind): Record<string, ServerEntry> {\n\tif (!config || typeof config !== \"object\") return {};\n\n\tconst obj = config as Record<string, unknown>;\n\n\tlet servers: unknown;\n\tswitch (kind) {\n\t\tcase \"claude-desktop\":\n\t\tcase \"claude-code\":\n\t\t\tservers = obj.mcpServers;\n\t\t\tbreak;\n\t\tcase \"codex\":\n\t\t\tservers = obj.mcp_servers ?? obj.mcpServers;\n\t\t\tbreak;\n\t\tcase \"cursor\":\n\t\tcase \"windsurf\":\n\t\tcase \"vscode\":\n\t\t\tservers = obj.mcpServers ?? obj[\"mcp-servers\"];\n\t\t\tbreak;\n\t\tcase \"opencode\":\n\t\t\tservers = obj.mcp;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn {};\n\t}\n\n\tif (!servers || typeof servers !== \"object\" || Array.isArray(servers)) {\n\t\treturn {};\n\t}\n\n\tconst mappedServers: Record<string, ServerEntry> = {};\n\tfor (const [name, entry] of Object.entries(servers)) {\n\t\tif (kind === \"opencode\") {\n\t\t\tif (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n\t\t\tconst raw = entry as Record<string, unknown>;\n\t\t\tif (raw.enabled === false) continue;\n\n\t\t\tif (\n\t\t\t\traw.type === \"local\" &&\n\t\t\t\tArray.isArray(raw.command) &&\n\t\t\t\traw.command.length > 0 &&\n\t\t\t\traw.command.every((value): value is string => typeof value === \"string\")\n\t\t\t) {\n\t\t\t\tconst env = toStringRecord(raw.environment);\n\t\t\t\tconst command = raw.command[0];\n\t\t\t\tif (command === undefined) continue;\n\t\t\t\tconst mapped: ServerEntry = {\n\t\t\t\t\tcommand,\n\t\t\t\t\targs: raw.command.slice(1),\n\t\t\t\t\t...(env ? { env } : {}),\n\t\t\t\t\t...(typeof raw.cwd === \"string\" ? { cwd: raw.cwd } : {}),\n\t\t\t\t};\n\t\t\t\tmappedServers[name] = mapped;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (raw.type === \"remote\" && typeof raw.url === \"string\") {\n\t\t\t\tconst headers = toStringRecord(raw.headers);\n\t\t\t\tconst mapped: ServerEntry = {\n\t\t\t\t\turl: raw.url,\n\t\t\t\t\t...(headers ? { headers } : {}),\n\t\t\t\t};\n\t\t\t\tif (raw.oauth === false) {\n\t\t\t\t\tmapped.oauth = false;\n\t\t\t\t} else if (raw.oauth && typeof raw.oauth === \"object\" && !Array.isArray(raw.oauth)) {\n\t\t\t\t\tconst oauth = raw.oauth as Record<string, unknown>;\n\t\t\t\t\tmapped.auth = \"oauth\";\n\t\t\t\t\tmapped.oauth = {\n\t\t\t\t\t\t...(typeof oauth.clientId === \"string\" ? { clientId: oauth.clientId } : {}),\n\t\t\t\t\t\t...(typeof oauth.clientSecret === \"string\" ? { clientSecret: oauth.clientSecret } : {}),\n\t\t\t\t\t\t...(typeof oauth.scope === \"string\" ? { scope: oauth.scope } : {}),\n\t\t\t\t\t\t...(typeof oauth.skipIssuerMetadataValidation === \"boolean\"\n\t\t\t\t\t\t\t? { skipIssuerMetadataValidation: oauth.skipIssuerMetadataValidation }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tmappedServers[name] = mapped;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isRecord(entry)) continue;\n\t\tif (kind !== \"codex\") {\n\t\t\tmappedServers[name] = entry;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst mapped = { ...entry };\n\t\tconst bearerTokenEnv = mapped.bearer_token_env_var;\n\t\tconst httpHeaders = mapped.http_headers;\n\t\tconst envHttpHeaders = mapped.env_http_headers;\n\n\t\tif (typeof bearerTokenEnv === \"string\") {\n\t\t\tmapped.bearerTokenEnv = bearerTokenEnv;\n\t\t\tif (mapped.auth === undefined) mapped.auth = \"bearer\";\n\t\t}\n\t\tif (httpHeaders && typeof httpHeaders === \"object\" && !Array.isArray(httpHeaders)) {\n\t\t\tmapped.headers = {\n\t\t\t\t...(mapped.headers as Record<string, string> | undefined),\n\t\t\t\t...(httpHeaders as Record<string, string>),\n\t\t\t};\n\t\t}\n\t\tif (envHttpHeaders && typeof envHttpHeaders === \"object\" && !Array.isArray(envHttpHeaders)) {\n\t\t\tconst headers = { ...(mapped.headers as Record<string, string> | undefined) };\n\t\t\tfor (const [header, envVar] of Object.entries(envHttpHeaders)) {\n\t\t\t\tif (typeof envVar === \"string\" && headers[header] === undefined) headers[header] = `$env:${envVar}`;\n\t\t\t}\n\t\t\tmapped.headers = headers;\n\t\t}\n\n\t\tdelete mapped.bearer_token_env_var;\n\t\tdelete mapped.http_headers;\n\t\tdelete mapped.env_http_headers;\n\t\tmappedServers[name] = mapped as ServerEntry;\n\t}\n\n\treturn mappedServers;\n}\n\nfunction serializeRawConfig(raw: Record<string, unknown>): string {\n\treturn `${JSON.stringify(raw, null, 2)}\\n`;\n}\n\nfunction buildUnifiedDiff(beforeText: string, afterText: string): string {\n\tif (beforeText === afterText) return \"(no changes)\";\n\n\tconst before = beforeText.split(\"\\n\");\n\tconst after = afterText.split(\"\\n\");\n\tconst rows = before.length;\n\tconst cols = after.length;\n\tconst lcs = Array.from({ length: rows + 1 }, () => Array<number>(cols + 1).fill(0));\n\n\tfor (let i = rows - 1; i >= 0; i--) {\n\t\tfor (let j = cols - 1; j >= 0; j--) {\n\t\t\tconst row = lcs[i];\n\t\t\tconst nextRow = lcs[i + 1];\n\t\t\tif (!row || !nextRow) continue;\n\t\t\trow[j] = before[i] === after[j] ? (nextRow[j + 1] ?? 0) + 1 : Math.max(nextRow[j] ?? 0, row[j + 1] ?? 0);\n\t\t}\n\t}\n\n\tconst lines: string[] = [];\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < rows || j < cols) {\n\t\tif (i < rows && j < cols && before[i] === after[j]) {\n\t\t\tlines.push(` ${before[i]}`);\n\t\t\ti++;\n\t\t\tj++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (j < cols && (i === rows || (lcs[i]?.[j + 1] ?? 0) >= (lcs[i + 1]?.[j] ?? 0))) {\n\t\t\tlines.push(`+ ${after[j]}`);\n\t\t\tj++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (i < rows) {\n\t\t\tlines.push(`- ${before[i]}`);\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction buildConfigWritePreview(filePath: string, nextRaw: Record<string, unknown>): ConfigWritePreview {\n\tconst existed = existsSync(filePath);\n\tconst beforeRaw = readRawConfigObject(filePath);\n\tconst beforeText = existed ? serializeRawConfig(beforeRaw) : \"\";\n\tconst afterText = serializeRawConfig(nextRaw);\n\treturn {\n\t\tpath: filePath,\n\t\texisted,\n\t\tchanged: beforeText !== afterText,\n\t\tbeforeText,\n\t\tafterText,\n\t\tdiffText: buildUnifiedDiff(beforeText, afterText),\n\t};\n}\n\nfunction readRawConfigObject(filePath: string): Record<string, unknown> {\n\tif (!existsSync(filePath)) return {};\n\n\ttry {\n\t\tconst raw = parseJsonConfig(readFileSync(filePath, \"utf-8\"));\n\t\treturn raw && typeof raw === \"object\" && !Array.isArray(raw) ? (raw as Record<string, unknown>) : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction writeRawConfigObject(filePath: string, raw: Record<string, unknown>): void {\n\tmkdirSync(dirname(filePath), { recursive: true });\n\tconst tmpPath = `${filePath}.${process.pid}.tmp`;\n\twriteFileSync(tmpPath, `${JSON.stringify(raw, null, 2)}\\n`, \"utf-8\");\n\trenameSync(tmpPath, filePath);\n}\n\nfunction getServersObject(raw: Record<string, unknown>): Record<string, ServerEntry> {\n\tconst existing = raw.mcpServers ?? raw[\"mcp-servers\"] ?? {};\n\tif (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n\t\treturn {};\n\t}\n\treturn existing as Record<string, ServerEntry>;\n}\n\nfunction setServersObject(raw: Record<string, unknown>, servers: Record<string, ServerEntry>): void {\n\tdelete raw[\"mcp-servers\"];\n\traw.mcpServers = servers;\n}\n\nexport interface ServerDisabledOverrideResult {\n\tpath: string;\n\tchanged: boolean;\n}\n\n/**\n * Persist only the disabled field in the project Nexus layer. Enabling writes an\n * explicit false only when a lower-precedence source is itself disabled; this\n * writer never copies a server definition or its credentials into the file.\n */\nexport function writeProjectServerDisabledOverride(\n\toverridePath: string | undefined,\n\tcwd: string,\n\tserverName: string,\n\tdisabled: boolean,\n): ServerDisabledOverrideResult {\n\tconst filePath = getProjectNexusConfigPath(cwd);\n\tlet raw: Record<string, unknown> = {};\n\tif (existsSync(filePath)) {\n\t\ttry {\n\t\t\tconst parsed = parseJsonConfig(readFileSync(filePath, \"utf-8\"));\n\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\t\tthrow new Error(\"root value must be an object\");\n\t\t\t}\n\t\t\traw = parsed as Record<string, unknown>;\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to read project MCP override at ${filePath}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t}\n\n\tconst serverKey =\n\t\traw.mcpServers !== undefined ? \"mcpServers\" : raw[\"mcp-servers\"] !== undefined ? \"mcp-servers\" : \"mcpServers\";\n\tconst rawServers = raw[serverKey];\n\tif (rawServers !== undefined && (!rawServers || typeof rawServers !== \"object\" || Array.isArray(rawServers))) {\n\t\tthrow new Error(`Failed to update project MCP override at ${filePath}: ${serverKey} must be an object`);\n\t}\n\tconst servers = (rawServers ?? {}) as Record<string, unknown>;\n\tconst previous = servers[serverName];\n\tif (previous !== undefined && (!previous || typeof previous !== \"object\" || Array.isArray(previous))) {\n\t\tthrow new Error(`Failed to update project MCP override at ${filePath}: server \"${serverName}\" must be an object`);\n\t}\n\tconst existing = previous as Record<string, unknown> | undefined;\n\n\tlet next: Record<string, unknown>;\n\tif (disabled) {\n\t\tnext = { ...existing, disabled: true };\n\t} else {\n\t\tnext = Object.fromEntries(Object.entries(existing ?? {}).filter(([key]) => key !== \"disabled\"));\n\t\tlet lowerConfig: McpConfig = { mcpServers: {} };\n\t\tfor (const source of getConfigSources(overridePath, cwd)) {\n\t\t\tif (source.readPath === filePath) continue;\n\t\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\t\tif (loaded) lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd));\n\t\t}\n\t\tif (raw.imports !== undefined) {\n\t\t\tif (\n\t\t\t\t!Array.isArray(raw.imports) ||\n\t\t\t\traw.imports.some((kind) => typeof kind !== \"string\" || !Object.hasOwn(IMPORT_PATHS, kind))\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to update project MCP override at ${filePath}: imports contains an unsupported config kind`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlowerConfig = mergeConfigs(\n\t\t\t\tlowerConfig,\n\t\t\t\texpandImports({ mcpServers: {}, imports: raw.imports as ImportKind[] }, cwd),\n\t\t\t);\n\t\t}\n\t\tif (isServerDisabled(lowerConfig.mcpServers[serverName])) next.disabled = false;\n\t}\n\n\tif ((!existing && Object.keys(next).length === 0) || JSON.stringify(existing) === JSON.stringify(next)) {\n\t\treturn { path: filePath, changed: false };\n\t}\n\tif (Object.keys(next).length === 0) delete servers[serverName];\n\telse servers[serverName] = next;\n\n\traw[serverKey] = servers;\n\twriteRawConfigObject(filePath, raw);\n\treturn { path: filePath, changed: true };\n}\n\nfunction isRepoPromptServer(name: string, entry: ServerEntry): boolean {\n\tconst normalizedName = name.toLowerCase();\n\tif (normalizedName.includes(\"repoprompt\") || normalizedName === \"rp\") {\n\t\treturn true;\n\t}\n\n\tconst command = entry.command?.toLowerCase() ?? \"\";\n\tif (command.includes(\"repoprompt\") || command.includes(\"rp-mcp\") || command.endsWith(\"repoprompt_cli\")) {\n\t\treturn true;\n\t}\n\n\treturn (entry.args ?? []).some((arg) => typeof arg === \"string\" && arg.toLowerCase().includes(\"repoprompt\"));\n}\n\nfunction findProjectRoot(cwd = process.cwd()): string | null {\n\tlet current = resolve(cwd);\n\twhile (true) {\n\t\tif (\n\t\t\texistsSync(join(current, \".git\")) ||\n\t\t\texistsSync(join(current, \"package.json\")) ||\n\t\t\texistsSync(getProjectConfigPath(current)) ||\n\t\t\texistsSync(join(current, getConfigDirName()))\n\t\t) {\n\t\t\treturn current;\n\t\t}\n\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) return null;\n\t\tcurrent = parent;\n\t}\n}\n\nfunction buildRepoPromptEntry(executablePath: string): ServerEntry {\n\treturn {\n\t\tcommand: executablePath,\n\t\targs: [],\n\t\tlifecycle: \"lazy\",\n\t};\n}\n\nfunction detectRepoPrompt(\n\tsummary: Omit<McpDiscoverySummary, \"fingerprint\" | \"repoPrompt\">,\n\tcwd = process.cwd(),\n): RepoPromptDiscovery {\n\tfor (const source of summary.sources) {\n\t\tif (source.serverCount === 0) continue;\n\t\tconst config = readValidatedConfig(source.path, `MCP config from ${source.path}`);\n\t\tif (!config) continue;\n\t\tfor (const [name, entry] of Object.entries(config.mcpServers)) {\n\t\t\tif (isRepoPromptServer(name, entry)) {\n\t\t\t\treturn { configured: true, configuredPath: source.path };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst executablePath = REPOPROMPT_BINARY_CANDIDATES.find((candidate) => existsSync(candidate));\n\tif (!executablePath) {\n\t\treturn { configured: false };\n\t}\n\n\tconst projectRoot = findProjectRoot(cwd);\n\tconst targetPath = projectRoot ? getProjectConfigPath(projectRoot) : NEXUS_GLOBAL_CONFIG_PATH;\n\treturn {\n\t\tconfigured: false,\n\t\texecutablePath,\n\t\ttargetPath,\n\t\tserverName: \"repoprompt\",\n\t\tentry: buildRepoPromptEntry(executablePath),\n\t};\n}\n\nexport function previewCompatibilityImports(importKinds: ImportKind[], overridePath?: string): ConfigWritePreview {\n\tconst targetPath = getNexusGlobalConfigPath(overridePath);\n\tconst raw = readRawConfigObject(targetPath);\n\tconst currentImports = Array.isArray(raw.imports)\n\t\t? raw.imports.filter((value): value is ImportKind => typeof value === \"string\")\n\t\t: [];\n\tconst merged = [...new Set([...currentImports, ...importKinds])];\n\tconst nextRaw = { ...raw, imports: merged };\n\tsetServersObject(nextRaw, getServersObject(nextRaw));\n\treturn buildConfigWritePreview(targetPath, nextRaw);\n}\n\nexport function ensureCompatibilityImports(\n\timportKinds: ImportKind[],\n\toverridePath?: string,\n): { path: string; added: ImportKind[] } {\n\tconst targetPath = getNexusGlobalConfigPath(overridePath);\n\tconst raw = readRawConfigObject(targetPath);\n\tconst currentImports = Array.isArray(raw.imports)\n\t\t? raw.imports.filter((value): value is ImportKind => typeof value === \"string\")\n\t\t: [];\n\tconst merged = [...new Set([...currentImports, ...importKinds])];\n\tconst added = merged.filter((kind) => !currentImports.includes(kind));\n\tif (added.length === 0) {\n\t\treturn { path: targetPath, added: [] };\n\t}\n\n\traw.imports = merged;\n\tconst servers = getServersObject(raw);\n\tsetServersObject(raw, servers);\n\twriteRawConfigObject(targetPath, raw);\n\treturn { path: targetPath, added };\n}\n\nexport function buildStarterProjectConfig(): McpConfig {\n\treturn {\n\t\tmcpServers: {},\n\t};\n}\n\nexport function previewStarterProjectConfig(cwd = process.cwd()): ConfigWritePreview {\n\tconst targetPath = getProjectConfigPath(cwd);\n\tconst nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };\n\treturn buildConfigWritePreview(targetPath, nextRaw);\n}\n\nexport function writeStarterProjectConfig(cwd = process.cwd()): string {\n\tconst targetPath = getProjectConfigPath(cwd);\n\tconst raw = { mcpServers: buildStarterProjectConfig().mcpServers };\n\twriteRawConfigObject(targetPath, raw);\n\treturn targetPath;\n}\n\nexport function previewSharedServerEntry(filePath: string, serverName: string, entry: ServerEntry): ConfigWritePreview {\n\tconst raw = readRawConfigObject(filePath);\n\tconst nextRaw = { ...raw };\n\tconst servers = getServersObject(nextRaw);\n\tservers[serverName] = entry;\n\tsetServersObject(nextRaw, servers);\n\treturn buildConfigWritePreview(filePath, nextRaw);\n}\n\nexport function writeSharedServerEntry(filePath: string, serverName: string, entry: ServerEntry): string {\n\tconst raw = readRawConfigObject(filePath);\n\tconst servers = getServersObject(raw);\n\tservers[serverName] = entry;\n\tsetServersObject(raw, servers);\n\twriteRawConfigObject(filePath, raw);\n\treturn filePath;\n}\n\nexport function getServerProvenance(overridePath?: string, cwd = process.cwd()): Map<string, ServerProvenance> {\n\tconst provenance = new Map<string, ServerProvenance>();\n\tconst userPath = getNexusGlobalConfigPath(overridePath);\n\n\tif (getConfiguredHostConfigDiscovery(overridePath, cwd) === \"on\") {\n\t\tfor (const importKind of Object.keys(IMPORT_PATHS) as ImportKind[]) {\n\t\t\tconst imported = loadImportedConfig(\n\t\t\t\timportKind,\n\t\t\t\tcwd,\n\t\t\t\t`Failed to inspect imported MCP config from ${importKind}:`,\n\t\t\t);\n\t\t\tif (!imported) continue;\n\t\t\tfor (const name of Object.keys(extractServers(imported.value, importKind))) {\n\t\t\t\t// Keep writes inside Nexus-owned storage even though the source is external.\n\t\t\t\t// Later import kinds win in the same deterministic order as loadDiscoveredHostConfigs.\n\t\t\t\tprovenance.set(name, { path: userPath, kind: \"import\", importKind });\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const source of getConfigSources(overridePath, cwd)) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (!loaded) continue;\n\n\t\tif (loaded.imports?.length) {\n\t\t\tfor (const importKind of loaded.imports) {\n\t\t\t\tconst imported = loadImportedConfig(\n\t\t\t\t\timportKind,\n\t\t\t\t\tcwd,\n\t\t\t\t\t`Failed to inspect imported MCP config from ${importKind}:`,\n\t\t\t\t);\n\t\t\t\tif (!imported) continue;\n\n\t\t\t\tconst servers = extractServers(imported.value, importKind);\n\t\t\t\tfor (const name of Object.keys(servers)) {\n\t\t\t\t\t// Sources and their imports are visited from lower to higher precedence.\n\t\t\t\t\t// Always replace the prior provenance so writes follow the definition\n\t\t\t\t\t// that actually won the merge.\n\t\t\t\t\tprovenance.set(name, { path: userPath, kind: \"import\", importKind });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const name of Object.keys(loaded.mcpServers)) {\n\t\t\tprovenance.set(name, {\n\t\t\t\tpath: source.writePath,\n\t\t\t\tkind: source.kind,\n\t\t\t\t...(source.importKind !== undefined ? { importKind: source.importKind } : {}),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn provenance;\n}\n\nexport function writeDirectToolsConfig(\n\tchanges: Map<string, true | string[] | false>,\n\tprovenance: Map<string, ServerProvenance>,\n): void {\n\tconst byPath = new Map<string, { name: string; value: true | string[] | false; prov: ServerProvenance }[]>();\n\n\tfor (const [serverName, value] of changes) {\n\t\tconst prov = provenance.get(serverName);\n\t\tif (!prov) continue;\n\n\t\tconst targetPath = prov.path;\n\n\t\tif (!byPath.has(targetPath)) byPath.set(targetPath, []);\n\t\tbyPath.get(targetPath)!.push({ name: serverName, value, prov });\n\t}\n\n\tfor (const [filePath, entries] of byPath) {\n\t\tconst raw = readRawConfigObject(filePath);\n\t\tconst servers = getServersObject(raw);\n\n\t\tfor (const { name, value, prov } of entries) {\n\t\t\tif (prov.kind === \"import\") {\n\t\t\t\t// Imported definitions can contain credentials. Persist only Nexus's\n\t\t\t\t// field-level override and let mergeServerMaps inherit the definition\n\t\t\t\t// from the selected compatibility source on the next load.\n\t\t\t\tservers[name] = { ...(servers[name] ?? {}), directTools: value };\n\t\t\t} else if (servers[name]) {\n\t\t\t\tservers[name] = { ...servers[name], directTools: value };\n\t\t\t}\n\t\t}\n\n\t\tsetServersObject(raw, servers);\n\t\twriteRawConfigObject(filePath, raw);\n\t}\n}\n\nexport function resolveConfiguredOAuthDir(raw: unknown, cwd = process.cwd()): string | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\tif (typeof raw !== \"string\") {\n\t\tthrow new Error(\"settings.oauthDir must be a string\");\n\t}\n\n\tconst trimmed = raw.trim();\n\tif (!trimmed) return undefined;\n\treturn resolve(cwd, trimmed);\n}\n"]}