@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":"init.js","sourceRoot":"","sources":["../../../src/extensions/mcp/init.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\nimport { cloneMcpConfig, loadMcpConfig } from \"./config.ts\";\nimport { ConsentManager } from \"./consent-manager.ts\";\nimport { McpLifecycleManager } from \"./lifecycle.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getAuthStorageOptions } from \"./mcp-auth.ts\";\nimport { createOAuthRuntime, hasPendingAuth, type McpOAuthRuntime, shutdownOAuth } from \"./mcp-auth-flow.ts\";\nimport { publishMcpStatusSnapshot } from \"./mcp-status.ts\";\nimport {\n\tcomputeServerHash,\n\tcreateCachedToolSelectorCandidateIndex,\n\tgetMetadataCachePath,\n\tgetMissingConfiguredDirectToolServers,\n\tisServerCacheValid,\n\tloadMetadataCache,\n\treconstructPromptMetadata,\n\treconstructToolMetadata,\n\ttype ServerCacheEntry,\n\tsaveMetadataCache,\n\tserializePrompts,\n\tserializeResources,\n\tserializeTools,\n} from \"./metadata-cache.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport {\n\tcombineAbortSignals,\n\tcreateMcpRuntimeOwner,\n\tcreateOwnedUi,\n\tisAbortError,\n\ttype McpRuntimeOwner,\n} from \"./runtime-owner.ts\";\nimport { McpServerManager } from \"./server-manager.ts\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport { buildToolMetadata, totalToolCount } from \"./tool-metadata.ts\";\nimport {\n\tformatToolName,\n\tisServerDisabled,\n\ttype McpAdapterOptions,\n\ttype PromptMetadata,\n\tresolveToolPrefix,\n\ttype ToolMetadata,\n\ttype ToolSelectorCandidateIndex,\n} from \"./types.ts\";\nimport { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport { formatMcpStatus, openUrl, parallelLimit, sanitizeTerminalText } from \"./utils.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\nconst MAX_FAILURE_MESSAGE_CHARS = 8 * 1024;\nconst failureExpiryTimers = new WeakMap<McpExtensionState, Map<string, ReturnType<typeof setTimeout>>>();\n\nfunction getFailureExpiryTimers(state: McpExtensionState): Map<string, ReturnType<typeof setTimeout>> {\n\tlet timers = failureExpiryTimers.get(state);\n\tif (!timers) {\n\t\ttimers = new Map();\n\t\tfailureExpiryTimers.set(state, timers);\n\t}\n\treturn timers;\n}\n\nexport function clearFailure(state: McpExtensionState, serverName: string): void {\n\tstate.failureTracker.delete(serverName);\n\tstate.failureMessages?.delete(serverName);\n\tconst timers = failureExpiryTimers.get(state);\n\tconst timer = timers?.get(serverName);\n\tif (timer) clearTimeout(timer);\n\ttimers?.delete(serverName);\n}\n\nexport function recordFailure(state: McpExtensionState, serverName: string, message: string): void {\n\tclearFailure(state, serverName);\n\tconst failedAt = Date.now();\n\tstate.failureTracker.set(serverName, failedAt);\n\tstate.failureMessages?.set(serverName, message.slice(0, MAX_FAILURE_MESSAGE_CHARS));\n\tconst timer = setTimeout(() => {\n\t\tif (!state.owner.isActive()) {\n\t\t\tgetFailureExpiryTimers(state).delete(serverName);\n\t\t\treturn;\n\t\t}\n\t\tif (state.failureTracker.get(serverName) === failedAt) {\n\t\t\tstate.failureTracker.delete(serverName);\n\t\t\tstate.failureMessages?.delete(serverName);\n\t\t\tpublishMcpStatusSnapshot(state);\n\t\t}\n\t\tgetFailureExpiryTimers(state).delete(serverName);\n\t}, FAILURE_BACKOFF_MS);\n\ttimer.unref?.();\n\tgetFailureExpiryTimers(state).set(serverName, timer);\n}\n\nexport function isTuiMode(ctx: Pick<ExtensionContext, \"hasUI\" | \"mode\">): boolean {\n\treturn ctx.hasUI && ctx.mode === \"tui\";\n}\n\ntype McpInitializationOptions = McpAdapterOptions & {\n\toauthRuntime?: McpOAuthRuntime;\n\tstatusEvents?: McpExtensionState[\"statusEvents\"];\n\tgetCurrentModel?: () => Model<Api> | undefined;\n};\n\nexport async function initializeMcp(\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\towner: McpRuntimeOwner = createMcpRuntimeOwner(),\n\toptions: McpInitializationOptions = {},\n): Promise<McpExtensionState> {\n\t// Nexus guards ExtensionContext getters after reload. Snapshot all values that\n\t// can be used by asynchronous work before the first await.\n\tconst configPath =\n\t\toptions.config !== undefined\n\t\t\t? undefined\n\t\t\t: (options.configPath ?? (nexus.getFlag(\"mcp-config\") as string | undefined));\n\tconst cwd = ctx.cwd;\n\tconst hasUI = ctx.hasUI;\n\tconst mode = ctx.mode;\n\tconst rawUi = hasUI ? ctx.ui : undefined;\n\tconst modelRegistry = ctx.modelRegistry;\n\tconst initialModel = ctx.model;\n\tconst initialSignal = ctx.signal;\n\tconst ui = rawUi ? createOwnedUi(rawUi, owner) : undefined;\n\tconst runtimeSignal = combineAbortSignals(owner.signal, initialSignal);\n\tconst config =\n\t\toptions.config !== undefined\n\t\t\t? cloneMcpConfig(options.config)\n\t\t\t: loadMcpConfig(configPath, cwd, ctx.isProjectTrusted());\n\tconst authStorageOptions = getAuthStorageOptions(config.settings?.oauthDir, cwd);\n\n\tconst ownsOAuthRuntime = options.oauthRuntime === undefined;\n\tconst oauthRuntime = options.oauthRuntime ?? createOAuthRuntime(owner.signal);\n\tconst manager = new McpServerManager(cwd);\n\tmanager.setRuntimeSignal?.(owner.signal);\n\tmanager.setOAuthRuntime?.(oauthRuntime);\n\tmanager.setDefaultRequestTimeoutMs(config.settings?.requestTimeoutMs);\n\tmanager.setTraceConfig?.(config.settings?.trace);\n\tmanager.setAuthStorageOptions(authStorageOptions);\n\tconst samplingAutoApprove = config.settings?.samplingAutoApprove === true;\n\tif (config.settings?.sampling !== false && (hasUI || samplingAutoApprove)) {\n\t\tmanager.setSamplingConfig({\n\t\t\tautoApprove: samplingAutoApprove,\n\t\t\t...(ui !== undefined ? { ui } : {}),\n\t\t\tmodelRegistry,\n\t\t\tgetCurrentModel: options.getCurrentModel ?? (() => initialModel),\n\t\t\tgetSignal: () => owner.signal,\n\t\t});\n\t}\n\tconst elicitationEnabled = config.settings?.elicitation !== false && hasUI;\n\tif (elicitationEnabled && ui) {\n\t\tmanager.setElicitationConfig({\n\t\t\tui,\n\t\t\tallowUrl: mode === \"tui\",\n\t\t});\n\t}\n\tconst lifecycle = new McpLifecycleManager(manager, (serverName) =>\n\t\thasPendingAuth(serverName, undefined, oauthRuntime),\n\t);\n\tconst toolMetadata = new Map<string, ToolMetadata[]>();\n\tconst resourceCounts = new Map<string, number>();\n\tconst promptMetadata = new Map<string, PromptMetadata[]>();\n\tconst promptMetadataLive = new Set<string>();\n\tconst serverInstructions = new Map<string, string>();\n\tconst failureTracker = new Map<string, number>();\n\tconst failureMessages = new Map<string, string>();\n\tconst approvedToolCalls = new Map<string, true>();\n\tconst uiResourceHandler = new UiResourceHandler(manager, config);\n\tconst consentManager = new ConsentManager(\"once-per-server\");\n\tconst state: McpExtensionState = {\n\t\towner,\n\t\tmanager,\n\t\tlifecycle,\n\t\ttoolMetadata,\n\t\tresourceCounts,\n\t\tpromptMetadata,\n\t\tpromptMetadataLive,\n\t\tserverInstructions,\n\t\tconfig,\n\t\tprogrammaticConfig: options.config !== undefined,\n\t\toauthRuntime,\n\t\tauthStorageOptions,\n\t\tfailureTracker,\n\t\tfailureMessages,\n\t\tapprovedToolCalls,\n\t\tapprovalEvents: nexus.events,\n\t\tuiResourceHandler,\n\t\tconsentManager,\n\t\tuiServer: null,\n\t\tcompletedUiSessions: [],\n\t\topenBrowser: async (url: string) => {\n\t\t\towner.throwIfInactive();\n\t\t\tawait openUrl(nexus, url, process.env.BROWSER, owner.signal);\n\t\t\towner.throwIfInactive();\n\t\t},\n\t\t...(ui !== undefined ? { ui } : {}),\n\t\tsendMessage: (message, options) => {\n\t\t\tconst deliver = () => {\n\t\t\t\tif (!owner.isActive()) return;\n\t\t\t\tnexus.sendMessage(message as unknown as Parameters<typeof nexus.sendMessage>[0], options);\n\t\t\t};\n\t\t\tif (!options?.triggerTurn) {\n\t\t\t\tdeliver();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid lifecycle.ensureConverged(owner.signal).then(deliver, (error) => {\n\t\t\t\tif (!owner.isActive() || isAbortError(error, owner.signal)) return;\n\t\t\t\tconst detail = error instanceof Error ? error.message : String(error);\n\t\t\t\tlogger.debug(`MCP: pre-turn keep-alive convergence failed: ${sanitizeTerminalText(detail)}`);\n\t\t\t\tdeliver();\n\t\t\t});\n\t\t},\n\t\t...(options.statusEvents !== undefined ? { statusEvents: options.statusEvents } : {}),\n\t};\n\tif (ownsOAuthRuntime) owner.addCleanup(() => shutdownOAuth(oauthRuntime));\n\tmanager.setMetadataListChangedListener?.((serverName, reason) => {\n\t\tif (!owner.isActive()) return;\n\t\tupdateServerMetadata(state, serverName);\n\t\tupdateMetadataCache(state, serverName, { preserveEmptyResources: false });\n\t\tnotifyToolMetadataUpdated(state, serverName, reason);\n\t\tupdateStatusBar(state);\n\t});\n\towner.addCleanup(() => lifecycle.gracefulShutdown());\n\towner.addCleanup(() => {\n\t\tif (state.uiServer) {\n\t\t\tstate.uiServer.close(\"runtime_owner_stopped\");\n\t\t\tstate.uiServer = null;\n\t\t}\n\t});\n\n\tconst allServerEntries = Object.entries(config.mcpServers);\n\tconst serverEntries = allServerEntries.filter(([, definition]) => !isServerDisabled(definition));\n\tif (serverEntries.length === 0) {\n\t\tif (allServerEntries.length > 0 && hasUI) {\n\t\t\tui?.notify(`MCP: All ${allServerEntries.length} server(s) are disabled`, \"info\");\n\t\t}\n\t\tpublishMcpStatusSnapshot(state);\n\t\treturn state;\n\t}\n\n\tconst idleSetting = typeof config.settings?.idleTimeout === \"number\" ? config.settings.idleTimeout : 10;\n\tlifecycle.setGlobalIdleTimeout(idleSetting);\n\n\tconst cachePath = getMetadataCachePath();\n\tconst cacheFileExists = existsSync(cachePath);\n\tlet cache = loadMetadataCache();\n\tlet bootstrapAll = false;\n\n\tif (!cacheFileExists) {\n\t\tbootstrapAll = true;\n\t\tsaveMetadataCache({ version: 1, servers: {} });\n\t} else if (!cache) {\n\t\tcache = { version: 1, servers: {} };\n\t\tsaveMetadataCache(cache);\n\t}\n\n\tconst prefix = config.settings?.toolPrefix ?? \"server\";\n\tlet cachedSelectorCandidateIndex: ToolSelectorCandidateIndex | undefined;\n\n\tfor (const [name, definition] of serverEntries) {\n\t\tconst lifecycleMode = definition.lifecycle ?? \"lazy\";\n\t\tconst persistsAfterFirstSpawn = lifecycleMode === \"eager\" || lifecycleMode === \"lazy-keep-alive\";\n\t\tconst idleOverride = definition.idleTimeout ?? (persistsAfterFirstSpawn ? 0 : undefined);\n\t\tlifecycle.registerServer(\n\t\t\tname,\n\t\t\tdefinition,\n\t\t\tidleOverride !== undefined ? { idleTimeout: idleOverride } : undefined,\n\t\t);\n\t\tif (lifecycleMode === \"keep-alive\") {\n\t\t\tlifecycle.markKeepAlive(name, definition);\n\t\t}\n\n\t\tconst cachedEntry = cache?.servers?.[name];\n\t\tif (cachedEntry && isServerCacheValid(cachedEntry, definition)) {\n\t\t\tconst hasToolFilters =\n\t\t\t\t(Array.isArray(definition.includeTools) && definition.includeTools.length > 0) ||\n\t\t\t\t(Array.isArray(definition.excludeTools) && definition.excludeTools.length > 0);\n\t\t\tif (hasToolFilters && !cachedSelectorCandidateIndex && cache) {\n\t\t\t\tcachedSelectorCandidateIndex = createCachedToolSelectorCandidateIndex(config.mcpServers, cache, prefix);\n\t\t\t}\n\t\t\tconst metadata = reconstructToolMetadata(\n\t\t\t\tname,\n\t\t\t\tcachedEntry,\n\t\t\t\tprefix,\n\t\t\t\tdefinition,\n\t\t\t\tconfig.mcpServers,\n\t\t\t\tcache ?? undefined,\n\t\t\t\tcachedSelectorCandidateIndex,\n\t\t\t);\n\t\t\ttoolMetadata.set(name, metadata);\n\t\t\tif (Array.isArray(cachedEntry.resources)) {\n\t\t\t\tresourceCounts.set(name, cachedEntry.resources.length);\n\t\t\t}\n\t\t\tif (cachedEntry.prompts?.length) {\n\t\t\t\tpromptMetadata.set(name, reconstructPromptMetadata(name, cachedEntry.prompts ?? [], prefix, definition));\n\t\t\t}\n\t\t\tif (cachedEntry.instructions) {\n\t\t\t\tserverInstructions.set(name, cachedEntry.instructions);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst startupServers = bootstrapAll\n\t\t? serverEntries\n\t\t: serverEntries.filter(([, definition]) => {\n\t\t\t\tconst mode = definition.lifecycle ?? \"lazy\";\n\t\t\t\treturn mode === \"keep-alive\" || mode === \"eager\";\n\t\t\t});\n\n\tif (ui && startupServers.length > 0) {\n\t\tconst status = formatMcpStatus(state.config, `connecting to ${startupServers.length} servers...`);\n\t\tui.setStatus(\"mcp\", status);\n\t}\n\n\tconst results = await parallelLimit(startupServers, 10, async ([name, definition]) => {\n\t\ttry {\n\t\t\tconst connection = await manager.connect(name, definition, runtimeSignal);\n\t\t\tif (connection.status === \"needs-auth\") {\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tdefinition,\n\t\t\t\t\tconnection: null,\n\t\t\t\t\terror: `OAuth authentication required. Run /mcp-auth ${name}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { name, definition, connection, error: null };\n\t\t} catch (error) {\n\t\t\tif (isAbortError(error, runtimeSignal)) {\n\t\t\t\tif (owner.signal.aborted) throw error;\n\t\t\t\treturn { name, definition, connection: null, error: null };\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\treturn { name, definition, connection: null, error: message };\n\t\t}\n\t});\n\n\tif (initialSignal?.aborted) return state;\n\towner.throwIfInactive();\n\n\tconst startupKnownMetadata = new Map<string, ToolMetadata[]>();\n\tfor (const { name, definition, connection } of results) {\n\t\tif (!connection) continue;\n\t\tconst effectivePrefix = resolveToolPrefix(definition, prefix);\n\t\tconst metadata: ToolMetadata[] = [\n\t\t\t...connection.tools\n\t\t\t\t.filter((tool) => tool?.name)\n\t\t\t\t.map((tool) => ({\n\t\t\t\t\tname: formatToolName(tool.name, name, effectivePrefix),\n\t\t\t\t\toriginalName: tool.name,\n\t\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\t})),\n\t\t\t...(definition.exposeResources !== false\n\t\t\t\t? connection.resources\n\t\t\t\t\t\t.filter((resource) => resource?.name && resource?.uri)\n\t\t\t\t\t\t.map((resource) => {\n\t\t\t\t\t\t\tconst originalName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tname: formatToolName(originalName, name, effectivePrefix),\n\t\t\t\t\t\t\t\toriginalName,\n\t\t\t\t\t\t\t\tdescription: resource.description ?? `Read resource: ${resource.uri}`,\n\t\t\t\t\t\t\t\tresourceUri: resource.uri,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t})\n\t\t\t\t: []),\n\t\t];\n\t\tstartupKnownMetadata.set(name, metadata);\n\t}\n\n\tfor (const { name, definition, connection, error } of results) {\n\t\towner.throwIfInactive();\n\t\tif (error || !connection) {\n\t\t\tif (initialSignal?.aborted) continue;\n\t\t\tif (error) recordFailure(state, name, error);\n\t\t\tconst displayError = sanitizeTerminalText(error ?? \"Unknown connection failure\");\n\t\t\tif (ui) {\n\t\t\t\tui.notify(`MCP: Failed to connect to ${name}: ${displayError}`, \"error\");\n\t\t\t}\n\t\t\tconsole.error(`MCP: Failed to connect to ${name}: ${displayError}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { metadata, failedTools } = buildToolMetadata(\n\t\t\tconnection.tools,\n\t\t\tconnection.resources,\n\t\t\tdefinition,\n\t\t\tname,\n\t\t\tprefix,\n\t\t\tconfig.mcpServers,\n\t\t\tstartupKnownMetadata,\n\t\t\ttrue,\n\t\t);\n\t\ttoolMetadata.set(name, metadata);\n\t\tresourceCounts.set(name, connection.resources.length);\n\t\tif (!connection.promptDiscoveryFailed) {\n\t\t\tpromptMetadata.set(name, reconstructPromptMetadata(name, connection.prompts ?? [], prefix, definition));\n\t\t\tpromptMetadataLive.add(name);\n\t\t}\n\t\tif (connection.instructions) {\n\t\t\tserverInstructions.set(name, connection.instructions);\n\t\t} else {\n\t\t\tserverInstructions.delete(name);\n\t\t}\n\t\tupdateMetadataCache(state, name);\n\t\tnotifyToolMetadataUpdated(state, name, \"startup\");\n\t\tmarkKeepAliveAfterConnect(state, name);\n\n\t\tif (failedTools.length > 0 && ui) {\n\t\t\tui.notify(`MCP: ${name} - ${failedTools.length} tools skipped`, \"warning\");\n\t\t}\n\t}\n\n\tconst connectedCount = results.filter((r) => r.connection).length;\n\tconst failedCount = results.filter((r) => r.error).length;\n\tif (ui && connectedCount > 0 && config.settings?.notifyOnStartupConnect !== false) {\n\t\tconst totalTools = totalToolCount(state);\n\t\tconst msg =\n\t\t\tfailedCount > 0\n\t\t\t\t? `MCP: ${connectedCount}/${startupServers.length} servers connected (${totalTools} tools)`\n\t\t\t\t: `MCP: ${connectedCount} servers connected (${totalTools} tools)`;\n\t\tui.notify(msg, \"info\");\n\t}\n\n\tconst envDirect = process.env.MCP_DIRECT_TOOLS;\n\tif (envDirect !== \"__none__\") {\n\t\tconst currentCache = loadMetadataCache();\n\t\tconst envDirectToolOverride = envDirect\n\t\t\t?.split(\",\")\n\t\t\t.map((selector) => selector.trim())\n\t\t\t.filter(Boolean);\n\t\tconst missingCacheServers = getMissingConfiguredDirectToolServers(config, currentCache, envDirectToolOverride);\n\n\t\tif (missingCacheServers.length > 0) {\n\t\t\tconst bootstrapResults = await parallelLimit(\n\t\t\t\tmissingCacheServers.filter((name) => !results.some((r) => r.name === name && r.connection)),\n\t\t\t\t10,\n\t\t\t\tasync (name) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst definition = config.mcpServers[name];\n\t\t\t\t\t\tif (!definition) throw new Error(`MCP server \"${name}\" is not configured`);\n\t\t\t\t\t\tconst connection = await manager.connect(name, definition, runtimeSignal);\n\t\t\t\t\t\tif (connection.status === \"needs-auth\") {\n\t\t\t\t\t\t\treturn { name, ok: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateServerMetadata(state, name);\n\t\t\t\t\t\tupdateMetadataCache(state, name);\n\t\t\t\t\t\tnotifyToolMetadataUpdated(state, name, \"direct-tools-bootstrap\");\n\t\t\t\t\t\tmarkKeepAliveAfterConnect(state, name);\n\t\t\t\t\t\tclearFailure(state, name);\n\t\t\t\t\t\treturn { name, ok: true };\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (isAbortError(error, runtimeSignal)) {\n\t\t\t\t\t\t\tif (owner.signal.aborted) throw error;\n\t\t\t\t\t\t\treturn { name, ok: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\trecordFailure(state, name, message);\n\t\t\t\t\t\tlogger.debug(`MCP: direct-tools bootstrap failed for ${name}: ${sanitizeTerminalText(message)}`);\n\t\t\t\t\t\treturn { name, ok: false };\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst bootstrapped = bootstrapResults.filter((r) => r.ok).map((r) => r.name);\n\t\t\towner.throwIfInactive();\n\t\t\tif (bootstrapped.length > 0 && ui) {\n\t\t\t\tui.notify(`MCP: direct tools for ${bootstrapped.join(\", \")} will be available after restart`, \"info\");\n\t\t\t}\n\t\t}\n\t}\n\n\tlifecycle.setReconnectCallback((serverName) => {\n\t\tif (!owner.isActive()) return;\n\t\tupdateServerMetadata(state, serverName);\n\t\tupdateMetadataCache(state, serverName);\n\t\tnotifyToolMetadataUpdated(state, serverName, \"lifecycle-reconnect\");\n\t\tclearFailure(state, serverName);\n\t\tupdateStatusBar(state);\n\t});\n\n\tlifecycle.setReconnectFailureCallback((serverName, error) => {\n\t\tif (!owner.isActive()) return;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\trecordFailure(state, serverName, message);\n\t\tupdateStatusBar(state);\n\t});\n\n\tlifecycle.setHealthRestoredCallback((serverName) => {\n\t\tif (!owner.isActive()) return;\n\t\tclearFailure(state, serverName);\n\t\tupdateStatusBar(state);\n\t});\n\n\tlifecycle.setAuthRequiredCallback((serverName) => {\n\t\tif (!owner.isActive()) return;\n\t\tclearFailure(state, serverName);\n\t\tupdateStatusBar(state);\n\t});\n\n\tlifecycle.setIdleShutdownCallback((serverName) => {\n\t\tif (!owner.isActive()) return;\n\t\tconst idleMinutes = getEffectiveIdleTimeoutMinutes(state, serverName);\n\t\tlogger.debug(`${serverName} shut down (idle ${idleMinutes}m)`);\n\t\tupdateStatusBar(state);\n\t});\n\n\towner.throwIfInactive();\n\tlifecycle.startHealthChecks(runtimeSignal);\n\tif (config.settings?.mcpFooterStatus === \"off\") {\n\t\tui?.setStatus(\"mcp\", undefined);\n\t}\n\tpublishMcpStatusSnapshot(state);\n\n\treturn state;\n}\n\nexport function markKeepAliveAfterConnect(state: McpExtensionState, serverName: string): void {\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition || isServerDisabled(definition)) return;\n\tif ((definition.lifecycle ?? \"lazy\") === \"lazy-keep-alive\") {\n\t\tstate.lifecycle.markKeepAlive(serverName, definition);\n\t}\n}\n\nexport function updateServerMetadata(state: McpExtensionState, serverName: string): void {\n\tconst connection = state.manager.getConnection(serverName);\n\tif (!connection || connection.status !== \"connected\") return;\n\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) return;\n\tif (isServerDisabled(definition)) {\n\t\tstate.toolMetadata.delete(serverName);\n\t\tstate.resourceCounts?.delete(serverName);\n\t\tstate.promptMetadata?.delete(serverName);\n\t\tstate.promptMetadataLive?.delete(serverName);\n\t\tstate.serverInstructions.delete(serverName);\n\t\treturn;\n\t}\n\n\tconst prefix = state.config.settings?.toolPrefix ?? \"server\";\n\n\tconst { metadata } = buildToolMetadata(\n\t\tconnection.tools,\n\t\tconnection.resources,\n\t\tdefinition,\n\t\tserverName,\n\t\tprefix,\n\t\tstate.config.mcpServers,\n\t\tstate.toolMetadata,\n\t);\n\tstate.toolMetadata.set(serverName, metadata);\n\tstate.resourceCounts?.set(serverName, connection.resources.length);\n\tif (!connection.promptDiscoveryFailed) {\n\t\tstate.promptMetadata?.set(\n\t\t\tserverName,\n\t\t\treconstructPromptMetadata(serverName, connection.prompts ?? [], prefix, definition),\n\t\t);\n\t\tstate.promptMetadataLive?.add(serverName);\n\t}\n\tif (connection.instructions) {\n\t\tstate.serverInstructions?.set(serverName, connection.instructions);\n\t} else {\n\t\tstate.serverInstructions?.delete(serverName);\n\t}\n}\n\nexport function updateMetadataCache(\n\tstate: McpExtensionState,\n\tserverName: string,\n\toptions: { preserveEmptyResources?: boolean } = {},\n): void {\n\tconst connection = state.manager.getConnection(serverName);\n\tif (!connection || connection.status !== \"connected\") return;\n\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition || isServerDisabled(definition)) return;\n\n\tconst configHash = computeServerHash(definition);\n\tconst existing = loadMetadataCache();\n\tconst existingEntry = existing?.servers?.[serverName];\n\n\tconst tools = serializeTools(connection.tools);\n\tlet resources = definition.exposeResources === false ? [] : serializeResources(connection.resources);\n\tconst prompts = connection.promptDiscoveryFailed\n\t\t? existingEntry?.configHash === configHash\n\t\t\t? existingEntry.prompts\n\t\t\t: undefined\n\t\t: serializePrompts(connection.prompts ?? []);\n\n\tif (\n\t\tdefinition.exposeResources !== false &&\n\t\tresources.length === 0 &&\n\t\texistingEntry?.resources?.length &&\n\t\texistingEntry.configHash === configHash &&\n\t\toptions.preserveEmptyResources !== false\n\t) {\n\t\tresources = existingEntry.resources;\n\t}\n\n\tconst entry: ServerCacheEntry = {\n\t\tconfigHash,\n\t\ttools,\n\t\tresources,\n\t\t...(prompts !== undefined ? { prompts } : {}),\n\t\t...(connection.instructions !== undefined ? { instructions: connection.instructions } : {}),\n\t\tcachedAt: Date.now(),\n\t};\n\n\tsaveMetadataCache({ version: 1, servers: { [serverName]: entry } });\n}\n\nexport function notifyToolMetadataUpdated(state: McpExtensionState, serverName: string, reason: string): void {\n\ttry {\n\t\tconst result = state.onToolMetadataUpdated?.(serverName, reason);\n\t\tif (result && typeof (result as Promise<void>).catch === \"function\") {\n\t\t\t(result as Promise<void>).catch((error) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tlogger.debug(`MCP: metadata update hook failed for ${serverName}: ${message}`);\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tlogger.debug(`MCP: metadata update hook failed for ${serverName}: ${message}`);\n\t}\n}\n\nexport function flushMetadataCache(state: McpExtensionState): void {\n\tfor (const [name, connection] of state.manager.getAllConnections()) {\n\t\tif (connection.status === \"connected\") {\n\t\t\tupdateMetadataCache(state, name);\n\t\t}\n\t}\n}\n\nexport function updateStatusBar(state: McpExtensionState): void {\n\tpublishMcpStatusSnapshot(state);\n\tconst ui = state.ui;\n\tif (!ui) return;\n\tconst entries = Object.entries(state.config.mcpServers);\n\tconst disabledCount = entries.filter(([, definition]) => isServerDisabled(definition)).length;\n\tconst enabledCount = entries.length - disabledCount;\n\tif (entries.length === 0) {\n\t\tui.setStatus(\"mcp\", undefined);\n\t\treturn;\n\t}\n\tconst connectedCount = [...state.manager.getAllConnections()].filter(([name, connection]) => {\n\t\tconst definition = state.config.mcpServers[name];\n\t\treturn connection.status === \"connected\" && definition !== undefined && !isServerDisabled(definition);\n\t}).length;\n\tconst footerStatus = state.config.settings?.mcpFooterStatus ?? \"full\";\n\tif (footerStatus === \"off\") {\n\t\tui.setStatus(\"mcp\", undefined);\n\t\treturn;\n\t}\n\n\tlet status =\n\t\tfooterStatus === \"compact\"\n\t\t\t? `MCP ${connectedCount}/${enabledCount}`\n\t\t\t: `${enabledCount} ${enabledCount === 1 ? \"server\" : \"servers\"} enabled`;\n\tif (footerStatus === \"full\") {\n\t\tif (connectedCount > 0) status += ` (${connectedCount} connected)`;\n\t\tif (disabledCount > 0) status += ` (${disabledCount} disabled)`;\n\t}\n\tconst formattedStatus = footerStatus === \"compact\" ? status : formatMcpStatus(state.config, status);\n\tif (formattedStatus === undefined) {\n\t\tui.setStatus(\"mcp\", undefined);\n\t\treturn;\n\t}\n\tui.setStatus(\"mcp\", ui.theme ? ui.theme.fg(\"accent\", formattedStatus) : formattedStatus);\n}\n\nexport function getFailureAgeSeconds(state: McpExtensionState, serverName: string): number | null {\n\tconst failedAt = state.failureTracker.get(serverName);\n\tif (!failedAt) return null;\n\tconst ageMs = Date.now() - failedAt;\n\tif (ageMs > FAILURE_BACKOFF_MS) return null;\n\treturn Math.round(ageMs / 1000);\n}\n\nexport function getFailureMessage(state: McpExtensionState, serverName: string): string | null {\n\tif (getFailureAgeSeconds(state, serverName) === null) return null;\n\treturn state.failureMessages?.get(serverName) ?? null;\n}\n\nexport async function lazyConnect(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tsignal?: AbortSignal,\n): Promise<boolean> {\n\tconst ownedSignal = combineAbortSignals(state.owner?.signal, signal);\n\tthrowIfAborted(ownedSignal);\n\tconst connection = state.manager.getConnection(serverName);\n\tif (connection?.status === \"needs-auth\") {\n\t\treturn false;\n\t}\n\tif (connection?.status === \"connected\") {\n\t\tupdateServerMetadata(state, serverName);\n\t\tmarkKeepAliveAfterConnect(state, serverName);\n\t\treturn true;\n\t}\n\n\tconst failedAgo = getFailureAgeSeconds(state, serverName);\n\tif (failedAgo !== null) return false;\n\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition || isServerDisabled(definition)) return false;\n\n\ttry {\n\t\tif (state.ui) {\n\t\t\tconst status = formatMcpStatus(state.config, `connecting to ${serverName}...`);\n\t\t\tstate.ui.setStatus(\"mcp\", status);\n\t\t}\n\t\tconst newConnection = await state.manager.connect(serverName, definition, ownedSignal);\n\t\tif (newConnection.status === \"needs-auth\") {\n\t\t\treturn false;\n\t\t}\n\t\tclearFailure(state, serverName);\n\t\tupdateServerMetadata(state, serverName);\n\t\tupdateMetadataCache(state, serverName);\n\t\tnotifyToolMetadataUpdated(state, serverName, \"lazy-connect\");\n\t\tmarkKeepAliveAfterConnect(state, serverName);\n\t\tupdateStatusBar(state);\n\t\treturn true;\n\t} catch (error) {\n\t\tif (isAbortError(error, ownedSignal)) {\n\t\t\tthrowIfAborted(ownedSignal);\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\trecordFailure(state, serverName, message);\n\t\tlogger.debug(`MCP: lazy connect failed for ${serverName}: ${sanitizeTerminalText(message)}`);\n\t\tupdateStatusBar(state);\n\t\treturn false;\n\t}\n}\n\nfunction getEffectiveIdleTimeoutMinutes(state: McpExtensionState, serverName: string): number {\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) {\n\t\treturn typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n\t}\n\tif (typeof definition.idleTimeout === \"number\") return definition.idleTimeout;\n\tconst mode = definition.lifecycle ?? \"lazy\";\n\tif (mode === \"eager\" || mode === \"lazy-keep-alive\") return 0;\n\treturn typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { jsonSchemaValidator as JsonSchemaValidatorProvider } from "@modelcontextprotocol/client";
2
+ export declare function createJsonSchemaValidator(): JsonSchemaValidatorProvider;
3
+ //# sourceMappingURL=json-schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-validator.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/json-schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,mBAAmB,IAAI,2BAA2B,EAClD,MAAM,8BAA8B,CAAC;AA2BtC,wBAAgB,yBAAyB,IAAI,2BAA2B,CAiCvE","sourcesContent":["import type {\n\tJsonSchemaType,\n\tJsonSchemaValidator,\n\tjsonSchemaValidator as JsonSchemaValidatorProvider,\n} from \"@modelcontextprotocol/client\";\nimport { AjvJsonSchemaValidator } from \"@modelcontextprotocol/client/validators/ajv\";\nimport { Ajv } from \"ajv\";\nimport Ajv2020Import from \"ajv/dist/2020.js\";\nimport addFormatsImport from \"ajv-formats\";\n\n// ajv-formats types target its bundled ajv; the runtime accepts both instances.\nconst addFormats = addFormatsImport as unknown as (instance: Ajv) => void;\n\ntype SchemaDialect = { status: \"unstamped\" } | { status: \"stamped\"; uri: string };\n\nconst DRAFT_07_SCHEMA_URIS: ReadonlySet<string> = new Set([\n\t\"http://json-schema.org/draft-07/schema\",\n\t\"https://json-schema.org/draft-07/schema\",\n]);\nconst DRAFT_2020_12_SCHEMA_URIS: ReadonlySet<string> = new Set([\"https://json-schema.org/draft/2020-12/schema\"]);\n\nfunction schemaDialect(schema: JsonSchemaType): SchemaDialect {\n\tif (!(\"$schema\" in schema) || typeof schema.$schema !== \"string\") {\n\t\treturn { status: \"unstamped\" };\n\t}\n\treturn {\n\t\tstatus: \"stamped\",\n\t\turi: schema.$schema.endsWith(\"#\") ? schema.$schema.slice(0, -1) : schema.$schema,\n\t};\n}\n\nexport function createJsonSchemaValidator(): JsonSchemaValidatorProvider {\n\tlet draft07Validator: AjvJsonSchemaValidator | undefined;\n\tlet draft2020Validator: AjvJsonSchemaValidator | undefined;\n\n\treturn {\n\t\tgetValidator<T>(schema: JsonSchemaType): JsonSchemaValidator<T> {\n\t\t\tconst dialect = schemaDialect(schema);\n\t\t\tif (dialect.status === \"unstamped\" || DRAFT_2020_12_SCHEMA_URIS.has(dialect.uri)) {\n\t\t\t\tdraft2020Validator ??= (() => {\n\t\t\t\t\tconst Ajv2020 = Ajv2020Import as unknown as typeof Ajv;\n\t\t\t\t\tconst ajv = new Ajv2020({ strict: false, allErrors: true });\n\t\t\t\t\taddFormats(ajv);\n\t\t\t\t\treturn new AjvJsonSchemaValidator(ajv);\n\t\t\t\t})();\n\t\t\t\treturn draft2020Validator.getValidator<T>(schema);\n\t\t\t}\n\t\t\tif (!DRAFT_07_SCHEMA_URIS.has(dialect.uri)) {\n\t\t\t\tthrow new Error(`Unsupported JSON Schema dialect: ${dialect.uri}`);\n\t\t\t}\n\n\t\t\tdraft07Validator ??= (() => {\n\t\t\t\tconst ajv = new Ajv({\n\t\t\t\t\tstrict: false,\n\t\t\t\t\tvalidateFormats: true,\n\t\t\t\t\tvalidateSchema: false,\n\t\t\t\t\tallErrors: true,\n\t\t\t\t});\n\t\t\t\taddFormats(ajv);\n\t\t\t\treturn new AjvJsonSchemaValidator(ajv);\n\t\t\t})();\n\t\t\treturn draft07Validator.getValidator<T>(schema);\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import { AjvJsonSchemaValidator } from "@modelcontextprotocol/client/validators/ajv";
2
+ import { Ajv } from "ajv";
3
+ import Ajv2020Import from "ajv/dist/2020.js";
4
+ import addFormatsImport from "ajv-formats";
5
+ // ajv-formats types target its bundled ajv; the runtime accepts both instances.
6
+ const addFormats = addFormatsImport;
7
+ const DRAFT_07_SCHEMA_URIS = new Set([
8
+ "http://json-schema.org/draft-07/schema",
9
+ "https://json-schema.org/draft-07/schema",
10
+ ]);
11
+ const DRAFT_2020_12_SCHEMA_URIS = new Set(["https://json-schema.org/draft/2020-12/schema"]);
12
+ function schemaDialect(schema) {
13
+ if (!("$schema" in schema) || typeof schema.$schema !== "string") {
14
+ return { status: "unstamped" };
15
+ }
16
+ return {
17
+ status: "stamped",
18
+ uri: schema.$schema.endsWith("#") ? schema.$schema.slice(0, -1) : schema.$schema,
19
+ };
20
+ }
21
+ export function createJsonSchemaValidator() {
22
+ let draft07Validator;
23
+ let draft2020Validator;
24
+ return {
25
+ getValidator(schema) {
26
+ const dialect = schemaDialect(schema);
27
+ if (dialect.status === "unstamped" || DRAFT_2020_12_SCHEMA_URIS.has(dialect.uri)) {
28
+ draft2020Validator ??= (() => {
29
+ const Ajv2020 = Ajv2020Import;
30
+ const ajv = new Ajv2020({ strict: false, allErrors: true });
31
+ addFormats(ajv);
32
+ return new AjvJsonSchemaValidator(ajv);
33
+ })();
34
+ return draft2020Validator.getValidator(schema);
35
+ }
36
+ if (!DRAFT_07_SCHEMA_URIS.has(dialect.uri)) {
37
+ throw new Error(`Unsupported JSON Schema dialect: ${dialect.uri}`);
38
+ }
39
+ draft07Validator ??= (() => {
40
+ const ajv = new Ajv({
41
+ strict: false,
42
+ validateFormats: true,
43
+ validateSchema: false,
44
+ allErrors: true,
45
+ });
46
+ addFormats(ajv);
47
+ return new AjvJsonSchemaValidator(ajv);
48
+ })();
49
+ return draft07Validator.getValidator(schema);
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=json-schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-validator.js","sourceRoot":"","sources":["../../../src/extensions/mcp/json-schema-validator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,aAAa,CAAC;AAE3C,gFAAgF;AAChF,MAAM,UAAU,GAAG,gBAAsD,CAAC;AAI1E,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACzD,wCAAwC;IACxC,yCAAyC;CACzC,CAAC,CAAC;AACH,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC;AAEjH,SAAS,aAAa,CAAC,MAAsB,EAAiB;IAC7D,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAChC,CAAC;IACD,OAAO;QACN,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;KAChF,CAAC;AAAA,CACF;AAED,MAAM,UAAU,yBAAyB,GAAgC;IACxE,IAAI,gBAAoD,CAAC;IACzD,IAAI,kBAAsD,CAAC;IAE3D,OAAO;QACN,YAAY,CAAI,MAAsB,EAA0B;YAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClF,kBAAkB,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,aAAsC,CAAC;oBACvD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5D,UAAU,CAAC,GAAG,CAAC,CAAC;oBAChB,OAAO,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAAA,CACvC,CAAC,EAAE,CAAC;gBACL,OAAO,kBAAkB,CAAC,YAAY,CAAI,MAAM,CAAC,CAAC;YACnD,CAAC;YACD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,gBAAgB,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;oBACnB,MAAM,EAAE,KAAK;oBACb,eAAe,EAAE,IAAI;oBACrB,cAAc,EAAE,KAAK;oBACrB,SAAS,EAAE,IAAI;iBACf,CAAC,CAAC;gBACH,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,OAAO,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAAA,CACvC,CAAC,EAAE,CAAC;YACL,OAAO,gBAAgB,CAAC,YAAY,CAAI,MAAM,CAAC,CAAC;QAAA,CAChD;KACD,CAAC;AAAA,CACF","sourcesContent":["import type {\n\tJsonSchemaType,\n\tJsonSchemaValidator,\n\tjsonSchemaValidator as JsonSchemaValidatorProvider,\n} from \"@modelcontextprotocol/client\";\nimport { AjvJsonSchemaValidator } from \"@modelcontextprotocol/client/validators/ajv\";\nimport { Ajv } from \"ajv\";\nimport Ajv2020Import from \"ajv/dist/2020.js\";\nimport addFormatsImport from \"ajv-formats\";\n\n// ajv-formats types target its bundled ajv; the runtime accepts both instances.\nconst addFormats = addFormatsImport as unknown as (instance: Ajv) => void;\n\ntype SchemaDialect = { status: \"unstamped\" } | { status: \"stamped\"; uri: string };\n\nconst DRAFT_07_SCHEMA_URIS: ReadonlySet<string> = new Set([\n\t\"http://json-schema.org/draft-07/schema\",\n\t\"https://json-schema.org/draft-07/schema\",\n]);\nconst DRAFT_2020_12_SCHEMA_URIS: ReadonlySet<string> = new Set([\"https://json-schema.org/draft/2020-12/schema\"]);\n\nfunction schemaDialect(schema: JsonSchemaType): SchemaDialect {\n\tif (!(\"$schema\" in schema) || typeof schema.$schema !== \"string\") {\n\t\treturn { status: \"unstamped\" };\n\t}\n\treturn {\n\t\tstatus: \"stamped\",\n\t\turi: schema.$schema.endsWith(\"#\") ? schema.$schema.slice(0, -1) : schema.$schema,\n\t};\n}\n\nexport function createJsonSchemaValidator(): JsonSchemaValidatorProvider {\n\tlet draft07Validator: AjvJsonSchemaValidator | undefined;\n\tlet draft2020Validator: AjvJsonSchemaValidator | undefined;\n\n\treturn {\n\t\tgetValidator<T>(schema: JsonSchemaType): JsonSchemaValidator<T> {\n\t\t\tconst dialect = schemaDialect(schema);\n\t\t\tif (dialect.status === \"unstamped\" || DRAFT_2020_12_SCHEMA_URIS.has(dialect.uri)) {\n\t\t\t\tdraft2020Validator ??= (() => {\n\t\t\t\t\tconst Ajv2020 = Ajv2020Import as unknown as typeof Ajv;\n\t\t\t\t\tconst ajv = new Ajv2020({ strict: false, allErrors: true });\n\t\t\t\t\taddFormats(ajv);\n\t\t\t\t\treturn new AjvJsonSchemaValidator(ajv);\n\t\t\t\t})();\n\t\t\t\treturn draft2020Validator.getValidator<T>(schema);\n\t\t\t}\n\t\t\tif (!DRAFT_07_SCHEMA_URIS.has(dialect.uri)) {\n\t\t\t\tthrow new Error(`Unsupported JSON Schema dialect: ${dialect.uri}`);\n\t\t\t}\n\n\t\t\tdraft07Validator ??= (() => {\n\t\t\t\tconst ajv = new Ajv({\n\t\t\t\t\tstrict: false,\n\t\t\t\t\tvalidateFormats: true,\n\t\t\t\t\tvalidateSchema: false,\n\t\t\t\t\tallErrors: true,\n\t\t\t\t});\n\t\t\t\taddFormats(ajv);\n\t\t\t\treturn new AjvJsonSchemaValidator(ajv);\n\t\t\t})();\n\t\t\treturn draft07Validator.getValidator<T>(schema);\n\t\t},\n\t};\n}\n"]}
@@ -0,0 +1,56 @@
1
+ import { hasPendingAuth } from "./mcp-auth-flow.ts";
2
+ import type { McpServerManager } from "./server-manager.ts";
3
+ import { type ServerDefinition } from "./types.ts";
4
+ export type ReconnectCallback = (serverName: string) => void | Promise<void>;
5
+ export type ReconnectFailureCallback = (serverName: string, error: unknown) => void;
6
+ export type HealthRestoredCallback = (serverName: string) => void | Promise<void>;
7
+ export type AuthRequiredCallback = (serverName: string) => void | Promise<void>;
8
+ export declare class McpLifecycleManager {
9
+ private keepAliveServers;
10
+ private allServers;
11
+ private serverSettings;
12
+ private globalIdleTimeout;
13
+ private healthCheckInterval;
14
+ private onReconnect;
15
+ private onReconnectFailure;
16
+ private onHealthRestored;
17
+ private onAuthRequired;
18
+ private onIdleShutdown;
19
+ private activeHealthCheck;
20
+ private activeConvergence;
21
+ private shutdownPromise;
22
+ private retryStates;
23
+ private pendingMetadataPublications;
24
+ private stopped;
25
+ private removeHealthAbortListener;
26
+ private readonly manager;
27
+ private readonly hasPendingAuthForServer;
28
+ constructor(manager: McpServerManager, hasPendingAuthForServer?: typeof hasPendingAuth);
29
+ setReconnectCallback(callback: ReconnectCallback): void;
30
+ setReconnectFailureCallback(callback: ReconnectFailureCallback): void;
31
+ setHealthRestoredCallback(callback: HealthRestoredCallback): void;
32
+ setAuthRequiredCallback(callback: AuthRequiredCallback): void;
33
+ markKeepAlive(name: string, definition: ServerDefinition): void;
34
+ registerServer(name: string, definition: ServerDefinition, settings?: {
35
+ idleTimeout?: number;
36
+ }): void;
37
+ unregisterServer(name: string): void;
38
+ setGlobalIdleTimeout(minutes: number): void;
39
+ setIdleShutdownCallback(callback: (serverName: string) => void): void;
40
+ startHealthChecks(signalOrInterval?: AbortSignal | number, maybeIntervalMs?: number): void;
41
+ ensureConverged(signal?: AbortSignal): Promise<void>;
42
+ private checkConnections;
43
+ private checkKeepAliveConnections;
44
+ private checkKeepAliveConnection;
45
+ private handleSupersededConnection;
46
+ private publishConnectedMetadata;
47
+ private notifyAuthRequired;
48
+ private shouldAttemptConnection;
49
+ private reportConnectionFailure;
50
+ private deferRefreshTimeout;
51
+ private recordRetry;
52
+ private getIdleTimeout;
53
+ gracefulShutdown(): Promise<void>;
54
+ private shutdownOnce;
55
+ }
56
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","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"]}