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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +1 -0
  3. package/README.md +3 -2
  4. package/dist/app-bridge.bundle.js +67 -0
  5. package/dist/cli/require-login.d.ts.map +1 -1
  6. package/dist/cli/require-login.js +2 -2
  7. package/dist/cli/require-login.js.map +1 -1
  8. package/dist/cli.js +20866 -1882
  9. package/dist/core/agent-session.d.ts +3 -1
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +5 -1
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/auto-model.d.ts +1 -1
  14. package/dist/core/auto-model.d.ts.map +1 -1
  15. package/dist/core/auto-model.js +1 -1
  16. package/dist/core/auto-model.js.map +1 -1
  17. package/dist/core/extensions/index.d.ts +1 -1
  18. package/dist/core/extensions/index.d.ts.map +1 -1
  19. package/dist/core/extensions/index.js.map +1 -1
  20. package/dist/core/extensions/loader.d.ts.map +1 -1
  21. package/dist/core/extensions/loader.js +6 -0
  22. package/dist/core/extensions/loader.js.map +1 -1
  23. package/dist/core/extensions/runner.d.ts +7 -1
  24. package/dist/core/extensions/runner.d.ts.map +1 -1
  25. package/dist/core/extensions/runner.js +14 -0
  26. package/dist/core/extensions/runner.js.map +1 -1
  27. package/dist/core/extensions/types.d.ts +18 -0
  28. package/dist/core/extensions/types.d.ts.map +1 -1
  29. package/dist/core/extensions/types.js.map +1 -1
  30. package/dist/core/model-resolver.d.ts +2 -2
  31. package/dist/core/model-resolver.d.ts.map +1 -1
  32. package/dist/core/model-resolver.js +3 -3
  33. package/dist/core/model-resolver.js.map +1 -1
  34. package/dist/core/package-manager.d.ts +15 -0
  35. package/dist/core/package-manager.d.ts.map +1 -1
  36. package/dist/core/package-manager.js +50 -0
  37. package/dist/core/package-manager.js.map +1 -1
  38. package/dist/core/sdk.d.ts.map +1 -1
  39. package/dist/core/sdk.js +1 -1
  40. package/dist/core/sdk.js.map +1 -1
  41. package/dist/core/slash-commands.d.ts.map +1 -1
  42. package/dist/core/slash-commands.js +3 -3
  43. package/dist/core/slash-commands.js.map +1 -1
  44. package/dist/core/system-prompt.d.ts.map +1 -1
  45. package/dist/core/system-prompt.js +1 -1
  46. package/dist/core/system-prompt.js.map +1 -1
  47. package/dist/core/tools/find.d.ts.map +1 -1
  48. package/dist/core/tools/find.js +1 -1
  49. package/dist/core/tools/find.js.map +1 -1
  50. package/dist/core/tools/grep.d.ts.map +1 -1
  51. package/dist/core/tools/grep.js +1 -1
  52. package/dist/core/tools/grep.js.map +1 -1
  53. package/dist/core/tools/index.d.ts +1 -1
  54. package/dist/core/tools/index.d.ts.map +1 -1
  55. package/dist/core/tools/index.js +5 -5
  56. package/dist/core/tools/index.js.map +1 -1
  57. package/dist/core/tools/websearch.d.ts.map +1 -1
  58. package/dist/core/tools/websearch.js +3 -3
  59. package/dist/core/tools/websearch.js.map +1 -1
  60. package/dist/extensions/gitnexus/config.d.ts +15 -1
  61. package/dist/extensions/gitnexus/config.d.ts.map +1 -1
  62. package/dist/extensions/gitnexus/config.js +86 -2
  63. package/dist/extensions/gitnexus/config.js.map +1 -1
  64. package/dist/extensions/gitnexus/gateway.d.ts +6 -6
  65. package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
  66. package/dist/extensions/gitnexus/gateway.js +4 -4
  67. package/dist/extensions/gitnexus/gateway.js.map +1 -1
  68. package/dist/extensions/gitnexus/index.d.ts.map +1 -1
  69. package/dist/extensions/gitnexus/index.js +6 -4
  70. package/dist/extensions/gitnexus/index.js.map +1 -1
  71. package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
  72. package/dist/extensions/gitnexus/observatory.js +2 -2
  73. package/dist/extensions/gitnexus/observatory.js.map +1 -1
  74. package/dist/extensions/index.d.ts.map +1 -1
  75. package/dist/extensions/index.js +3 -0
  76. package/dist/extensions/index.js.map +1 -1
  77. package/dist/extensions/mcp/abort.d.ts +3 -0
  78. package/dist/extensions/mcp/abort.d.ts.map +1 -0
  79. package/dist/extensions/mcp/abort.js +41 -0
  80. package/dist/extensions/mcp/abort.js.map +1 -0
  81. package/dist/extensions/mcp/agent-dir.d.ts +6 -0
  82. package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
  83. package/dist/extensions/mcp/agent-dir.js +18 -0
  84. package/dist/extensions/mcp/agent-dir.js.map +1 -0
  85. package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
  86. package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
  87. package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
  88. package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
  89. package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
  90. package/dist/extensions/mcp/commands.d.ts +47 -0
  91. package/dist/extensions/mcp/commands.d.ts.map +1 -0
  92. package/dist/extensions/mcp/commands.js +821 -0
  93. package/dist/extensions/mcp/commands.js.map +1 -0
  94. package/dist/extensions/mcp/config.d.ts +123 -38
  95. package/dist/extensions/mcp/config.d.ts.map +1 -1
  96. package/dist/extensions/mcp/config.js +1035 -70
  97. package/dist/extensions/mcp/config.js.map +1 -1
  98. package/dist/extensions/mcp/consent-manager.d.ts +14 -0
  99. package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
  100. package/dist/extensions/mcp/consent-manager.js +60 -0
  101. package/dist/extensions/mcp/consent-manager.js.map +1 -0
  102. package/dist/extensions/mcp/direct-tools.d.ts +11 -0
  103. package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
  104. package/dist/extensions/mcp/direct-tools.js +562 -0
  105. package/dist/extensions/mcp/direct-tools.js.map +1 -0
  106. package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
  107. package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
  108. package/dist/extensions/mcp/elicitation-handler.js +320 -0
  109. package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
  110. package/dist/extensions/mcp/error-signal.d.ts +16 -0
  111. package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
  112. package/dist/extensions/mcp/error-signal.js +22 -0
  113. package/dist/extensions/mcp/error-signal.js.map +1 -0
  114. package/dist/extensions/mcp/errors.d.ts +104 -0
  115. package/dist/extensions/mcp/errors.d.ts.map +1 -0
  116. package/dist/extensions/mcp/errors.js +171 -0
  117. package/dist/extensions/mcp/errors.js.map +1 -0
  118. package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
  119. package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
  120. package/dist/extensions/mcp/glimpse-ui.js +67 -0
  121. package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
  122. package/dist/extensions/mcp/host-html-template.d.ts +17 -0
  123. package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
  124. package/dist/extensions/mcp/host-html-template.js +442 -0
  125. package/dist/extensions/mcp/host-html-template.js.map +1 -0
  126. package/dist/extensions/mcp/index.d.ts +20 -15
  127. package/dist/extensions/mcp/index.d.ts.map +1 -1
  128. package/dist/extensions/mcp/index.js +1113 -82
  129. package/dist/extensions/mcp/index.js.map +1 -1
  130. package/dist/extensions/mcp/init.d.ts +28 -0
  131. package/dist/extensions/mcp/init.d.ts.map +1 -0
  132. package/dist/extensions/mcp/init.js +631 -0
  133. package/dist/extensions/mcp/init.js.map +1 -0
  134. package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
  135. package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
  136. package/dist/extensions/mcp/json-schema-validator.js +53 -0
  137. package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
  138. package/dist/extensions/mcp/lifecycle.d.ts +56 -0
  139. package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
  140. package/dist/extensions/mcp/lifecycle.js +395 -0
  141. package/dist/extensions/mcp/lifecycle.js.map +1 -0
  142. package/dist/extensions/mcp/logger.d.ts +52 -0
  143. package/dist/extensions/mcp/logger.d.ts.map +1 -0
  144. package/dist/extensions/mcp/logger.js +134 -0
  145. package/dist/extensions/mcp/logger.js.map +1 -0
  146. package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
  147. package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
  148. package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
  149. package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
  150. package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
  151. package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
  152. package/dist/extensions/mcp/mcp-auth.js +897 -0
  153. package/dist/extensions/mcp/mcp-auth.js.map +1 -0
  154. package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
  155. package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
  156. package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
  157. package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
  158. package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
  159. package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
  160. package/dist/extensions/mcp/mcp-callback-server.js +454 -0
  161. package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
  162. package/dist/extensions/mcp/mcp-code.d.ts +48 -0
  163. package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
  164. package/dist/extensions/mcp/mcp-code.js +358 -0
  165. package/dist/extensions/mcp/mcp-code.js.map +1 -0
  166. package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
  167. package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
  168. package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
  169. package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
  170. package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
  171. package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
  172. package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
  173. package/dist/extensions/mcp/mcp-output-guard.js +343 -0
  174. package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
  175. package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
  176. package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
  177. package/dist/extensions/mcp/mcp-panel.js +973 -0
  178. package/dist/extensions/mcp/mcp-panel.js.map +1 -0
  179. package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
  180. package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
  181. package/dist/extensions/mcp/mcp-probe.js +155 -0
  182. package/dist/extensions/mcp/mcp-probe.js.map +1 -0
  183. package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
  184. package/dist/extensions/mcp/mcp-setup-panel.d.ts +146 -0
  185. package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
  186. package/dist/extensions/mcp/mcp-setup-panel.js +1104 -0
  187. package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
  188. package/dist/extensions/mcp/mcp-status.d.ts +12 -0
  189. package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
  190. package/dist/extensions/mcp/mcp-status.js +98 -0
  191. package/dist/extensions/mcp/mcp-status.js.map +1 -0
  192. package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
  193. package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
  194. package/dist/extensions/mcp/mcp-trace.js +252 -0
  195. package/dist/extensions/mcp/mcp-trace.js.map +1 -0
  196. package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
  197. package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
  198. package/dist/extensions/mcp/metadata-cache.js +318 -0
  199. package/dist/extensions/mcp/metadata-cache.js.map +1 -0
  200. package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
  201. package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
  202. package/dist/extensions/mcp/npx-resolver.js +505 -0
  203. package/dist/extensions/mcp/npx-resolver.js.map +1 -0
  204. package/dist/extensions/mcp/oauth.d.ts +21 -0
  205. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  206. package/dist/extensions/mcp/oauth.js +15 -0
  207. package/dist/extensions/mcp/oauth.js.map +1 -0
  208. package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
  209. package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
  210. package/dist/extensions/mcp/onboarding-state.js +65 -0
  211. package/dist/extensions/mcp/onboarding-state.js.map +1 -0
  212. package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
  213. package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
  214. package/dist/extensions/mcp/package-mcp-loader.js +170 -0
  215. package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
  216. package/dist/extensions/mcp/panel-keys.d.ts +21 -0
  217. package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
  218. package/dist/extensions/mcp/panel-keys.js +29 -0
  219. package/dist/extensions/mcp/panel-keys.js.map +1 -0
  220. package/dist/extensions/mcp/prompts.d.ts +63 -0
  221. package/dist/extensions/mcp/prompts.d.ts.map +1 -0
  222. package/dist/extensions/mcp/prompts.js +297 -0
  223. package/dist/extensions/mcp/prompts.js.map +1 -0
  224. package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
  225. package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
  226. package/dist/extensions/mcp/proxy-modes.js +1421 -0
  227. package/dist/extensions/mcp/proxy-modes.js.map +1 -0
  228. package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
  229. package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
  230. package/dist/extensions/mcp/request-headers-command.js +334 -0
  231. package/dist/extensions/mcp/request-headers-command.js.map +1 -0
  232. package/dist/extensions/mcp/resource-tools.d.ts +2 -0
  233. package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
  234. package/dist/extensions/mcp/resource-tools.js +15 -0
  235. package/dist/extensions/mcp/resource-tools.js.map +1 -0
  236. package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
  237. package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
  238. package/dist/extensions/mcp/runtime-owner.js +84 -0
  239. package/dist/extensions/mcp/runtime-owner.js.map +1 -0
  240. package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
  241. package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
  242. package/dist/extensions/mcp/sampling-handler.js +229 -0
  243. package/dist/extensions/mcp/sampling-handler.js.map +1 -0
  244. package/dist/extensions/mcp/search-ranking.d.ts +25 -0
  245. package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
  246. package/dist/extensions/mcp/search-ranking.js +234 -0
  247. package/dist/extensions/mcp/search-ranking.js.map +1 -0
  248. package/dist/extensions/mcp/server-manager.d.ts +116 -0
  249. package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
  250. package/dist/extensions/mcp/server-manager.js +1052 -0
  251. package/dist/extensions/mcp/server-manager.js.map +1 -0
  252. package/dist/extensions/mcp/session-recovery.d.ts +27 -0
  253. package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
  254. package/dist/extensions/mcp/session-recovery.js +140 -0
  255. package/dist/extensions/mcp/session-recovery.js.map +1 -0
  256. package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
  257. package/dist/extensions/mcp/state.d.ts +62 -0
  258. package/dist/extensions/mcp/state.d.ts.map +1 -0
  259. package/dist/extensions/mcp/state.js +2 -0
  260. package/dist/extensions/mcp/state.js.map +1 -0
  261. package/dist/extensions/mcp/tool-approval.d.ts +11 -0
  262. package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
  263. package/dist/extensions/mcp/tool-approval.js +156 -0
  264. package/dist/extensions/mcp/tool-approval.js.map +1 -0
  265. package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
  266. package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
  267. package/dist/extensions/mcp/tool-metadata.js +264 -0
  268. package/dist/extensions/mcp/tool-metadata.js.map +1 -0
  269. package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
  270. package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
  271. package/dist/extensions/mcp/tool-registrar.js +229 -0
  272. package/dist/extensions/mcp/tool-registrar.js.map +1 -0
  273. package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
  274. package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
  275. package/dist/extensions/mcp/tool-result-renderer.js +345 -0
  276. package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
  277. package/dist/extensions/mcp/ts-shape.d.ts +3 -0
  278. package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
  279. package/dist/extensions/mcp/ts-shape.js +160 -0
  280. package/dist/extensions/mcp/ts-shape.js.map +1 -0
  281. package/dist/extensions/mcp/types.d.ts +521 -0
  282. package/dist/extensions/mcp/types.d.ts.map +1 -0
  283. package/dist/extensions/mcp/types.js +294 -0
  284. package/dist/extensions/mcp/types.js.map +1 -0
  285. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
  286. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
  287. package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
  288. package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
  289. package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
  290. package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
  291. package/dist/extensions/mcp/ui-resource-handler.js +210 -0
  292. package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
  293. package/dist/extensions/mcp/ui-server.d.ts +52 -0
  294. package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
  295. package/dist/extensions/mcp/ui-server.js +740 -0
  296. package/dist/extensions/mcp/ui-server.js.map +1 -0
  297. package/dist/extensions/mcp/ui-session.d.ts +40 -0
  298. package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
  299. package/dist/extensions/mcp/ui-session.js +477 -0
  300. package/dist/extensions/mcp/ui-session.js.map +1 -0
  301. package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
  302. package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
  303. package/dist/extensions/mcp/ui-stream-types.js +61 -0
  304. package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
  305. package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
  306. package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
  307. package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
  308. package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
  309. package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
  310. package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
  311. package/dist/extensions/mcp/unix-socket-transport.js +85 -0
  312. package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
  313. package/dist/extensions/mcp/utils.d.ts +32 -0
  314. package/dist/extensions/mcp/utils.d.ts.map +1 -0
  315. package/dist/extensions/mcp/utils.js +336 -0
  316. package/dist/extensions/mcp/utils.js.map +1 -0
  317. package/dist/extensions/subagent/index.d.ts +62 -1
  318. package/dist/extensions/subagent/index.d.ts.map +1 -1
  319. package/dist/extensions/subagent/index.js +195 -9
  320. package/dist/extensions/subagent/index.js.map +1 -1
  321. package/dist/extensions/subagent-render.d.ts +3 -0
  322. package/dist/extensions/subagent-render.d.ts.map +1 -0
  323. package/dist/extensions/subagent-render.js +39 -0
  324. package/dist/extensions/subagent-render.js.map +1 -0
  325. package/dist/extensions/web-access.d.ts.map +1 -1
  326. package/dist/extensions/web-access.js +1 -1
  327. package/dist/extensions/web-access.js.map +1 -1
  328. package/dist/index.d.ts +2 -0
  329. package/dist/index.d.ts.map +1 -1
  330. package/dist/index.js +20992 -2003
  331. package/dist/index.js.map +1 -1
  332. package/dist/mcp-keyring-helper.cjs +89 -0
  333. package/dist/mcp-script-worker.mjs +130 -0
  334. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  335. package/dist/modes/interactive/components/model-selector.js +1 -1
  336. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  337. package/dist/modes/interactive/components/response-separator.d.ts +1 -1
  338. package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
  339. package/dist/modes/interactive/components/response-separator.js +1 -1
  340. package/dist/modes/interactive/components/response-separator.js.map +1 -1
  341. package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
  342. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  343. package/dist/modes/interactive/components/tool-execution.js +12 -2
  344. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  345. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  346. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  347. package/dist/modes/interactive/interactive-mode.js +14 -8
  348. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  349. package/dist/rpc-entry.js +20866 -1882
  350. package/dist/skills/mcp-scripting/SKILL.md +38 -0
  351. package/dist/utils/hidden-spawn.d.ts +29 -0
  352. package/dist/utils/hidden-spawn.d.ts.map +1 -0
  353. package/dist/utils/hidden-spawn.js +101 -0
  354. package/dist/utils/hidden-spawn.js.map +1 -0
  355. package/dist/vendor/ai.js +110 -35
  356. package/docs/mcp.md +178 -0
  357. package/docs/pi-subagents.md +75 -0
  358. package/docs/quickstart.md +1 -1
  359. package/docs/usage.md +2 -1
  360. package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
  361. package/native/win32/build.mjs +95 -0
  362. package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
  363. package/native/win32/src/hidden-spawn.c +157 -0
  364. package/npm-shrinkwrap.json +728 -6
  365. package/package.json +21 -6
  366. package/dist/extensions/mcp/client.d.ts +0 -86
  367. package/dist/extensions/mcp/client.d.ts.map +0 -1
  368. package/dist/extensions/mcp/client.js +0 -275
  369. package/dist/extensions/mcp/client.js.map +0 -1
