@akon-labs/nexus-cli 0.1.8 → 0.1.10

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 (320) hide show
  1. package/CHANGELOG.md +27 -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.js +19934 -1869
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +1 -1
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/auto-model.d.ts +1 -1
  10. package/dist/core/auto-model.d.ts.map +1 -1
  11. package/dist/core/auto-model.js +1 -1
  12. package/dist/core/auto-model.js.map +1 -1
  13. package/dist/core/model-resolver.d.ts +2 -2
  14. package/dist/core/model-resolver.d.ts.map +1 -1
  15. package/dist/core/model-resolver.js +3 -3
  16. package/dist/core/model-resolver.js.map +1 -1
  17. package/dist/core/package-manager.d.ts +15 -0
  18. package/dist/core/package-manager.d.ts.map +1 -1
  19. package/dist/core/package-manager.js +50 -0
  20. package/dist/core/package-manager.js.map +1 -1
  21. package/dist/core/sdk.d.ts.map +1 -1
  22. package/dist/core/sdk.js +1 -1
  23. package/dist/core/sdk.js.map +1 -1
  24. package/dist/core/slash-commands.d.ts.map +1 -1
  25. package/dist/core/slash-commands.js +3 -3
  26. package/dist/core/slash-commands.js.map +1 -1
  27. package/dist/core/system-prompt.d.ts.map +1 -1
  28. package/dist/core/system-prompt.js +1 -1
  29. package/dist/core/system-prompt.js.map +1 -1
  30. package/dist/core/tools/index.d.ts +1 -1
  31. package/dist/core/tools/index.d.ts.map +1 -1
  32. package/dist/core/tools/index.js +5 -5
  33. package/dist/core/tools/index.js.map +1 -1
  34. package/dist/core/tools/websearch.d.ts.map +1 -1
  35. package/dist/core/tools/websearch.js +3 -3
  36. package/dist/core/tools/websearch.js.map +1 -1
  37. package/dist/extensions/gitnexus/gateway.d.ts +6 -6
  38. package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
  39. package/dist/extensions/gitnexus/gateway.js +4 -4
  40. package/dist/extensions/gitnexus/gateway.js.map +1 -1
  41. package/dist/extensions/gitnexus/index.d.ts.map +1 -1
  42. package/dist/extensions/gitnexus/index.js +4 -2
  43. package/dist/extensions/gitnexus/index.js.map +1 -1
  44. package/dist/extensions/mcp/abort.d.ts +3 -0
  45. package/dist/extensions/mcp/abort.d.ts.map +1 -0
  46. package/dist/extensions/mcp/abort.js +41 -0
  47. package/dist/extensions/mcp/abort.js.map +1 -0
  48. package/dist/extensions/mcp/agent-dir.d.ts +6 -0
  49. package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
  50. package/dist/extensions/mcp/agent-dir.js +18 -0
  51. package/dist/extensions/mcp/agent-dir.js.map +1 -0
  52. package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
  53. package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
  54. package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
  55. package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
  56. package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
  57. package/dist/extensions/mcp/commands.d.ts +27 -0
  58. package/dist/extensions/mcp/commands.d.ts.map +1 -0
  59. package/dist/extensions/mcp/commands.js +629 -0
  60. package/dist/extensions/mcp/commands.js.map +1 -0
  61. package/dist/extensions/mcp/config.d.ts +121 -38
  62. package/dist/extensions/mcp/config.d.ts.map +1 -1
  63. package/dist/extensions/mcp/config.js +1030 -70
  64. package/dist/extensions/mcp/config.js.map +1 -1
  65. package/dist/extensions/mcp/consent-manager.d.ts +14 -0
  66. package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
  67. package/dist/extensions/mcp/consent-manager.js +60 -0
  68. package/dist/extensions/mcp/consent-manager.js.map +1 -0
  69. package/dist/extensions/mcp/direct-tools.d.ts +11 -0
  70. package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
  71. package/dist/extensions/mcp/direct-tools.js +562 -0
  72. package/dist/extensions/mcp/direct-tools.js.map +1 -0
  73. package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
  74. package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
  75. package/dist/extensions/mcp/elicitation-handler.js +320 -0
  76. package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
  77. package/dist/extensions/mcp/error-signal.d.ts +16 -0
  78. package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
  79. package/dist/extensions/mcp/error-signal.js +22 -0
  80. package/dist/extensions/mcp/error-signal.js.map +1 -0
  81. package/dist/extensions/mcp/errors.d.ts +104 -0
  82. package/dist/extensions/mcp/errors.d.ts.map +1 -0
  83. package/dist/extensions/mcp/errors.js +171 -0
  84. package/dist/extensions/mcp/errors.js.map +1 -0
  85. package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
  86. package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
  87. package/dist/extensions/mcp/glimpse-ui.js +67 -0
  88. package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
  89. package/dist/extensions/mcp/host-html-template.d.ts +17 -0
  90. package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
  91. package/dist/extensions/mcp/host-html-template.js +442 -0
  92. package/dist/extensions/mcp/host-html-template.js.map +1 -0
  93. package/dist/extensions/mcp/index.d.ts +20 -15
  94. package/dist/extensions/mcp/index.d.ts.map +1 -1
  95. package/dist/extensions/mcp/index.js +1064 -82
  96. package/dist/extensions/mcp/index.js.map +1 -1
  97. package/dist/extensions/mcp/init.d.ts +28 -0
  98. package/dist/extensions/mcp/init.d.ts.map +1 -0
  99. package/dist/extensions/mcp/init.js +631 -0
  100. package/dist/extensions/mcp/init.js.map +1 -0
  101. package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
  102. package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
  103. package/dist/extensions/mcp/json-schema-validator.js +53 -0
  104. package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
  105. package/dist/extensions/mcp/lifecycle.d.ts +56 -0
  106. package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
  107. package/dist/extensions/mcp/lifecycle.js +395 -0
  108. package/dist/extensions/mcp/lifecycle.js.map +1 -0
  109. package/dist/extensions/mcp/logger.d.ts +52 -0
  110. package/dist/extensions/mcp/logger.d.ts.map +1 -0
  111. package/dist/extensions/mcp/logger.js +134 -0
  112. package/dist/extensions/mcp/logger.js.map +1 -0
  113. package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
  114. package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
  115. package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
  116. package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
  117. package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
  118. package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
  119. package/dist/extensions/mcp/mcp-auth.js +897 -0
  120. package/dist/extensions/mcp/mcp-auth.js.map +1 -0
  121. package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
  122. package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
  123. package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
  124. package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
  125. package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
  126. package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
  127. package/dist/extensions/mcp/mcp-callback-server.js +454 -0
  128. package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
  129. package/dist/extensions/mcp/mcp-code.d.ts +48 -0
  130. package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
  131. package/dist/extensions/mcp/mcp-code.js +358 -0
  132. package/dist/extensions/mcp/mcp-code.js.map +1 -0
  133. package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
  134. package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
  135. package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
  136. package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
  137. package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
  138. package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
  139. package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
  140. package/dist/extensions/mcp/mcp-output-guard.js +343 -0
  141. package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
  142. package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
  143. package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
  144. package/dist/extensions/mcp/mcp-panel.js +973 -0
  145. package/dist/extensions/mcp/mcp-panel.js.map +1 -0
  146. package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
  147. package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
  148. package/dist/extensions/mcp/mcp-probe.js +155 -0
  149. package/dist/extensions/mcp/mcp-probe.js.map +1 -0
  150. package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
  151. package/dist/extensions/mcp/mcp-setup-panel.d.ts +85 -0
  152. package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
  153. package/dist/extensions/mcp/mcp-setup-panel.js +618 -0
  154. package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
  155. package/dist/extensions/mcp/mcp-status.d.ts +12 -0
  156. package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
  157. package/dist/extensions/mcp/mcp-status.js +98 -0
  158. package/dist/extensions/mcp/mcp-status.js.map +1 -0
  159. package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
  160. package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
  161. package/dist/extensions/mcp/mcp-trace.js +252 -0
  162. package/dist/extensions/mcp/mcp-trace.js.map +1 -0
  163. package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
  164. package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
  165. package/dist/extensions/mcp/metadata-cache.js +318 -0
  166. package/dist/extensions/mcp/metadata-cache.js.map +1 -0
  167. package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
  168. package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
  169. package/dist/extensions/mcp/npx-resolver.js +505 -0
  170. package/dist/extensions/mcp/npx-resolver.js.map +1 -0
  171. package/dist/extensions/mcp/oauth.d.ts +21 -0
  172. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  173. package/dist/extensions/mcp/oauth.js +15 -0
  174. package/dist/extensions/mcp/oauth.js.map +1 -0
  175. package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
  176. package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
  177. package/dist/extensions/mcp/onboarding-state.js +65 -0
  178. package/dist/extensions/mcp/onboarding-state.js.map +1 -0
  179. package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
  180. package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
  181. package/dist/extensions/mcp/package-mcp-loader.js +170 -0
  182. package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
  183. package/dist/extensions/mcp/panel-keys.d.ts +21 -0
  184. package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
  185. package/dist/extensions/mcp/panel-keys.js +29 -0
  186. package/dist/extensions/mcp/panel-keys.js.map +1 -0
  187. package/dist/extensions/mcp/prompts.d.ts +63 -0
  188. package/dist/extensions/mcp/prompts.d.ts.map +1 -0
  189. package/dist/extensions/mcp/prompts.js +297 -0
  190. package/dist/extensions/mcp/prompts.js.map +1 -0
  191. package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
  192. package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
  193. package/dist/extensions/mcp/proxy-modes.js +1421 -0
  194. package/dist/extensions/mcp/proxy-modes.js.map +1 -0
  195. package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
  196. package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
  197. package/dist/extensions/mcp/request-headers-command.js +334 -0
  198. package/dist/extensions/mcp/request-headers-command.js.map +1 -0
  199. package/dist/extensions/mcp/resource-tools.d.ts +2 -0
  200. package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
  201. package/dist/extensions/mcp/resource-tools.js +15 -0
  202. package/dist/extensions/mcp/resource-tools.js.map +1 -0
  203. package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
  204. package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
  205. package/dist/extensions/mcp/runtime-owner.js +84 -0
  206. package/dist/extensions/mcp/runtime-owner.js.map +1 -0
  207. package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
  208. package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
  209. package/dist/extensions/mcp/sampling-handler.js +229 -0
  210. package/dist/extensions/mcp/sampling-handler.js.map +1 -0
  211. package/dist/extensions/mcp/search-ranking.d.ts +25 -0
  212. package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
  213. package/dist/extensions/mcp/search-ranking.js +234 -0
  214. package/dist/extensions/mcp/search-ranking.js.map +1 -0
  215. package/dist/extensions/mcp/server-manager.d.ts +116 -0
  216. package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
  217. package/dist/extensions/mcp/server-manager.js +1052 -0
  218. package/dist/extensions/mcp/server-manager.js.map +1 -0
  219. package/dist/extensions/mcp/session-recovery.d.ts +27 -0
  220. package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
  221. package/dist/extensions/mcp/session-recovery.js +140 -0
  222. package/dist/extensions/mcp/session-recovery.js.map +1 -0
  223. package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
  224. package/dist/extensions/mcp/state.d.ts +62 -0
  225. package/dist/extensions/mcp/state.d.ts.map +1 -0
  226. package/dist/extensions/mcp/state.js +2 -0
  227. package/dist/extensions/mcp/state.js.map +1 -0
  228. package/dist/extensions/mcp/tool-approval.d.ts +11 -0
  229. package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
  230. package/dist/extensions/mcp/tool-approval.js +156 -0
  231. package/dist/extensions/mcp/tool-approval.js.map +1 -0
  232. package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
  233. package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
  234. package/dist/extensions/mcp/tool-metadata.js +264 -0
  235. package/dist/extensions/mcp/tool-metadata.js.map +1 -0
  236. package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
  237. package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
  238. package/dist/extensions/mcp/tool-registrar.js +229 -0
  239. package/dist/extensions/mcp/tool-registrar.js.map +1 -0
  240. package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
  241. package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
  242. package/dist/extensions/mcp/tool-result-renderer.js +345 -0
  243. package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
  244. package/dist/extensions/mcp/ts-shape.d.ts +3 -0
  245. package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
  246. package/dist/extensions/mcp/ts-shape.js +160 -0
  247. package/dist/extensions/mcp/ts-shape.js.map +1 -0
  248. package/dist/extensions/mcp/types.d.ts +521 -0
  249. package/dist/extensions/mcp/types.d.ts.map +1 -0
  250. package/dist/extensions/mcp/types.js +294 -0
  251. package/dist/extensions/mcp/types.js.map +1 -0
  252. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
  253. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
  254. package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
  255. package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
  256. package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
  257. package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
  258. package/dist/extensions/mcp/ui-resource-handler.js +210 -0
  259. package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
  260. package/dist/extensions/mcp/ui-server.d.ts +52 -0
  261. package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
  262. package/dist/extensions/mcp/ui-server.js +740 -0
  263. package/dist/extensions/mcp/ui-server.js.map +1 -0
  264. package/dist/extensions/mcp/ui-session.d.ts +40 -0
  265. package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
  266. package/dist/extensions/mcp/ui-session.js +477 -0
  267. package/dist/extensions/mcp/ui-session.js.map +1 -0
  268. package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
  269. package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
  270. package/dist/extensions/mcp/ui-stream-types.js +61 -0
  271. package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
  272. package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
  273. package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
  274. package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
  275. package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
  276. package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
  277. package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
  278. package/dist/extensions/mcp/unix-socket-transport.js +85 -0
  279. package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
  280. package/dist/extensions/mcp/utils.d.ts +32 -0
  281. package/dist/extensions/mcp/utils.d.ts.map +1 -0
  282. package/dist/extensions/mcp/utils.js +336 -0
  283. package/dist/extensions/mcp/utils.js.map +1 -0
  284. package/dist/extensions/subagent/index.d.ts +62 -3
  285. package/dist/extensions/subagent/index.d.ts.map +1 -1
  286. package/dist/extensions/subagent/index.js +193 -58
  287. package/dist/extensions/subagent/index.js.map +1 -1
  288. package/dist/extensions/web-access.d.ts.map +1 -1
  289. package/dist/extensions/web-access.js +1 -1
  290. package/dist/extensions/web-access.js.map +1 -1
  291. package/dist/index.d.ts +2 -0
  292. package/dist/index.d.ts.map +1 -1
  293. package/dist/index.js +20074 -2004
  294. package/dist/index.js.map +1 -1
  295. package/dist/mcp-keyring-helper.cjs +89 -0
  296. package/dist/mcp-script-worker.mjs +130 -0
  297. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  298. package/dist/modes/interactive/components/model-selector.js +1 -1
  299. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  300. package/dist/modes/interactive/components/response-separator.d.ts +1 -1
  301. package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/response-separator.js +1 -1
  303. package/dist/modes/interactive/components/response-separator.js.map +1 -1
  304. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  305. package/dist/modes/interactive/interactive-mode.js +7 -5
  306. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  307. package/dist/rpc-entry.js +19934 -1869
  308. package/dist/skills/mcp-scripting/SKILL.md +38 -0
  309. package/dist/vendor/ai.js +282 -207
  310. package/docs/mcp.md +178 -0
  311. package/docs/pi-subagents.md +75 -0
  312. package/docs/quickstart.md +1 -1
  313. package/docs/usage.md +2 -1
  314. package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
  315. package/npm-shrinkwrap.json +763 -6
  316. package/package.json +15 -4
  317. package/dist/extensions/mcp/client.d.ts +0 -86
  318. package/dist/extensions/mcp/client.d.ts.map +0 -1
  319. package/dist/extensions/mcp/client.js +0 -275
  320. package/dist/extensions/mcp/client.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-setup-panel.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-setup-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesKey, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { getConfigDirName } from \"./agent-dir.ts\";\nimport {\n\ttype ConfigWritePreview,\n\tKNOWN_SERVER_PRESETS,\n\ttype KnownServerPreset,\n\ttype McpDiscoverySummary,\n} from \"./config.ts\";\nimport type { McpOnboardingState } from \"./onboarding-state.ts\";\nimport { createPanelKeys, type PanelKeybindings, type PanelKeys } from \"./panel-keys.ts\";\nimport type { ImportKind } from \"./types.ts\";\n\ninterface SetupTheme {\n\tborder: string;\n\ttitle: string;\n\tselected: string;\n\thint: string;\n\tsuccess: string;\n\twarning: string;\n\tmuted: string;\n}\n\nconst DEFAULT_THEME: SetupTheme = {\n\tborder: \"2\",\n\ttitle: \"36\",\n\tselected: \"32\",\n\thint: \"2\",\n\tsuccess: \"32\",\n\twarning: \"33\",\n\tmuted: \"2;3\",\n};\n\nconst MIN_PANEL_WIDTH = 24;\nconst COMPACT_WIDTH = 60;\nconst COMPACT_ACTION_ROWS = 7;\nconst DESKTOP_PREVIEW_WIDTH = 74;\n\nfunction fg(code: string, text: string): string {\n\treturn code ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nfunction wrapText(text: string, width: number): string[] {\n\tif (width <= 8) return [text];\n\tconst words = text.split(/\\s+/).filter(Boolean);\n\tconst lines: string[] = [];\n\tlet current = \"\";\n\tfor (const word of words) {\n\t\tconst candidate = current ? `${current} ${word}` : word;\n\t\tif (visibleWidth(candidate) <= width) {\n\t\t\tcurrent = candidate;\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) lines.push(current);\n\t\tcurrent = word;\n\t}\n\tif (current) lines.push(current);\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\nexport interface SetupPanelCallbacks {\n\tpreviewImports: (imports: ImportKind[]) => ConfigWritePreview;\n\tpreviewStarterProject: () => ConfigWritePreview;\n\tpreviewRepoPrompt: () => ConfigWritePreview | null;\n\tpreviewKnownServer: (preset: KnownServerPreset) => ConfigWritePreview;\n\tadoptImports: (imports: ImportKind[]) => Promise<{ added: ImportKind[]; path: string }>;\n\tscaffoldProjectConfig: () => Promise<{ path: string }>;\n\taddRepoPrompt: () => Promise<{ path: string; serverName: string }>;\n\taddKnownServer: (preset: KnownServerPreset) => Promise<{ path: string; serverName: string }>;\n\topenPath: (path: string) => Promise<void>;\n\tmarkSetupCompleted: () => void;\n}\n\nexport interface SetupPanelOptions {\n\tmode: \"empty\" | \"setup\";\n\tonboardingState: McpOnboardingState;\n\tkeybindings?: PanelKeybindings;\n}\n\ntype Screen = \"empty\" | \"setup\" | \"imports\" | \"paths\";\n\ntype ActionId =\n\t| \"run-setup\"\n\t| \"adopt-imports\"\n\t| \"view-example\"\n\t| \"show-precedence\"\n\t| \"open-paths\"\n\t| \"add-repoprompt\"\n\t| \"add-known-server\"\n\t| \"scaffold-project\"\n\t| \"close\";\n\ninterface Action {\n\tid: ActionId;\n\tlabel: string;\n\tdescription: string;\n\tpreset?: KnownServerPreset;\n}\n\nexport class McpSetupPanel {\n\tprivate screen: Screen;\n\tprivate actionCursor = 0;\n\tprivate importCursor = 0;\n\tprivate pathCursor = 0;\n\tprivate selectedImports = new Set<ImportKind>();\n\tprivate busy = false;\n\tprivate notice: { text: string; tone: \"success\" | \"warning\" | \"muted\" } | null = null;\n\tprivate tui: { requestRender(): void };\n\tprivate t = DEFAULT_THEME;\n\tprivate keys: PanelKeys;\n\tprivate inactivityTimeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate discovery: McpDiscoverySummary;\n\tprivate callbacks: SetupPanelCallbacks;\n\tprivate options: SetupPanelOptions;\n\tprivate done: () => void;\n\tprivate static readonly INACTIVITY_MS = 60_000;\n\n\tconstructor(\n\t\tdiscovery: McpDiscoverySummary,\n\t\tcallbacks: SetupPanelCallbacks,\n\t\toptions: SetupPanelOptions,\n\t\ttui: { requestRender(): void },\n\t\tdone: () => void,\n\t) {\n\t\tthis.discovery = discovery;\n\t\tthis.callbacks = callbacks;\n\t\tthis.options = options;\n\t\tthis.done = done;\n\t\tthis.tui = tui;\n\t\tthis.keys = createPanelKeys(options.keybindings);\n\t\tthis.screen = options.mode;\n\t\tfor (const entry of discovery.imports) {\n\t\t\tthis.selectedImports.add(entry.kind);\n\t\t}\n\t\tthis.resetInactivityTimeout();\n\t}\n\n\tprivate resetInactivityTimeout(): void {\n\t\tif (this.inactivityTimeout) clearTimeout(this.inactivityTimeout);\n\t\tthis.inactivityTimeout = setTimeout(() => {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t}, McpSetupPanel.INACTIVITY_MS);\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (this.inactivityTimeout) {\n\t\t\tclearTimeout(this.inactivityTimeout);\n\t\t\tthis.inactivityTimeout = null;\n\t\t}\n\t}\n\n\tprivate getActions(): Action[] {\n\t\tconst actions: Action[] = [];\n\t\tif (this.screen === \"empty\") {\n\t\t\tactions.push({\n\t\t\t\tid: \"run-setup\",\n\t\t\t\tlabel: \"Run setup\",\n\t\t\t\tdescription: \"Inspect detected configs, adopt imports, and scaffold a minimal `.nexus/mcp.json`.\",\n\t\t\t});\n\t\t}\n\t\tif (this.discovery.imports.length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"adopt-imports\",\n\t\t\t\tlabel: \"Adopt detected compatibility imports\",\n\t\t\t\tdescription: `Choose which host-specific MCP configs Nexus should import into its own override file. ${this.discovery.imports.length} source${this.discovery.imports.length === 1 ? \"\" : \"s\"} found.`,\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"view-example\",\n\t\t\tlabel: \"View example `.nexus/mcp.json`\",\n\t\t\tdescription: \"Preview a working Nexus MCP config you can paste or adapt.\",\n\t\t});\n\t\tif (!this.discovery.sources.some((source) => source.id === \"nexus-project\" && source.exists)) {\n\t\t\tactions.push({\n\t\t\t\tid: \"scaffold-project\",\n\t\t\t\tlabel: \"Scaffold project `.nexus/mcp.json`\",\n\t\t\t\tdescription: \"Write a minimal Nexus project MCP config, then reload Nexus.\",\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"show-precedence\",\n\t\t\tlabel: \"Explain config precedence\",\n\t\t\tdescription: \"Show the read order and where Nexus writes compatibility settings.\",\n\t\t});\n\t\tif (this.getDetectedPaths().length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"open-paths\",\n\t\t\t\tlabel: \"Open detected config paths\",\n\t\t\t\tdescription: \"Browse the actual config files that Nexus discovered on this machine.\",\n\t\t\t});\n\t\t}\n\t\tfor (const preset of KNOWN_SERVER_PRESETS) {\n\t\t\tactions.push({ id: \"add-known-server\", label: preset.name, description: preset.summary, preset });\n\t\t}\n\t\tif (\n\t\t\t!this.discovery.repoPrompt.configured &&\n\t\t\tthis.discovery.repoPrompt.executablePath &&\n\t\t\tthis.discovery.repoPrompt.targetPath &&\n\t\t\tthis.discovery.repoPrompt.entry &&\n\t\t\tthis.discovery.repoPrompt.serverName\n\t\t) {\n\t\t\tactions.push({\n\t\t\t\tid: \"add-repoprompt\",\n\t\t\t\tlabel: \"Add RepoPrompt to Nexus MCP config\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Write an MCP entry for RepoPrompt to the recommended Nexus target, then reload MCP in-session.\",\n\t\t\t});\n\t\t}\n\t\tactions.push({ id: \"close\", label: \"Close\", description: \"Exit the onboarding flow.\" });\n\t\treturn actions;\n\t}\n\n\tprivate getDetectedPaths(): string[] {\n\t\tconst paths = [\n\t\t\t...this.discovery.sources.filter((source) => source.exists).map((source) => source.path),\n\t\t\t...this.discovery.imports.map((entry) => entry.path),\n\t\t];\n\t\treturn [...new Set(paths)];\n\t}\n\n\tprivate getSelectedAction(): Action | undefined {\n\t\tconst actions = this.getActions();\n\t\treturn actions[this.actionCursor];\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.resetInactivityTimeout();\n\t\tif (!this.busy) this.notice = null;\n\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tif (this.screen === \"imports\" || this.screen === \"paths\") {\n\t\t\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.busy) return;\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tthis.handleImportsInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"paths\") {\n\t\t\tthis.handlePathsInput(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst actions = this.getActions();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.actionCursor = Math.max(0, this.actionCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.actionCursor = Math.min(actions.length - 1, this.actionCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = this.getSelectedAction();\n\t\t\tif (selected) void this.runAction(selected);\n\t\t}\n\t}\n\n\tprivate handleImportsInput(data: string): void {\n\t\tconst imports = this.discovery.imports;\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.importCursor = Math.max(0, this.importCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.importCursor = Math.min(imports.length - 1, this.importCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"space\")) {\n\t\t\tconst current = imports[this.importCursor];\n\t\t\tif (!current) return;\n\t\t\tif (this.selectedImports.has(current.kind)) {\n\t\t\t\tthis.selectedImports.delete(current.kind);\n\t\t\t} else {\n\t\t\t\tthis.selectedImports.add(current.kind);\n\t\t\t}\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tvoid this.applySelectedImports();\n\t\t}\n\t}\n\n\tprivate handlePathsInput(data: string): void {\n\t\tconst paths = this.getDetectedPaths();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.pathCursor = Math.max(0, this.pathCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.pathCursor = Math.min(paths.length - 1, this.pathCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = paths[this.pathCursor];\n\t\t\tif (!selected) return;\n\t\t\tvoid this.runBusy(async () => {\n\t\t\t\tawait this.callbacks.openPath(selected);\n\t\t\t\tthis.notice = { text: `Opened ${selected}`, tone: \"success\" };\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async runAction(action: Action): Promise<void> {\n\t\tif (action.id === \"run-setup\") {\n\t\t\tthis.screen = \"setup\";\n\t\t\tthis.actionCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"adopt-imports\") {\n\t\t\tthis.screen = \"imports\";\n\t\t\tthis.importCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"open-paths\") {\n\t\t\tthis.screen = \"paths\";\n\t\t\tthis.pathCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"scaffold-project\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.scaffoldProjectConfig();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Wrote starter config to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-repoprompt\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addRepoPrompt();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-known-server\" && action.preset) {\n\t\t\tconst preset = action.preset;\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addKnownServer(preset);\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"close\") {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.notice = {\n\t\t\ttext: \"Review the details below. Press Enter on an action with a side effect to apply it.\",\n\t\t\ttone: \"muted\",\n\t\t};\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate async applySelectedImports(): Promise<void> {\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tif (selected.length === 0) {\n\t\t\tthis.notice = { text: \"Select at least one compatibility import first.\", tone: \"warning\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBusy(async () => {\n\t\t\tconst result = await this.callbacks.adoptImports(selected);\n\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\tthis.notice =\n\t\t\t\tresult.added.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttext: `Added ${result.added.join(\", \")} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: { text: `No changes needed in ${result.path}.`, tone: \"muted\" };\n\t\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\t\tthis.actionCursor = 0;\n\t\t});\n\t}\n\n\tprivate async runBusy(fn: () => Promise<void>): Promise<void> {\n\t\tthis.busy = true;\n\t\tthis.notice = { text: \"Working...\", tone: \"muted\" };\n\t\tthis.tui.requestRender();\n\t\ttry {\n\t\t\tawait fn();\n\t\t} catch (error) {\n\t\t\tthis.notice = {\n\t\t\t\ttext: error instanceof Error ? error.message : String(error),\n\t\t\t\ttone: \"warning\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.busy = false;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst panelW = Math.max(MIN_PANEL_WIDTH, width);\n\t\tconst innerW = panelW - 2;\n\t\tconst contentW = this.contentWidth(innerW);\n\t\tconst lines: string[] = [];\n\t\tconst border = fg(this.t.border, \"─\".repeat(innerW));\n\t\tlines.push(`┌${border}┐`);\n\t\tlines.push(this.padLine(fg(this.t.title, \"MCP setup\"), innerW));\n\t\tfor (const line of wrapText(this.discoverySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tfor (const line of wrapText(this.secondarySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, line), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tif (this.notice) {\n\t\t\tconst tone =\n\t\t\t\tthis.notice.tone === \"success\"\n\t\t\t\t\t? this.t.success\n\t\t\t\t\t: this.notice.tone === \"warning\"\n\t\t\t\t\t\t? this.t.warning\n\t\t\t\t\t\t: this.t.hint;\n\t\t\tfor (const line of wrapText(this.notice.text, contentW)) {\n\t\t\t\tlines.push(this.padLine(fg(tone, line), innerW));\n\t\t\t}\n\t\t\tlines.push(this.padLine(\"\", innerW));\n\t\t}\n\n\t\tlines.push(`├${border}┤`);\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tlines.push(...this.renderImports(innerW));\n\t\t} else if (this.screen === \"paths\") {\n\t\t\tlines.push(...this.renderPaths(innerW));\n\t\t} else {\n\t\t\tlines.push(...this.renderActions(innerW));\n\t\t}\n\n\t\tlines.push(`└${border}┘`);\n\t\treturn lines;\n\t}\n\n\tprivate renderActions(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst actions = this.getActions();\n\t\tconst compact = innerW < COMPACT_WIDTH;\n\t\tconst { start, end } = compact ? this.visibleActionRange(actions.length) : { start: 0, end: actions.length };\n\n\t\tif (start > 0) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${start} more above`), innerW));\n\t\t}\n\t\tfor (let index = start; index < end; index++) {\n\t\t\tconst action = actions[index];\n\t\t\tif (!action) continue;\n\t\t\tif (action.id === \"add-known-server\" && (index === start || actions[index - 1]?.id !== \"add-known-server\")) {\n\t\t\t\tlines.push(this.padLine(fg(this.t.title, \"Add a known server\"), innerW));\n\t\t\t}\n\t\t\tconst selected = index === this.actionCursor;\n\t\t\tconst cursor = selected ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tlines.push(this.padLine(`${cursor} ${truncateToWidth(action.label, this.contentWidth(innerW) - 2)}`, innerW));\n\t\t}\n\t\tif (end < actions.length) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${actions.length - end} more below`), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tconst preview = this.getActionPreview(this.getSelectedAction(), this.previewWidth(innerW));\n\t\tfor (const line of preview) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst hint = compact ? \"Enter select · Esc back\" : \"Enter selects, Esc goes back, Ctrl+C closes.\";\n\t\tlines.push(this.padLine(fg(this.t.muted, hint), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate renderImports(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select compatibility imports. Space toggles, Enter saves, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tfor (let index = 0; index < this.discovery.imports.length; index++) {\n\t\t\tconst entry = this.discovery.imports[index];\n\t\t\tif (!entry) continue;\n\t\t\tconst selected = this.selectedImports.has(entry.kind) ? \"[x]\" : \"[ ]\";\n\t\t\tconst cursor = index === this.importCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tlines.push(this.padLine(`${cursor} ${selected} ${entry.kind} ${entry.path}`, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tconst preview = this.callbacks.previewImports(selected);\n\t\tfor (const line of this.formatWritePreview(\n\t\t\t\"Compatibility import write preview\",\n\t\t\tpreview,\n\t\t\t[],\n\t\t\tthis.previewWidth(innerW),\n\t\t)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate renderPaths(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select a detected config path to open. Enter opens it, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst paths = this.getDetectedPaths();\n\t\tfor (let index = 0; index < paths.length; index++) {\n\t\t\tconst cursor = index === this.pathCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst path = paths[index];\n\t\t\tif (path !== undefined) lines.push(this.padLine(`${cursor} ${path}`, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate discoverySummaryLine(): string {\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn fg(\n\t\t\t\tthis.t.warning,\n\t\t\t\tthis.options.onboardingState.setupCompleted\n\t\t\t\t\t? \"No MCP servers are active right now.\"\n\t\t\t\t\t: \"No MCP config is active yet.\",\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tthis.discovery.totalServerCount === 0 &&\n\t\t\t(this.discovery.imports.length > 0 || !!this.discovery.repoPrompt.executablePath)\n\t\t) {\n\t\t\treturn fg(this.t.warning, \"Nexus found MCP-related setup options, but none are active in Nexus yet.\");\n\t\t}\n\n\t\tconst configuredSources = this.discovery.sources.filter((source) => source.serverCount > 0).length;\n\t\treturn fg(\n\t\t\tthis.t.hint,\n\t\t\t`Detected ${this.discovery.totalServerCount} configured servers across ${configuredSources} Nexus source${configuredSources === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t}\n\n\tprivate secondarySummaryLine(): string {\n\t\tconst hostNote =\n\t\t\tthis.discovery.hostConfigs.length > 0\n\t\t\t\t? ` Host discovery is ${this.discovery.hostConfigDiscovery}; ${this.discovery.hostConfigs.length} host source${this.discovery.hostConfigs.length === 1 ? \"\" : \"s\"} detected.`\n\t\t\t\t: \"\";\n\t\tconst conflictNote =\n\t\t\tthis.discovery.conflicts.length > 0\n\t\t\t\t? ` ${this.discovery.conflicts.length} same-name conflict${this.discovery.conflicts.length === 1 ? \"\" : \"s\"} reported.`\n\t\t\t\t: \"\";\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn `Create .nexus/mcp.json, adopt host imports, or quick-add RepoPrompt from this screen.${hostNote}${conflictNote}`;\n\t\t}\n\t\tif (this.discovery.totalServerCount === 0 && this.discovery.imports.length > 0) {\n\t\t\treturn `Detected ${this.discovery.imports.length} compatibility import source${this.discovery.imports.length === 1 ? \"\" : \"s\"}. Adopt them into Nexus or inspect the underlying files.${hostNote}${conflictNote}`;\n\t\t}\n\t\treturn `Nexus MCP files contain server definitions, compatibility imports, and MCP-specific overrides.${hostNote}${conflictNote}`;\n\t}\n\n\tprivate visibleActionRange(total: number): { start: number; end: number } {\n\t\tif (total <= COMPACT_ACTION_ROWS) return { start: 0, end: total };\n\t\tconst half = Math.floor(COMPACT_ACTION_ROWS / 2);\n\t\tconst start = Math.min(Math.max(0, this.actionCursor - half), Math.max(0, total - COMPACT_ACTION_ROWS));\n\t\treturn { start, end: Math.min(total, start + COMPACT_ACTION_ROWS) };\n\t}\n\n\tprivate contentWidth(innerW: number): number {\n\t\treturn Math.max(8, innerW - 4);\n\t}\n\n\tprivate previewWidth(innerW: number): number {\n\t\treturn Math.max(12, Math.min(DESKTOP_PREVIEW_WIDTH, this.contentWidth(innerW)));\n\t}\n\n\tprivate getActionPreview(action?: Action, previewW = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tswitch (action?.id) {\n\t\t\tcase \"run-setup\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Run setup to adopt host-specific imports, inspect detected paths, and scaffold a minimal `.nexus/mcp.json` if needed.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"adopt-imports\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Compatibility import write preview\",\n\t\t\t\t\tthis.callbacks.previewImports(\n\t\t\t\t\t\tthis.discovery.imports\n\t\t\t\t\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t\t\t\t\t.map((entry) => entry.kind),\n\t\t\t\t\t),\n\t\t\t\t\t[\n\t\t\t\t\t\t`Detected imports: ${this.discovery.imports.map((entry) => `${entry.kind} (${entry.serverCount} servers)`).join(\", \")}`,\n\t\t\t\t\t\t\"Selected imports are written to the Nexus global MCP configuration shown above.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"view-example\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Example Nexus `.nexus/mcp.json`:\",\n\t\t\t\t\t\t\"{\",\n\t\t\t\t\t\t' \"mcpServers\": {',\n\t\t\t\t\t\t' \"chrome-devtools\": {',\n\t\t\t\t\t\t' \"command\": \"npx\",',\n\t\t\t\t\t\t' \"args\": [\"-y\", \"chrome-devtools-mcp@1.6.0\"]',\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\"}\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Use Scaffold project `.nexus/mcp.json` when you want a safe empty shell instead of a live example server.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"show-precedence\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Read order (later entries win):\",\n\t\t\t\t\t\t\"0. detected host configs (opt-in lowest-precedence fallback)\",\n\t\t\t\t\t\t\"1. ~/.config/nexus/mcp.json\",\n\t\t\t\t\t\t`2. ${getConfigDirName()}/mcp.json`,\n\t\t\t\t\t\t`Host discovery: ${this.discovery.hostConfigDiscovery}. Conflicts reported: ${this.discovery.conflicts.length}.`,\n\t\t\t\t\t\t...this.discovery.conflicts\n\t\t\t\t\t\t\t.slice(0, 8)\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(conflict) =>\n\t\t\t\t\t\t\t\t\t`${conflict.serverName}: ${conflict.sources.map((source) => source.path).join(\" -> \")} (winner: ${conflict.winner.path})`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\"Nexus writes global MCP state to ~/.config/nexus/mcp.json and project state to .nexus/mcp.json.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"open-paths\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\tthis.getDetectedPaths().length > 0\n\t\t\t\t\t\t? [\"Detected paths:\", ...this.getDetectedPaths()]\n\t\t\t\t\t\t: [\"No config paths were detected.\"],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"add-repoprompt\": {\n\t\t\t\tconst repoPrompt = this.discovery.repoPrompt;\n\t\t\t\tconst preview = this.callbacks.previewRepoPrompt();\n\t\t\t\tif (!preview) {\n\t\t\t\t\treturn this.formatPreview([\"RepoPrompt is not available to add from this setup screen.\"], previewW);\n\t\t\t\t}\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"RepoPrompt write preview\",\n\t\t\t\t\tpreview,\n\t\t\t\t\t[\n\t\t\t\t\t\t`Executable: ${repoPrompt.executablePath ?? \"not found\"}`,\n\t\t\t\t\t\t`Target: ${repoPrompt.targetPath ?? \"n/a\"}`,\n\t\t\t\t\t\t`Server name: ${repoPrompt.serverName ?? \"repoprompt\"}`,\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"add-known-server\": {\n\t\t\t\tconst preset = action.preset;\n\t\t\t\tif (!preset) return this.formatPreview([\"Known server preset is unavailable.\"], previewW);\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t`${preset.name} write preview`,\n\t\t\t\t\tthis.callbacks.previewKnownServer(preset),\n\t\t\t\t\t[preset.summary],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"scaffold-project\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Starter project `.nexus/mcp.json` write preview\",\n\t\t\t\t\tthis.callbacks.previewStarterProject(),\n\t\t\t\t\t[\n\t\t\t\t\t\t\"This writes a minimal `.nexus/mcp.json` in the current project using the Nexus MCP layout.\",\n\t\t\t\t\t\t\"It intentionally avoids adding a fake placeholder server that would fail on first reload.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn this.formatPreview([\"Close the setup flow.\"], previewW);\n\t\t}\n\t}\n\n\tprivate formatPreview(lines: string[], width = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tconst preview: string[] = [];\n\t\tfor (const line of lines) {\n\t\t\tpreview.push(...wrapText(line, width));\n\t\t}\n\t\treturn preview;\n\t}\n\n\tprivate formatWritePreview(\n\t\ttitle: string,\n\t\tpreview: ConfigWritePreview,\n\t\tintro: string[] = [],\n\t\twidth = DESKTOP_PREVIEW_WIDTH,\n\t): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (const line of intro) {\n\t\t\tlines.push(...wrapText(line, width));\n\t\t}\n\t\tif (intro.length > 0) lines.push(\"\");\n\t\tlines.push(...wrapText(`${title}: ${preview.path}`, width));\n\t\tlines.push(\n\t\t\t...wrapText(\n\t\t\t\tpreview.existed\n\t\t\t\t\t? \"Existing file detected. Showing exact before/after diff.\"\n\t\t\t\t\t: \"New file will be created. Showing exact content diff.\",\n\t\t\t\twidth,\n\t\t\t),\n\t\t);\n\t\tlines.push(\"\");\n\t\tconst diffLines = preview.diffText.split(\"\\n\");\n\t\tconst maxLines = 18;\n\t\tconst shown = diffLines.slice(0, maxLines);\n\t\tfor (const line of shown) {\n\t\t\tlines.push(...wrapText(line, width));\n\t\t}\n\t\tif (diffLines.length > maxLines) {\n\t\t\tlines.push(\n\t\t\t\t...wrapText(\n\t\t\t\t\t`… ${diffLines.length - maxLines} more diff line${diffLines.length - maxLines === 1 ? \"\" : \"s\"}`,\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate padLine(text: string, innerW: number): string {\n\t\tconst inset = 2;\n\t\tconst contentW = Math.max(0, innerW - inset * 2);\n\t\tconst fitted = truncateToWidth(text, contentW, \"…\", true);\n\t\tconst plainWidth = visibleWidth(fitted);\n\t\tconst padding = Math.max(0, contentW - plainWidth);\n\t\treturn `│${\" \".repeat(inset)}${fitted}${\" \".repeat(padding)}${\" \".repeat(inset)}│`;\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.cleanup();\n\t}\n}\n\nexport function createMcpSetupPanel(\n\tdiscovery: McpDiscoverySummary,\n\tcallbacks: SetupPanelCallbacks,\n\toptions: SetupPanelOptions,\n\ttui: { requestRender(): void },\n\tdone: () => void,\n): McpSetupPanel & { dispose(): void } {\n\treturn new McpSetupPanel(discovery, callbacks, options, tui, done);\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { McpExtensionState } from "./state.ts";
2
+ import { type McpStatusSnapshot } from "./types.ts";
3
+ export interface McpStatusEventBus {
4
+ emit(channel: string, data: unknown): void;
5
+ }
6
+ /** Build a sanitized snapshot without connecting or querying any MCP server. */
7
+ export declare function createMcpStatusSnapshot(state: McpExtensionState): McpStatusSnapshot;
8
+ export declare function publishMcpStatusSnapshot(state: McpExtensionState, snapshot?: McpStatusSnapshot): void;
9
+ export declare function publishMcpStatusShutdown(events: McpStatusEventBus | undefined): void;
10
+ export type { McpServerStatusSnapshot, McpStatusSnapshot } from "./types.ts";
11
+ export { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from "./types.ts";
12
+ //# sourceMappingURL=mcp-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAIN,KAAK,iBAAiB,EACtB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C;AAUD,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAsDnF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAQrG;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAcpF;AAED,YAAY,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC","sourcesContent":["import type { McpExtensionState } from \"./state.ts\";\nimport {\n\tMCP_STATUS_EVENT,\n\tMCP_STATUS_SNAPSHOT_VERSION,\n\ttype McpServerStatusSnapshot,\n\ttype McpStatusSnapshot,\n} from \"./types.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport interface McpStatusEventBus {\n\temit(channel: string, data: unknown): void;\n}\n\nfunction getActiveFailureAgeSeconds(state: McpExtensionState, serverName: string): number | undefined {\n\tconst failedAt = state.failureTracker.get(serverName);\n\tif (!failedAt) return undefined;\n\tconst ageMs = Date.now() - failedAt;\n\tif (ageMs > FAILURE_BACKOFF_MS) return undefined;\n\treturn Math.round(ageMs / 1000);\n}\n\n/** Build a sanitized snapshot without connecting or querying any MCP server. */\nexport function createMcpStatusSnapshot(state: McpExtensionState): McpStatusSnapshot {\n\tconst servers: McpServerStatusSnapshot[] = [];\n\tlet totalTools = 0;\n\tlet totalResources = 0;\n\tlet connectedCount = 0;\n\tlet disabledCount = 0;\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tconst disabled = definition?.disabled === true;\n\t\tconst connection = disabled ? undefined : state.manager.getConnection(name);\n\t\tconst metadata = disabled ? undefined : state.toolMetadata.get(name);\n\t\tconst toolCount = metadata?.length ?? (connection?.status === \"connected\" ? connection.tools.length : 0);\n\t\tconst resourceCount = disabled\n\t\t\t? undefined\n\t\t\t: (state.resourceCounts?.get(name) ??\n\t\t\t\t(connection?.status === \"connected\" ? connection.resources.length : undefined));\n\t\tconst failedAgoSeconds = disabled ? undefined : getActiveFailureAgeSeconds(state, name);\n\n\t\tlet status: McpServerStatusSnapshot[\"status\"] = \"not-connected\";\n\t\tif (disabled) {\n\t\t\tstatus = \"disabled\";\n\t\t\tdisabledCount++;\n\t\t} else if (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tconnectedCount++;\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs-auth\";\n\t\t} else if (failedAgoSeconds !== undefined) {\n\t\t\tstatus = \"failed\";\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\ttotalTools += disabled ? 0 : toolCount;\n\t\tif (!disabled && resourceCount !== undefined) totalResources += resourceCount;\n\t\tservers.push({\n\t\t\tname,\n\t\t\tstatus,\n\t\t\ttoolCount,\n\t\t\t...(resourceCount !== undefined ? { resourceCount } : {}),\n\t\t\t...(status === \"failed\" && failedAgoSeconds !== undefined ? { failedAgoSeconds } : {}),\n\t\t\tdisabled,\n\t\t});\n\t}\n\n\treturn {\n\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\tservers,\n\t\ttotalTools,\n\t\ttotalResources,\n\t\tconnectedCount,\n\t\tdisabledCount,\n\t};\n}\n\nexport function publishMcpStatusSnapshot(state: McpExtensionState, snapshot?: McpStatusSnapshot): void {\n\tconst events = state.statusEvents;\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, snapshot ?? createMcpStatusSnapshot(state));\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP operations.\n\t}\n}\n\nexport function publishMcpStatusShutdown(events: McpStatusEventBus | undefined): void {\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, {\n\t\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\t\tservers: [],\n\t\t\ttotalTools: 0,\n\t\t\ttotalResources: 0,\n\t\t\tconnectedCount: 0,\n\t\t\tdisabledCount: 0,\n\t\t} satisfies McpStatusSnapshot);\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP shutdown.\n\t}\n}\n\nexport type { McpServerStatusSnapshot, McpStatusSnapshot } from \"./types.ts\";\nexport { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from \"./types.ts\";\n"]}
@@ -0,0 +1,98 @@
1
+ import { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION, } from "./types.js";
2
+ const FAILURE_BACKOFF_MS = 60 * 1000;
3
+ function getActiveFailureAgeSeconds(state, serverName) {
4
+ const failedAt = state.failureTracker.get(serverName);
5
+ if (!failedAt)
6
+ return undefined;
7
+ const ageMs = Date.now() - failedAt;
8
+ if (ageMs > FAILURE_BACKOFF_MS)
9
+ return undefined;
10
+ return Math.round(ageMs / 1000);
11
+ }
12
+ /** Build a sanitized snapshot without connecting or querying any MCP server. */
13
+ export function createMcpStatusSnapshot(state) {
14
+ const servers = [];
15
+ let totalTools = 0;
16
+ let totalResources = 0;
17
+ let connectedCount = 0;
18
+ let disabledCount = 0;
19
+ for (const name of Object.keys(state.config.mcpServers)) {
20
+ const definition = state.config.mcpServers[name];
21
+ const disabled = definition?.disabled === true;
22
+ const connection = disabled ? undefined : state.manager.getConnection(name);
23
+ const metadata = disabled ? undefined : state.toolMetadata.get(name);
24
+ const toolCount = metadata?.length ?? (connection?.status === "connected" ? connection.tools.length : 0);
25
+ const resourceCount = disabled
26
+ ? undefined
27
+ : (state.resourceCounts?.get(name) ??
28
+ (connection?.status === "connected" ? connection.resources.length : undefined));
29
+ const failedAgoSeconds = disabled ? undefined : getActiveFailureAgeSeconds(state, name);
30
+ let status = "not-connected";
31
+ if (disabled) {
32
+ status = "disabled";
33
+ disabledCount++;
34
+ }
35
+ else if (connection?.status === "connected") {
36
+ status = "connected";
37
+ connectedCount++;
38
+ }
39
+ else if (connection?.status === "needs-auth") {
40
+ status = "needs-auth";
41
+ }
42
+ else if (failedAgoSeconds !== undefined) {
43
+ status = "failed";
44
+ }
45
+ else if (metadata !== undefined) {
46
+ status = "cached";
47
+ }
48
+ totalTools += disabled ? 0 : toolCount;
49
+ if (!disabled && resourceCount !== undefined)
50
+ totalResources += resourceCount;
51
+ servers.push({
52
+ name,
53
+ status,
54
+ toolCount,
55
+ ...(resourceCount !== undefined ? { resourceCount } : {}),
56
+ ...(status === "failed" && failedAgoSeconds !== undefined ? { failedAgoSeconds } : {}),
57
+ disabled,
58
+ });
59
+ }
60
+ return {
61
+ version: MCP_STATUS_SNAPSHOT_VERSION,
62
+ servers,
63
+ totalTools,
64
+ totalResources,
65
+ connectedCount,
66
+ disabledCount,
67
+ };
68
+ }
69
+ export function publishMcpStatusSnapshot(state, snapshot) {
70
+ const events = state.statusEvents;
71
+ if (!events)
72
+ return;
73
+ try {
74
+ events.emit(MCP_STATUS_EVENT, snapshot ?? createMcpStatusSnapshot(state));
75
+ }
76
+ catch {
77
+ // Event consumers must not be able to interrupt MCP operations.
78
+ }
79
+ }
80
+ export function publishMcpStatusShutdown(events) {
81
+ if (!events)
82
+ return;
83
+ try {
84
+ events.emit(MCP_STATUS_EVENT, {
85
+ version: MCP_STATUS_SNAPSHOT_VERSION,
86
+ servers: [],
87
+ totalTools: 0,
88
+ totalResources: 0,
89
+ connectedCount: 0,
90
+ disabledCount: 0,
91
+ });
92
+ }
93
+ catch {
94
+ // Event consumers must not be able to interrupt MCP shutdown.
95
+ }
96
+ }
97
+ export { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from "./types.js";
98
+ //# sourceMappingURL=mcp-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-status.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-status.ts"],"names":[],"mappings":"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","sourcesContent":["import type { McpExtensionState } from \"./state.ts\";\nimport {\n\tMCP_STATUS_EVENT,\n\tMCP_STATUS_SNAPSHOT_VERSION,\n\ttype McpServerStatusSnapshot,\n\ttype McpStatusSnapshot,\n} from \"./types.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport interface McpStatusEventBus {\n\temit(channel: string, data: unknown): void;\n}\n\nfunction getActiveFailureAgeSeconds(state: McpExtensionState, serverName: string): number | undefined {\n\tconst failedAt = state.failureTracker.get(serverName);\n\tif (!failedAt) return undefined;\n\tconst ageMs = Date.now() - failedAt;\n\tif (ageMs > FAILURE_BACKOFF_MS) return undefined;\n\treturn Math.round(ageMs / 1000);\n}\n\n/** Build a sanitized snapshot without connecting or querying any MCP server. */\nexport function createMcpStatusSnapshot(state: McpExtensionState): McpStatusSnapshot {\n\tconst servers: McpServerStatusSnapshot[] = [];\n\tlet totalTools = 0;\n\tlet totalResources = 0;\n\tlet connectedCount = 0;\n\tlet disabledCount = 0;\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tconst disabled = definition?.disabled === true;\n\t\tconst connection = disabled ? undefined : state.manager.getConnection(name);\n\t\tconst metadata = disabled ? undefined : state.toolMetadata.get(name);\n\t\tconst toolCount = metadata?.length ?? (connection?.status === \"connected\" ? connection.tools.length : 0);\n\t\tconst resourceCount = disabled\n\t\t\t? undefined\n\t\t\t: (state.resourceCounts?.get(name) ??\n\t\t\t\t(connection?.status === \"connected\" ? connection.resources.length : undefined));\n\t\tconst failedAgoSeconds = disabled ? undefined : getActiveFailureAgeSeconds(state, name);\n\n\t\tlet status: McpServerStatusSnapshot[\"status\"] = \"not-connected\";\n\t\tif (disabled) {\n\t\t\tstatus = \"disabled\";\n\t\t\tdisabledCount++;\n\t\t} else if (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tconnectedCount++;\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs-auth\";\n\t\t} else if (failedAgoSeconds !== undefined) {\n\t\t\tstatus = \"failed\";\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\ttotalTools += disabled ? 0 : toolCount;\n\t\tif (!disabled && resourceCount !== undefined) totalResources += resourceCount;\n\t\tservers.push({\n\t\t\tname,\n\t\t\tstatus,\n\t\t\ttoolCount,\n\t\t\t...(resourceCount !== undefined ? { resourceCount } : {}),\n\t\t\t...(status === \"failed\" && failedAgoSeconds !== undefined ? { failedAgoSeconds } : {}),\n\t\t\tdisabled,\n\t\t});\n\t}\n\n\treturn {\n\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\tservers,\n\t\ttotalTools,\n\t\ttotalResources,\n\t\tconnectedCount,\n\t\tdisabledCount,\n\t};\n}\n\nexport function publishMcpStatusSnapshot(state: McpExtensionState, snapshot?: McpStatusSnapshot): void {\n\tconst events = state.statusEvents;\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, snapshot ?? createMcpStatusSnapshot(state));\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP operations.\n\t}\n}\n\nexport function publishMcpStatusShutdown(events: McpStatusEventBus | undefined): void {\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, {\n\t\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\t\tservers: [],\n\t\t\ttotalTools: 0,\n\t\t\ttotalResources: 0,\n\t\t\tconnectedCount: 0,\n\t\t\tdisabledCount: 0,\n\t\t} satisfies McpStatusSnapshot);\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP shutdown.\n\t}\n}\n\nexport type { McpServerStatusSnapshot, McpStatusSnapshot } from \"./types.ts\";\nexport { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from \"./types.ts\";\n"]}
@@ -0,0 +1,95 @@
1
+ import type { JSONRPCMessage, Transport } from "@modelcontextprotocol/client";
2
+ export declare const MCP_TRACE_SCHEMA_VERSION = 1;
3
+ export declare const DEFAULT_MCP_TRACE_MAX_BYTES: number;
4
+ export declare const DEFAULT_MCP_TRACE_MAX_EVENTS = 10000;
5
+ export type McpTraceDirection = "outbound" | "inbound";
6
+ export type McpTraceTransport = "stdio" | "unix-socket" | "sse" | "streamable-http" | "unknown";
7
+ export type McpTraceMessageKind = "request" | "response" | "notification";
8
+ export interface McpTraceSettings {
9
+ /** Enable metadata-only protocol tracing for all servers unless overridden. */
10
+ enabled?: boolean;
11
+ /** JSONL destination. Relative paths are resolved from the session cwd. */
12
+ file?: string;
13
+ /** Maximum bytes retained in the per-session JSONL file. */
14
+ maxBytes?: number;
15
+ /** Maximum events retained in the per-session JSONL file. */
16
+ maxEvents?: number;
17
+ }
18
+ export interface McpTraceEvent {
19
+ version: typeof MCP_TRACE_SCHEMA_VERSION;
20
+ timestamp: string;
21
+ direction: McpTraceDirection;
22
+ server: string;
23
+ transport: McpTraceTransport;
24
+ kind: McpTraceMessageKind;
25
+ status: "sent" | "received" | "error";
26
+ method?: string;
27
+ id?: string | number | null;
28
+ relatedRequestId?: string | number;
29
+ errorCode?: number | string;
30
+ bytes?: number;
31
+ durationMs?: number;
32
+ }
33
+ export interface McpTraceWriterOptions {
34
+ filePath: string;
35
+ maxBytes?: number;
36
+ maxEvents?: number;
37
+ appendFile?: (path: string, data: string, options: {
38
+ encoding: "utf8";
39
+ }) => Promise<void>;
40
+ writeFile?: (path: string, data: string, options: {
41
+ encoding: "utf8";
42
+ }) => Promise<void>;
43
+ mkdir?: (path: string, options: {
44
+ recursive: true;
45
+ }) => Promise<string | undefined>;
46
+ }
47
+ /** Redact strings before they can become durable trace metadata. */
48
+ export declare function redactTraceText(value: string, maxLength?: number): string;
49
+ export declare function createMcpTraceEvent(direction: McpTraceDirection, server: string, transport: McpTraceTransport, message: JSONRPCMessage, status: "sent" | "received" | "error", options?: {
50
+ relatedRequestId?: unknown;
51
+ durationMs?: number;
52
+ }): McpTraceEvent;
53
+ export declare class McpTraceWriter {
54
+ private readonly maxBytes;
55
+ private readonly maxEvents;
56
+ private readonly append;
57
+ private readonly resetFile;
58
+ private readonly makeDirectory;
59
+ private bytesWritten;
60
+ private eventsWritten;
61
+ private queue;
62
+ private disabled;
63
+ private initializationFailed;
64
+ private readonly fileReady;
65
+ private readonly options;
66
+ constructor(options: McpTraceWriterOptions);
67
+ get filePath(): string;
68
+ get isDisabled(): boolean;
69
+ get stats(): {
70
+ bytes: number;
71
+ events: number;
72
+ };
73
+ write(event: McpTraceEvent): void;
74
+ flush(): Promise<void>;
75
+ }
76
+ export declare function createMcpTraceWriter(sessionCwd: string | undefined, settings?: McpTraceSettings, randomSuffix?: string): McpTraceWriter;
77
+ export interface McpTraceObserver {
78
+ record(event: McpTraceEvent): void;
79
+ }
80
+ export declare function isMcpTraceEnabled(definition: {
81
+ trace?: boolean;
82
+ }, settings?: McpTraceSettings): boolean;
83
+ /**
84
+ * Compose the SDK's transport callbacks in place instead of replacing the
85
+ * transport object. SDK v2 detects its base stdio transport before connect so
86
+ * it can run `server/discover` on a disposable sibling process; returning a
87
+ * wrapper hides that identity and makes tracing change negotiation behavior.
88
+ */
89
+ export declare function wrapTransportWithMcpTrace(transport: Transport, server: string, transportKind: McpTraceTransport, observer: McpTraceObserver): Transport;
90
+ export declare function traceTransportKind(definition: {
91
+ command?: string;
92
+ url?: string;
93
+ socket?: string;
94
+ }, transport: Transport): McpTraceTransport;
95
+ //# sourceMappingURL=mcp-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-trace.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-trace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAoB,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEhG,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,2BAA2B,QAAa,CAAC;AACtD,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;AACvD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,aAAa,GAAG,KAAK,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAChG,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAChC,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,wBAAwB,CAAC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACpF;AAOD,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM,CAatE;AAsBD,wBAAgB,mBAAmB,CAClC,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,EACrC,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,aAAa,CAwBf;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;IAC1E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;IAC5E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8C;IAC5E,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAEhD,YAAY,OAAO,EAAE,qBAAqB,EA2BzC;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAE7C;IAED,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CA2BhC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;CACD;AAED,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,GAAE,gBAAqB,EAC/B,YAAY,SAA0C,GACpD,cAAc,CAahB;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAEvG;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,iBAAiB,EAChC,QAAQ,EAAE,gBAAgB,GACxB,SAAS,CA4DX;AAED,wBAAgB,kBAAkB,CACjC,UAAU,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/D,SAAS,EAAE,SAAS,GAClB,iBAAiB,CAOnB","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, resolve } from \"node:path\";\nimport type { JSONRPCMessage, MessageExtraInfo, Transport } from \"@modelcontextprotocol/client\";\n\nexport const MCP_TRACE_SCHEMA_VERSION = 1;\nexport const DEFAULT_MCP_TRACE_MAX_BYTES = 256 * 1024;\nexport const DEFAULT_MCP_TRACE_MAX_EVENTS = 10_000;\n\nexport type McpTraceDirection = \"outbound\" | \"inbound\";\nexport type McpTraceTransport = \"stdio\" | \"unix-socket\" | \"sse\" | \"streamable-http\" | \"unknown\";\nexport type McpTraceMessageKind = \"request\" | \"response\" | \"notification\";\n\nexport interface McpTraceSettings {\n\t/** Enable metadata-only protocol tracing for all servers unless overridden. */\n\tenabled?: boolean;\n\t/** JSONL destination. Relative paths are resolved from the session cwd. */\n\tfile?: string;\n\t/** Maximum bytes retained in the per-session JSONL file. */\n\tmaxBytes?: number;\n\t/** Maximum events retained in the per-session JSONL file. */\n\tmaxEvents?: number;\n}\n\nexport interface McpTraceEvent {\n\tversion: typeof MCP_TRACE_SCHEMA_VERSION;\n\ttimestamp: string;\n\tdirection: McpTraceDirection;\n\tserver: string;\n\ttransport: McpTraceTransport;\n\tkind: McpTraceMessageKind;\n\tstatus: \"sent\" | \"received\" | \"error\";\n\tmethod?: string;\n\tid?: string | number | null;\n\trelatedRequestId?: string | number;\n\terrorCode?: number | string;\n\tbytes?: number;\n\tdurationMs?: number;\n}\n\nexport interface McpTraceWriterOptions {\n\tfilePath: string;\n\tmaxBytes?: number;\n\tmaxEvents?: number;\n\tappendFile?: (path: string, data: string, options: { encoding: \"utf8\" }) => Promise<void>;\n\twriteFile?: (path: string, data: string, options: { encoding: \"utf8\" }) => Promise<void>;\n\tmkdir?: (path: string, options: { recursive: true }) => Promise<string | undefined>;\n}\n\nfunction boundedPositiveInteger(value: number | undefined, fallback: number): number {\n\tif (!Number.isFinite(value) || value === undefined || value <= 0) return fallback;\n\treturn Math.floor(value);\n}\n\n/** Redact strings before they can become durable trace metadata. */\nexport function redactTraceText(value: string, maxLength = 160): string {\n\tlet redacted = value\n\t\t.replace(/\\b[a-z][a-z\\d+.-]*:\\/\\/[^\\s\"'<>]+/gi, \"[REDACTED_URL]\")\n\t\t.replace(/\\b(?:bearer|basic)\\s+[A-Za-z0-9._~+/=-]+/gi, \"[REDACTED_AUTH]\")\n\t\t.replace(\n\t\t\t/\\b(token|secret|password|passwd|api[_-]?key|authorization|cookie)\\s*[:=]\\s*[^\\s,;]+/gi,\n\t\t\t\"$1=[REDACTED]\",\n\t\t);\n\tif (redacted === value && /\\b(?:token|secret|password|passwd|api[_-]?key|authorization|cookie)\\b/i.test(value)) {\n\t\treturn \"[REDACTED]\";\n\t}\n\tif (redacted.length > maxLength) redacted = `${redacted.slice(0, maxLength - 1)}…`;\n\treturn redacted;\n}\n\nfunction messageKind(message: JSONRPCMessage): McpTraceMessageKind {\n\tif (\"method\" in message) return \"id\" in message ? \"request\" : \"notification\";\n\treturn \"response\";\n}\n\nfunction traceId(value: unknown): string | number | null | undefined {\n\tif (value === null) return null;\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\") return \"[REDACTED_ID]\";\n\treturn undefined;\n}\n\nfunction messageBytes(message: JSONRPCMessage): number | undefined {\n\ttry {\n\t\treturn Buffer.byteLength(JSON.stringify(message), \"utf8\");\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function createMcpTraceEvent(\n\tdirection: McpTraceDirection,\n\tserver: string,\n\ttransport: McpTraceTransport,\n\tmessage: JSONRPCMessage,\n\tstatus: \"sent\" | \"received\" | \"error\",\n\toptions?: { relatedRequestId?: unknown; durationMs?: number },\n): McpTraceEvent {\n\tconst kind = messageKind(message);\n\tconst bytes = messageBytes(message);\n\tconst event: McpTraceEvent = {\n\t\tversion: MCP_TRACE_SCHEMA_VERSION,\n\t\ttimestamp: new Date().toISOString(),\n\t\tdirection,\n\t\tserver: redactTraceText(server, 120),\n\t\ttransport,\n\t\tkind,\n\t\tstatus,\n\t\t...(bytes !== undefined ? { bytes } : {}),\n\t};\n\tif (\"method\" in message) event.method = redactTraceText(message.method, 120);\n\tif (\"id\" in message) event.id = traceId(message.id) ?? null;\n\tconst relatedRequestId = traceId(options?.relatedRequestId);\n\tif (relatedRequestId !== undefined && relatedRequestId !== null) event.relatedRequestId = relatedRequestId;\n\tif (\"error\" in message && message.error && typeof message.error.code === \"number\") {\n\t\tevent.errorCode = message.error.code;\n\t}\n\tif (options?.durationMs !== undefined && Number.isFinite(options.durationMs)) {\n\t\tevent.durationMs = Math.max(0, Math.round(options.durationMs * 100) / 100);\n\t}\n\treturn event;\n}\n\nexport class McpTraceWriter {\n\tprivate readonly maxBytes: number;\n\tprivate readonly maxEvents: number;\n\tprivate readonly append: NonNullable<McpTraceWriterOptions[\"appendFile\"]>;\n\tprivate readonly resetFile: NonNullable<McpTraceWriterOptions[\"writeFile\"]>;\n\tprivate readonly makeDirectory: NonNullable<McpTraceWriterOptions[\"mkdir\"]>;\n\tprivate bytesWritten = 0;\n\tprivate eventsWritten = 0;\n\tprivate queue = Promise.resolve();\n\tprivate disabled = false;\n\tprivate initializationFailed = false;\n\tprivate readonly fileReady: Promise<void>;\n\tprivate readonly options: McpTraceWriterOptions;\n\n\tconstructor(options: McpTraceWriterOptions) {\n\t\tthis.options = options;\n\t\tthis.maxBytes = boundedPositiveInteger(options.maxBytes, DEFAULT_MCP_TRACE_MAX_BYTES);\n\t\tthis.maxEvents = boundedPositiveInteger(options.maxEvents, DEFAULT_MCP_TRACE_MAX_EVENTS);\n\t\tthis.append =\n\t\t\toptions.appendFile ??\n\t\t\t(async (path, data, appendOptions) => {\n\t\t\t\tawait appendFile(path, data, appendOptions);\n\t\t\t});\n\t\tthis.resetFile =\n\t\t\toptions.writeFile ??\n\t\t\t(async (path, data, writeOptions) => {\n\t\t\t\tawait writeFile(path, data, writeOptions);\n\t\t\t});\n\t\tthis.makeDirectory =\n\t\t\toptions.mkdir ??\n\t\t\t(async (path) => {\n\t\t\t\tawait mkdir(path, { recursive: true });\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\tthis.fileReady = this.makeDirectory(dirname(this.options.filePath), { recursive: true })\n\t\t\t.then(() => this.resetFile(this.options.filePath, \"\", { encoding: \"utf8\" }))\n\t\t\t.catch(() => {\n\t\t\t\t// Tracing must never change MCP request/response behavior.\n\t\t\t\tthis.initializationFailed = true;\n\t\t\t\tthis.disabled = true;\n\t\t\t});\n\t}\n\n\tget filePath(): string {\n\t\treturn this.options.filePath;\n\t}\n\n\tget isDisabled(): boolean {\n\t\treturn this.disabled;\n\t}\n\n\tget stats(): { bytes: number; events: number } {\n\t\treturn { bytes: this.bytesWritten, events: this.eventsWritten };\n\t}\n\n\twrite(event: McpTraceEvent): void {\n\t\tif (this.disabled || this.eventsWritten >= this.maxEvents) return;\n\t\tlet line: string;\n\t\ttry {\n\t\t\tline = `${JSON.stringify(event)}\\n`;\n\t\t} catch {\n\t\t\tthis.disabled = true;\n\t\t\treturn;\n\t\t}\n\t\tconst bytes = Buffer.byteLength(line, \"utf8\");\n\t\tif (bytes > this.maxBytes - this.bytesWritten) {\n\t\t\tthis.disabled = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bytesWritten += bytes;\n\t\tthis.eventsWritten += 1;\n\t\tthis.queue = this.queue\n\t\t\t.then(async () => {\n\t\t\t\tawait this.fileReady;\n\t\t\t\tif (this.initializationFailed) return;\n\t\t\t\tawait this.append(this.options.filePath, line, { encoding: \"utf8\" });\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// Tracing must never change MCP request/response behavior.\n\t\t\t\tthis.disabled = true;\n\t\t\t});\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tawait this.fileReady;\n\t\tawait this.queue;\n\t}\n}\n\nexport function createMcpTraceWriter(\n\tsessionCwd: string | undefined,\n\tsettings: McpTraceSettings = {},\n\trandomSuffix = Math.random().toString(36).slice(2, 10),\n): McpTraceWriter {\n\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\tconst configuredPath = settings.file;\n\tconst filePath = configuredPath\n\t\t? isAbsolute(configuredPath)\n\t\t\t? configuredPath\n\t\t\t: resolve(sessionCwd ?? process.cwd(), configuredPath)\n\t\t: resolve(sessionCwd ?? process.cwd(), \".nexus\", \"mcp-traces\", `mcp-${timestamp}-${randomSuffix}.jsonl`);\n\treturn new McpTraceWriter({\n\t\tfilePath,\n\t\t...(settings.maxBytes !== undefined ? { maxBytes: settings.maxBytes } : {}),\n\t\t...(settings.maxEvents !== undefined ? { maxEvents: settings.maxEvents } : {}),\n\t});\n}\n\nexport interface McpTraceObserver {\n\trecord(event: McpTraceEvent): void;\n}\n\nexport function isMcpTraceEnabled(definition: { trace?: boolean }, settings?: McpTraceSettings): boolean {\n\treturn definition.trace ?? settings?.enabled === true;\n}\n\n/**\n * Compose the SDK's transport callbacks in place instead of replacing the\n * transport object. SDK v2 detects its base stdio transport before connect so\n * it can run `server/discover` on a disposable sibling process; returning a\n * wrapper hides that identity and makes tracing change negotiation behavior.\n */\nexport function wrapTransportWithMcpTrace(\n\ttransport: Transport,\n\tserver: string,\n\ttransportKind: McpTraceTransport,\n\tobserver: McpTraceObserver,\n): Transport {\n\tlet messageHandler = transport.onmessage;\n\tlet tracedMessageHandler: Transport[\"onmessage\"];\n\tconst originalSend = transport.send;\n\tconst record = (event: McpTraceEvent): void => {\n\t\ttry {\n\t\t\tobserver.record(event);\n\t\t} catch {\n\t\t\t// An observer failure must never alter SDK transport behavior.\n\t\t}\n\t};\n\n\ttry {\n\t\tObject.defineProperty(transport, \"onmessage\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tget() {\n\t\t\t\treturn tracedMessageHandler;\n\t\t\t},\n\t\t\tset(handler: Transport[\"onmessage\"]) {\n\t\t\t\tmessageHandler = handler;\n\t\t\t\ttracedMessageHandler = handler\n\t\t\t\t\t? (message: JSONRPCMessage, extra?: MessageExtraInfo) => {\n\t\t\t\t\t\t\trecord(createMcpTraceEvent(\"inbound\", server, transportKind, message, \"received\"));\n\t\t\t\t\t\t\thandler(message, extra);\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t},\n\t\t});\n\t\ttransport.onmessage = messageHandler;\n\t} catch {\n\t\t// Some future transport may make onmessage non-configurable. Keep tracing\n\t\t// best-effort rather than changing connection behavior.\n\t}\n\n\ttransport.send = async (message: JSONRPCMessage, options?: Parameters<Transport[\"send\"]>[1]) => {\n\t\tconst started = performance.now();\n\t\tconst messages = Array.isArray(message) ? message : [message];\n\t\ttry {\n\t\t\tawait originalSend.call(transport, message, options);\n\t\t\tfor (const item of messages) {\n\t\t\t\trecord(\n\t\t\t\t\tcreateMcpTraceEvent(\"outbound\", server, transportKind, item, \"sent\", {\n\t\t\t\t\t\tdurationMs: performance.now() - started,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const item of messages) {\n\t\t\t\trecord(\n\t\t\t\t\tcreateMcpTraceEvent(\"outbound\", server, transportKind, item, \"error\", {\n\t\t\t\t\t\tdurationMs: performance.now() - started,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\treturn transport;\n}\n\nexport function traceTransportKind(\n\tdefinition: { command?: string; url?: string; socket?: string },\n\ttransport: Transport,\n): McpTraceTransport {\n\tif (definition.command) return \"stdio\";\n\tif (definition.socket) return \"unix-socket\";\n\tconst constructorName = transport.constructor?.name.toLowerCase() ?? \"\";\n\tif (constructorName.includes(\"sse\")) return \"sse\";\n\tif (constructorName.includes(\"streamable\")) return \"streamable-http\";\n\treturn definition.url ? \"streamable-http\" : \"unknown\";\n}\n"]}