@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-panel.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchesKey, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { copyToClipboard } from \"../../utils/clipboard.ts\";\nimport { type CachedTool, isServerCacheValid, type MetadataCache, type ServerCacheEntry } from \"./metadata-cache.ts\";\nimport { createPanelKeys, type PanelKeybindings, type PanelKeys } from \"./panel-keys.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport type { McpConfig, McpPanelCallbacks, McpPanelResult, ServerProvenance, ToolPrefix } from \"./types.ts\";\nimport { getToolNameCandidates, isServerDisabled, isToolAllowed, resolveToolPrefix } from \"./types.ts\";\nimport { isUiToolVisibleToModel } from \"./ui-tool-visibility.ts\";\nimport { sanitizeTerminalText, stripOscSequences } from \"./utils.ts\";\n\ninterface PanelTheme {\n\tborder: string;\n\ttitle: string;\n\tselected: string;\n\tdirect: string;\n\tneedsAuth: string;\n\tplaceholder: string;\n\tdescription: string;\n\thint: string;\n\tconfirm: string;\n\tcancel: string;\n}\n\nconst DEFAULT_THEME: PanelTheme = {\n\tborder: \"2\",\n\ttitle: \"2\",\n\tselected: \"36\",\n\tdirect: \"32\",\n\tneedsAuth: \"33\",\n\tplaceholder: \"2;3\",\n\tdescription: \"2\",\n\thint: \"2\",\n\tconfirm: \"32\",\n\tcancel: \"31\",\n};\n\nfunction fg(code: string, text: string): string {\n\tif (!code) return text;\n\treturn `\\x1b[${code}m${text}\\x1b[0m`;\n}\n\nconst RAINBOW_COLORS = [\n\t\"38;2;178;129;214\",\n\t\"38;2;215;135;175\",\n\t\"38;2;254;188;56\",\n\t\"38;2;228;192;15\",\n\t\"38;2;137;210;129\",\n\t\"38;2;0;175;175\",\n\t\"38;2;23;143;185\",\n];\n\nfunction rainbowProgress(filled: number, total: number): string {\n\tconst dots: string[] = [];\n\tfor (let i = 0; i < total; i++) {\n\t\tconst color = RAINBOW_COLORS[i % RAINBOW_COLORS.length];\n\t\tif (!color) continue;\n\t\tdots.push(fg(color, i < filled ? \"●\" : \"○\"));\n\t}\n\treturn dots.join(\" \");\n}\n\nfunction fuzzyScore(query: string, text: string): number {\n\tconst lq = query.toLowerCase();\n\tconst lt = text.toLowerCase();\n\tif (lt.includes(lq)) return 100 + (lq.length / lt.length) * 50;\n\tlet score = 0;\n\tlet qi = 0;\n\tlet consecutive = 0;\n\tfor (let i = 0; i < lt.length && qi < lq.length; i++) {\n\t\tif (lt[i] === lq[qi]) {\n\t\t\tscore += 10 + consecutive;\n\t\t\tconsecutive += 5;\n\t\t\tqi++;\n\t\t} else {\n\t\t\tconsecutive = 0;\n\t\t}\n\t}\n\treturn qi === lq.length ? score : 0;\n}\n\nfunction sanitizeDisplayText(text: string | null | undefined): string {\n\treturn sanitizeTerminalText(text ?? \"\");\n}\n\nfunction sanitizeRowContent(content: string): string {\n\tconst withoutOsc = stripOscSequences(content);\n\tlet result = \"\";\n\tlet pendingSpace = false;\n\tfor (let i = 0; i < withoutOsc.length; i++) {\n\t\tconst rest = withoutOsc.slice(i);\n\t\tconst ansi = rest.match(/^(?:\\x1b\\[[0-?]*[ -/]*[@-~]|\\x1b[@-Z\\\\-_])/);\n\t\tif (ansi) {\n\t\t\tresult += ansi[0];\n\t\t\ti += ansi[0].length - 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst code = withoutOsc.charCodeAt(i);\n\t\tif (code <= 0x1f || code === 0x7f || (code >= 0x80 && code <= 0x9f)) {\n\t\t\tpendingSpace = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pendingSpace && result && !result.endsWith(\" \")) {\n\t\t\tresult += \" \";\n\t\t}\n\t\tpendingSpace = false;\n\t\tresult += withoutOsc[i];\n\t}\n\treturn result;\n}\n\nfunction estimateTokens(tool: CachedTool): number {\n\tconst schemaLen = JSON.stringify(tool.inputSchema ?? {}).length;\n\tconst descLen = tool.description?.length ?? 0;\n\treturn Math.ceil((tool.name.length + descLen + schemaLen) / 4) + 10;\n}\n\ntype ConnectionStatus = \"connected\" | \"idle\" | \"failed\" | \"needs-auth\" | \"connecting\" | \"disabled\";\n\ninterface ToolState {\n\tname: string;\n\tdescription: string;\n\tisDirect: boolean;\n\twasDirect: boolean;\n\testimatedTokens: number;\n}\n\ninterface ServerState {\n\tname: string;\n\texpanded: boolean;\n\tsource: \"user\" | \"project\" | \"import\";\n\timportKind?: string;\n\tincludeTools?: string[];\n\texcludeTools?: string[];\n\texposeResources: boolean;\n\tconnectionStatus: ConnectionStatus;\n\tfailureMessage?: string | null;\n\ttools: ToolState[];\n\tdirectCount: number;\n\tdirectTokens: number;\n\thasCachedData: boolean;\n}\n\ninterface VisibleItem {\n\ttype: \"server\" | \"tool\";\n\tserverIndex: number;\n\ttoolIndex?: number;\n}\n\nclass McpPanel {\n\tprivate noticeLines: string[];\n\tprivate prefix: ToolPrefix;\n\tprivate servers: ServerState[] = [];\n\tprivate cursorIndex = 0;\n\tprivate nameQuery = \"\";\n\tprivate descSearchActive = false;\n\tprivate descQuery = \"\";\n\tprivate dirty = false;\n\tprivate confirmingDiscard = false;\n\tprivate discardSelected = 1;\n\tprivate importNotice: string | null = null;\n\tprivate authNotice: string | null = null;\n\tprivate authInFlight: string | null = null;\n\tprivate inactivityTimeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate visibleItems: VisibleItem[] = [];\n\tprivate tui: { requestRender(): void };\n\tprivate t = DEFAULT_THEME;\n\tprivate authOnly: boolean;\n\tprivate keys: PanelKeys;\n\tprivate config: McpConfig;\n\tprivate cache: MetadataCache | null;\n\tprivate callbacks: McpPanelCallbacks;\n\tprivate done: (result: McpPanelResult) => void;\n\n\tprivate static readonly MAX_VISIBLE = 12;\n\tprivate static readonly INACTIVITY_MS = 60_000;\n\n\tconstructor(\n\t\tconfig: McpConfig,\n\t\tcache: MetadataCache | null,\n\t\tprovenance: Map<string, ServerProvenance>,\n\t\tcallbacks: McpPanelCallbacks,\n\t\ttui: { requestRender(): void },\n\t\tdone: (result: McpPanelResult) => void,\n\t\toptions: { noticeLines?: string[]; authOnly?: boolean; keybindings?: PanelKeybindings } = {},\n\t) {\n\t\tthis.config = config;\n\t\tthis.cache = cache;\n\t\tthis.callbacks = callbacks;\n\t\tthis.done = done;\n\t\tthis.tui = tui;\n\t\tthis.noticeLines = options.noticeLines ?? [];\n\t\tthis.authOnly = options.authOnly === true;\n\t\tthis.keys = createPanelKeys(options.keybindings);\n\t\tthis.prefix = config.settings?.toolPrefix ?? \"server\";\n\n\t\tfor (const [serverName, definition] of Object.entries(config.mcpServers)) {\n\t\t\tif (this.authOnly && !callbacks.canAuthenticate(serverName)) continue;\n\t\t\tconst prov = provenance.get(serverName);\n\t\t\tconst cachedEntry = this.cache?.servers?.[serverName];\n\t\t\tconst serverCache = cachedEntry && isServerCacheValid(cachedEntry, definition) ? cachedEntry : undefined;\n\n\t\t\tconst globalDirect = config.settings?.directTools;\n\t\t\tlet toolFilter: true | string[] | false = false;\n\t\t\tif (definition.directTools !== undefined) {\n\t\t\t\ttoolFilter = definition.directTools;\n\t\t\t} else if (globalDirect) {\n\t\t\t\ttoolFilter = globalDirect;\n\t\t\t}\n\n\t\t\tconst tools: ToolState[] = [];\n\t\t\tif (serverCache && !this.authOnly && !isServerDisabled(definition)) {\n\t\t\t\tfor (const tool of serverCache.tools ?? []) {\n\t\t\t\t\tif (!isUiToolVisibleToModel(tool.uiVisibility)) continue;\n\t\t\t\t\tif (\n\t\t\t\t\t\t!isToolAllowed(\n\t\t\t\t\t\t\ttool.name,\n\t\t\t\t\t\t\tserverName,\n\t\t\t\t\t\t\tthis.prefix,\n\t\t\t\t\t\t\tdefinition.includeTools,\n\t\t\t\t\t\t\tdefinition.excludeTools,\n\t\t\t\t\t\t\tthis.getOtherCurrentCandidates(serverName, definition, serverCache, tool.name),\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isDirect = toolFilter === true || (Array.isArray(toolFilter) && toolFilter.includes(tool.name));\n\t\t\t\t\ttools.push({\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\t\t\tisDirect,\n\t\t\t\t\t\twasDirect: isDirect,\n\t\t\t\t\t\testimatedTokens: estimateTokens(tool),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (definition.exposeResources !== false) {\n\t\t\t\t\tfor (const resource of serverCache.resources ?? []) {\n\t\t\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!isToolAllowed(\n\t\t\t\t\t\t\t\tbaseName,\n\t\t\t\t\t\t\t\tserverName,\n\t\t\t\t\t\t\t\tthis.prefix,\n\t\t\t\t\t\t\t\tdefinition.includeTools,\n\t\t\t\t\t\t\t\tdefinition.excludeTools,\n\t\t\t\t\t\t\t\tthis.getOtherCurrentCandidates(serverName, definition, serverCache, baseName),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isDirect = toolFilter === true || (Array.isArray(toolFilter) && toolFilter.includes(baseName));\n\t\t\t\t\t\tconst ct: CachedTool = {\n\t\t\t\t\t\t\tname: baseName,\n\t\t\t\t\t\t\t...(resource.description !== undefined ? { description: resource.description } : {}),\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttools.push({\n\t\t\t\t\t\t\tname: baseName,\n\t\t\t\t\t\t\tdescription: resource.description ?? `Read resource: ${resource.uri}`,\n\t\t\t\t\t\t\tisDirect,\n\t\t\t\t\t\t\twasDirect: isDirect,\n\t\t\t\t\t\t\testimatedTokens: estimateTokens(ct),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst status = callbacks.getConnectionStatus(serverName);\n\t\t\tconst failureMessage = callbacks.getFailureMessage?.(serverName) ?? null;\n\t\t\tlet directCount = 0;\n\t\t\tlet directTokens = 0;\n\t\t\tfor (const tool of tools) {\n\t\t\t\tif (!tool.isDirect) continue;\n\t\t\t\tdirectCount++;\n\t\t\t\tdirectTokens += tool.estimatedTokens;\n\t\t\t}\n\t\t\tthis.servers.push({\n\t\t\t\tname: serverName,\n\t\t\t\texpanded: false,\n\t\t\t\tsource: prov?.kind ?? \"user\",\n\t\t\t\t...(prov?.importKind !== undefined ? { importKind: prov.importKind } : {}),\n\t\t\t\t...(definition.includeTools !== undefined ? { includeTools: definition.includeTools } : {}),\n\t\t\t\t...(definition.excludeTools !== undefined ? { excludeTools: definition.excludeTools } : {}),\n\t\t\t\texposeResources: definition.exposeResources !== false,\n\t\t\t\tconnectionStatus: status,\n\t\t\t\tfailureMessage,\n\t\t\t\ttools,\n\t\t\t\tdirectCount,\n\t\t\t\tdirectTokens,\n\t\t\t\thasCachedData: !!serverCache,\n\t\t\t});\n\t\t}\n\n\t\tthis.rebuildVisibleItems();\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({ cancelled: true, changes: new Map() });\n\t\t}, McpPanel.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 rebuildVisibleItems(): void {\n\t\tconst query = this.descSearchActive ? this.descQuery : this.nameQuery;\n\t\tconst mode = this.descSearchActive ? \"desc\" : \"name\";\n\n\t\tthis.visibleItems = [];\n\t\tfor (let si = 0; si < this.servers.length; si++) {\n\t\t\tconst server = this.servers[si];\n\t\t\tif (!server) continue;\n\t\t\tif (query && this.authOnly) {\n\t\t\t\tconst score = mode === \"name\" ? fuzzyScore(query, server.name) : 0;\n\t\t\t\tif (score > 0) {\n\t\t\t\t\tthis.visibleItems.push({ type: \"server\", serverIndex: si });\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.visibleItems.push({ type: \"server\", serverIndex: si });\n\t\t\tif (server.expanded || query) {\n\t\t\t\tfor (let ti = 0; ti < server.tools.length; ti++) {\n\t\t\t\t\tconst tool = server.tools[ti];\n\t\t\t\t\tif (!tool) continue;\n\t\t\t\t\tif (query) {\n\t\t\t\t\t\tconst score =\n\t\t\t\t\t\t\tmode === \"name\"\n\t\t\t\t\t\t\t\t? Math.max(fuzzyScore(query, tool.name), fuzzyScore(query, server.name) * 0.6)\n\t\t\t\t\t\t\t\t: fuzzyScore(query, tool.description);\n\t\t\t\t\t\tif (score === 0) continue;\n\t\t\t\t\t}\n\t\t\t\t\tthis.visibleItems.push({ type: \"tool\", serverIndex: si, toolIndex: ti });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (query && !this.authOnly) {\n\t\t\tthis.visibleItems = this.visibleItems.filter((item) => {\n\t\t\t\tif (item.type === \"server\") {\n\t\t\t\t\treturn this.visibleItems.some(\n\t\t\t\t\t\t(other) => other.type === \"tool\" && other.serverIndex === item.serverIndex,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate updateDirty(): void {\n\t\tthis.dirty = this.servers.some((s) => s.tools.some((t) => t.isDirect !== t.wasDirect));\n\t}\n\n\tprivate buildResult(): McpPanelResult {\n\t\tconst changes = new Map<string, true | string[] | false>();\n\t\tfor (const server of this.servers) {\n\t\t\tconst changed = server.tools.some((t) => t.isDirect !== t.wasDirect);\n\t\t\tif (!changed) continue;\n\t\t\tconst directTools = server.tools.filter((t) => t.isDirect);\n\t\t\tif (directTools.length === server.tools.length && server.tools.length > 0) {\n\t\t\t\tchanges.set(server.name, true);\n\t\t\t} else if (directTools.length === 0) {\n\t\t\t\tchanges.set(server.name, false);\n\t\t\t} else {\n\t\t\t\tchanges.set(\n\t\t\t\t\tserver.name,\n\t\t\t\t\tdirectTools.map((t) => t.name),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn { changes, cancelled: false };\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.resetInactivityTimeout();\n\t\tthis.importNotice = null;\n\t\tif (!this.authInFlight) this.authNotice = null;\n\n\t\tif (this.confirmingDiscard) {\n\t\t\tthis.handleDiscardInput(data);\n\t\t\treturn;\n\t\t}\n\n\t\t// Global shortcuts — always work, even during desc search\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done({ cancelled: true, changes: new Map() });\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.keys.save(data)) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done(this.buildResult());\n\t\t\treturn;\n\t\t}\n\n\t\t// Modal description search mode\n\t\tif (this.descSearchActive) {\n\t\t\tif (matchesKey(data, \"escape\") || this.keys.selectConfirm(data)) {\n\t\t\t\tthis.descSearchActive = false;\n\t\t\t\tthis.descQuery = \"\";\n\t\t\t\tthis.rebuildVisibleItems();\n\t\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"backspace\")) {\n\t\t\t\tif (this.descQuery.length > 0) {\n\t\t\t\t\tthis.descQuery = this.descQuery.slice(0, -1);\n\t\t\t\t\tthis.rebuildVisibleItems();\n\t\t\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.keys.selectUp(data)) {\n\t\t\t\tthis.moveCursor(-1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.keys.selectDown(data)) {\n\t\t\t\tthis.moveCursor(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (matchesKey(data, \"space\")) {\n\t\t\t\t// Toggle even while in desc search\n\t\t\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\t\t\tif (item) this.toggleItem(item);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (data.length === 1 && data.charCodeAt(0) >= 32) {\n\t\t\t\tthis.descQuery += data;\n\t\t\t\tthis.rebuildVisibleItems();\n\t\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tif (this.nameQuery) {\n\t\t\t\tthis.nameQuery = \"\";\n\t\t\t\tthis.rebuildVisibleItems();\n\t\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.dirty) {\n\t\t\t\tthis.confirmingDiscard = true;\n\t\t\t\tthis.discardSelected = 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.cleanup();\n\t\t\tthis.done({ cancelled: true, changes: new Map() });\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.moveCursor(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.moveCursor(1);\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"space\")) {\n\t\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\t\tif (item && !this.authOnly) this.toggleItem(item);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\t\tif (!item) return;\n\t\t\tconst server = this.servers[item.serverIndex];\n\t\t\tif (!server) return;\n\t\t\tif (item.type === \"server\") {\n\t\t\t\tif (server.connectionStatus === \"disabled\") return;\n\t\t\t\tif (this.authOnly || server.connectionStatus === \"needs-auth\") {\n\t\t\t\t\tthis.authenticateServer(server);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tserver.expanded = !server.expanded;\n\t\t\t\tthis.rebuildVisibleItems();\n\t\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\t} else if (item.toolIndex !== undefined) {\n\t\t\t\tconst tool = server.tools[item.toolIndex];\n\t\t\t\tif (!tool) return;\n\t\t\t\tthis.toggleToolDirect(server, tool);\n\t\t\t\tif (tool.isDirect && server.source === \"import\") {\n\t\t\t\t\tthis.importNotice = `Imported from ${sanitizeDisplayText(server.importKind ?? \"external\")} — will copy to user config on save`;\n\t\t\t\t}\n\t\t\t\tthis.updateDirty();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"ctrl+a\")) {\n\t\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\t\tif (item) this.authenticateSelectedServer(item);\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"ctrl+r\")) {\n\t\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\t\tif (!item) return;\n\t\t\tconst server = this.servers[item.serverIndex];\n\t\t\tif (server) this.reconnectServer(server);\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"ctrl+y\")) {\n\t\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\t\tif (!item) return;\n\t\t\tconst server = this.servers[item.serverIndex];\n\t\t\tif (!server || server.connectionStatus !== \"failed\" || !server.failureMessage) return;\n\t\t\tconst serverName = sanitizeDisplayText(server.name);\n\t\t\tconst failureMessage = sanitizeDisplayText(server.failureMessage);\n\t\t\tcopyToClipboard(failureMessage)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.authNotice = `Copied error for ${serverName} to clipboard`;\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst message = sanitizeDisplayText(error instanceof Error ? error.message : String(error));\n\t\t\t\t\tthis.authNotice = `Failed to copy error for ${serverName}: ${message}`;\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (data === \"?\") {\n\t\t\tif (this.authOnly) return;\n\t\t\tthis.descSearchActive = true;\n\t\t\tthis.descQuery = \"\";\n\t\t\tthis.rebuildVisibleItems();\n\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\treturn;\n\t\t}\n\n\t\t// Backspace removes from name query\n\t\tif (matchesKey(data, \"backspace\")) {\n\t\t\tif (this.nameQuery.length > 0) {\n\t\t\t\tthis.nameQuery = this.nameQuery.slice(0, -1);\n\t\t\t\tthis.rebuildVisibleItems();\n\t\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// All other printable chars → always-on name search\n\t\tif (data.length === 1 && data.charCodeAt(0) >= 32) {\n\t\t\tthis.nameQuery += data;\n\t\t\tthis.rebuildVisibleItems();\n\t\t\tthis.cursorIndex = Math.min(this.cursorIndex, Math.max(0, this.visibleItems.length - 1));\n\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate authenticateSelectedServer(item: VisibleItem): void {\n\t\tconst server = this.servers[item.serverIndex];\n\t\tif (server) this.authenticateServer(server);\n\t}\n\n\tprivate authenticateServer(server: ServerState): void {\n\t\tif (this.authInFlight) return;\n\t\tif (server.connectionStatus === \"connecting\" || server.connectionStatus === \"disabled\") return;\n\t\tconst serverName = sanitizeDisplayText(server.name);\n\t\tif (!this.callbacks.canAuthenticate(server.name)) {\n\t\t\tthis.authNotice = `${serverName} does not use OAuth authentication.`;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.authInFlight = server.name;\n\t\tthis.authNotice = `Authenticating ${serverName}...`;\n\t\tthis.tui.requestRender();\n\n\t\tthis.callbacks\n\t\t\t.authenticate(server.name)\n\t\t\t.then((result) => {\n\t\t\t\tserver.connectionStatus = this.callbacks.getConnectionStatus(server.name);\n\t\t\t\tif (result.ok) {\n\t\t\t\t\tthis.authNotice = `OAuth finished for ${serverName}. Reconnecting...`;\n\t\t\t\t\tthis.authInFlight = null;\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t\tthis.reconnectServer(server, { afterAuth: true });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = sanitizeDisplayText(result.message);\n\t\t\t\tthis.authNotice = `OAuth failed for ${serverName}${message ? `: ${message}` : \". Check the notification for details.\"}`;\n\t\t\t\tthis.authInFlight = null;\n\t\t\t\tthis.tui.requestRender();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconst message = sanitizeDisplayText(error instanceof Error ? error.message : String(error));\n\t\t\t\tserver.connectionStatus = this.callbacks.getConnectionStatus(server.name);\n\t\t\t\tthis.authNotice = `OAuth failed for ${serverName}: ${message}`;\n\t\t\t\tthis.authInFlight = null;\n\t\t\t\tthis.tui.requestRender();\n\t\t\t});\n\t}\n\n\tprivate reconnectServer(server: ServerState, options: { afterAuth?: boolean } = {}): void {\n\t\tif (server.connectionStatus === \"connecting\" || server.connectionStatus === \"disabled\") return;\n\t\tconst serverName = sanitizeDisplayText(server.name);\n\t\tserver.connectionStatus = \"connecting\";\n\t\tthis.tui.requestRender();\n\n\t\tthis.callbacks\n\t\t\t.reconnect(server.name)\n\t\t\t.then((connected) => {\n\t\t\t\tserver.connectionStatus = this.callbacks.getConnectionStatus(server.name);\n\t\t\t\tserver.failureMessage = this.callbacks.getFailureMessage?.(server.name) ?? null;\n\t\t\t\tif (server.connectionStatus === \"connected\") {\n\t\t\t\t\tconst entry = this.callbacks.refreshCacheAfterReconnect(server.name);\n\t\t\t\t\tif (entry) {\n\t\t\t\t\t\tthis.cache ??= { version: 1, servers: {} };\n\t\t\t\t\t\tthis.cache.servers[server.name] = entry;\n\t\t\t\t\t\tthis.rebuildServerTools(server, entry);\n\t\t\t\t\t}\n\t\t\t\t\tserver.hasCachedData = true;\n\t\t\t\t}\n\t\t\t\tif (options.afterAuth) {\n\t\t\t\t\tthis.authNotice =\n\t\t\t\t\t\tconnected && server.connectionStatus === \"connected\"\n\t\t\t\t\t\t\t? `OAuth finished for ${serverName}. Reconnected.`\n\t\t\t\t\t\t\t: `OAuth finished for ${serverName}, but reconnect did not complete. Press ctrl+r to retry.`;\n\t\t\t\t}\n\t\t\t\tthis.tui.requestRender();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tserver.connectionStatus = \"failed\";\n\t\t\t\tconst message = sanitizeDisplayText(error instanceof Error ? error.message : String(error));\n\t\t\t\tthis.authNotice = `Reconnect failed for ${serverName}: ${message}`;\n\t\t\t\tthis.tui.requestRender();\n\t\t\t});\n\t}\n\n\tprivate toggleItem(item: VisibleItem): void {\n\t\tif (this.authOnly) return;\n\t\tconst server = this.servers[item.serverIndex];\n\t\tif (!server) return;\n\t\tif (item.type === \"server\") {\n\t\t\tconst newState = !server.tools.every((t) => t.isDirect);\n\t\t\tif (server.source === \"import\" && newState) {\n\t\t\t\tthis.importNotice = `Imported from ${sanitizeDisplayText(server.importKind ?? \"external\")} — will copy to user config on save`;\n\t\t\t}\n\t\t\tlet directTokens = 0;\n\t\t\tfor (const tool of server.tools) {\n\t\t\t\ttool.isDirect = newState;\n\t\t\t\tif (newState) directTokens += tool.estimatedTokens;\n\t\t\t}\n\t\t\tserver.directCount = newState ? server.tools.length : 0;\n\t\t\tserver.directTokens = directTokens;\n\t\t} else if (item.toolIndex !== undefined) {\n\t\t\tconst tool = server.tools[item.toolIndex];\n\t\t\tif (!tool) return;\n\t\t\tthis.toggleToolDirect(server, tool);\n\t\t\tif (tool.isDirect && server.source === \"import\") {\n\t\t\t\tthis.importNotice = `Imported from ${sanitizeDisplayText(server.importKind ?? \"external\")} — will copy to user config on save`;\n\t\t\t}\n\t\t}\n\t\tthis.updateDirty();\n\t}\n\n\tprivate toggleToolDirect(server: ServerState, tool: ToolState): void {\n\t\ttool.isDirect = !tool.isDirect;\n\t\tserver.directCount += tool.isDirect ? 1 : -1;\n\t\tserver.directTokens += tool.isDirect ? tool.estimatedTokens : -tool.estimatedTokens;\n\t}\n\n\tprivate handleDiscardInput(data: string): void {\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done({ cancelled: true, changes: new Map() });\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"escape\") || data === \"n\" || data === \"N\") {\n\t\t\tthis.confirmingDiscard = false;\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tthis.cleanup();\n\t\t\tif (this.discardSelected === 0) {\n\t\t\t\tthis.done({ cancelled: true, changes: new Map() });\n\t\t\t} else {\n\t\t\t\tthis.done(this.buildResult());\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"y\" || data === \"Y\") {\n\t\t\tthis.cleanup();\n\t\t\tthis.done({ cancelled: true, changes: new Map() });\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"left\") || matchesKey(data, \"right\") || matchesKey(data, \"tab\")) {\n\t\t\tthis.discardSelected = this.discardSelected === 0 ? 1 : 0;\n\t\t}\n\t}\n\n\tprivate moveCursor(delta: number): void {\n\t\tif (this.visibleItems.length === 0) return;\n\t\tthis.cursorIndex = Math.max(0, Math.min(this.visibleItems.length - 1, this.cursorIndex + delta));\n\t}\n\n\tprivate getOtherCurrentCandidates(\n\t\tserverName: string,\n\t\tdefinition: McpConfig[\"mcpServers\"][string],\n\t\tcurrentEntry: ServerCacheEntry,\n\t\ttoolName: string,\n\t): Set<string> {\n\t\tconst candidates = new Set<string>();\n\t\tfor (const [otherServerName, otherDefinition] of Object.entries(this.config.mcpServers)) {\n\t\t\tif (isServerDisabled(otherDefinition)) continue;\n\t\t\tconst cachedEntry = this.cache?.servers?.[otherServerName];\n\t\t\tconst entry =\n\t\t\t\totherServerName === serverName\n\t\t\t\t\t? currentEntry\n\t\t\t\t\t: cachedEntry && isServerCacheValid(cachedEntry, otherDefinition)\n\t\t\t\t\t\t? cachedEntry\n\t\t\t\t\t\t: undefined;\n\t\t\tif (!entry) continue;\n\t\t\tconst otherPrefix = resolveToolPrefix(otherDefinition, this.prefix);\n\t\t\tfor (const tool of entry.tools ?? []) {\n\t\t\t\tif (!isUiToolVisibleToModel(tool.uiVisibility)) continue;\n\t\t\t\tfor (const candidate of getToolNameCandidates(tool.name, otherServerName, otherPrefix, false))\n\t\t\t\t\tcandidates.add(candidate);\n\t\t\t}\n\t\t\tif (otherDefinition.exposeResources !== false) {\n\t\t\t\tfor (const resource of entry.resources ?? []) {\n\t\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\t\tfor (const candidate of getToolNameCandidates(baseName, otherServerName, otherPrefix, false))\n\t\t\t\t\t\tcandidates.add(candidate);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const candidate of getToolNameCandidates(\n\t\t\ttoolName,\n\t\t\tserverName,\n\t\t\tresolveToolPrefix(definition, this.prefix),\n\t\t\tfalse,\n\t\t))\n\t\t\tcandidates.delete(candidate);\n\t\treturn candidates;\n\t}\n\n\tprivate rebuildServerTools(server: ServerState, entry: ServerCacheEntry): void {\n\t\tconst existingState = new Map<string, boolean>();\n\t\tfor (const t of server.tools) existingState.set(t.name, t.isDirect);\n\n\t\tconst newTools: ToolState[] = [];\n\t\tfor (const tool of entry.tools ?? []) {\n\t\t\tif (!isUiToolVisibleToModel(tool.uiVisibility)) continue;\n\t\t\tif (\n\t\t\t\t!isToolAllowed(\n\t\t\t\t\ttool.name,\n\t\t\t\t\tserver.name,\n\t\t\t\t\tthis.prefix,\n\t\t\t\t\tserver.includeTools,\n\t\t\t\t\tserver.excludeTools,\n\t\t\t\t\tthis.getOtherCurrentCandidates(server.name, server, entry, tool.name),\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst prev = existingState.get(tool.name);\n\t\t\tconst isDirect = prev !== undefined ? prev : false;\n\t\t\tnewTools.push({\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\tisDirect,\n\t\t\t\twasDirect:\n\t\t\t\t\tprev !== undefined ? (server.tools.find((t) => t.name === tool.name)?.wasDirect ?? false) : false,\n\t\t\t\testimatedTokens: estimateTokens(tool),\n\t\t\t});\n\t\t}\n\n\t\tif (server.exposeResources) {\n\t\t\tfor (const resource of entry.resources ?? []) {\n\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\tif (\n\t\t\t\t\t!isToolAllowed(\n\t\t\t\t\t\tbaseName,\n\t\t\t\t\t\tserver.name,\n\t\t\t\t\t\tthis.prefix,\n\t\t\t\t\t\tserver.includeTools,\n\t\t\t\t\t\tserver.excludeTools,\n\t\t\t\t\t\tthis.getOtherCurrentCandidates(server.name, server, entry, baseName),\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst prev = existingState.get(baseName);\n\t\t\t\tconst isDirect = prev !== undefined ? prev : false;\n\t\t\t\tconst ct: CachedTool = {\n\t\t\t\t\tname: baseName,\n\t\t\t\t\t...(resource.description !== undefined ? { description: resource.description } : {}),\n\t\t\t\t};\n\t\t\t\tnewTools.push({\n\t\t\t\t\tname: baseName,\n\t\t\t\t\tdescription: resource.description ?? `Read resource: ${resource.uri}`,\n\t\t\t\t\tisDirect,\n\t\t\t\t\twasDirect:\n\t\t\t\t\t\tprev !== undefined ? (server.tools.find((t) => t.name === baseName)?.wasDirect ?? false) : false,\n\t\t\t\t\testimatedTokens: estimateTokens(ct),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tserver.tools = newTools;\n\t\tserver.directCount = 0;\n\t\tserver.directTokens = 0;\n\t\tfor (const tool of newTools) {\n\t\t\tif (!tool.isDirect) continue;\n\t\t\tserver.directCount++;\n\t\t\tserver.directTokens += tool.estimatedTokens;\n\t\t}\n\t\tthis.rebuildVisibleItems();\n\t\tthis.updateDirty();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst innerW = width - 2;\n\t\tconst lines: string[] = [];\n\t\tconst t = this.t;\n\t\tconst bold = (s: string) => `\\x1b[1m${s}\\x1b[22m`;\n\t\tconst italic = (s: string) => `\\x1b[3m${s}\\x1b[23m`;\n\t\tconst inverse = (s: string) => `\\x1b[7m${s}\\x1b[27m`;\n\n\t\tconst row = (content: string) =>\n\t\t\tfg(t.border, \"│\") + truncateToWidth(` ${sanitizeRowContent(content)}`, innerW, \"…\", true) + fg(t.border, \"│\");\n\t\tconst emptyRow = () => fg(t.border, \"│\") + \" \".repeat(innerW) + fg(t.border, \"│\");\n\t\tconst divider = () => fg(t.border, `├${\"─\".repeat(innerW)}┤`);\n\n\t\tconst titleText = this.authOnly ? \" MCP OAuth \" : \" MCP Servers \";\n\t\tconst borderLen = innerW - visibleWidth(titleText);\n\t\tconst leftB = Math.floor(borderLen / 2);\n\t\tconst rightB = borderLen - leftB;\n\t\tlines.push(\n\t\t\tfg(t.border, `╭${\"─\".repeat(leftB)}`) + fg(t.title, titleText) + fg(t.border, `${\"─\".repeat(rightB)}╮`),\n\t\t);\n\n\t\tlines.push(emptyRow());\n\n\t\tconst cursor = fg(t.selected, \"│\");\n\t\tconst searchIcon = fg(t.border, \"◎\");\n\t\tif (this.descSearchActive) {\n\t\t\tlines.push(row(`${searchIcon} ${fg(t.needsAuth, \"desc:\")} ${this.descQuery}${cursor}`));\n\t\t} else if (this.nameQuery) {\n\t\t\tlines.push(row(`${searchIcon} ${this.nameQuery}${cursor}`));\n\t\t} else {\n\t\t\tlines.push(row(`${searchIcon} ${fg(t.placeholder, italic(\"search...\"))}`));\n\t\t}\n\n\t\tlines.push(emptyRow());\n\t\tif (this.noticeLines.length > 0) {\n\t\t\tfor (const notice of this.noticeLines) {\n\t\t\t\tlines.push(row(fg(t.hint, italic(sanitizeDisplayText(notice)))));\n\t\t\t}\n\t\t\tlines.push(emptyRow());\n\t\t}\n\t\tlines.push(divider());\n\n\t\tif (this.servers.length === 0) {\n\t\t\tlines.push(emptyRow());\n\t\t\tlines.push(\n\t\t\t\trow(\n\t\t\t\t\tfg(\n\t\t\t\t\t\tt.hint,\n\t\t\t\t\t\titalic(this.authOnly ? \"No OAuth-capable MCP servers configured.\" : \"No MCP servers configured.\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\t\t\tlines.push(emptyRow());\n\t\t} else {\n\t\t\tconst maxVis = McpPanel.MAX_VISIBLE;\n\t\t\tconst total = this.visibleItems.length;\n\t\t\tconst startIdx = Math.max(0, Math.min(this.cursorIndex - Math.floor(maxVis / 2), total - maxVis));\n\t\t\tconst endIdx = Math.min(startIdx + maxVis, total);\n\n\t\t\tlines.push(emptyRow());\n\n\t\t\tfor (let i = startIdx; i < endIdx; i++) {\n\t\t\t\tconst item = this.visibleItems[i];\n\t\t\t\tif (!item) continue;\n\t\t\t\tconst isCursor = i === this.cursorIndex;\n\t\t\t\tconst server = this.servers[item.serverIndex];\n\t\t\t\tif (!server) continue;\n\n\t\t\t\tif (item.type === \"server\") {\n\t\t\t\t\tlines.push(row(this.renderServerRow(server, isCursor)));\n\t\t\t\t\tif (isCursor && server.connectionStatus === \"failed\" && server.failureMessage) {\n\t\t\t\t\t\tfor (const line of this.wrapText(sanitizeDisplayText(server.failureMessage), innerW - 6)) {\n\t\t\t\t\t\t\tlines.push(row(` ${fg(t.cancel, line)}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (item.toolIndex !== undefined) {\n\t\t\t\t\tconst tool = server.tools[item.toolIndex];\n\t\t\t\t\tif (tool) lines.push(row(this.renderToolRow(tool, isCursor, innerW)));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(emptyRow());\n\n\t\t\tif (total > maxVis) {\n\t\t\t\tconst prog = Math.round(((this.cursorIndex + 1) / total) * 10);\n\t\t\t\tlines.push(row(`${rainbowProgress(prog, 10)} ${fg(t.hint, `${this.cursorIndex + 1}/${total}`)}`));\n\t\t\t\tlines.push(emptyRow());\n\t\t\t}\n\n\t\t\tif (this.importNotice) {\n\t\t\t\tlines.push(row(fg(t.needsAuth, italic(sanitizeDisplayText(this.importNotice)))));\n\t\t\t\tlines.push(emptyRow());\n\t\t\t}\n\t\t\tif (this.authNotice) {\n\t\t\t\tlines.push(row(fg(t.needsAuth, italic(sanitizeDisplayText(this.authNotice)))));\n\t\t\t\tlines.push(emptyRow());\n\t\t\t}\n\t\t}\n\n\t\tlines.push(divider());\n\t\tlines.push(emptyRow());\n\n\t\tif (this.confirmingDiscard) {\n\t\t\tconst discardBtn =\n\t\t\t\tthis.discardSelected === 0 ? inverse(bold(fg(t.cancel, \" Discard \"))) : fg(t.hint, \" Discard \");\n\t\t\tconst keepBtn =\n\t\t\t\tthis.discardSelected === 1\n\t\t\t\t\t? inverse(bold(fg(t.confirm, \" Keep & Close \")))\n\t\t\t\t\t: fg(t.hint, \" Keep & Close \");\n\t\t\tlines.push(row(`Discard unsaved changes? ${discardBtn} ${keepBtn}`));\n\t\t} else {\n\t\t\tif (this.authOnly) {\n\t\t\t\tlines.push(row(fg(t.description, \"select a server to authenticate\")));\n\t\t\t} else {\n\t\t\t\tlet directCount = 0;\n\t\t\t\tlet directTokens = 0;\n\t\t\t\tfor (const server of this.servers) {\n\t\t\t\t\tdirectCount += server.directCount;\n\t\t\t\t\tdirectTokens += server.directTokens;\n\t\t\t\t}\n\t\t\t\tconst stats =\n\t\t\t\t\tdirectCount > 0 ? `${directCount} direct ~${directTokens.toLocaleString()} tokens` : \"no direct tools\";\n\t\t\t\tlines.push(row(fg(t.description, stats + (this.dirty ? fg(t.needsAuth, \" (unsaved)\") : \"\"))));\n\t\t\t}\n\t\t}\n\n\t\tlines.push(emptyRow());\n\t\tconst saveLabel = this.keys.saveLabel();\n\t\tconst hints = this.authOnly\n\t\t\t? [\n\t\t\t\t\t`${italic(\"↑↓\")} navigate`,\n\t\t\t\t\t`${italic(\"⏎\")} auth`,\n\t\t\t\t\t`${italic(\"ctrl+a\")} auth`,\n\t\t\t\t\t`${italic(\"esc\")} clear/close`,\n\t\t\t\t\t`${italic(\"ctrl+c\")} quit`,\n\t\t\t\t]\n\t\t\t: [\n\t\t\t\t\t`${italic(\"↑↓\")} navigate`,\n\t\t\t\t\t`${italic(\"space\")} toggle`,\n\t\t\t\t\t`${italic(\"⏎\")} expand/auth`,\n\t\t\t\t\t`${italic(\"ctrl+a\")} auth`,\n\t\t\t\t\t`${italic(\"ctrl+r\")} reconnect`,\n\t\t\t\t\t...(this.selectedServerHasFailureMessage() ? [`${italic(\"ctrl+y\")} copy error`] : []),\n\t\t\t\t\t`${italic(\"?\")} desc search`,\n\t\t\t\t\t...(saveLabel ? [`${italic(saveLabel)} save`] : []),\n\t\t\t\t\t`${italic(\"esc\")} clear/close`,\n\t\t\t\t\t`${italic(\"ctrl+c\")} quit`,\n\t\t\t\t];\n\t\tconst gap = \" \";\n\t\tconst gapW = 2;\n\t\tconst maxW = innerW - 2;\n\t\tlet curLine = \"\";\n\t\tlet curW = 0;\n\t\tfor (const hint of hints) {\n\t\t\tconst hw = visibleWidth(hint);\n\t\t\tconst needed = curW === 0 ? hw : gapW + hw;\n\t\t\tif (curW > 0 && curW + needed > maxW) {\n\t\t\t\tlines.push(row(fg(t.hint, curLine)));\n\t\t\t\tcurLine = hint;\n\t\t\t\tcurW = hw;\n\t\t\t} else {\n\t\t\t\tcurLine += (curW > 0 ? gap : \"\") + hint;\n\t\t\t\tcurW += needed;\n\t\t\t}\n\t\t}\n\t\tif (curLine) lines.push(row(fg(t.hint, curLine)));\n\n\t\tlines.push(fg(t.border, `╰${\"─\".repeat(innerW)}╯`));\n\n\t\treturn lines;\n\t}\n\n\tprivate renderServerRow(server: ServerState, isCursor: boolean): string {\n\t\tconst t = this.t;\n\t\tconst bold = (s: string) => `\\x1b[1m${s}\\x1b[22m`;\n\n\t\tconst expandIcon = server.expanded ? \"▾\" : \"▸\";\n\t\tconst prefix = isCursor ? fg(t.selected, expandIcon) : fg(t.border, server.expanded ? expandIcon : \"·\");\n\n\t\tconst serverName = sanitizeDisplayText(server.name);\n\t\tconst importKind = sanitizeDisplayText(server.importKind ?? \"import\");\n\t\tconst nameStr = isCursor ? bold(fg(t.selected, serverName)) : serverName;\n\t\tconst importLabel = server.source === \"import\" ? fg(t.description, ` (${importKind})`) : \"\";\n\t\tconst statusLabel = this.renderConnectionStatus(server);\n\n\t\tif (!server.hasCachedData && !this.authOnly) {\n\t\t\treturn `${prefix} ${nameStr}${importLabel} ${fg(t.description, \"(not cached)\")}${statusLabel}`;\n\t\t}\n\n\t\tconst directCount = server.directCount;\n\t\tconst totalCount = server.tools.length;\n\t\tlet toggleIcon = fg(t.description, \"○\");\n\t\tif (directCount === totalCount && totalCount > 0) {\n\t\t\ttoggleIcon = fg(t.direct, \"●\");\n\t\t} else if (directCount > 0) {\n\t\t\ttoggleIcon = fg(t.needsAuth, \"◐\");\n\t\t}\n\n\t\tlet toolInfo = \"\";\n\t\tif (totalCount > 0) {\n\t\t\ttoolInfo = `${directCount}/${totalCount}`;\n\t\t\tif (directCount > 0) {\n\t\t\t\ttoolInfo += ` ~${server.directTokens.toLocaleString()}`;\n\t\t\t}\n\t\t\ttoolInfo = fg(t.description, toolInfo);\n\t\t}\n\n\t\treturn `${prefix} ${toggleIcon} ${nameStr}${importLabel} ${toolInfo}${statusLabel}`;\n\t}\n\n\tprivate selectedServerHasFailureMessage(): boolean {\n\t\tconst item = this.visibleItems[this.cursorIndex];\n\t\tif (!item) return false;\n\t\tconst server = this.servers[item.serverIndex];\n\t\treturn server?.connectionStatus === \"failed\" && !!server.failureMessage;\n\t}\n\n\tprivate wrapText(text: string, width: number): string[] {\n\t\tconst max = Math.max(8, width);\n\t\tconst words = text.split(/\\s+/).filter(Boolean);\n\t\tconst lines: string[] = [];\n\t\tlet current = \"\";\n\t\tconst splitLongWord = (word: string): string => {\n\t\t\tlet rest = word;\n\t\t\twhile (visibleWidth(rest) > max) {\n\t\t\t\tlet take = \"\";\n\t\t\t\tlet index = 0;\n\t\t\t\twhile (index < rest.length && visibleWidth(take + rest.charAt(index)) <= max) {\n\t\t\t\t\ttake += rest.charAt(index);\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t\tif (!take) take = rest.charAt(0);\n\t\t\t\tlines.push(take);\n\t\t\t\trest = rest.slice(take.length);\n\t\t\t}\n\t\t\treturn rest;\n\t\t};\n\n\t\tfor (const word of words) {\n\t\t\tconst candidate = current ? `${current} ${word}` : word;\n\t\t\tif (visibleWidth(candidate) <= max) {\n\t\t\t\tcurrent = candidate;\n\t\t\t} else {\n\t\t\t\tif (current) lines.push(current);\n\t\t\t\tcurrent = splitLongWord(word);\n\t\t\t}\n\t\t}\n\t\tif (current) lines.push(current);\n\t\treturn lines.length > 0 ? lines : [text];\n\t}\n\n\tprivate renderConnectionStatus(server: ServerState): string {\n\t\tconst t = this.t;\n\t\tif (this.authInFlight === server.name) return ` ${fg(t.needsAuth, \"authenticating\")}`;\n\t\tif (server.connectionStatus === \"disabled\") return ` ${fg(t.description, \"disabled\")}`;\n\t\tif (server.connectionStatus === \"needs-auth\") return ` ${fg(t.needsAuth, \"needs auth\")}`;\n\t\tif (server.connectionStatus === \"connecting\") return ` ${fg(t.needsAuth, \"connecting\")}`;\n\t\tif (server.connectionStatus === \"failed\") return ` ${fg(t.cancel, \"failed\")}`;\n\t\tif (this.authOnly && server.connectionStatus === \"connected\") return ` ${fg(t.direct, \"connected\")}`;\n\t\tif (this.authOnly) return ` ${fg(t.description, \"idle\")}`;\n\t\treturn \"\";\n\t}\n\n\tprivate renderToolRow(tool: ToolState, isCursor: boolean, innerW: number): string {\n\t\tconst t = this.t;\n\t\tconst bold = (s: string) => `\\x1b[1m${s}\\x1b[22m`;\n\n\t\tconst toggleIcon = tool.isDirect ? fg(t.direct, \"●\") : fg(t.description, \"○\");\n\t\tconst cursor = isCursor ? fg(t.selected, \"▸\") : \" \";\n\t\tconst toolName = sanitizeDisplayText(tool.name);\n\t\tconst description = sanitizeDisplayText(tool.description);\n\t\tconst nameStr = isCursor ? bold(fg(t.selected, toolName)) : toolName;\n\n\t\tconst prefixLen = 7 + visibleWidth(toolName);\n\t\tconst maxDescLen = Math.max(0, innerW - prefixLen - 8);\n\t\tconst descStr =\n\t\t\tmaxDescLen > 5 && description ? fg(t.description, `— ${truncateToWidth(description, maxDescLen, \"…\")}`) : \"\";\n\n\t\treturn ` ${cursor} ${toggleIcon} ${nameStr} ${descStr}`;\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.cleanup();\n\t}\n}\n\nexport function createMcpPanel(\n\tconfig: McpConfig,\n\tcache: MetadataCache | null,\n\tprovenance: Map<string, ServerProvenance>,\n\tcallbacks: McpPanelCallbacks,\n\ttui: { requestRender(): void },\n\tdone: (result: McpPanelResult) => void,\n\toptions?: { noticeLines?: string[]; authOnly?: boolean; keybindings?: PanelKeybindings },\n): McpPanel & { dispose(): void } {\n\treturn new McpPanel(config, cache, provenance, callbacks, tui, done, options ?? {});\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export interface McpProbeResult {
2
+ isMcp: boolean;
3
+ classification: string;
4
+ }
5
+ /** Makes up to three unauthenticated metadata-only requests to identify an HTTP endpoint's protocol shape. */
6
+ export declare function probeMcpEndpoint(url: string | URL): Promise<McpProbeResult>;
7
+ //# sourceMappingURL=mcp-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-probe.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-probe.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACvB;AAiKD,8GAA8G;AAC9G,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,CAcjF","sourcesContent":["import { VERSION } from \"../../config.ts\";\n\nconst PROBE_TIMEOUT_MS = 5_000;\nconst MODERN_PROTOCOL_VERSION = \"2026-07-28\";\nconst LEGACY_PROTOCOL_VERSION = \"2025-06-18\";\nconst JSON_ACCEPT = \"application/json, text/event-stream\";\nconst SSE_ACCEPT = \"text/event-stream\";\nconst MODERN_FALLBACK_STATUSES = new Set([400, 401, 404, 405, 406, 415]);\nconst POST_ENDPOINT_MISMATCH_STATUSES = new Set([404, 405, 406, 415]);\n\nexport interface McpProbeResult {\n\tisMcp: boolean;\n\tclassification: string;\n}\n\nconst DISCOVER_REQUEST = {\n\tjsonrpc: \"2.0\",\n\tid: 1,\n\tmethod: \"server/discover\",\n\tparams: {},\n};\n\nconst INITIALIZE_REQUEST = {\n\tjsonrpc: \"2.0\",\n\tid: 1,\n\tmethod: \"initialize\",\n\tparams: {\n\t\tprotocolVersion: LEGACY_PROTOCOL_VERSION,\n\t\tcapabilities: {},\n\t\tclientInfo: { name: \"nexus-cli-mcp-probe\", version: VERSION },\n\t},\n};\n\ntype ProbeStrategy =\n\t| { kind: \"modern\"; request: RequestInit; allowJson: true }\n\t| { kind: \"legacy-post\"; request: RequestInit; allowJson: true }\n\t| { kind: \"legacy-sse\"; request: RequestInit; allowJson: false };\n\nconst MODERN_STRATEGY: ProbeStrategy = {\n\tkind: \"modern\",\n\trequest: {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\tAccept: JSON_ACCEPT,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"MCP-Protocol-Version\": MODERN_PROTOCOL_VERSION,\n\t\t\t\"Mcp-Method\": \"server/discover\",\n\t\t},\n\t\tbody: JSON.stringify(DISCOVER_REQUEST),\n\t},\n\tallowJson: true,\n};\n\nconst LEGACY_POST_STRATEGY: ProbeStrategy = {\n\tkind: \"legacy-post\",\n\trequest: {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\tAccept: JSON_ACCEPT,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify(INITIALIZE_REQUEST),\n\t},\n\tallowJson: true,\n};\n\nconst LEGACY_SSE_STRATEGY: ProbeStrategy = {\n\tkind: \"legacy-sse\",\n\trequest: { headers: { Accept: SSE_ACCEPT } },\n\tallowJson: false,\n};\n\ntype JsonRpcEnvelopeInfo = { kind: \"result\"; protocolVersion: unknown } | { kind: \"error\" };\n\ntype ProbeOutcome = { kind: \"mcp\"; result: McpProbeResult } | { kind: \"unsupported-modern\" } | { kind: \"unrecognized\" };\n\ninterface ProbeResult {\n\tresponse: Response;\n\toutcome: ProbeOutcome;\n}\n\nfunction jsonRpcEnvelopeInfo(value: unknown): JsonRpcEnvelopeInfo | null {\n\tif (typeof value !== \"object\" || value === null || (value as { jsonrpc?: unknown }).jsonrpc !== \"2.0\") {\n\t\treturn null;\n\t}\n\tif (\"result\" in value) {\n\t\tconst result = (value as { result?: unknown }).result;\n\t\treturn {\n\t\t\tkind: \"result\",\n\t\t\tprotocolVersion:\n\t\t\t\ttypeof result === \"object\" && result !== null\n\t\t\t\t\t? (result as { protocolVersion?: unknown }).protocolVersion\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\tif (\"error\" in value) return { kind: \"error\" };\n\treturn null;\n}\n\nfunction isBearerChallenge(response: Response): boolean {\n\treturn /(?:^|,)\\s*Bearer\\b/i.test(response.headers.get(\"www-authenticate\") ?? \"\");\n}\n\nfunction responseKind(response: Response): string {\n\tconst contentType = response.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase();\n\tif (contentType === \"text/html\") return \"HTML\";\n\tif (contentType) return contentType;\n\treturn \"an untyped response\";\n}\n\nasync function getJsonRpcEnvelopeInfo(response: Response): Promise<JsonRpcEnvelopeInfo | null> {\n\ttry {\n\t\treturn jsonRpcEnvelopeInfo(JSON.parse(await response.text()));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function classifyResponse(response: Response, strategy: ProbeStrategy): Promise<ProbeOutcome> {\n\tconst isSse = response.headers.get(\"content-type\")?.toLowerCase().startsWith(\"text/event-stream\");\n\tif (response.ok && isSse) {\n\t\treturn { kind: \"mcp\", result: { isMcp: true, classification: \"endpoint responded with an MCP event stream\" } };\n\t}\n\n\tconst envelope = strategy.allowJson || response.status === 401 ? await getJsonRpcEnvelopeInfo(response) : null;\n\tif (response.ok && strategy.allowJson && envelope) {\n\t\tif (\n\t\t\tstrategy.kind === \"modern\" &&\n\t\t\t(envelope.kind === \"error\" || envelope.protocolVersion !== MODERN_PROTOCOL_VERSION)\n\t\t) {\n\t\t\treturn { kind: \"unsupported-modern\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"mcp\",\n\t\t\tresult: {\n\t\t\t\tisMcp: true,\n\t\t\t\tclassification:\n\t\t\t\t\tstrategy.kind === \"modern\"\n\t\t\t\t\t\t? `endpoint supports stateless MCP ${MODERN_PROTOCOL_VERSION} server/discover`\n\t\t\t\t\t\t: \"endpoint responded with a JSON-RPC 2.0 envelope\",\n\t\t\t},\n\t\t};\n\t}\n\tif (response.status === 401 && isBearerChallenge(response) && envelope) {\n\t\treturn {\n\t\t\tkind: \"mcp\",\n\t\t\tresult: {\n\t\t\t\tisMcp: true,\n\t\t\t\tclassification:\n\t\t\t\t\tstrategy.kind === \"modern\"\n\t\t\t\t\t\t? `endpoint requires Bearer authentication during MCP ${MODERN_PROTOCOL_VERSION} server/discover probing`\n\t\t\t\t\t\t: \"endpoint requires Bearer authentication and responded with a JSON-RPC 2.0 error\",\n\t\t\t},\n\t\t};\n\t}\n\n\treturn { kind: \"unrecognized\" };\n}\n\nasync function probe(url: string | URL, strategy: ProbeStrategy): Promise<ProbeResult> {\n\tconst response = await fetch(url, {\n\t\t...strategy.request,\n\t\tsignal: AbortSignal.timeout(PROBE_TIMEOUT_MS),\n\t});\n\treturn { response, outcome: await classifyResponse(response, strategy) };\n}\n\nfunction notMcp(response: Response): McpProbeResult {\n\treturn {\n\t\tisMcp: false,\n\t\tclassification: `endpoint returned ${responseKind(response)} (${response.status}) — this URL does not appear to speak MCP`,\n\t};\n}\n\n/** Makes up to three unauthenticated metadata-only requests to identify an HTTP endpoint's protocol shape. */\nexport async function probeMcpEndpoint(url: string | URL): Promise<McpProbeResult> {\n\tconst { response: modernResponse, outcome: modernOutcome } = await probe(url, MODERN_STRATEGY);\n\tif (modernOutcome.kind === \"mcp\") return modernOutcome.result;\n\n\tif (modernOutcome.kind !== \"unsupported-modern\" && !MODERN_FALLBACK_STATUSES.has(modernResponse.status)) {\n\t\treturn notMcp(modernResponse);\n\t}\n\n\tconst { response: postResponse, outcome: postOutcome } = await probe(url, LEGACY_POST_STRATEGY);\n\tif (postOutcome.kind === \"mcp\") return postOutcome.result;\n\tif (!POST_ENDPOINT_MISMATCH_STATUSES.has(postResponse.status)) return notMcp(postResponse);\n\n\tconst { response: getResponse, outcome: getOutcome } = await probe(url, LEGACY_SSE_STRATEGY);\n\treturn getOutcome.kind === \"mcp\" ? getOutcome.result : notMcp(getResponse);\n}\n"]}
@@ -0,0 +1,155 @@
1
+ import { VERSION } from "../../config.js";
2
+ const PROBE_TIMEOUT_MS = 5_000;
3
+ const MODERN_PROTOCOL_VERSION = "2026-07-28";
4
+ const LEGACY_PROTOCOL_VERSION = "2025-06-18";
5
+ const JSON_ACCEPT = "application/json, text/event-stream";
6
+ const SSE_ACCEPT = "text/event-stream";
7
+ const MODERN_FALLBACK_STATUSES = new Set([400, 401, 404, 405, 406, 415]);
8
+ const POST_ENDPOINT_MISMATCH_STATUSES = new Set([404, 405, 406, 415]);
9
+ const DISCOVER_REQUEST = {
10
+ jsonrpc: "2.0",
11
+ id: 1,
12
+ method: "server/discover",
13
+ params: {},
14
+ };
15
+ const INITIALIZE_REQUEST = {
16
+ jsonrpc: "2.0",
17
+ id: 1,
18
+ method: "initialize",
19
+ params: {
20
+ protocolVersion: LEGACY_PROTOCOL_VERSION,
21
+ capabilities: {},
22
+ clientInfo: { name: "nexus-cli-mcp-probe", version: VERSION },
23
+ },
24
+ };
25
+ const MODERN_STRATEGY = {
26
+ kind: "modern",
27
+ request: {
28
+ method: "POST",
29
+ headers: {
30
+ Accept: JSON_ACCEPT,
31
+ "Content-Type": "application/json",
32
+ "MCP-Protocol-Version": MODERN_PROTOCOL_VERSION,
33
+ "Mcp-Method": "server/discover",
34
+ },
35
+ body: JSON.stringify(DISCOVER_REQUEST),
36
+ },
37
+ allowJson: true,
38
+ };
39
+ const LEGACY_POST_STRATEGY = {
40
+ kind: "legacy-post",
41
+ request: {
42
+ method: "POST",
43
+ headers: {
44
+ Accept: JSON_ACCEPT,
45
+ "Content-Type": "application/json",
46
+ },
47
+ body: JSON.stringify(INITIALIZE_REQUEST),
48
+ },
49
+ allowJson: true,
50
+ };
51
+ const LEGACY_SSE_STRATEGY = {
52
+ kind: "legacy-sse",
53
+ request: { headers: { Accept: SSE_ACCEPT } },
54
+ allowJson: false,
55
+ };
56
+ function jsonRpcEnvelopeInfo(value) {
57
+ if (typeof value !== "object" || value === null || value.jsonrpc !== "2.0") {
58
+ return null;
59
+ }
60
+ if ("result" in value) {
61
+ const result = value.result;
62
+ return {
63
+ kind: "result",
64
+ protocolVersion: typeof result === "object" && result !== null
65
+ ? result.protocolVersion
66
+ : undefined,
67
+ };
68
+ }
69
+ if ("error" in value)
70
+ return { kind: "error" };
71
+ return null;
72
+ }
73
+ function isBearerChallenge(response) {
74
+ return /(?:^|,)\s*Bearer\b/i.test(response.headers.get("www-authenticate") ?? "");
75
+ }
76
+ function responseKind(response) {
77
+ const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
78
+ if (contentType === "text/html")
79
+ return "HTML";
80
+ if (contentType)
81
+ return contentType;
82
+ return "an untyped response";
83
+ }
84
+ async function getJsonRpcEnvelopeInfo(response) {
85
+ try {
86
+ return jsonRpcEnvelopeInfo(JSON.parse(await response.text()));
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ async function classifyResponse(response, strategy) {
93
+ const isSse = response.headers.get("content-type")?.toLowerCase().startsWith("text/event-stream");
94
+ if (response.ok && isSse) {
95
+ return { kind: "mcp", result: { isMcp: true, classification: "endpoint responded with an MCP event stream" } };
96
+ }
97
+ const envelope = strategy.allowJson || response.status === 401 ? await getJsonRpcEnvelopeInfo(response) : null;
98
+ if (response.ok && strategy.allowJson && envelope) {
99
+ if (strategy.kind === "modern" &&
100
+ (envelope.kind === "error" || envelope.protocolVersion !== MODERN_PROTOCOL_VERSION)) {
101
+ return { kind: "unsupported-modern" };
102
+ }
103
+ return {
104
+ kind: "mcp",
105
+ result: {
106
+ isMcp: true,
107
+ classification: strategy.kind === "modern"
108
+ ? `endpoint supports stateless MCP ${MODERN_PROTOCOL_VERSION} server/discover`
109
+ : "endpoint responded with a JSON-RPC 2.0 envelope",
110
+ },
111
+ };
112
+ }
113
+ if (response.status === 401 && isBearerChallenge(response) && envelope) {
114
+ return {
115
+ kind: "mcp",
116
+ result: {
117
+ isMcp: true,
118
+ classification: strategy.kind === "modern"
119
+ ? `endpoint requires Bearer authentication during MCP ${MODERN_PROTOCOL_VERSION} server/discover probing`
120
+ : "endpoint requires Bearer authentication and responded with a JSON-RPC 2.0 error",
121
+ },
122
+ };
123
+ }
124
+ return { kind: "unrecognized" };
125
+ }
126
+ async function probe(url, strategy) {
127
+ const response = await fetch(url, {
128
+ ...strategy.request,
129
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
130
+ });
131
+ return { response, outcome: await classifyResponse(response, strategy) };
132
+ }
133
+ function notMcp(response) {
134
+ return {
135
+ isMcp: false,
136
+ classification: `endpoint returned ${responseKind(response)} (${response.status}) — this URL does not appear to speak MCP`,
137
+ };
138
+ }
139
+ /** Makes up to three unauthenticated metadata-only requests to identify an HTTP endpoint's protocol shape. */
140
+ export async function probeMcpEndpoint(url) {
141
+ const { response: modernResponse, outcome: modernOutcome } = await probe(url, MODERN_STRATEGY);
142
+ if (modernOutcome.kind === "mcp")
143
+ return modernOutcome.result;
144
+ if (modernOutcome.kind !== "unsupported-modern" && !MODERN_FALLBACK_STATUSES.has(modernResponse.status)) {
145
+ return notMcp(modernResponse);
146
+ }
147
+ const { response: postResponse, outcome: postOutcome } = await probe(url, LEGACY_POST_STRATEGY);
148
+ if (postOutcome.kind === "mcp")
149
+ return postOutcome.result;
150
+ if (!POST_ENDPOINT_MISMATCH_STATUSES.has(postResponse.status))
151
+ return notMcp(postResponse);
152
+ const { response: getResponse, outcome: getOutcome } = await probe(url, LEGACY_SSE_STRATEGY);
153
+ return getOutcome.kind === "mcp" ? getOutcome.result : notMcp(getResponse);
154
+ }
155
+ //# sourceMappingURL=mcp-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-probe.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAC7C,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAC7C,MAAM,WAAW,GAAG,qCAAqC,CAAC;AAC1D,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACzE,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAOtE,MAAM,gBAAgB,GAAG;IACxB,OAAO,EAAE,KAAK;IACd,EAAE,EAAE,CAAC;IACL,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,kBAAkB,GAAG;IAC1B,OAAO,EAAE,KAAK;IACd,EAAE,EAAE,CAAC;IACL,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE;QACP,eAAe,EAAE,uBAAuB;QACxC,YAAY,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE;KAC7D;CACD,CAAC;AAOF,MAAM,eAAe,GAAkB;IACtC,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE;QACR,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACR,MAAM,EAAE,WAAW;YACnB,cAAc,EAAE,kBAAkB;YAClC,sBAAsB,EAAE,uBAAuB;YAC/C,YAAY,EAAE,iBAAiB;SAC/B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;KACtC;IACD,SAAS,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,oBAAoB,GAAkB;IAC3C,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE;QACR,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACR,MAAM,EAAE,WAAW;YACnB,cAAc,EAAE,kBAAkB;SAClC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;KACxC;IACD,SAAS,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,mBAAmB,GAAkB;IAC1C,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;IAC5C,SAAS,EAAE,KAAK;CAChB,CAAC;AAWF,SAAS,mBAAmB,CAAC,KAAc,EAA8B;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA+B,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACvG,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,GAAI,KAA8B,CAAC,MAAM,CAAC;QACtD,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,eAAe,EACd,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;gBAC5C,CAAC,CAAE,MAAwC,CAAC,eAAe;gBAC3D,CAAC,CAAC,SAAS;SACb,CAAC;IACH,CAAC;IACD,IAAI,OAAO,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,SAAS,iBAAiB,CAAC,QAAkB,EAAW;IACvD,OAAO,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,CAClF;AAED,SAAS,YAAY,CAAC,QAAkB,EAAU;IACjD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjG,IAAI,WAAW,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,OAAO,qBAAqB,CAAC;AAAA,CAC7B;AAED,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAuC;IAC9F,IAAI,CAAC;QACJ,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AAAA,CACD;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,QAAuB,EAAyB;IACnG,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAClG,IAAI,QAAQ,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,6CAA6C,EAAE,EAAE,CAAC;IAChH,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/G,IAAI,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;QACnD,IACC,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAC1B,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,eAAe,KAAK,uBAAuB,CAAC,EAClF,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;QACvC,CAAC;QACD,OAAO;YACN,IAAI,EAAE,KAAK;YACX,MAAM,EAAE;gBACP,KAAK,EAAE,IAAI;gBACX,cAAc,EACb,QAAQ,CAAC,IAAI,KAAK,QAAQ;oBACzB,CAAC,CAAC,mCAAmC,uBAAuB,kBAAkB;oBAC9E,CAAC,CAAC,iDAAiD;aACrD;SACD,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAC;QACxE,OAAO;YACN,IAAI,EAAE,KAAK;YACX,MAAM,EAAE;gBACP,KAAK,EAAE,IAAI;gBACX,cAAc,EACb,QAAQ,CAAC,IAAI,KAAK,QAAQ;oBACzB,CAAC,CAAC,sDAAsD,uBAAuB,0BAA0B;oBACzG,CAAC,CAAC,iFAAiF;aACrF;SACD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AAAA,CAChC;AAED,KAAK,UAAU,KAAK,CAAC,GAAiB,EAAE,QAAuB,EAAwB;IACtF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QACjC,GAAG,QAAQ,CAAC,OAAO;QACnB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;KAC7C,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,CACzE;AAED,SAAS,MAAM,CAAC,QAAkB,EAAkB;IACnD,OAAO;QACN,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,qBAAqB,YAAY,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,MAAM,6CAA2C;KAC1H,CAAC;AAAA,CACF;AAED,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAiB,EAA2B;IAClF,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC/F,IAAI,aAAa,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC;IAE9D,IAAI,aAAa,CAAC,IAAI,KAAK,oBAAoB,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QACzG,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAChG,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC;IAC1D,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC;IAE3F,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAC7F,OAAO,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAAA,CAC3E","sourcesContent":["import { VERSION } from \"../../config.ts\";\n\nconst PROBE_TIMEOUT_MS = 5_000;\nconst MODERN_PROTOCOL_VERSION = \"2026-07-28\";\nconst LEGACY_PROTOCOL_VERSION = \"2025-06-18\";\nconst JSON_ACCEPT = \"application/json, text/event-stream\";\nconst SSE_ACCEPT = \"text/event-stream\";\nconst MODERN_FALLBACK_STATUSES = new Set([400, 401, 404, 405, 406, 415]);\nconst POST_ENDPOINT_MISMATCH_STATUSES = new Set([404, 405, 406, 415]);\n\nexport interface McpProbeResult {\n\tisMcp: boolean;\n\tclassification: string;\n}\n\nconst DISCOVER_REQUEST = {\n\tjsonrpc: \"2.0\",\n\tid: 1,\n\tmethod: \"server/discover\",\n\tparams: {},\n};\n\nconst INITIALIZE_REQUEST = {\n\tjsonrpc: \"2.0\",\n\tid: 1,\n\tmethod: \"initialize\",\n\tparams: {\n\t\tprotocolVersion: LEGACY_PROTOCOL_VERSION,\n\t\tcapabilities: {},\n\t\tclientInfo: { name: \"nexus-cli-mcp-probe\", version: VERSION },\n\t},\n};\n\ntype ProbeStrategy =\n\t| { kind: \"modern\"; request: RequestInit; allowJson: true }\n\t| { kind: \"legacy-post\"; request: RequestInit; allowJson: true }\n\t| { kind: \"legacy-sse\"; request: RequestInit; allowJson: false };\n\nconst MODERN_STRATEGY: ProbeStrategy = {\n\tkind: \"modern\",\n\trequest: {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\tAccept: JSON_ACCEPT,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"MCP-Protocol-Version\": MODERN_PROTOCOL_VERSION,\n\t\t\t\"Mcp-Method\": \"server/discover\",\n\t\t},\n\t\tbody: JSON.stringify(DISCOVER_REQUEST),\n\t},\n\tallowJson: true,\n};\n\nconst LEGACY_POST_STRATEGY: ProbeStrategy = {\n\tkind: \"legacy-post\",\n\trequest: {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\tAccept: JSON_ACCEPT,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify(INITIALIZE_REQUEST),\n\t},\n\tallowJson: true,\n};\n\nconst LEGACY_SSE_STRATEGY: ProbeStrategy = {\n\tkind: \"legacy-sse\",\n\trequest: { headers: { Accept: SSE_ACCEPT } },\n\tallowJson: false,\n};\n\ntype JsonRpcEnvelopeInfo = { kind: \"result\"; protocolVersion: unknown } | { kind: \"error\" };\n\ntype ProbeOutcome = { kind: \"mcp\"; result: McpProbeResult } | { kind: \"unsupported-modern\" } | { kind: \"unrecognized\" };\n\ninterface ProbeResult {\n\tresponse: Response;\n\toutcome: ProbeOutcome;\n}\n\nfunction jsonRpcEnvelopeInfo(value: unknown): JsonRpcEnvelopeInfo | null {\n\tif (typeof value !== \"object\" || value === null || (value as { jsonrpc?: unknown }).jsonrpc !== \"2.0\") {\n\t\treturn null;\n\t}\n\tif (\"result\" in value) {\n\t\tconst result = (value as { result?: unknown }).result;\n\t\treturn {\n\t\t\tkind: \"result\",\n\t\t\tprotocolVersion:\n\t\t\t\ttypeof result === \"object\" && result !== null\n\t\t\t\t\t? (result as { protocolVersion?: unknown }).protocolVersion\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n\tif (\"error\" in value) return { kind: \"error\" };\n\treturn null;\n}\n\nfunction isBearerChallenge(response: Response): boolean {\n\treturn /(?:^|,)\\s*Bearer\\b/i.test(response.headers.get(\"www-authenticate\") ?? \"\");\n}\n\nfunction responseKind(response: Response): string {\n\tconst contentType = response.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase();\n\tif (contentType === \"text/html\") return \"HTML\";\n\tif (contentType) return contentType;\n\treturn \"an untyped response\";\n}\n\nasync function getJsonRpcEnvelopeInfo(response: Response): Promise<JsonRpcEnvelopeInfo | null> {\n\ttry {\n\t\treturn jsonRpcEnvelopeInfo(JSON.parse(await response.text()));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function classifyResponse(response: Response, strategy: ProbeStrategy): Promise<ProbeOutcome> {\n\tconst isSse = response.headers.get(\"content-type\")?.toLowerCase().startsWith(\"text/event-stream\");\n\tif (response.ok && isSse) {\n\t\treturn { kind: \"mcp\", result: { isMcp: true, classification: \"endpoint responded with an MCP event stream\" } };\n\t}\n\n\tconst envelope = strategy.allowJson || response.status === 401 ? await getJsonRpcEnvelopeInfo(response) : null;\n\tif (response.ok && strategy.allowJson && envelope) {\n\t\tif (\n\t\t\tstrategy.kind === \"modern\" &&\n\t\t\t(envelope.kind === \"error\" || envelope.protocolVersion !== MODERN_PROTOCOL_VERSION)\n\t\t) {\n\t\t\treturn { kind: \"unsupported-modern\" };\n\t\t}\n\t\treturn {\n\t\t\tkind: \"mcp\",\n\t\t\tresult: {\n\t\t\t\tisMcp: true,\n\t\t\t\tclassification:\n\t\t\t\t\tstrategy.kind === \"modern\"\n\t\t\t\t\t\t? `endpoint supports stateless MCP ${MODERN_PROTOCOL_VERSION} server/discover`\n\t\t\t\t\t\t: \"endpoint responded with a JSON-RPC 2.0 envelope\",\n\t\t\t},\n\t\t};\n\t}\n\tif (response.status === 401 && isBearerChallenge(response) && envelope) {\n\t\treturn {\n\t\t\tkind: \"mcp\",\n\t\t\tresult: {\n\t\t\t\tisMcp: true,\n\t\t\t\tclassification:\n\t\t\t\t\tstrategy.kind === \"modern\"\n\t\t\t\t\t\t? `endpoint requires Bearer authentication during MCP ${MODERN_PROTOCOL_VERSION} server/discover probing`\n\t\t\t\t\t\t: \"endpoint requires Bearer authentication and responded with a JSON-RPC 2.0 error\",\n\t\t\t},\n\t\t};\n\t}\n\n\treturn { kind: \"unrecognized\" };\n}\n\nasync function probe(url: string | URL, strategy: ProbeStrategy): Promise<ProbeResult> {\n\tconst response = await fetch(url, {\n\t\t...strategy.request,\n\t\tsignal: AbortSignal.timeout(PROBE_TIMEOUT_MS),\n\t});\n\treturn { response, outcome: await classifyResponse(response, strategy) };\n}\n\nfunction notMcp(response: Response): McpProbeResult {\n\treturn {\n\t\tisMcp: false,\n\t\tclassification: `endpoint returned ${responseKind(response)} (${response.status}) — this URL does not appear to speak MCP`,\n\t};\n}\n\n/** Makes up to three unauthenticated metadata-only requests to identify an HTTP endpoint's protocol shape. */\nexport async function probeMcpEndpoint(url: string | URL): Promise<McpProbeResult> {\n\tconst { response: modernResponse, outcome: modernOutcome } = await probe(url, MODERN_STRATEGY);\n\tif (modernOutcome.kind === \"mcp\") return modernOutcome.result;\n\n\tif (modernOutcome.kind !== \"unsupported-modern\" && !MODERN_FALLBACK_STATUSES.has(modernResponse.status)) {\n\t\treturn notMcp(modernResponse);\n\t}\n\n\tconst { response: postResponse, outcome: postOutcome } = await probe(url, LEGACY_POST_STRATEGY);\n\tif (postOutcome.kind === \"mcp\") return postOutcome.result;\n\tif (!POST_ENDPOINT_MISMATCH_STATUSES.has(postResponse.status)) return notMcp(postResponse);\n\n\tconst { response: getResponse, outcome: getOutcome } = await probe(url, LEGACY_SSE_STRATEGY);\n\treturn getOutcome.kind === \"mcp\" ? getOutcome.result : notMcp(getResponse);\n}\n"]}
@@ -0,0 +1,130 @@
1
+ import { parentPort, workerData } from "node:worker_threads";
2
+ import { formatWithOptions } from "node:util";
3
+ import vm from "node:vm";
4
+
5
+ const TOOLS_ENUMERATION_ERROR = "tools is not enumerable — use tools.search({ query })";
6
+ const RESERVED_TOOL_PROPS = new Set(["then", "catch", "finally", "toJSON", "toString", "valueOf"]);
7
+
8
+ // Keep this formatting logic in sync with mcp-code.ts; the standalone worker cannot import the TypeScript host module.
9
+ function needsInspectableFormatting(value, stack = new WeakSet()) {
10
+ if (value === undefined || typeof value === "bigint" || typeof value === "function" || typeof value === "symbol") return true;
11
+ if (typeof value !== "object" || value === null) return false;
12
+ if (stack.has(value)) return true;
13
+ if (value instanceof Map || value instanceof Set || value instanceof WeakMap || value instanceof WeakSet) return true;
14
+ stack.add(value);
15
+ try {
16
+ return Object.values(value).some((entry) => needsInspectableFormatting(entry, stack));
17
+ } finally {
18
+ stack.delete(value);
19
+ }
20
+ }
21
+
22
+ function formatValue(value) {
23
+ if (typeof value === "string") return value;
24
+ try {
25
+ if (!needsInspectableFormatting(value)) {
26
+ const json = JSON.stringify(value, null, 2);
27
+ if (json !== undefined) return json;
28
+ }
29
+ return formatWithOptions({ colors: false, depth: 6 }, value);
30
+ } catch {
31
+ return "[unserializable value]";
32
+ }
33
+ }
34
+
35
+ function toContentBlock(value) {
36
+ if (typeof value === "object" && value !== null) {
37
+ if (value.type === "text" && typeof value.text === "string") {
38
+ return { type: "text", text: value.text };
39
+ }
40
+ if (value.type === "image" && typeof value.data === "string" && typeof value.mimeType === "string") {
41
+ return { type: "image", data: value.data, mimeType: value.mimeType };
42
+ }
43
+ }
44
+ return { type: "text", text: formatValue(value) };
45
+ }
46
+
47
+ let nextRequestId = 0;
48
+ const pending = new Map();
49
+
50
+ parentPort.on("message", (message) => {
51
+ if (message?.type !== "result" || typeof message.id !== "number") return;
52
+ const resolve = pending.get(message.id);
53
+ if (!resolve) return;
54
+ pending.delete(message.id);
55
+ resolve(message.envelope);
56
+ });
57
+
58
+ function request(type, payload) {
59
+ return new Promise((resolve) => {
60
+ const id = ++nextRequestId;
61
+ pending.set(id, resolve);
62
+ parentPort.postMessage({ type, id, ...payload });
63
+ });
64
+ }
65
+
66
+ const tools = new Proxy(Object.create(null), {
67
+ get(_target, property) {
68
+ if (property === "search") {
69
+ return async (input) => request("search", { input });
70
+ }
71
+ if (property === "call") {
72
+ return async (path, args) => {
73
+ // Invalid paths never reach dispatch and therefore never appear in the call trace.
74
+ if (typeof path !== "string" || path.trim() === "") {
75
+ return {
76
+ ok: false,
77
+ error: {
78
+ code: "invalid_tool_path",
79
+ message: "tools.call(path, args) requires a non-empty tool path.",
80
+ },
81
+ };
82
+ }
83
+ return request("call", { path, args });
84
+ };
85
+ }
86
+ if (property === "describe") {
87
+ return async (input) => request("describe", { input });
88
+ }
89
+ if (typeof property !== "string" || RESERVED_TOOL_PROPS.has(property)) return undefined;
90
+ return (args) => request("call", { path: property, args });
91
+ },
92
+ ownKeys() {
93
+ throw new Error(TOOLS_ENUMERATION_ERROR);
94
+ },
95
+ });
96
+
97
+ const emit = (value) => {
98
+ parentPort.postMessage({ type: "emit", block: toContentBlock(value) });
99
+ };
100
+
101
+ const capturedConsole = Object.freeze({
102
+ log: (...args) => emit(`[console.log] ${formatWithOptions({ colors: false, depth: 4 }, ...args)}`),
103
+ info: (...args) => emit(`[console.info] ${formatWithOptions({ colors: false, depth: 4 }, ...args)}`),
104
+ warn: (...args) => emit(`[console.warn] ${formatWithOptions({ colors: false, depth: 4 }, ...args)}`),
105
+ error: (...args) => emit(`[console.error] ${formatWithOptions({ colors: false, depth: 4 }, ...args)}`),
106
+ debug: (...args) => emit(`[console.debug] ${formatWithOptions({ colors: false, depth: 4 }, ...args)}`),
107
+ });
108
+
109
+ void (async () => {
110
+ try {
111
+ const context = vm.createContext(Object.assign(Object.create(null), {
112
+ tools,
113
+ emit,
114
+ console: capturedConsole,
115
+ }), {
116
+ codeGeneration: { strings: false, wasm: false },
117
+ name: "mcpScript",
118
+ });
119
+ const script = new vm.Script(`(async () => {\n${workerData.code}\n})()`, { filename: "mcpScript.js" });
120
+ const returnValue = await Promise.resolve(script.runInContext(context));
121
+ parentPort.postMessage(returnValue === undefined
122
+ ? { type: "done" }
123
+ : { type: "done", returnBlock: toContentBlock(returnValue) });
124
+ } catch (error) {
125
+ parentPort.postMessage({
126
+ type: "error",
127
+ message: error instanceof Error ? error.message : String(error),
128
+ });
129
+ }
130
+ })();
@@ -0,0 +1,85 @@
1
+ import { type ConfigWritePreview, type KnownServerPreset, type McpDiscoverySummary } from "./config.ts";
2
+ import type { McpOnboardingState } from "./onboarding-state.ts";
3
+ import { type PanelKeybindings } from "./panel-keys.ts";
4
+ import type { ImportKind } from "./types.ts";
5
+ export interface SetupPanelCallbacks {
6
+ previewImports: (imports: ImportKind[]) => ConfigWritePreview;
7
+ previewStarterProject: () => ConfigWritePreview;
8
+ previewRepoPrompt: () => ConfigWritePreview | null;
9
+ previewKnownServer: (preset: KnownServerPreset) => ConfigWritePreview;
10
+ adoptImports: (imports: ImportKind[]) => Promise<{
11
+ added: ImportKind[];
12
+ path: string;
13
+ }>;
14
+ scaffoldProjectConfig: () => Promise<{
15
+ path: string;
16
+ }>;
17
+ addRepoPrompt: () => Promise<{
18
+ path: string;
19
+ serverName: string;
20
+ }>;
21
+ addKnownServer: (preset: KnownServerPreset) => Promise<{
22
+ path: string;
23
+ serverName: string;
24
+ }>;
25
+ openPath: (path: string) => Promise<void>;
26
+ markSetupCompleted: () => void;
27
+ }
28
+ export interface SetupPanelOptions {
29
+ mode: "empty" | "setup";
30
+ onboardingState: McpOnboardingState;
31
+ keybindings?: PanelKeybindings;
32
+ }
33
+ export declare class McpSetupPanel {
34
+ private screen;
35
+ private actionCursor;
36
+ private importCursor;
37
+ private pathCursor;
38
+ private selectedImports;
39
+ private busy;
40
+ private notice;
41
+ private tui;
42
+ private t;
43
+ private keys;
44
+ private inactivityTimeout;
45
+ private discovery;
46
+ private callbacks;
47
+ private options;
48
+ private done;
49
+ private static readonly INACTIVITY_MS;
50
+ constructor(discovery: McpDiscoverySummary, callbacks: SetupPanelCallbacks, options: SetupPanelOptions, tui: {
51
+ requestRender(): void;
52
+ }, done: () => void);
53
+ private resetInactivityTimeout;
54
+ private cleanup;
55
+ private getActions;
56
+ private getDetectedPaths;
57
+ private getSelectedAction;
58
+ handleInput(data: string): void;
59
+ private handleImportsInput;
60
+ private handlePathsInput;
61
+ private runAction;
62
+ private applySelectedImports;
63
+ private runBusy;
64
+ render(width: number): string[];
65
+ private renderActions;
66
+ private renderImports;
67
+ private renderPaths;
68
+ private discoverySummaryLine;
69
+ private secondarySummaryLine;
70
+ private visibleActionRange;
71
+ private contentWidth;
72
+ private previewWidth;
73
+ private getActionPreview;
74
+ private formatPreview;
75
+ private formatWritePreview;
76
+ private padLine;
77
+ invalidate(): void;
78
+ dispose(): void;
79
+ }
80
+ export declare function createMcpSetupPanel(discovery: McpDiscoverySummary, callbacks: SetupPanelCallbacks, options: SetupPanelOptions, tui: {
81
+ requestRender(): void;
82
+ }, done: () => void): McpSetupPanel & {
83
+ dispose(): void;
84
+ };
85
+ //# sourceMappingURL=mcp-setup-panel.d.ts.map