@@ -0,0 +1,395 @@
1
+ import { SdkError, SdkErrorCode } from "@modelcontextprotocol/client";
2
+ import { logger } from "./logger.js";
3
+ import { hasPendingAuth } from "./mcp-auth-flow.js";
4
+ import { isTerminatedSession } from "./session-recovery.js";
5
+ import { isServerDisabled } from "./types.js";
6
+ import { formatTerminalError, parallelLimit, sanitizeTerminalText } from "./utils.js";
7
+ const KEEP_ALIVE_RETRY_BASE_MS = 30_000;
8
+ const KEEP_ALIVE_RETRY_MAX_MS = 5 * 60_000;
9
+ const KEEP_ALIVE_CHECK_CONCURRENCY = 10;
10
+ export class McpLifecycleManager {
11
+ keepAliveServers = new Map();
12
+ allServers = new Map();
13
+ serverSettings = new Map();
14
+ globalIdleTimeout = 10 * 60 * 1000;
15
+ healthCheckInterval;
16
+ onReconnect;
17
+ onReconnectFailure;
18
+ onHealthRestored;
19
+ onAuthRequired;
20
+ onIdleShutdown;
21
+ activeHealthCheck;
22
+ activeConvergence;
23
+ shutdownPromise;
24
+ retryStates = new Map();
25
+ pendingMetadataPublications = new Set();
26
+ stopped = false;
27
+ removeHealthAbortListener;
28
+ manager;
29
+ hasPendingAuthForServer;
30
+ constructor(manager, hasPendingAuthForServer = hasPendingAuth) {
31
+ this.manager = manager;
32
+ this.hasPendingAuthForServer = hasPendingAuthForServer;
33
+ }
34
+ setReconnectCallback(callback) {
35
+ this.onReconnect = callback;
36
+ }
37
+ setReconnectFailureCallback(callback) {
38
+ this.onReconnectFailure = callback;
39
+ }
40
+ setHealthRestoredCallback(callback) {
41
+ this.onHealthRestored = callback;
42
+ }
43
+ setAuthRequiredCallback(callback) {
44
+ this.onAuthRequired = callback;
45
+ }
46
+ markKeepAlive(name, definition) {
47
+ if (isServerDisabled(definition))
48
+ return;
49
+ this.keepAliveServers.set(name, definition);
50
+ }
51
+ registerServer(name, definition, settings) {
52
+ if (isServerDisabled(definition))
53
+ return;
54
+ this.allServers.set(name, definition);
55
+ if (settings?.idleTimeout !== undefined)
56
+ this.serverSettings.set(name, settings);
57
+ }
58
+ unregisterServer(name) {
59
+ this.allServers.delete(name);
60
+ this.keepAliveServers.delete(name);
61
+ this.serverSettings.delete(name);
62
+ this.retryStates.delete(name);
63
+ this.pendingMetadataPublications.delete(name);
64
+ }
65
+ setGlobalIdleTimeout(minutes) {
66
+ this.globalIdleTimeout = minutes * 60 * 1000;
67
+ }
68
+ setIdleShutdownCallback(callback) {
69
+ this.onIdleShutdown = callback;
70
+ }
71
+ startHealthChecks(signalOrInterval, maybeIntervalMs = 30000) {
72
+ const signal = typeof signalOrInterval === "number" ? undefined : signalOrInterval;
73
+ const intervalMs = typeof signalOrInterval === "number" ? signalOrInterval : maybeIntervalMs;
74
+ this.stopped = false;
75
+ if (signal?.aborted) {
76
+ this.stopped = true;
77
+ return;
78
+ }
79
+ const stop = () => {
80
+ this.stopped = true;
81
+ if (this.healthCheckInterval)
82
+ clearInterval(this.healthCheckInterval);
83
+ this.healthCheckInterval = undefined;
84
+ };
85
+ signal?.addEventListener("abort", stop, { once: true });
86
+ this.removeHealthAbortListener = () => signal?.removeEventListener("abort", stop);
87
+ this.healthCheckInterval = setInterval(() => {
88
+ if (this.stopped || signal?.aborted || this.activeHealthCheck)
89
+ return;
90
+ const check = this.checkConnections(signal)
91
+ .catch((error) => {
92
+ console.error(`MCP: Health check failed: ${formatTerminalError(error)}`);
93
+ })
94
+ .finally(() => {
95
+ if (this.activeHealthCheck === check)
96
+ this.activeHealthCheck = undefined;
97
+ });
98
+ this.activeHealthCheck = check;
99
+ }, intervalMs);
100
+ this.healthCheckInterval.unref();
101
+ }
102
+ async ensureConverged(signal) {
103
+ if (this.stopped || signal?.aborted)
104
+ return;
105
+ if (this.activeConvergence)
106
+ return this.activeConvergence;
107
+ const check = this.checkKeepAliveConnections(signal);
108
+ this.activeConvergence = check;
109
+ try {
110
+ await check;
111
+ }
112
+ finally {
113
+ if (this.activeConvergence === check)
114
+ this.activeConvergence = undefined;
115
+ }
116
+ }
117
+ async checkConnections(signal) {
118
+ if (this.stopped || signal?.aborted)
119
+ return;
120
+ await this.ensureConverged(signal);
121
+ if (this.stopped || signal?.aborted)
122
+ return;
123
+ for (const [name] of this.allServers) {
124
+ if (this.keepAliveServers.has(name))
125
+ continue;
126
+ const timeout = this.getIdleTimeout(name);
127
+ const connection = this.manager.getConnection(name);
128
+ if (connection && timeout > 0 && this.manager.isIdle(name, timeout)) {
129
+ const closed = await this.manager.closeIfCurrent(name, connection);
130
+ if (this.stopped || signal?.aborted)
131
+ return;
132
+ if (closed)
133
+ this.onIdleShutdown?.(name);
134
+ }
135
+ }
136
+ }
137
+ async checkKeepAliveConnections(signal) {
138
+ if (this.stopped || signal?.aborted)
139
+ return;
140
+ await parallelLimit([...this.keepAliveServers], KEEP_ALIVE_CHECK_CONCURRENCY, ([name, definition]) => this.checkKeepAliveConnection(name, definition, signal));
141
+ }
142
+ async checkKeepAliveConnection(name, definition, signal, retrySuperseded = true) {
143
+ if (isServerDisabled(definition) || this.stopped || signal?.aborted)
144
+ return;
145
+ // Fence against unregisterServer racing an in-flight convergence pass.
146
+ // Identity comparison also rejects stale passes after a same-name
147
+ // replacement registration, which a name check would wrongly accept.
148
+ if (this.keepAliveServers.get(name) !== definition)
149
+ return;
150
+ const connection = this.manager.getConnection(name);
151
+ if (connection?.status === "needs-auth") {
152
+ this.pendingMetadataPublications.delete(name);
153
+ return;
154
+ }
155
+ if (!this.shouldAttemptConnection(name, connection))
156
+ return;
157
+ if (!connection || connection.status !== "connected") {
158
+ if (this.hasPendingAuthForServer(name)) {
159
+ logger.debug(`Skipping reconnect for ${name} while OAuth authorization is pending`);
160
+ return;
161
+ }
162
+ let freshConnection;
163
+ try {
164
+ freshConnection = await this.manager.connect(name, definition, signal);
165
+ }
166
+ catch (error) {
167
+ if (this.stopped || signal?.aborted)
168
+ return;
169
+ this.reportConnectionFailure(name, definition, error, "reconnect", this.manager.getConnection(name));
170
+ return;
171
+ }
172
+ if (this.stopped || signal?.aborted)
173
+ return;
174
+ if (freshConnection.status === "needs-auth") {
175
+ await this.notifyAuthRequired(name, definition, freshConnection);
176
+ return;
177
+ }
178
+ if (freshConnection.status !== "connected") {
179
+ this.reportConnectionFailure(name, definition, new Error(`MCP server ${name} did not return a connected session`), "reconnect", freshConnection);
180
+ return;
181
+ }
182
+ logger.debug(`Reconnected to ${name}`);
183
+ await this.publishConnectedMetadata(name, definition, freshConnection);
184
+ return;
185
+ }
186
+ if (this.pendingMetadataPublications.has(name)) {
187
+ await this.publishConnectedMetadata(name, definition, connection);
188
+ return;
189
+ }
190
+ const hadSessionId = connection.transport?.sessionId != null;
191
+ let refreshResult;
192
+ try {
193
+ refreshResult = await this.manager.refreshTools(name, connection, signal);
194
+ }
195
+ catch (error) {
196
+ if (this.stopped || signal?.aborted)
197
+ return;
198
+ const current = this.manager.getConnection(name);
199
+ if (current !== connection || connection.status !== "connected") {
200
+ await this.handleSupersededConnection(name, definition, connection, signal, retrySuperseded);
201
+ return;
202
+ }
203
+ if (!shouldReconnectAfterRefresh(error, hadSessionId)) {
204
+ this.reportConnectionFailure(name, definition, error, "refresh", connection);
205
+ return;
206
+ }
207
+ if (this.hasPendingAuthForServer(name)) {
208
+ logger.debug(`Skipping reconnect for ${name} while OAuth authorization is pending`);
209
+ return;
210
+ }
211
+ let freshConnection;
212
+ try {
213
+ freshConnection = await this.manager.reconnect(name, definition, connection, signal);
214
+ }
215
+ catch (reconnectError) {
216
+ if (this.stopped || signal?.aborted)
217
+ return;
218
+ this.reportConnectionFailure(name, definition, reconnectError, "reconnect", this.manager.getConnection(name));
219
+ return;
220
+ }
221
+ if (this.stopped || signal?.aborted)
222
+ return;
223
+ if (freshConnection.status === "needs-auth") {
224
+ await this.notifyAuthRequired(name, definition, freshConnection);
225
+ return;
226
+ }
227
+ if (freshConnection.status !== "connected") {
228
+ this.reportConnectionFailure(name, definition, new Error(`MCP server ${name} did not return a connected session`), "reconnect", freshConnection);
229
+ return;
230
+ }
231
+ logger.debug(`Reconnected stale MCP session for ${name}`);
232
+ await this.publishConnectedMetadata(name, definition, freshConnection);
233
+ return;
234
+ }
235
+ if (refreshResult === "superseded") {
236
+ await this.handleSupersededConnection(name, definition, connection, signal, retrySuperseded);
237
+ return;
238
+ }
239
+ if (refreshResult === "refresh-timeout") {
240
+ this.deferRefreshTimeout(name, definition, connection);
241
+ return;
242
+ }
243
+ if (this.keepAliveServers.get(name) !== definition)
244
+ return;
245
+ if (this.retryStates.delete(name)) {
246
+ await this.onHealthRestored?.(name);
247
+ }
248
+ }
249
+ async handleSupersededConnection(name, definition, staleConnection, signal, retrySuperseded) {
250
+ const current = this.manager.getConnection(name);
251
+ if (this.keepAliveServers.get(name) !== definition)
252
+ return;
253
+ if (current === staleConnection && current.status === "connected") {
254
+ if (this.retryStates.delete(name))
255
+ await this.onHealthRestored?.(name);
256
+ return;
257
+ }
258
+ if (current?.status === "connected") {
259
+ await this.publishConnectedMetadata(name, definition, current);
260
+ return;
261
+ }
262
+ if (current?.status === "needs-auth") {
263
+ await this.notifyAuthRequired(name, definition, current);
264
+ return;
265
+ }
266
+ if (retrySuperseded) {
267
+ await this.checkKeepAliveConnection(name, definition, signal, false);
268
+ }
269
+ }
270
+ async publishConnectedMetadata(name, definition, connection) {
271
+ // Fence stale convergence passes by definition identity so disposal, and
272
+ // disposal followed by a same-name replacement, never re-track this
273
+ // server. Close the pass's own connection only when it is still current,
274
+ // so a replacement's connection is never touched.
275
+ if (this.keepAliveServers.get(name) !== definition) {
276
+ if (this.manager.getConnection(name) === connection)
277
+ await this.manager.close(name);
278
+ return;
279
+ }
280
+ this.pendingMetadataPublications.add(name);
281
+ try {
282
+ await this.onReconnect?.(name);
283
+ this.pendingMetadataPublications.delete(name);
284
+ this.retryStates.delete(name);
285
+ }
286
+ catch (error) {
287
+ if (this.stopped)
288
+ return;
289
+ this.reportConnectionFailure(name, definition, error, "publish", connection);
290
+ }
291
+ }
292
+ async notifyAuthRequired(name, definition, connection) {
293
+ // Fence stale convergence passes by definition identity. Close the
294
+ // leftover needs-auth connection only while it is still the manager's
295
+ // current entry, so a replacement's connection is never touched and the
296
+ // stale client/transport cannot leak when a replacement connects later.
297
+ if (this.keepAliveServers.get(name) !== definition) {
298
+ if (this.manager.getConnection(name) === connection)
299
+ await this.manager.close(name);
300
+ return;
301
+ }
302
+ this.pendingMetadataPublications.delete(name);
303
+ this.retryStates.delete(name);
304
+ try {
305
+ await this.onAuthRequired?.(name);
306
+ }
307
+ catch (error) {
308
+ const message = error instanceof Error ? error.message : String(error);
309
+ logger.debug(`MCP: auth-required callback failed for ${name}: ${sanitizeTerminalText(message)}`);
310
+ }
311
+ }
312
+ shouldAttemptConnection(name, connection) {
313
+ const retry = this.retryStates.get(name);
314
+ if (!retry)
315
+ return true;
316
+ if (retry.connection !== connection || retry.status !== connection?.status) {
317
+ this.retryStates.delete(name);
318
+ return true;
319
+ }
320
+ return Date.now() >= retry.nextAttemptAt;
321
+ }
322
+ reportConnectionFailure(name, definition, error, action, connection) {
323
+ if (!this.recordRetry(name, definition, connection))
324
+ return;
325
+ this.onReconnectFailure?.(name, error);
326
+ const message = error instanceof Error ? error.message : String(error);
327
+ const target = action === "reconnect"
328
+ ? `reconnect to ${name}`
329
+ : action === "publish"
330
+ ? `publish metadata for ${name}`
331
+ : `refresh ${name}`;
332
+ console.error(`MCP: Failed to ${target}: ${sanitizeTerminalText(message)}`);
333
+ }
334
+ deferRefreshTimeout(name, definition, connection) {
335
+ if (!this.recordRetry(name, definition, connection))
336
+ return;
337
+ logger.debug(`MCP: keep-alive tools/list refresh timed out for ${name}; retrying after backoff`);
338
+ }
339
+ recordRetry(name, definition, connection) {
340
+ // Do not recreate retry/failure state from a stale convergence pass after
341
+ // disposal or a same-name replacement registration.
342
+ if (this.keepAliveServers.get(name) !== definition)
343
+ return false;
344
+ const attempts = (this.retryStates.get(name)?.attempts ?? 0) + 1;
345
+ const delay = Math.min(KEEP_ALIVE_RETRY_BASE_MS * 2 ** Math.min(attempts - 1, 10), KEEP_ALIVE_RETRY_MAX_MS);
346
+ this.retryStates.set(name, {
347
+ attempts,
348
+ nextAttemptAt: Date.now() + delay,
349
+ connection,
350
+ status: connection?.status,
351
+ });
352
+ return true;
353
+ }
354
+ getIdleTimeout(name) {
355
+ const perServer = this.serverSettings.get(name)?.idleTimeout;
356
+ if (perServer !== undefined)
357
+ return perServer * 60 * 1000;
358
+ return this.globalIdleTimeout;
359
+ }
360
+ async gracefulShutdown() {
361
+ if (this.shutdownPromise)
362
+ return this.shutdownPromise;
363
+ this.shutdownPromise = this.shutdownOnce();
364
+ return this.shutdownPromise;
365
+ }
366
+ async shutdownOnce() {
367
+ this.stopped = true;
368
+ if (this.healthCheckInterval)
369
+ clearInterval(this.healthCheckInterval);
370
+ this.healthCheckInterval = undefined;
371
+ this.removeHealthAbortListener?.();
372
+ this.removeHealthAbortListener = undefined;
373
+ await this.activeHealthCheck;
374
+ this.activeHealthCheck = undefined;
375
+ await this.activeConvergence;
376
+ this.activeConvergence = undefined;
377
+ this.onReconnect = undefined;
378
+ this.onReconnectFailure = undefined;
379
+ this.onHealthRestored = undefined;
380
+ this.onAuthRequired = undefined;
381
+ this.onIdleShutdown = undefined;
382
+ this.retryStates.clear();
383
+ this.pendingMetadataPublications.clear();
384
+ if (typeof this.manager.closeAll === "function") {
385
+ await this.manager.closeAll();
386
+ }
387
+ }
388
+ }
389
+ function shouldReconnectAfterRefresh(error, hadSessionId) {
390
+ if (isTerminatedSession(error, hadSessionId))
391
+ return true;
392
+ return (error instanceof SdkError &&
393
+ (error.code === SdkErrorCode.NotConnected || error.code === SdkErrorCode.ConnectionClosed));
394
+ }
395
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/extensions/mcp/lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import { SdkError, SdkErrorCode } from \"@modelcontextprotocol/client\";\nimport { logger } from \"./logger.ts\";\nimport { hasPendingAuth } from \"./mcp-auth-flow.ts\";\nimport type { McpServerManager, ServerConnection } from \"./server-manager.ts\";\nimport { isTerminatedSession } from \"./session-recovery.ts\";\nimport { isServerDisabled, type ServerDefinition } from \"./types.ts\";\nimport { formatTerminalError, parallelLimit, sanitizeTerminalText } from \"./utils.ts\";\n\nexport type ReconnectCallback = (serverName: string) => void | Promise<void>;\nexport type ReconnectFailureCallback = (serverName: string, error: unknown) => void;\nexport type HealthRestoredCallback = (serverName: string) => void | Promise<void>;\nexport type AuthRequiredCallback = (serverName: string) => void | Promise<void>;\n\nconst KEEP_ALIVE_RETRY_BASE_MS = 30_000;\nconst KEEP_ALIVE_RETRY_MAX_MS = 5 * 60_000;\nconst KEEP_ALIVE_CHECK_CONCURRENCY = 10;\n\ninterface RetryState {\n\tattempts: number;\n\tnextAttemptAt: number;\n\tconnection: ServerConnection | undefined;\n\tstatus: ServerConnection[\"status\"] | undefined;\n}\n\nexport class McpLifecycleManager {\n\tprivate keepAliveServers = new Map<string, ServerDefinition>();\n\tprivate allServers = new Map<string, ServerDefinition>();\n\tprivate serverSettings = new Map<string, { idleTimeout?: number }>();\n\tprivate globalIdleTimeout = 10 * 60 * 1000;\n\tprivate healthCheckInterval: NodeJS.Timeout | undefined;\n\tprivate onReconnect: ReconnectCallback | undefined;\n\tprivate onReconnectFailure: ReconnectFailureCallback | undefined;\n\tprivate onHealthRestored: HealthRestoredCallback | undefined;\n\tprivate onAuthRequired: AuthRequiredCallback | undefined;\n\tprivate onIdleShutdown: ((serverName: string) => void) | undefined;\n\tprivate activeHealthCheck: Promise<void> | undefined;\n\tprivate activeConvergence: Promise<void> | undefined;\n\tprivate shutdownPromise: Promise<void> | undefined;\n\tprivate retryStates = new Map<string, RetryState>();\n\tprivate pendingMetadataPublications = new Set<string>();\n\tprivate stopped = false;\n\tprivate removeHealthAbortListener: (() => void) | undefined;\n\tprivate readonly manager: McpServerManager;\n\tprivate readonly hasPendingAuthForServer: typeof hasPendingAuth;\n\n\tconstructor(manager: McpServerManager, hasPendingAuthForServer = hasPendingAuth) {\n\t\tthis.manager = manager;\n\t\tthis.hasPendingAuthForServer = hasPendingAuthForServer;\n\t}\n\n\tsetReconnectCallback(callback: ReconnectCallback): void {\n\t\tthis.onReconnect = callback;\n\t}\n\n\tsetReconnectFailureCallback(callback: ReconnectFailureCallback): void {\n\t\tthis.onReconnectFailure = callback;\n\t}\n\n\tsetHealthRestoredCallback(callback: HealthRestoredCallback): void {\n\t\tthis.onHealthRestored = callback;\n\t}\n\n\tsetAuthRequiredCallback(callback: AuthRequiredCallback): void {\n\t\tthis.onAuthRequired = callback;\n\t}\n\n\tmarkKeepAlive(name: string, definition: ServerDefinition): void {\n\t\tif (isServerDisabled(definition)) return;\n\t\tthis.keepAliveServers.set(name, definition);\n\t}\n\n\tregisterServer(name: string, definition: ServerDefinition, settings?: { idleTimeout?: number }): void {\n\t\tif (isServerDisabled(definition)) return;\n\t\tthis.allServers.set(name, definition);\n\t\tif (settings?.idleTimeout !== undefined) this.serverSettings.set(name, settings);\n\t}\n\n\tunregisterServer(name: string): void {\n\t\tthis.allServers.delete(name);\n\t\tthis.keepAliveServers.delete(name);\n\t\tthis.serverSettings.delete(name);\n\t\tthis.retryStates.delete(name);\n\t\tthis.pendingMetadataPublications.delete(name);\n\t}\n\n\tsetGlobalIdleTimeout(minutes: number): void {\n\t\tthis.globalIdleTimeout = minutes * 60 * 1000;\n\t}\n\n\tsetIdleShutdownCallback(callback: (serverName: string) => void): void {\n\t\tthis.onIdleShutdown = callback;\n\t}\n\n\tstartHealthChecks(signalOrInterval?: AbortSignal | number, maybeIntervalMs = 30000): void {\n\t\tconst signal = typeof signalOrInterval === \"number\" ? undefined : signalOrInterval;\n\t\tconst intervalMs = typeof signalOrInterval === \"number\" ? signalOrInterval : maybeIntervalMs;\n\t\tthis.stopped = false;\n\t\tif (signal?.aborted) {\n\t\t\tthis.stopped = true;\n\t\t\treturn;\n\t\t}\n\t\tconst stop = () => {\n\t\t\tthis.stopped = true;\n\t\t\tif (this.healthCheckInterval) clearInterval(this.healthCheckInterval);\n\t\t\tthis.healthCheckInterval = undefined;\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", stop, { once: true });\n\t\tthis.removeHealthAbortListener = () => signal?.removeEventListener(\"abort\", stop);\n\t\tthis.healthCheckInterval = setInterval(() => {\n\t\t\tif (this.stopped || signal?.aborted || this.activeHealthCheck) return;\n\t\t\tconst check = this.checkConnections(signal)\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(`MCP: Health check failed: ${formatTerminalError(error)}`);\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tif (this.activeHealthCheck === check) this.activeHealthCheck = undefined;\n\t\t\t\t});\n\t\t\tthis.activeHealthCheck = check;\n\t\t}, intervalMs);\n\t\tthis.healthCheckInterval.unref();\n\t}\n\n\tasync ensureConverged(signal?: AbortSignal): Promise<void> {\n\t\tif (this.stopped || signal?.aborted) return;\n\t\tif (this.activeConvergence) return this.activeConvergence;\n\n\t\tconst check = this.checkKeepAliveConnections(signal);\n\t\tthis.activeConvergence = check;\n\t\ttry {\n\t\t\tawait check;\n\t\t} finally {\n\t\t\tif (this.activeConvergence === check) this.activeConvergence = undefined;\n\t\t}\n\t}\n\n\tprivate async checkConnections(signal?: AbortSignal): Promise<void> {\n\t\tif (this.stopped || signal?.aborted) return;\n\t\tawait this.ensureConverged(signal);\n\t\tif (this.stopped || signal?.aborted) return;\n\n\t\tfor (const [name] of this.allServers) {\n\t\t\tif (this.keepAliveServers.has(name)) continue;\n\t\t\tconst timeout = this.getIdleTimeout(name);\n\t\t\tconst connection = this.manager.getConnection(name);\n\t\t\tif (connection && timeout > 0 && this.manager.isIdle(name, timeout)) {\n\t\t\t\tconst closed = await this.manager.closeIfCurrent(name, connection);\n\t\t\t\tif (this.stopped || signal?.aborted) return;\n\t\t\t\tif (closed) this.onIdleShutdown?.(name);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async checkKeepAliveConnections(signal?: AbortSignal): Promise<void> {\n\t\tif (this.stopped || signal?.aborted) return;\n\t\tawait parallelLimit([...this.keepAliveServers], KEEP_ALIVE_CHECK_CONCURRENCY, ([name, definition]) =>\n\t\t\tthis.checkKeepAliveConnection(name, definition, signal),\n\t\t);\n\t}\n\n\tprivate async checkKeepAliveConnection(\n\t\tname: string,\n\t\tdefinition: ServerDefinition,\n\t\tsignal?: AbortSignal,\n\t\tretrySuperseded = true,\n\t): Promise<void> {\n\t\tif (isServerDisabled(definition) || this.stopped || signal?.aborted) return;\n\t\t// Fence against unregisterServer racing an in-flight convergence pass.\n\t\t// Identity comparison also rejects stale passes after a same-name\n\t\t// replacement registration, which a name check would wrongly accept.\n\t\tif (this.keepAliveServers.get(name) !== definition) return;\n\t\tconst connection = this.manager.getConnection(name);\n\t\tif (connection?.status === \"needs-auth\") {\n\t\t\tthis.pendingMetadataPublications.delete(name);\n\t\t\treturn;\n\t\t}\n\t\tif (!this.shouldAttemptConnection(name, connection)) return;\n\t\tif (!connection || connection.status !== \"connected\") {\n\t\t\tif (this.hasPendingAuthForServer(name)) {\n\t\t\t\tlogger.debug(`Skipping reconnect for ${name} while OAuth authorization is pending`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet freshConnection: ServerConnection;\n\t\t\ttry {\n\t\t\t\tfreshConnection = await this.manager.connect(name, definition, signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (this.stopped || signal?.aborted) return;\n\t\t\t\tthis.reportConnectionFailure(name, definition, error, \"reconnect\", this.manager.getConnection(name));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.stopped || signal?.aborted) return;\n\t\t\tif (freshConnection.status === \"needs-auth\") {\n\t\t\t\tawait this.notifyAuthRequired(name, definition, freshConnection);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (freshConnection.status !== \"connected\") {\n\t\t\t\tthis.reportConnectionFailure(\n\t\t\t\t\tname,\n\t\t\t\t\tdefinition,\n\t\t\t\t\tnew Error(`MCP server ${name} did not return a connected session`),\n\t\t\t\t\t\"reconnect\",\n\t\t\t\t\tfreshConnection,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlogger.debug(`Reconnected to ${name}`);\n\t\t\tawait this.publishConnectedMetadata(name, definition, freshConnection);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.pendingMetadataPublications.has(name)) {\n\t\t\tawait this.publishConnectedMetadata(name, definition, connection);\n\t\t\treturn;\n\t\t}\n\t\tconst hadSessionId = (connection.transport as { sessionId?: string } | undefined)?.sessionId != null;\n\t\tlet refreshResult: Awaited<ReturnType<McpServerManager[\"refreshTools\"]>>;\n\t\ttry {\n\t\t\trefreshResult = await this.manager.refreshTools(name, connection, signal);\n\t\t} catch (error) {\n\t\t\tif (this.stopped || signal?.aborted) return;\n\t\t\tconst current = this.manager.getConnection(name);\n\t\t\tif (current !== connection || connection.status !== \"connected\") {\n\t\t\t\tawait this.handleSupersededConnection(name, definition, connection, signal, retrySuperseded);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!shouldReconnectAfterRefresh(error, hadSessionId)) {\n\t\t\t\tthis.reportConnectionFailure(name, definition, error, \"refresh\", connection);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.hasPendingAuthForServer(name)) {\n\t\t\t\tlogger.debug(`Skipping reconnect for ${name} while OAuth authorization is pending`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet freshConnection: ServerConnection;\n\t\t\ttry {\n\t\t\t\tfreshConnection = await this.manager.reconnect(name, definition, connection, signal);\n\t\t\t} catch (reconnectError) {\n\t\t\t\tif (this.stopped || signal?.aborted) return;\n\t\t\t\tthis.reportConnectionFailure(\n\t\t\t\t\tname,\n\t\t\t\t\tdefinition,\n\t\t\t\t\treconnectError,\n\t\t\t\t\t\"reconnect\",\n\t\t\t\t\tthis.manager.getConnection(name),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.stopped || signal?.aborted) return;\n\t\t\tif (freshConnection.status === \"needs-auth\") {\n\t\t\t\tawait this.notifyAuthRequired(name, definition, freshConnection);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (freshConnection.status !== \"connected\") {\n\t\t\t\tthis.reportConnectionFailure(\n\t\t\t\t\tname,\n\t\t\t\t\tdefinition,\n\t\t\t\t\tnew Error(`MCP server ${name} did not return a connected session`),\n\t\t\t\t\t\"reconnect\",\n\t\t\t\t\tfreshConnection,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlogger.debug(`Reconnected stale MCP session for ${name}`);\n\t\t\tawait this.publishConnectedMetadata(name, definition, freshConnection);\n\t\t\treturn;\n\t\t}\n\n\t\tif (refreshResult === \"superseded\") {\n\t\t\tawait this.handleSupersededConnection(name, definition, connection, signal, retrySuperseded);\n\t\t\treturn;\n\t\t}\n\t\tif (refreshResult === \"refresh-timeout\") {\n\t\t\tthis.deferRefreshTimeout(name, definition, connection);\n\t\t\treturn;\n\t\t}\n\t\tif (this.keepAliveServers.get(name) !== definition) return;\n\t\tif (this.retryStates.delete(name)) {\n\t\t\tawait this.onHealthRestored?.(name);\n\t\t}\n\t}\n\n\tprivate async handleSupersededConnection(\n\t\tname: string,\n\t\tdefinition: ServerDefinition,\n\t\tstaleConnection: ServerConnection,\n\t\tsignal: AbortSignal | undefined,\n\t\tretrySuperseded: boolean,\n\t): Promise<void> {\n\t\tconst current = this.manager.getConnection(name);\n\t\tif (this.keepAliveServers.get(name) !== definition) return;\n\t\tif (current === staleConnection && current.status === \"connected\") {\n\t\t\tif (this.retryStates.delete(name)) await this.onHealthRestored?.(name);\n\t\t\treturn;\n\t\t}\n\t\tif (current?.status === \"connected\") {\n\t\t\tawait this.publishConnectedMetadata(name, definition, current);\n\t\t\treturn;\n\t\t}\n\t\tif (current?.status === \"needs-auth\") {\n\t\t\tawait this.notifyAuthRequired(name, definition, current);\n\t\t\treturn;\n\t\t}\n\t\tif (retrySuperseded) {\n\t\t\tawait this.checkKeepAliveConnection(name, definition, signal, false);\n\t\t}\n\t}\n\n\tprivate async publishConnectedMetadata(\n\t\tname: string,\n\t\tdefinition: ServerDefinition,\n\t\tconnection: ServerConnection,\n\t): Promise<void> {\n\t\t// Fence stale convergence passes by definition identity so disposal, and\n\t\t// disposal followed by a same-name replacement, never re-track this\n\t\t// server. Close the pass's own connection only when it is still current,\n\t\t// so a replacement's connection is never touched.\n\t\tif (this.keepAliveServers.get(name) !== definition) {\n\t\t\tif (this.manager.getConnection(name) === connection) await this.manager.close(name);\n\t\t\treturn;\n\t\t}\n\t\tthis.pendingMetadataPublications.add(name);\n\t\ttry {\n\t\t\tawait this.onReconnect?.(name);\n\t\t\tthis.pendingMetadataPublications.delete(name);\n\t\t\tthis.retryStates.delete(name);\n\t\t} catch (error) {\n\t\t\tif (this.stopped) return;\n\t\t\tthis.reportConnectionFailure(name, definition, error, \"publish\", connection);\n\t\t}\n\t}\n\n\tprivate async notifyAuthRequired(\n\t\tname: string,\n\t\tdefinition: ServerDefinition,\n\t\tconnection: ServerConnection,\n\t): Promise<void> {\n\t\t// Fence stale convergence passes by definition identity. Close the\n\t\t// leftover needs-auth connection only while it is still the manager's\n\t\t// current entry, so a replacement's connection is never touched and the\n\t\t// stale client/transport cannot leak when a replacement connects later.\n\t\tif (this.keepAliveServers.get(name) !== definition) {\n\t\t\tif (this.manager.getConnection(name) === connection) await this.manager.close(name);\n\t\t\treturn;\n\t\t}\n\t\tthis.pendingMetadataPublications.delete(name);\n\t\tthis.retryStates.delete(name);\n\t\ttry {\n\t\t\tawait this.onAuthRequired?.(name);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tlogger.debug(`MCP: auth-required callback failed for ${name}: ${sanitizeTerminalText(message)}`);\n\t\t}\n\t}\n\n\tprivate shouldAttemptConnection(name: string, connection: ServerConnection | undefined): boolean {\n\t\tconst retry = this.retryStates.get(name);\n\t\tif (!retry) return true;\n\t\tif (retry.connection !== connection || retry.status !== connection?.status) {\n\t\t\tthis.retryStates.delete(name);\n\t\t\treturn true;\n\t\t}\n\t\treturn Date.now() >= retry.nextAttemptAt;\n\t}\n\n\tprivate reportConnectionFailure(\n\t\tname: string,\n\t\tdefinition: ServerDefinition,\n\t\terror: unknown,\n\t\taction: \"refresh\" | \"reconnect\" | \"publish\",\n\t\tconnection: ServerConnection | undefined,\n\t): void {\n\t\tif (!this.recordRetry(name, definition, connection)) return;\n\t\tthis.onReconnectFailure?.(name, error);\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconst target =\n\t\t\taction === \"reconnect\"\n\t\t\t\t? `reconnect to ${name}`\n\t\t\t\t: action === \"publish\"\n\t\t\t\t\t? `publish metadata for ${name}`\n\t\t\t\t\t: `refresh ${name}`;\n\t\tconsole.error(`MCP: Failed to ${target}: ${sanitizeTerminalText(message)}`);\n\t}\n\n\tprivate deferRefreshTimeout(\n\t\tname: string,\n\t\tdefinition: ServerDefinition,\n\t\tconnection: ServerConnection | undefined,\n\t): void {\n\t\tif (!this.recordRetry(name, definition, connection)) return;\n\t\tlogger.debug(`MCP: keep-alive tools/list refresh timed out for ${name}; retrying after backoff`);\n\t}\n\n\tprivate recordRetry(name: string, definition: ServerDefinition, connection: ServerConnection | undefined): boolean {\n\t\t// Do not recreate retry/failure state from a stale convergence pass after\n\t\t// disposal or a same-name replacement registration.\n\t\tif (this.keepAliveServers.get(name) !== definition) return false;\n\t\tconst attempts = (this.retryStates.get(name)?.attempts ?? 0) + 1;\n\t\tconst delay = Math.min(KEEP_ALIVE_RETRY_BASE_MS * 2 ** Math.min(attempts - 1, 10), KEEP_ALIVE_RETRY_MAX_MS);\n\t\tthis.retryStates.set(name, {\n\t\t\tattempts,\n\t\t\tnextAttemptAt: Date.now() + delay,\n\t\t\tconnection,\n\t\t\tstatus: connection?.status,\n\t\t});\n\t\treturn true;\n\t}\n\n\tprivate getIdleTimeout(name: string): number {\n\t\tconst perServer = this.serverSettings.get(name)?.idleTimeout;\n\t\tif (perServer !== undefined) return perServer * 60 * 1000;\n\t\treturn this.globalIdleTimeout;\n\t}\n\n\tasync gracefulShutdown(): Promise<void> {\n\t\tif (this.shutdownPromise) return this.shutdownPromise;\n\t\tthis.shutdownPromise = this.shutdownOnce();\n\t\treturn this.shutdownPromise;\n\t}\n\n\tprivate async shutdownOnce(): Promise<void> {\n\t\tthis.stopped = true;\n\t\tif (this.healthCheckInterval) clearInterval(this.healthCheckInterval);\n\t\tthis.healthCheckInterval = undefined;\n\t\tthis.removeHealthAbortListener?.();\n\t\tthis.removeHealthAbortListener = undefined;\n\t\tawait this.activeHealthCheck;\n\t\tthis.activeHealthCheck = undefined;\n\t\tawait this.activeConvergence;\n\t\tthis.activeConvergence = undefined;\n\t\tthis.onReconnect = undefined;\n\t\tthis.onReconnectFailure = undefined;\n\t\tthis.onHealthRestored = undefined;\n\t\tthis.onAuthRequired = undefined;\n\t\tthis.onIdleShutdown = undefined;\n\t\tthis.retryStates.clear();\n\t\tthis.pendingMetadataPublications.clear();\n\t\tif (typeof this.manager.closeAll === \"function\") {\n\t\t\tawait this.manager.closeAll();\n\t\t}\n\t}\n}\n\nfunction shouldReconnectAfterRefresh(error: unknown, hadSessionId: boolean): boolean {\n\tif (isTerminatedSession(error, hadSessionId)) return true;\n\treturn (\n\t\terror instanceof SdkError &&\n\t\t(error.code === SdkErrorCode.NotConnected || error.code === SdkErrorCode.ConnectionClosed)\n\t);\n}\n"]}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Centralized logging for MCP UI operations.
3
+ * Provides structured, contextual logs with levels.
4
+ */
5
+ export type LogLevel = "debug" | "info" | "warn" | "error";
6
+ export interface LogContext {
7
+ server?: string;
8
+ session?: string;
9
+ tool?: string;
10
+ uri?: string;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface LogEntry {
14
+ level: LogLevel;
15
+ message: string;
16
+ context?: LogContext;
17
+ error?: Error;
18
+ timestamp: Date;
19
+ }
20
+ type LogHandler = (entry: LogEntry) => void;
21
+ declare class Logger {
22
+ private minLevel;
23
+ private handlers;
24
+ private defaultContext;
25
+ setLevel(level: LogLevel): void;
26
+ setDefaultContext(context: LogContext): void;
27
+ addHandler(handler: LogHandler): void;
28
+ clearHandlers(): void;
29
+ private shouldLog;
30
+ private emit;
31
+ debug(message: string, context?: LogContext): void;
32
+ info(message: string, context?: LogContext): void;
33
+ warn(message: string, context?: LogContext): void;
34
+ error(message: string, error?: Error, context?: LogContext): void;
35
+ /**
36
+ * Create a child logger with additional default context.
37
+ */
38
+ child(context: LogContext): ChildLogger;
39
+ }
40
+ declare class ChildLogger {
41
+ private parent;
42
+ private context;
43
+ constructor(parent: Logger, context: LogContext);
44
+ debug(message: string, context?: LogContext): void;
45
+ info(message: string, context?: LogContext): void;
46
+ warn(message: string, context?: LogContext): void;
47
+ error(message: string, error?: Error, context?: LogContext): void;
48
+ child(context: LogContext): ChildLogger;
49
+ }
50
+ export declare const logger: Logger;
51
+ export {};
52
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,UAAU;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,KAAK,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAgB5C,cAAM,MAAM;IACX,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAkB;IAExC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAE9B;IAED,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAE3C;IAED,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAEpC;IAED,aAAa,IAAI,IAAI,CAEpB;IAED,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,IAAI;IAqCZ,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEjD;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhD;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhD;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhE;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,WAAW,CAEtC;CACD;AAED,cAAM,WAAW;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAa;IAE5B,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAG9C;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEjD;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhD;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhD;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAEhE;IAED,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,WAAW,CAEtC;CACD;AAeD,eAAO,MAAM,MAAM,QAAe,CAAC","sourcesContent":["/**\n * Centralized logging for MCP UI operations.\n * Provides structured, contextual logs with levels.\n */\n\nimport { sanitizeTerminalText } from \"./utils.ts\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogContext {\n\tserver?: string;\n\tsession?: string;\n\ttool?: string;\n\turi?: string;\n\t[key: string]: unknown;\n}\n\nexport interface LogEntry {\n\tlevel: LogLevel;\n\tmessage: string;\n\tcontext?: LogContext;\n\terror?: Error;\n\ttimestamp: Date;\n}\n\ntype LogHandler = (entry: LogEntry) => void;\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n\tdebug: 0,\n\tinfo: 1,\n\twarn: 2,\n\terror: 3,\n};\n\nconst LEVEL_PREFIX: Record<LogLevel, string> = {\n\tdebug: \"[MCP-UI:DEBUG]\",\n\tinfo: \"[MCP-UI]\",\n\twarn: \"[MCP-UI:WARN]\",\n\terror: \"[MCP-UI:ERROR]\",\n};\n\nclass Logger {\n\tprivate minLevel: LogLevel = \"info\";\n\tprivate handlers: LogHandler[] = [];\n\tprivate defaultContext: LogContext = {};\n\n\tsetLevel(level: LogLevel): void {\n\t\tthis.minLevel = level;\n\t}\n\n\tsetDefaultContext(context: LogContext): void {\n\t\tthis.defaultContext = context;\n\t}\n\n\taddHandler(handler: LogHandler): void {\n\t\tthis.handlers.push(handler);\n\t}\n\n\tclearHandlers(): void {\n\t\tthis.handlers = [];\n\t}\n\n\tprivate shouldLog(level: LogLevel): boolean {\n\t\treturn LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.minLevel];\n\t}\n\n\tprivate emit(level: LogLevel, message: string, context?: LogContext, error?: Error): void {\n\t\tif (!this.shouldLog(level)) return;\n\n\t\tconst entry: LogEntry = {\n\t\t\tlevel,\n\t\t\tmessage,\n\t\t\tcontext: { ...this.defaultContext, ...context },\n\t\t\t...(error !== undefined ? { error } : {}),\n\t\t\ttimestamp: new Date(),\n\t\t};\n\n\t\t// Default console output\n\t\tconst prefix = LEVEL_PREFIX[level];\n\t\tconst contextStr = formatContext(entry.context);\n\t\tconst terminalMessage = sanitizeTerminalText(message);\n\t\tconst fullMessage = contextStr ? `${prefix} ${terminalMessage} ${contextStr}` : `${prefix} ${terminalMessage}`;\n\n\t\tif (level === \"error\") {\n\t\t\tconsole.error(fullMessage, error ? sanitizeTerminalText(error.stack ?? error.message) : \"\");\n\t\t} else if (level === \"warn\") {\n\t\t\tconsole.warn(fullMessage);\n\t\t} else if (level === \"debug\") {\n\t\t\tconsole.debug(fullMessage);\n\t\t} else {\n\t\t\tconsole.log(fullMessage);\n\t\t}\n\n\t\t// Custom handlers\n\t\tfor (const handler of this.handlers) {\n\t\t\ttry {\n\t\t\t\thandler(entry);\n\t\t\t} catch {\n\t\t\t\t// Ignore handler errors\n\t\t\t}\n\t\t}\n\t}\n\n\tdebug(message: string, context?: LogContext): void {\n\t\tthis.emit(\"debug\", message, context);\n\t}\n\n\tinfo(message: string, context?: LogContext): void {\n\t\tthis.emit(\"info\", message, context);\n\t}\n\n\twarn(message: string, context?: LogContext): void {\n\t\tthis.emit(\"warn\", message, context);\n\t}\n\n\terror(message: string, error?: Error, context?: LogContext): void {\n\t\tthis.emit(\"error\", message, context, error);\n\t}\n\n\t/**\n\t * Create a child logger with additional default context.\n\t */\n\tchild(context: LogContext): ChildLogger {\n\t\treturn new ChildLogger(this, context);\n\t}\n}\n\nclass ChildLogger {\n\tprivate parent: Logger;\n\tprivate context: LogContext;\n\n\tconstructor(parent: Logger, context: LogContext) {\n\t\tthis.parent = parent;\n\t\tthis.context = context;\n\t}\n\n\tdebug(message: string, context?: LogContext): void {\n\t\tthis.parent.debug(message, { ...this.context, ...context });\n\t}\n\n\tinfo(message: string, context?: LogContext): void {\n\t\tthis.parent.info(message, { ...this.context, ...context });\n\t}\n\n\twarn(message: string, context?: LogContext): void {\n\t\tthis.parent.warn(message, { ...this.context, ...context });\n\t}\n\n\terror(message: string, error?: Error, context?: LogContext): void {\n\t\tthis.parent.error(message, error, { ...this.context, ...context });\n\t}\n\n\tchild(context: LogContext): ChildLogger {\n\t\treturn new ChildLogger(this.parent, { ...this.context, ...context });\n\t}\n}\n\nfunction formatContext(context?: LogContext): string {\n\tif (!context || Object.keys(context).length === 0) return \"\";\n\tconst parts: string[] = [];\n\tfor (const [key, value] of Object.entries(context)) {\n\t\tif (value !== undefined && value !== null) {\n\t\t\tconst rendered = typeof value === \"string\" ? value : (JSON.stringify(value) ?? String(value));\n\t\t\tparts.push(`${sanitizeTerminalText(key)}=${sanitizeTerminalText(rendered)}`);\n\t\t}\n\t}\n\treturn parts.length > 0 ? `(${parts.join(\", \")})` : \"\";\n}\n\n// Singleton instance\nexport const logger = new Logger();\n\n// Enable debug mode via environment variable\nif (process.env.MCP_UI_DEBUG === \"1\" || process.env.MCP_UI_DEBUG === \"true\") {\n\tlogger.setLevel(\"debug\");\n}\n"]}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Centralized logging for MCP UI operations.
3
+ * Provides structured, contextual logs with levels.
4
+ */
5
+ import { sanitizeTerminalText } from "./utils.js";
6
+ const LEVEL_PRIORITY = {
7
+ debug: 0,
8
+ info: 1,
9
+ warn: 2,
10
+ error: 3,
11
+ };
12
+ const LEVEL_PREFIX = {
13
+ debug: "[MCP-UI:DEBUG]",
14
+ info: "[MCP-UI]",
15
+ warn: "[MCP-UI:WARN]",
16
+ error: "[MCP-UI:ERROR]",
17
+ };
18
+ class Logger {
19
+ minLevel = "info";
20
+ handlers = [];
21
+ defaultContext = {};
22
+ setLevel(level) {
23
+ this.minLevel = level;
24
+ }
25
+ setDefaultContext(context) {
26
+ this.defaultContext = context;
27
+ }
28
+ addHandler(handler) {
29
+ this.handlers.push(handler);
30
+ }
31
+ clearHandlers() {
32
+ this.handlers = [];
33
+ }
34
+ shouldLog(level) {
35
+ return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.minLevel];
36
+ }
37
+ emit(level, message, context, error) {
38
+ if (!this.shouldLog(level))
39
+ return;
40
+ const entry = {
41
+ level,
42
+ message,
43
+ context: { ...this.defaultContext, ...context },
44
+ ...(error !== undefined ? { error } : {}),
45
+ timestamp: new Date(),
46
+ };
47
+ // Default console output
48
+ const prefix = LEVEL_PREFIX[level];
49
+ const contextStr = formatContext(entry.context);
50
+ const terminalMessage = sanitizeTerminalText(message);
51
+ const fullMessage = contextStr ? `${prefix} ${terminalMessage} ${contextStr}` : `${prefix} ${terminalMessage}`;
52
+ if (level === "error") {
53
+ console.error(fullMessage, error ? sanitizeTerminalText(error.stack ?? error.message) : "");
54
+ }
55
+ else if (level === "warn") {
56
+ console.warn(fullMessage);
57
+ }
58
+ else if (level === "debug") {
59
+ console.debug(fullMessage);
60
+ }
61
+ else {
62
+ console.log(fullMessage);
63
+ }
64
+ // Custom handlers
65
+ for (const handler of this.handlers) {
66
+ try {
67
+ handler(entry);
68
+ }
69
+ catch {
70
+ // Ignore handler errors
71
+ }
72
+ }
73
+ }
74
+ debug(message, context) {
75
+ this.emit("debug", message, context);
76
+ }
77
+ info(message, context) {
78
+ this.emit("info", message, context);
79
+ }
80
+ warn(message, context) {
81
+ this.emit("warn", message, context);
82
+ }
83
+ error(message, error, context) {
84
+ this.emit("error", message, context, error);
85
+ }
86
+ /**
87
+ * Create a child logger with additional default context.
88
+ */
89
+ child(context) {
90
+ return new ChildLogger(this, context);
91
+ }
92
+ }
93
+ class ChildLogger {
94
+ parent;
95
+ context;
96
+ constructor(parent, context) {
97
+ this.parent = parent;
98
+ this.context = context;
99
+ }
100
+ debug(message, context) {
101
+ this.parent.debug(message, { ...this.context, ...context });
102
+ }
103
+ info(message, context) {
104
+ this.parent.info(message, { ...this.context, ...context });
105
+ }
106
+ warn(message, context) {
107
+ this.parent.warn(message, { ...this.context, ...context });
108
+ }
109
+ error(message, error, context) {
110
+ this.parent.error(message, error, { ...this.context, ...context });
111
+ }
112
+ child(context) {
113
+ return new ChildLogger(this.parent, { ...this.context, ...context });
114
+ }
115
+ }
116
+ function formatContext(context) {
117
+ if (!context || Object.keys(context).length === 0)
118
+ return "";
119
+ const parts = [];
120
+ for (const [key, value] of Object.entries(context)) {
121
+ if (value !== undefined && value !== null) {
122
+ const rendered = typeof value === "string" ? value : (JSON.stringify(value) ?? String(value));
123
+ parts.push(`${sanitizeTerminalText(key)}=${sanitizeTerminalText(rendered)}`);
124
+ }
125
+ }
126
+ return parts.length > 0 ? `(${parts.join(", ")})` : "";
127
+ }
128
+ // Singleton instance
129
+ export const logger = new Logger();
130
+ // Enable debug mode via environment variable
131
+ if (process.env.MCP_UI_DEBUG === "1" || process.env.MCP_UI_DEBUG === "true") {
132
+ logger.setLevel("debug");
133
+ }
134
+ //# sourceMappingURL=logger.js.map