@ashx-j/lunr 0.2.16 → 0.2.18

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 (349) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +2 -1
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +44 -19
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +2 -2
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +8 -11
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/index.d.ts.map +1 -1
  12. package/dist/builtin-extensions/index.js +2 -1
  13. package/dist/builtin-extensions/index.js.map +1 -1
  14. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +4 -0
  15. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  16. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +172 -171
  17. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  18. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +50 -0
  19. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -0
  20. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +131 -0
  21. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -0
  22. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts +7 -0
  23. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -0
  24. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +211 -0
  25. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -0
  26. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +0 -5
  27. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js +0 -202
  29. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
  30. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-mcp-adapter/index.js +276 -109
  32. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  33. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +4 -1
  34. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-mcp-adapter/init.js +10 -3
  36. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  37. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.js +6 -1
  39. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.js.map +1 -1
  40. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
  41. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
  43. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  44. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  45. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +2 -1
  46. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  47. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +1 -1
  48. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  49. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +1 -1
  50. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  53. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +68 -15
  54. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +6 -2
  57. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +5 -2
  61. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts +10 -0
  63. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts.map +1 -0
  64. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js +38 -0
  65. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js.map +1 -0
  66. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +3 -16
  68. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  69. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
  71. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
  73. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  74. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +1 -1
  75. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  76. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  77. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +72 -31
  79. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  80. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +1 -1
  81. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +2 -1
  83. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  84. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  85. package/dist/builtin-extensions/pi-web-access/extract.js +105 -54
  86. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  87. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
  88. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
  89. package/dist/builtin-extensions/pi-web-access/gemini-search.js +82 -65
  90. package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
  91. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  92. package/dist/builtin-extensions/pi-web-access/github-extract.js +2 -0
  93. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  94. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  95. package/dist/builtin-extensions/pi-web-access/index.js +259 -168
  96. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  97. package/dist/builtin-extensions/pi-web-access/lazy.d.ts +18 -0
  98. package/dist/builtin-extensions/pi-web-access/lazy.d.ts.map +1 -0
  99. package/dist/builtin-extensions/pi-web-access/lazy.js +19 -0
  100. package/dist/builtin-extensions/pi-web-access/lazy.js.map +1 -0
  101. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +6 -0
  102. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -0
  103. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +17 -0
  104. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -0
  105. package/dist/cli-runtime.d.ts +3 -0
  106. package/dist/cli-runtime.d.ts.map +1 -0
  107. package/dist/cli-runtime.js +72 -0
  108. package/dist/cli-runtime.js.map +1 -0
  109. package/dist/cli.d.ts.map +1 -1
  110. package/dist/cli.js +11 -60
  111. package/dist/cli.js.map +1 -1
  112. package/dist/config.d.ts +1 -0
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +1 -0
  115. package/dist/config.js.map +1 -1
  116. package/dist/core/agent-session.d.ts.map +1 -1
  117. package/dist/core/agent-session.js +6 -3
  118. package/dist/core/agent-session.js.map +1 -1
  119. package/dist/core/extensions/host-static.d.ts.map +1 -1
  120. package/dist/core/extensions/host-static.js +34 -12
  121. package/dist/core/extensions/host-static.js.map +1 -1
  122. package/dist/core/extensions/loader.d.ts +1 -2
  123. package/dist/core/extensions/loader.d.ts.map +1 -1
  124. package/dist/core/extensions/loader.js +10 -64
  125. package/dist/core/extensions/loader.js.map +1 -1
  126. package/dist/core/keybindings.d.ts +2 -2
  127. package/dist/core/keybindings.d.ts.map +1 -1
  128. package/dist/core/keybindings.js +2 -2
  129. package/dist/core/keybindings.js.map +1 -1
  130. package/dist/core/package-manager.d.ts.map +1 -1
  131. package/dist/core/package-manager.js +1 -1
  132. package/dist/core/package-manager.js.map +1 -1
  133. package/dist/core/sdk.d.ts +1 -1
  134. package/dist/core/sdk.d.ts.map +1 -1
  135. package/dist/core/sdk.js +1 -1
  136. package/dist/core/sdk.js.map +1 -1
  137. package/dist/core/timings.d.ts +2 -1
  138. package/dist/core/timings.d.ts.map +1 -1
  139. package/dist/core/timings.js +17 -2
  140. package/dist/core/timings.js.map +1 -1
  141. package/dist/gateway/agent-bridge.d.ts +6 -1
  142. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  143. package/dist/gateway/agent-bridge.js +23 -6
  144. package/dist/gateway/agent-bridge.js.map +1 -1
  145. package/dist/gateway/cron.d.ts +1 -1
  146. package/dist/gateway/cron.d.ts.map +1 -1
  147. package/dist/gateway/cron.js +3 -1
  148. package/dist/gateway/cron.js.map +1 -1
  149. package/dist/main.d.ts.map +1 -1
  150. package/dist/main.js +20 -14
  151. package/dist/main.js.map +1 -1
  152. package/dist/modes/interactive/injected-context.d.ts +2 -0
  153. package/dist/modes/interactive/injected-context.d.ts.map +1 -0
  154. package/dist/modes/interactive/injected-context.js +7 -0
  155. package/dist/modes/interactive/injected-context.js.map +1 -0
  156. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  157. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  158. package/dist/modes/interactive/interactive-mode.js +32 -8
  159. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  160. package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
  161. package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
  162. package/dist/modes/interactive/thinking-level-slash.js +23 -0
  163. package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
  164. package/dist/node-runtime/agent-session-services-35WNVGMR.js +36 -0
  165. package/dist/node-runtime/benchmark-request-UC7PD3V3.js +57 -0
  166. package/dist/node-runtime/brave-UWDA3I22.js +143 -0
  167. package/dist/node-runtime/builtin-extensions-QATGXENO.js +28 -0
  168. package/dist/node-runtime/chunk-2SJB2AWP.js +47 -0
  169. package/dist/node-runtime/chunk-3NMWLTPV.js +64 -0
  170. package/dist/node-runtime/chunk-3WFAEVKS.js +115 -0
  171. package/dist/node-runtime/chunk-3X3KZKMI.js +49 -0
  172. package/dist/node-runtime/chunk-4CSFRBCN.js +7558 -0
  173. package/dist/node-runtime/chunk-4DJ6HEGH.js +296 -0
  174. package/dist/node-runtime/chunk-4HXHDDCF.js +16 -0
  175. package/dist/node-runtime/chunk-4I23VTC4.js +429 -0
  176. package/dist/node-runtime/chunk-4TLO4PO2.js +3427 -0
  177. package/dist/node-runtime/chunk-4ZWGEEAS.js +69 -0
  178. package/dist/node-runtime/chunk-53YJI7JU.js +137 -0
  179. package/dist/node-runtime/chunk-5EFIU3OM.js +295 -0
  180. package/dist/node-runtime/chunk-6BEIBLQ3.js +53 -0
  181. package/dist/node-runtime/chunk-6KDIOJL3.js +72 -0
  182. package/dist/node-runtime/chunk-7N3YHTYF.js +26 -0
  183. package/dist/node-runtime/chunk-7NBZ5P7I.js +24 -0
  184. package/dist/node-runtime/chunk-AD6VXAO7.js +342 -0
  185. package/dist/node-runtime/chunk-ARC4KOTI.js +11178 -0
  186. package/dist/node-runtime/chunk-AROOY4BB.js +173 -0
  187. package/dist/node-runtime/chunk-ATGA2WLC.js +5646 -0
  188. package/dist/node-runtime/chunk-AUXVGBO4.js +19 -0
  189. package/dist/node-runtime/chunk-AY6CAJSL.js +30 -0
  190. package/dist/node-runtime/chunk-BHO7O6E5.js +296 -0
  191. package/dist/node-runtime/chunk-BI3DHYCN.js +8845 -0
  192. package/dist/node-runtime/chunk-BOHIDQT4.js +21 -0
  193. package/dist/node-runtime/chunk-BRJX2PRC.js +53 -0
  194. package/dist/node-runtime/chunk-CBGB57XT.js +20211 -0
  195. package/dist/node-runtime/chunk-CCZJ3PYY.js +17 -0
  196. package/dist/node-runtime/chunk-CGBXPL3E.js +1171 -0
  197. package/dist/node-runtime/chunk-CJECDQKP.js +19 -0
  198. package/dist/node-runtime/chunk-CSFI6YXL.js +130 -0
  199. package/dist/node-runtime/chunk-DAPBPCBP.js +53 -0
  200. package/dist/node-runtime/chunk-DDWHZ633.js +37 -0
  201. package/dist/node-runtime/chunk-DMMTJQMQ.js +43 -0
  202. package/dist/node-runtime/chunk-DVGWF6A2.js +1180 -0
  203. package/dist/node-runtime/chunk-EBF6COVM.js +1734 -0
  204. package/dist/node-runtime/chunk-FQMM2EZ2.js +248 -0
  205. package/dist/node-runtime/chunk-FVDOXRUD.js +96 -0
  206. package/dist/node-runtime/chunk-G4P75AIS.js +9471 -0
  207. package/dist/node-runtime/chunk-G6LRAP36.js +105 -0
  208. package/dist/node-runtime/chunk-GKLEQ3I4.js +860 -0
  209. package/dist/node-runtime/chunk-H2EOZYMP.js +57 -0
  210. package/dist/node-runtime/chunk-HQCKFM2O.js +56 -0
  211. package/dist/node-runtime/chunk-HYHJIRDW.js +19 -0
  212. package/dist/node-runtime/chunk-I6R76AG7.js +22 -0
  213. package/dist/node-runtime/chunk-IRPJXI6U.js +1269 -0
  214. package/dist/node-runtime/chunk-J26TSGDL.js +633 -0
  215. package/dist/node-runtime/chunk-JZQ7F36T.js +610 -0
  216. package/dist/node-runtime/chunk-KBKMCJDU.js +126 -0
  217. package/dist/node-runtime/chunk-KWA4OC2J.js +100 -0
  218. package/dist/node-runtime/chunk-M3LZLQW2.js +98 -0
  219. package/dist/node-runtime/chunk-MCUNIRD5.js +8388 -0
  220. package/dist/node-runtime/chunk-NI6OTSBH.js +966 -0
  221. package/dist/node-runtime/chunk-NUIFPZWX.js +209 -0
  222. package/dist/node-runtime/chunk-OBMWP3I5.js +68 -0
  223. package/dist/node-runtime/chunk-OCVIXVTZ.js +88 -0
  224. package/dist/node-runtime/chunk-OPEK5RRY.js +466 -0
  225. package/dist/node-runtime/chunk-OR4L3IB2.js +42 -0
  226. package/dist/node-runtime/chunk-PL6JKXWI.js +3622 -0
  227. package/dist/node-runtime/chunk-PNJSG3IZ.js +807 -0
  228. package/dist/node-runtime/chunk-PVCDKGR6.js +55 -0
  229. package/dist/node-runtime/chunk-Q4Q6D4IY.js +364 -0
  230. package/dist/node-runtime/chunk-Q5ZU2VRT.js +83 -0
  231. package/dist/node-runtime/chunk-QFWG2RVL.js +5477 -0
  232. package/dist/node-runtime/chunk-QZMODZQ2.js +305 -0
  233. package/dist/node-runtime/chunk-R5EDISSV.js +375 -0
  234. package/dist/node-runtime/chunk-RNBHABBA.js +986 -0
  235. package/dist/node-runtime/chunk-RQ2Q5IYR.js +72 -0
  236. package/dist/node-runtime/chunk-RRIZE6QQ.js +17 -0
  237. package/dist/node-runtime/chunk-SN6G4OU6.js +4753 -0
  238. package/dist/node-runtime/chunk-STERBGUB.js +949 -0
  239. package/dist/node-runtime/chunk-UWQYRSYQ.js +8973 -0
  240. package/dist/node-runtime/chunk-VRB2IYGG.js +53 -0
  241. package/dist/node-runtime/chunk-VSELYKWU.js +772 -0
  242. package/dist/node-runtime/chunk-W3CVH5RX.js +62 -0
  243. package/dist/node-runtime/chunk-WJVFOIB5.js +24921 -0
  244. package/dist/node-runtime/chunk-WKDK4C5P.js +2834 -0
  245. package/dist/node-runtime/chunk-XATUM2HK.js +46 -0
  246. package/dist/node-runtime/chunk-XBWPBZBN.js +125 -0
  247. package/dist/node-runtime/chunk-XTHQ7XR7.js +509 -0
  248. package/dist/node-runtime/chunk-ZBV7FAHG.js +1345 -0
  249. package/dist/node-runtime/cli-runtime.js +80 -0
  250. package/dist/node-runtime/clipboard-OZ63BBC6.js +12 -0
  251. package/dist/node-runtime/clipboard-image-7QR6GXVA.js +13 -0
  252. package/dist/node-runtime/command-AAV3YRR5.js +13 -0
  253. package/dist/node-runtime/commands-MV5KOZ64.js +291 -0
  254. package/dist/node-runtime/config-QDD5PUE2.js +73 -0
  255. package/dist/node-runtime/curator-server-XCM43VEF.js +3816 -0
  256. package/dist/node-runtime/customize-XEXL2DGQ.js +12 -0
  257. package/dist/node-runtime/direct-tool-executor-BK7CLEBX.js +188 -0
  258. package/dist/node-runtime/exa-LL64QZR2.js +329 -0
  259. package/dist/node-runtime/export-html-TEXVV5RP.js +150 -0
  260. package/dist/node-runtime/extension-input-O4HSAEM4.js +14 -0
  261. package/dist/node-runtime/extension-selector-X5FCX43D.js +14 -0
  262. package/dist/node-runtime/extract-XLQSJN4V.js +17 -0
  263. package/dist/node-runtime/file-sync-HCOP2QVF.js +117 -0
  264. package/dist/node-runtime/gateway-OAC4OBBL.js +2137 -0
  265. package/dist/node-runtime/gemini-api-QE7ANVDZ.js +29 -0
  266. package/dist/node-runtime/gemini-search-U7SUMPQA.js +330 -0
  267. package/dist/node-runtime/gemini-url-context-PXWCBQHK.js +103 -0
  268. package/dist/node-runtime/gemini-web-MM446SEH.js +14 -0
  269. package/dist/node-runtime/github-extract-F64RZOEA.js +619 -0
  270. package/dist/node-runtime/goal-NJEE5CTU.js +1831 -0
  271. package/dist/node-runtime/index.js +859 -0
  272. package/dist/node-runtime/init-3C7Z24OI.js +28 -0
  273. package/dist/node-runtime/install-cli-EXMJQESX.js +308 -0
  274. package/dist/node-runtime/interactive-mode-2SZUO53H.js +56 -0
  275. package/dist/node-runtime/interactive-view-S6J3QHEF.js +247 -0
  276. package/dist/node-runtime/lsp-manager-3ASUSO4T.js +1104 -0
  277. package/dist/node-runtime/lunr-cron-AUUYP4N4.js +272 -0
  278. package/dist/node-runtime/main.js +54 -0
  279. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +32 -0
  280. package/dist/node-runtime/mcp-panel-IIGMXQGP.js +501 -0
  281. package/dist/node-runtime/mcp-setup-panel-FEK7663I.js +355 -0
  282. package/dist/node-runtime/memory-cap-3S4XRLNP.js +20 -0
  283. package/dist/node-runtime/model-tiers-NJLHUEGK.js +20 -0
  284. package/dist/node-runtime/openai-search-B3MSNCQA.js +288 -0
  285. package/dist/node-runtime/package-manager-cli-7RKSZGEN.js +749 -0
  286. package/dist/node-runtime/parallel-AI2MNSCU.js +265 -0
  287. package/dist/node-runtime/parser-manager-TQHWYDH7.js +152 -0
  288. package/dist/node-runtime/pdf-extract-IPE6H4HP.js +57 -0
  289. package/dist/node-runtime/perplexity-QVJW3I35.js +12 -0
  290. package/dist/node-runtime/pi-intercom-EEMBGQID.js +2215 -0
  291. package/dist/node-runtime/pi-mcp-adapter-GUFZWW54.js +428 -0
  292. package/dist/node-runtime/pi-ollama-cloud-2F3Y2QNM.js +1440 -0
  293. package/dist/node-runtime/pi-prompt-template-model-QWTCGLJU.js +3946 -0
  294. package/dist/node-runtime/pi-subagents-7YJ3I4VE.js +6048 -0
  295. package/dist/node-runtime/pi-web-access-2CQGFLT2.js +1867 -0
  296. package/dist/node-runtime/print-mode-XSFM26EL.js +12 -0
  297. package/dist/node-runtime/proxy-modes-V6YVFH3C.js +685 -0
  298. package/dist/node-runtime/rpc-entry.js +62 -0
  299. package/dist/node-runtime/rpc-mode-W5ZTLTMZ.js +13 -0
  300. package/dist/node-runtime/runtime-bridges-3RKBDLNA.js +14 -0
  301. package/dist/node-runtime/session-manager-E7AREDTV.js +33 -0
  302. package/dist/node-runtime/session-selector-FJ7M2AIX.js +14 -0
  303. package/dist/node-runtime/settings-manager-GHPTUN7R.js +21 -0
  304. package/dist/node-runtime/src-BPQFJR76.js +2427 -0
  305. package/dist/node-runtime/subagent-executor-5Q5A4HJ2.js +8499 -0
  306. package/dist/node-runtime/summary-review-YSMXKITO.js +228 -0
  307. package/dist/node-runtime/tavily-WEZFVFP7.js +154 -0
  308. package/dist/node-runtime/timings-UAD5BEAS.js +16 -0
  309. package/dist/node-runtime/tool-renderer-MV5O452K.js +204 -0
  310. package/dist/node-runtime/update-cli-L3JIBH2U.js +70 -0
  311. package/dist/node-runtime/v4-5MNC3H7G.js +424 -0
  312. package/dist/node-runtime/video-extract-OYT5WKS5.js +304 -0
  313. package/dist/node-runtime/workspace-index-6DBXSTJ6.js +163 -0
  314. package/dist/node-runtime/youtube-extract-TQYKGFGS.js +264 -0
  315. package/dist/rpc.d.ts +3 -0
  316. package/dist/rpc.d.ts.map +1 -0
  317. package/dist/rpc.js +18 -0
  318. package/dist/rpc.js.map +1 -0
  319. package/dist/startup/benchmark-request.d.ts +3 -0
  320. package/dist/startup/benchmark-request.d.ts.map +1 -0
  321. package/dist/startup/benchmark-request.js +65 -0
  322. package/dist/startup/benchmark-request.js.map +1 -0
  323. package/dist/startup/interactive-view.d.ts.map +1 -1
  324. package/dist/startup/interactive-view.js +1 -2
  325. package/dist/startup/interactive-view.js.map +1 -1
  326. package/dist/startup/startup-milestones.d.ts +1 -1
  327. package/dist/startup/startup-milestones.d.ts.map +1 -1
  328. package/dist/startup/startup-milestones.js.map +1 -1
  329. package/dist/utils/await-with-abort.d.ts +2 -0
  330. package/dist/utils/await-with-abort.d.ts.map +1 -0
  331. package/dist/utils/await-with-abort.js +19 -0
  332. package/dist/utils/await-with-abort.js.map +1 -0
  333. package/docs/development.md +5 -1
  334. package/docs/features.md +2 -2
  335. package/docs/interactive-startup.md +95 -48
  336. package/docs/keybindings.md +2 -2
  337. package/docs/terminal-setup.md +1 -1
  338. package/docs/usage.md +1 -1
  339. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  340. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  341. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  342. package/examples/extensions/gondolin/package-lock.json +2 -2
  343. package/examples/extensions/gondolin/package.json +1 -1
  344. package/examples/extensions/hidden-thinking-label.ts +1 -1
  345. package/examples/extensions/sandbox/package-lock.json +2 -2
  346. package/examples/extensions/sandbox/package.json +1 -1
  347. package/examples/extensions/with-deps/package-lock.json +2 -2
  348. package/examples/extensions/with-deps/package.json +1 -1
  349. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ToolInfo } from \"@ashx-j/lunr\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport { Type } from \"typebox\";\nimport { showStatus, showTools, reconnectServers, authenticateServer, logoutServer, openMcpAuthPanel, openMcpPanel, openMcpSetup } from \"./commands.ts\";\nimport { loadMcpConfig } from \"./config.ts\";\nimport { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, resolveDirectTools } from \"./direct-tools.ts\";\nimport { flushMetadataCache, initializeMcp, updateStatusBar } from \"./init.ts\";\nimport { loadMetadataCache } from \"./metadata-cache.ts\";\nimport { executeAuthComplete, executeAuthStart, executeCall, executeConnect, executeDescribe, executeList, executeSearch, executeStatus, executeUiMessages } from \"./proxy-modes.ts\";\nimport { getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from \"./utils.ts\";\nimport { initializeOAuth, shutdownOAuth } from \"./mcp-auth-flow.ts\";\nimport { createMcpDirectToolCallRenderer, renderMcpProxyToolCall, renderMcpToolResult } from \"./tool-result-renderer.ts\";\nimport { toolErrorOverride } from \"./error-signal.ts\";\n\nexport default function mcpAdapter(pi: ExtensionAPI) {\n let state: McpExtensionState | null = null;\n let initPromise: Promise<McpExtensionState> | null = null;\n let lifecycleGeneration = 0;\n\n async function shutdownState(currentState: McpExtensionState | null, reason: string): Promise<void> {\n if (!currentState) return;\n\n if (currentState.uiServer) {\n currentState.uiServer.close(reason);\n currentState.uiServer = null;\n }\n\n let flushError: unknown;\n try {\n flushMetadataCache(currentState);\n } catch (error) {\n flushError = error;\n }\n\n try {\n await currentState.lifecycle.gracefulShutdown();\n } catch (error) {\n if (flushError) {\n console.error(\"MCP: graceful shutdown failed after metadata flush error\", error);\n } else {\n throw error;\n }\n }\n\n if (flushError) {\n throw flushError;\n }\n }\n\n const earlyConfigPath = getConfigPathFromArgv();\n const earlyConfig = loadMcpConfig(earlyConfigPath);\n const earlyCache = loadMetadataCache();\n const prefix = earlyConfig.settings?.toolPrefix ?? \"server\";\n\n const envRaw = process.env.MCP_DIRECT_TOOLS;\n const directSpecs = envRaw === \"__none__\"\n ? []\n : resolveDirectTools(\n earlyConfig,\n earlyCache,\n prefix,\n envRaw?.split(\",\").map(s => s.trim()).filter(Boolean),\n );\n const missingConfiguredDirectToolServers = getMissingConfiguredDirectToolServers(earlyConfig, earlyCache);\n const shouldRegisterProxyTool =\n earlyConfig.settings?.disableProxyTool !== true\n || directSpecs.length === 0\n || missingConfiguredDirectToolServers.length > 0;\n\n for (const spec of directSpecs) {\n (pi.registerTool as (tool: unknown) => unknown)({\n name: spec.prefixedName,\n label: `MCP: ${spec.originalName}`,\n description: spec.description || \"(no description)\",\n promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,\n parameters: Type.Unsafe(normalizeDirectToolInputSchema(spec.inputSchema) as never),\n execute: createDirectToolExecutor(() => state, () => initPromise, spec),\n renderCall: createMcpDirectToolCallRenderer(spec.prefixedName),\n renderResult: renderMcpToolResult,\n });\n }\n\n const getPiTools = (): ToolInfo[] => pi.getAllTools();\n\n pi.registerFlag(\"mcp-config\", {\n description: \"Path to MCP config file\",\n type: \"string\",\n });\n\n pi.on(\"session_start\", async (_event, ctx) => {\n const generation = ++lifecycleGeneration;\n const previousState = state;\n state = null;\n initPromise = null;\n\n try {\n await Promise.all([\n shutdownState(previousState, \"session_restart\"),\n shutdownOAuth(),\n ]);\n } catch (error) {\n console.error(\"MCP: failed to shut down previous session state\", error);\n }\n\n if (generation !== lifecycleGeneration) {\n return;\n }\n\n await initializeOAuth().catch(err => {\n console.error(\"MCP OAuth initialization failed:\", err);\n });\n\n const promise = initializeMcp(pi, ctx);\n initPromise = promise;\n\n promise.then(async (nextState) => {\n if (generation !== lifecycleGeneration || initPromise !== promise) {\n try {\n await shutdownState(nextState, \"stale_session_start\");\n } catch (error) {\n console.error(\"MCP: failed to clean stale session state\", error);\n }\n return;\n }\n\n state = nextState;\n updateStatusBar(nextState);\n initPromise = null;\n }).catch(err => {\n if (generation !== lifecycleGeneration) {\n return;\n }\n if (initPromise !== promise && initPromise !== null) {\n return;\n }\n console.error(\"MCP initialization failed:\", err);\n initPromise = null;\n });\n });\n\n pi.on(\"session_shutdown\", async () => {\n ++lifecycleGeneration;\n const currentState = state;\n state = null;\n initPromise = null;\n\n try {\n await Promise.all([\n shutdownState(currentState, \"session_shutdown\"),\n shutdownOAuth(),\n ]);\n } catch (error) {\n console.error(\"MCP: session shutdown cleanup failed\", error);\n }\n });\n\n // Re-flag returned MCP tool failures so pi registers them as errors (see toolErrorOverride).\n pi.on(\"tool_result\", (event) => toolErrorOverride(event.details));\n\n pi.registerCommand(\"mcp\", {\n description: \"Show MCP server status\",\n handler: async (args, ctx) => {\n if (!state && initPromise) {\n try {\n state = await initPromise;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (ctx.hasUI) ctx.ui.notify(`MCP initialization failed: ${message}`, \"error\");\n return;\n }\n }\n if (!state) {\n if (ctx.hasUI) ctx.ui.notify(\"MCP not initialized\", \"error\");\n return;\n }\n\n const parts = args?.trim()?.split(/\\s+/) ?? [];\n const subcommand = parts[0] ?? \"\";\n const targetServer = parts[1];\n const rest = parts.slice(1).join(\" \");\n\n switch (subcommand) {\n case \"reconnect\":\n await reconnectServers(state, ctx, targetServer);\n break;\n case \"tools\":\n await showTools(state, ctx);\n break;\n case \"setup\": {\n const result = await openMcpSetup(state, pi, ctx, earlyConfigPath, \"setup\");\n if (result?.configChanged) {\n await ctx.reload();\n return;\n }\n break;\n }\n case \"logout\": {\n const serverName = rest;\n if (!serverName) {\n if (ctx.hasUI) ctx.ui.notify(\"Usage: /mcp logout <server>\", \"error\");\n return;\n }\n await logoutServer(serverName, state, ctx);\n break;\n }\n case \"status\":\n case \"\":\n default:\n if (ctx.hasUI) {\n const result = await openMcpPanel(state, pi, ctx, earlyConfigPath);\n if (result?.configChanged) {\n await ctx.reload();\n return;\n }\n } else {\n await showStatus(state, ctx);\n }\n break;\n }\n },\n });\n\n pi.registerCommand(\"mcp-auth\", {\n description: \"Authenticate with an MCP server (OAuth)\",\n handler: async (args, ctx) => {\n const serverName = args?.trim();\n if (!serverName && !ctx.hasUI) {\n return;\n }\n\n if (!state && initPromise) {\n try {\n state = await initPromise;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (ctx.hasUI) ctx.ui.notify(`MCP initialization failed: ${message}`, \"error\");\n return;\n }\n }\n if (!state) {\n if (ctx.hasUI) ctx.ui.notify(\"MCP not initialized\", \"error\");\n return;\n }\n\n if (!serverName) {\n await openMcpAuthPanel(state, pi, ctx, earlyConfigPath);\n return;\n }\n\n await authenticateServer(serverName, state.config, ctx);\n },\n });\n\n if (shouldRegisterProxyTool) {\n (pi.registerTool as (tool: unknown) => unknown)({\n name: \"mcp\",\n label: \"MCP\",\n description: buildProxyDescription(earlyConfig, earlyCache, directSpecs),\n promptSnippet: \"MCP gateway - connect to MCP servers and call their tools\",\n renderCall: renderMcpProxyToolCall,\n parameters: Type.Object({\n tool: Type.Optional(Type.String({ description: \"Tool name to call (e.g., 'xcodebuild_list_sims')\" })),\n args: Type.Optional(Type.String({ description: \"Arguments as JSON string (e.g., '{\\\"key\\\": \\\"value\\\"}')\" })),\n connect: Type.Optional(Type.String({ description: \"Server name to connect (lazy connect + metadata refresh)\" })),\n describe: Type.Optional(Type.String({ description: \"Tool name to describe (shows parameters)\" })),\n search: Type.Optional(Type.String({ description: \"Search tools by name/description\" })),\n regex: Type.Optional(Type.Boolean({ description: \"Treat search as regex (default: substring match)\" })),\n includeSchemas: Type.Optional(Type.Boolean({ description: \"Include parameter schemas in search results (default: true)\" })),\n server: Type.Optional(Type.String({ description: \"Filter to specific server (also disambiguates tool calls)\" })),\n action: Type.Optional(Type.String({ description: \"Action: 'ui-messages', 'auth-start', or 'auth-complete'\" })),\n }),\n renderResult: renderMcpToolResult,\n async execute(_toolCallId, params: {\n tool?: string;\n args?: string;\n connect?: string;\n describe?: string;\n search?: string;\n regex?: boolean;\n includeSchemas?: boolean;\n server?: string;\n action?: string;\n }, signal, _onUpdate, _ctx) {\n let parsedArgs: Record<string, unknown> | undefined;\n if (params.args) {\n try {\n parsedArgs = JSON.parse(params.args);\n if (typeof parsedArgs !== \"object\" || parsedArgs === null || Array.isArray(parsedArgs)) {\n const gotType = Array.isArray(parsedArgs) ? \"array\" : parsedArgs === null ? \"null\" : typeof parsedArgs;\n throw new Error(`Invalid args: expected a JSON object, got ${gotType}`);\n }\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Invalid args JSON: ${error.message}`, { cause: error });\n }\n throw error;\n }\n }\n\n if (!state && initPromise) {\n try {\n state = await initPromise;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: \"text\" as const, text: `MCP initialization failed: ${message}` }],\n details: { error: \"init_failed\", message },\n };\n }\n }\n if (!state) {\n return {\n content: [{ type: \"text\" as const, text: \"MCP not initialized\" }],\n details: { error: \"not_initialized\" },\n };\n }\n\n if (params.action === \"ui-messages\") {\n return executeUiMessages(state);\n }\n if (params.action === \"auth-start\") {\n if (!params.server) {\n return {\n content: [{ type: \"text\" as const, text: \"auth-start requires `server`. Example: mcp({ action: \\\"auth-start\\\", server: \\\"linear-server\\\" })\" }],\n details: { mode: \"auth-start\", error: \"missing_server\" },\n };\n }\n return executeAuthStart(state, params.server);\n }\n if (params.action === \"auth-complete\") {\n if (!params.server) {\n return {\n content: [{ type: \"text\" as const, text: \"auth-complete requires `server`.\" }],\n details: { mode: \"auth-complete\", error: \"missing_server\" },\n };\n }\n const input = parsedArgs?.redirectUrl ?? parsedArgs?.code ?? parsedArgs?.input;\n if (typeof input !== \"string\" || input.trim().length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"auth-complete requires args with `redirectUrl`, `code`, or `input`.\" }],\n details: { mode: \"auth-complete\", error: \"missing_input\" },\n };\n }\n return executeAuthComplete(state, params.server, input);\n }\n if (params.tool) {\n return executeCall(state, params.tool, parsedArgs, params.server, getPiTools, signal);\n }\n if (params.connect) {\n return executeConnect(state, params.connect, signal);\n }\n if (params.describe) {\n return executeDescribe(state, params.describe);\n }\n if (params.search) {\n return executeSearch(state, params.search, params.regex, params.server, params.includeSchemas);\n }\n if (params.server) {\n return executeList(state, params.server);\n }\n return executeStatus(state);\n },\n });\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ExtensionContext, ToolInfo } from \"@ashx-j/lunr\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { DirectToolSpec, McpConfig } from \"./types.ts\";\nimport type { MetadataCache } from \"./metadata-cache.ts\";\nimport { existsSync } from \"node:fs\";\nimport { Type } from \"typebox\";\nimport { loadMcpConfig } from \"./config.ts\";\nimport { buildProxyDescription, getMissingConfiguredDirectToolServers, resolveDirectTools } from \"./direct-tools.ts\";\nimport { getMetadataCachePath, loadMetadataCache } from \"./metadata-cache.ts\";\nimport { getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from \"./utils.ts\";\nimport { createMcpDirectToolCallRenderer, renderMcpProxyToolCall, renderMcpToolResult } from \"./tool-result-renderer.ts\";\nimport { toolErrorOverride } from \"./error-signal.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\n\ntype McpHeavyModules = {\n init: typeof import(\"./init.ts\");\n authFlow: typeof import(\"./mcp-auth-flow.ts\");\n commands: typeof import(\"./commands.ts\");\n proxyModes: typeof import(\"./proxy-modes.ts\");\n directToolExecutor: typeof import(\"./direct-tool-executor.ts\");\n};\n\nfunction shouldBackgroundAutostart(config: McpConfig, cache: MetadataCache | null): boolean {\n const serverEntries = Object.entries(config.mcpServers);\n if (serverEntries.length === 0) return false;\n\n if (!existsSync(getMetadataCachePath())) return true;\n\n for (const [, definition] of serverEntries) {\n const mode = definition.lifecycle ?? \"lazy\";\n if (mode === \"keep-alive\" || mode === \"eager\") return true;\n }\n\n if (process.env.MCP_DIRECT_TOOLS === \"__none__\") return false;\n return getMissingConfiguredDirectToolServers(config, cache).length > 0;\n}\n\nexport default function mcpAdapter(pi: ExtensionAPI) {\n let state: McpExtensionState | null = null;\n let initPromise: Promise<McpExtensionState> | null = null;\n let lifecycleGeneration = 0;\n let sessionAbort = new AbortController();\n const initializingStates = new Set<McpExtensionState>();\n const shutdownPromises = new WeakMap<McpExtensionState, Promise<void>>();\n let heavyModules: McpHeavyModules | null = null;\n let heavyModulesPromise: Promise<McpHeavyModules> | null = null;\n const directExecutors = new Map<string, ReturnType<McpHeavyModules[\"directToolExecutor\"][\"createDirectToolExecutor\"]>>();\n\n function loadHeavyModules(): Promise<McpHeavyModules> {\n if (heavyModules) return Promise.resolve(heavyModules);\n if (!heavyModulesPromise) {\n heavyModulesPromise = (async () => {\n const [init, authFlow, commands, proxyModes, directToolExecutor] = await Promise.all([\n import(\"./init.ts\"),\n import(\"./mcp-auth-flow.ts\"),\n import(\"./commands.ts\"),\n import(\"./proxy-modes.ts\"),\n import(\"./direct-tool-executor.ts\"),\n ]);\n const loaded: McpHeavyModules = { init, authFlow, commands, proxyModes, directToolExecutor };\n heavyModules = loaded;\n return loaded;\n })().catch((error) => {\n heavyModulesPromise = null;\n throw error;\n });\n }\n return heavyModulesPromise;\n }\n\n function shutdownState(currentState: McpExtensionState | null, reason: string): Promise<void> {\n if (!currentState) return Promise.resolve();\n const existing = shutdownPromises.get(currentState);\n if (existing) return existing;\n\n const shutdown = (async () => {\n if (currentState.uiServer) {\n currentState.uiServer.close(reason);\n currentState.uiServer = null;\n }\n\n let flushError: unknown;\n try {\n if (heavyModules) {\n heavyModules.init.flushMetadataCache(currentState);\n }\n } catch (error) {\n flushError = error;\n }\n\n try {\n await currentState.lifecycle.gracefulShutdown();\n } catch (error) {\n if (flushError) {\n console.error(\"MCP: graceful shutdown failed after metadata flush error\", error);\n } else {\n throw error;\n }\n }\n\n if (flushError) {\n throw flushError;\n }\n })();\n shutdownPromises.set(currentState, shutdown);\n return shutdown;\n }\n\n async function shutdownInitializingStates(): Promise<void> {\n const pending = [...initializingStates];\n initializingStates.clear();\n await Promise.all(pending.map((entry) => shutdownState(entry, \"initialization_cancelled\")));\n }\n\n async function shutdownLoadedRuntime(): Promise<void> {\n if (!heavyModules) return;\n await heavyModules.authFlow.shutdownOAuth();\n }\n\n async function runInitialize(\n generation: number,\n sessionPi: ExtensionAPI,\n ctx: ExtensionContext,\n ): Promise<McpExtensionState> {\n const signal = sessionAbort.signal;\n const heavy = await loadHeavyModules();\n throwIfAborted(signal);\n if (generation !== lifecycleGeneration) {\n throw new Error(\"MCP initialization aborted (session changed)\");\n }\n\n await heavy.authFlow.initializeOAuth().catch(err => {\n console.error(\"MCP OAuth initialization failed:\", err);\n });\n\n if (generation !== lifecycleGeneration) {\n throw new Error(\"MCP initialization aborted (session changed)\");\n }\n\n let partial: McpExtensionState | undefined;\n try {\n const initialized = await heavy.init.initializeMcp(sessionPi, ctx, {\n signal,\n onState: (entry: McpExtensionState) => {\n partial = entry;\n initializingStates.add(entry);\n },\n });\n if (!partial) {\n partial = initialized;\n initializingStates.add(initialized);\n }\n throwIfAborted(signal);\n return initialized;\n } catch (error) {\n if (partial) {\n initializingStates.delete(partial);\n await shutdownState(partial, \"initialization_failed\");\n }\n throw error;\n } finally {\n if (partial) initializingStates.delete(partial);\n }\n }\n\n function startSessionInit(generation: number, sessionPi: ExtensionAPI, ctx: ExtensionContext): Promise<McpExtensionState> {\n const promise = runInitialize(generation, sessionPi, ctx);\n initPromise = promise;\n\n promise.then(async (nextState) => {\n if (generation !== lifecycleGeneration || initPromise !== promise) {\n try {\n await shutdownState(nextState, \"stale_session_start\");\n } catch (error) {\n console.error(\"MCP: failed to clean stale session state\", error);\n }\n return;\n }\n\n state = nextState;\n if (heavyModules) {\n heavyModules.init.updateStatusBar(nextState);\n }\n initPromise = null;\n }).catch(err => {\n if (generation !== lifecycleGeneration) {\n return;\n }\n if (initPromise !== promise && initPromise !== null) {\n return;\n }\n console.error(\"MCP initialization failed:\", err);\n initPromise = null;\n });\n\n return promise;\n }\n\n async function ensureState(sessionPi: ExtensionAPI, ctx: ExtensionContext, signal?: AbortSignal): Promise<McpExtensionState> {\n throwIfAborted(signal);\n if (state) return state;\n\n const generation = lifecycleGeneration;\n if (!initPromise) {\n startSessionInit(generation, sessionPi, ctx);\n }\n const promise = initPromise;\n if (!promise) {\n throw new Error(\"MCP not initialized\");\n }\n\n try {\n const nextState = await abortable(promise, signal);\n if (generation !== lifecycleGeneration) {\n throw new Error(\"MCP initialization aborted (session changed)\");\n }\n if (state) return state;\n state = nextState;\n if (initPromise === promise) {\n initPromise = null;\n }\n return state;\n } catch (error) {\n if (initPromise === promise && !signal?.aborted) {\n initPromise = null;\n }\n throw error;\n }\n }\n\n function assertCurrentState(currentState: McpExtensionState): void {\n if (currentState !== state) throw new Error(\"MCP session changed before execution\");\n }\n\n function createLazyDirectToolExecute(spec: DirectToolSpec) {\n return async function execute(toolCallId, params, incomingSignal, onUpdate, ctx) {\n const signal = incomingSignal ? AbortSignal.any([incomingSignal, sessionAbort.signal]) : sessionAbort.signal;\n let currentState: McpExtensionState;\n try {\n currentState = await ensureState(pi, ctx, signal);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: \"text\" as const, text: `MCP initialization failed: ${message}` }],\n details: { error: \"init_failed\", message },\n };\n }\n\n const heavy = await loadHeavyModules();\n throwIfAborted(signal);\n assertCurrentState(currentState);\n let executor = directExecutors.get(spec.prefixedName);\n if (!executor) {\n executor = heavy.directToolExecutor.createDirectToolExecutor(() => currentState, () => null, spec);\n directExecutors.set(spec.prefixedName, executor);\n }\n return executor(toolCallId, params, signal, onUpdate, ctx);\n };\n }\n\n const earlyConfigPath = getConfigPathFromArgv();\n const earlyConfig = loadMcpConfig(earlyConfigPath);\n const earlyCache = loadMetadataCache();\n const prefix = earlyConfig.settings?.toolPrefix ?? \"server\";\n\n const envRaw = process.env.MCP_DIRECT_TOOLS;\n const directSpecs = envRaw === \"__none__\"\n ? []\n : resolveDirectTools(\n earlyConfig,\n earlyCache,\n prefix,\n envRaw?.split(\",\").map(s => s.trim()).filter(Boolean),\n );\n const missingConfiguredDirectToolServers = getMissingConfiguredDirectToolServers(earlyConfig, earlyCache);\n const shouldRegisterProxyTool =\n earlyConfig.settings?.disableProxyTool !== true\n || directSpecs.length === 0\n || missingConfiguredDirectToolServers.length > 0;\n\n for (const spec of directSpecs) {\n (pi.registerTool as (tool: unknown) => unknown)({\n name: spec.prefixedName,\n label: `MCP: ${spec.originalName}`,\n description: spec.description || \"(no description)\",\n promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,\n parameters: Type.Unsafe(normalizeDirectToolInputSchema(spec.inputSchema) as never),\n execute: createLazyDirectToolExecute(spec),\n renderCall: createMcpDirectToolCallRenderer(spec.prefixedName),\n renderResult: renderMcpToolResult,\n });\n }\n\n const getPiTools = (): ToolInfo[] => pi.getAllTools();\n\n pi.registerFlag(\"mcp-config\", {\n description: \"Path to MCP config file\",\n type: \"string\",\n });\n\n pi.on(\"session_start\", async (_event, ctx) => {\n const generation = ++lifecycleGeneration;\n sessionAbort.abort(new Error(\"MCP session changed\"));\n sessionAbort = new AbortController();\n const previousState = state;\n state = null;\n initPromise = null;\n directExecutors.clear();\n\n try {\n await Promise.all([\n shutdownState(previousState, \"session_restart\"),\n shutdownInitializingStates(),\n shutdownLoadedRuntime(),\n ]);\n } catch (error) {\n console.error(\"MCP: failed to shut down previous session state\", error);\n }\n\n if (generation !== lifecycleGeneration) {\n return;\n }\n\n const configPath = (pi.getFlag(\"mcp-config\") as string | undefined) ?? earlyConfigPath;\n const sessionConfig = loadMcpConfig(configPath, ctx.cwd);\n const sessionCache = loadMetadataCache();\n\n if (!shouldBackgroundAutostart(sessionConfig, sessionCache)) {\n return;\n }\n\n startSessionInit(generation, pi, ctx);\n });\n\n pi.on(\"session_shutdown\", async () => {\n ++lifecycleGeneration;\n sessionAbort.abort(new Error(\"MCP session ended\"));\n const currentState = state;\n state = null;\n initPromise = null;\n directExecutors.clear();\n\n try {\n await Promise.all([\n shutdownState(currentState, \"session_shutdown\"),\n shutdownInitializingStates(),\n shutdownLoadedRuntime(),\n ]);\n } catch (error) {\n console.error(\"MCP: session shutdown cleanup failed\", error);\n }\n });\n\n // Re-flag returned MCP tool failures so pi registers them as errors (see toolErrorOverride).\n pi.on(\"tool_result\", (event) => toolErrorOverride(event.details));\n\n pi.registerCommand(\"mcp\", {\n description: \"Show MCP server status\",\n handler: async (args, ctx) => {\n let currentState: McpExtensionState;\n try {\n currentState = await ensureState(pi, ctx);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (ctx.hasUI) ctx.ui.notify(`MCP initialization failed: ${message}`, \"error\");\n return;\n }\n\n const heavy = await loadHeavyModules();\n assertCurrentState(currentState);\n const parts = args?.trim()?.split(/\\s+/) ?? [];\n const subcommand = parts[0] ?? \"\";\n const targetServer = parts[1];\n const rest = parts.slice(1).join(\" \");\n\n switch (subcommand) {\n case \"reconnect\":\n await heavy.commands.reconnectServers(currentState, ctx, targetServer);\n break;\n case \"tools\":\n await heavy.commands.showTools(currentState, ctx);\n break;\n case \"setup\": {\n const result = await heavy.commands.openMcpSetup(currentState, pi, ctx, earlyConfigPath, \"setup\");\n if (result?.configChanged) {\n await ctx.reload();\n return;\n }\n break;\n }\n case \"logout\": {\n const serverName = rest;\n if (!serverName) {\n if (ctx.hasUI) ctx.ui.notify(\"Usage: /mcp logout <server>\", \"error\");\n return;\n }\n await heavy.commands.logoutServer(serverName, currentState, ctx);\n break;\n }\n case \"status\":\n case \"\":\n default:\n if (ctx.hasUI) {\n const result = await heavy.commands.openMcpPanel(currentState, pi, ctx, earlyConfigPath);\n if (result?.configChanged) {\n await ctx.reload();\n return;\n }\n } else {\n await heavy.commands.showStatus(currentState, ctx);\n }\n break;\n }\n },\n });\n\n pi.registerCommand(\"mcp-auth\", {\n description: \"Authenticate with an MCP server (OAuth)\",\n handler: async (args, ctx) => {\n const serverName = args?.trim();\n if (!serverName && !ctx.hasUI) {\n return;\n }\n\n let currentState: McpExtensionState;\n try {\n currentState = await ensureState(pi, ctx);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (ctx.hasUI) ctx.ui.notify(`MCP initialization failed: ${message}`, \"error\");\n return;\n }\n\n const heavy = await loadHeavyModules();\n assertCurrentState(currentState);\n\n if (!serverName) {\n await heavy.commands.openMcpAuthPanel(currentState, pi, ctx, earlyConfigPath);\n return;\n }\n\n await heavy.commands.authenticateServer(serverName, currentState.config, ctx);\n },\n });\n\n if (shouldRegisterProxyTool) {\n (pi.registerTool as (tool: unknown) => unknown)({\n name: \"mcp\",\n label: \"MCP\",\n description: buildProxyDescription(earlyConfig, earlyCache, directSpecs),\n promptSnippet: \"MCP gateway - connect to MCP servers and call their tools\",\n renderCall: renderMcpProxyToolCall,\n parameters: Type.Object({\n tool: Type.Optional(Type.String({ description: \"Tool name to call (e.g., 'xcodebuild_list_sims')\" })),\n args: Type.Optional(Type.String({ description: \"Arguments as JSON string (e.g., '{\\\"key\\\": \\\"value\\\"}')\" })),\n connect: Type.Optional(Type.String({ description: \"Server name to connect (lazy connect + metadata refresh)\" })),\n describe: Type.Optional(Type.String({ description: \"Tool name to describe (shows parameters)\" })),\n search: Type.Optional(Type.String({ description: \"Search tools by name/description\" })),\n regex: Type.Optional(Type.Boolean({ description: \"Treat search as regex (default: substring match)\" })),\n includeSchemas: Type.Optional(Type.Boolean({ description: \"Include parameter schemas in search results (default: true)\" })),\n server: Type.Optional(Type.String({ description: \"Filter to specific server (also disambiguates tool calls)\" })),\n action: Type.Optional(Type.String({ description: \"Action: 'ui-messages', 'auth-start', or 'auth-complete'\" })),\n }),\n renderResult: renderMcpToolResult,\n async execute(_toolCallId, params: {\n tool?: string;\n args?: string;\n connect?: string;\n describe?: string;\n search?: string;\n regex?: boolean;\n includeSchemas?: boolean;\n server?: string;\n action?: string;\n }, incomingSignal, _onUpdate, ctx) {\n const signal = incomingSignal ? AbortSignal.any([incomingSignal, sessionAbort.signal]) : sessionAbort.signal;\n let parsedArgs: Record<string, unknown> | undefined;\n if (params.args) {\n try {\n parsedArgs = JSON.parse(params.args);\n if (typeof parsedArgs !== \"object\" || parsedArgs === null || Array.isArray(parsedArgs)) {\n const gotType = Array.isArray(parsedArgs) ? \"array\" : parsedArgs === null ? \"null\" : typeof parsedArgs;\n throw new Error(`Invalid args: expected a JSON object, got ${gotType}`);\n }\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(`Invalid args JSON: ${error.message}`, { cause: error });\n }\n throw error;\n }\n }\n\n let currentState: McpExtensionState;\n try {\n currentState = await ensureState(pi, ctx, signal);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: \"text\" as const, text: `MCP initialization failed: ${message}` }],\n details: { error: \"init_failed\", message },\n };\n }\n\n const heavy = await loadHeavyModules();\n throwIfAborted(signal);\n assertCurrentState(currentState);\n\n if (params.action === \"ui-messages\") {\n return heavy.proxyModes.executeUiMessages(currentState);\n }\n if (params.action === \"auth-start\") {\n if (!params.server) {\n return {\n content: [{ type: \"text\" as const, text: \"auth-start requires `server`. Example: mcp({ action: \\\"auth-start\\\", server: \\\"linear-server\\\" })\" }],\n details: { mode: \"auth-start\", error: \"missing_server\" },\n };\n }\n return heavy.proxyModes.executeAuthStart(currentState, params.server);\n }\n if (params.action === \"auth-complete\") {\n if (!params.server) {\n return {\n content: [{ type: \"text\" as const, text: \"auth-complete requires `server`.\" }],\n details: { mode: \"auth-complete\", error: \"missing_server\" },\n };\n }\n const input = parsedArgs?.redirectUrl ?? parsedArgs?.code ?? parsedArgs?.input;\n if (typeof input !== \"string\" || input.trim().length === 0) {\n return {\n content: [{ type: \"text\" as const, text: \"auth-complete requires args with `redirectUrl`, `code`, or `input`.\" }],\n details: { mode: \"auth-complete\", error: \"missing_input\" },\n };\n }\n return heavy.proxyModes.executeAuthComplete(currentState, params.server, input);\n }\n if (params.tool) {\n return heavy.proxyModes.executeCall(currentState, params.tool, parsedArgs, params.server, getPiTools, signal);\n }\n if (params.connect) {\n return heavy.proxyModes.executeConnect(currentState, params.connect, signal);\n }\n if (params.describe) {\n return heavy.proxyModes.executeDescribe(currentState, params.describe);\n }\n if (params.search) {\n return heavy.proxyModes.executeSearch(currentState, params.search, params.regex, params.server, params.includeSchemas);\n }\n if (params.server) {\n return heavy.proxyModes.executeList(currentState, params.server);\n }\n return heavy.proxyModes.executeStatus(currentState);\n },\n });\n }\n}\n"]}
@@ -1,7 +1,10 @@
1
1
  import type { ExtensionAPI, ExtensionContext } from "@ashx-j/lunr";
2
2
  import type { McpExtensionState } from "./state.ts";
3
3
  export declare function isTuiMode(ctx: Pick<ExtensionContext, "hasUI" | "mode">): boolean;
4
- export declare function initializeMcp(pi: ExtensionAPI, ctx: ExtensionContext): Promise<McpExtensionState>;
4
+ export declare function initializeMcp(pi: ExtensionAPI, ctx: ExtensionContext, options?: {
5
+ signal?: AbortSignal;
6
+ onState?: (state: McpExtensionState) => void;
7
+ }): Promise<McpExtensionState>;
5
8
  export declare function updateServerMetadata(state: McpExtensionState, serverName: string): void;
6
9
  export declare function updateMetadataCache(state: McpExtensionState, serverName: string): void;
7
10
  export declare function flushMetadataCache(state: McpExtensionState): void;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA2BpD,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,CAEhF;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,gBAAgB,GACpB,OAAO,CAAC,iBAAiB,CAAC,CA8L5B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAWvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA+BtF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAMjE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAU9D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhG;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAuCtH","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { ToolMetadata } from \"./types.ts\";\nimport { existsSync } from \"node:fs\";\nimport { loadMcpConfig } from \"./config.ts\";\nimport { ConsentManager } from \"./consent-manager.ts\";\nimport { McpLifecycleManager } from \"./lifecycle.ts\";\nimport {\n computeServerHash,\n getMetadataCachePath,\n isServerCacheValid,\n loadMetadataCache,\n reconstructToolMetadata,\n saveMetadataCache,\n serializeResources,\n serializeTools,\n type ServerCacheEntry,\n} from \"./metadata-cache.ts\";\nimport { McpServerManager } from \"./server-manager.ts\";\nimport { buildToolMetadata, totalToolCount } from \"./tool-metadata.ts\";\nimport { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport { openUrl, parallelLimit } from \"./utils.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getMissingConfiguredDirectToolServers } from \"./direct-tools.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport function isTuiMode(ctx: Pick<ExtensionContext, \"hasUI\" | \"mode\">): boolean {\n return ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function initializeMcp(\n pi: ExtensionAPI,\n ctx: ExtensionContext\n): Promise<McpExtensionState> {\n const configPath = pi.getFlag(\"mcp-config\") as string | undefined;\n const config = loadMcpConfig(configPath, ctx.cwd);\n\n const manager = new McpServerManager(ctx.cwd);\n manager.setDefaultRequestTimeoutMs(config.settings?.requestTimeoutMs);\n const samplingAutoApprove = config.settings?.samplingAutoApprove === true;\n if (config.settings?.sampling !== false && (ctx.hasUI || samplingAutoApprove)) {\n manager.setSamplingConfig({\n autoApprove: samplingAutoApprove,\n ui: ctx.hasUI ? ctx.ui : undefined,\n modelRegistry: ctx.modelRegistry,\n getCurrentModel: () => ctx.model,\n getSignal: () => ctx.signal,\n });\n }\n const elicitationEnabled = config.settings?.elicitation !== false && ctx.hasUI;\n if (elicitationEnabled) {\n manager.setElicitationConfig({\n ui: ctx.ui,\n allowUrl: isTuiMode(ctx),\n });\n }\n const lifecycle = new McpLifecycleManager(manager);\n const toolMetadata = new Map<string, ToolMetadata[]>();\n const failureTracker = new Map<string, number>();\n const uiResourceHandler = new UiResourceHandler(manager);\n const consentManager = new ConsentManager(\"once-per-server\");\n const ui = ctx.hasUI ? ctx.ui : undefined;\n const state: McpExtensionState = {\n manager,\n lifecycle,\n toolMetadata,\n config,\n failureTracker,\n uiResourceHandler,\n consentManager,\n uiServer: null,\n completedUiSessions: [],\n openBrowser: (url: string) => openUrl(pi, url, process.env.BROWSER),\n ui,\n sendMessage: (message, options) => pi.sendMessage(message as unknown as Parameters<typeof pi.sendMessage>[0], options),\n };\n\n const serverEntries = Object.entries(config.mcpServers);\n if (serverEntries.length === 0) {\n return state;\n }\n\n const idleSetting = typeof config.settings?.idleTimeout === \"number\" ? config.settings.idleTimeout : 10;\n lifecycle.setGlobalIdleTimeout(idleSetting);\n\n const cachePath = getMetadataCachePath();\n const cacheFileExists = existsSync(cachePath);\n let cache = loadMetadataCache();\n let bootstrapAll = false;\n\n if (!cacheFileExists) {\n bootstrapAll = true;\n saveMetadataCache({ version: 1, servers: {} });\n } else if (!cache) {\n cache = { version: 1, servers: {} };\n saveMetadataCache(cache);\n }\n\n const prefix = config.settings?.toolPrefix ?? \"server\";\n\n for (const [name, definition] of serverEntries) {\n const lifecycleMode = definition.lifecycle ?? \"lazy\";\n const idleOverride = definition.idleTimeout ?? (lifecycleMode === \"eager\" ? 0 : undefined);\n lifecycle.registerServer(\n name,\n definition,\n idleOverride !== undefined ? { idleTimeout: idleOverride } : undefined\n );\n if (lifecycleMode === \"keep-alive\") {\n lifecycle.markKeepAlive(name, definition);\n }\n\n if (cache?.servers?.[name] && isServerCacheValid(cache.servers[name], definition)) {\n const metadata = reconstructToolMetadata(name, cache.servers[name], prefix, definition);\n toolMetadata.set(name, metadata);\n }\n }\n\n const startupServers = bootstrapAll\n ? serverEntries\n : serverEntries.filter(([, definition]) => {\n const mode = definition.lifecycle ?? \"lazy\";\n return mode === \"keep-alive\" || mode === \"eager\";\n });\n\n if (ctx.hasUI && startupServers.length > 0) {\n ctx.ui.setStatus(\"mcp\", `MCP: connecting to ${startupServers.length} servers...`);\n }\n\n const results = await parallelLimit(startupServers, 10, async ([name, definition]) => {\n try {\n const connection = await manager.connect(name, definition, ctx.signal);\n if (connection.status === \"needs-auth\") {\n return { name, definition, connection: null, error: `OAuth authentication required. Run /mcp-auth ${name}.` };\n }\n return { name, definition, connection, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, definition, connection: null, error: message };\n }\n });\n\n for (const { name, definition, connection, error } of results) {\n if (error || !connection) {\n if (ctx.hasUI) {\n ctx.ui.notify(`MCP: Failed to connect to ${name}: ${error}`, \"error\");\n }\n console.error(`MCP: Failed to connect to ${name}: ${error}`);\n continue;\n }\n\n const { metadata, failedTools } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n\n if (failedTools.length > 0 && ctx.hasUI) {\n ctx.ui.notify(\n `MCP: ${name} - ${failedTools.length} tools skipped`,\n \"warning\"\n );\n }\n }\n\n const connectedCount = results.filter(r => r.connection).length;\n const failedCount = results.filter(r => r.error).length;\n if (ctx.hasUI && connectedCount > 0) {\n const totalTools = totalToolCount(state);\n const msg = failedCount > 0\n ? `MCP: ${connectedCount}/${startupServers.length} servers connected (${totalTools} tools)`\n : `MCP: ${connectedCount} servers connected (${totalTools} tools)`;\n ctx.ui.notify(msg, \"info\");\n }\n\n const envDirect = process.env.MCP_DIRECT_TOOLS;\n if (envDirect !== \"__none__\") {\n const currentCache = loadMetadataCache();\n const missingCacheServers = getMissingConfiguredDirectToolServers(config, currentCache);\n\n if (missingCacheServers.length > 0) {\n const bootstrapResults = await parallelLimit(\n missingCacheServers.filter(name => !results.some(r => r.name === name && r.connection)),\n 10,\n async (name) => {\n const definition = config.mcpServers[name];\n try {\n const connection = await manager.connect(name, definition, ctx.signal);\n if (connection.status === \"needs-auth\") {\n return { name, ok: false };\n }\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: direct-tools bootstrap failed for ${name}: ${message}`);\n return { name, ok: false };\n }\n },\n );\n const bootstrapped = bootstrapResults.filter(r => r.ok).map(r => r.name);\n if (bootstrapped.length > 0 && ctx.hasUI) {\n ctx.ui.notify(`MCP: direct tools for ${bootstrapped.join(\", \")} will be available after restart`, \"info\");\n }\n }\n }\n\n lifecycle.setReconnectCallback((serverName) => {\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n state.failureTracker.delete(serverName);\n updateStatusBar(state);\n });\n\n lifecycle.setIdleShutdownCallback((serverName) => {\n const idleMinutes = getEffectiveIdleTimeoutMinutes(state, serverName);\n logger.debug(`${serverName} shut down (idle ${idleMinutes}m)`);\n updateStatusBar(state);\n });\n\n lifecycle.startHealthChecks();\n\n return state;\n}\n\nexport function updateServerMetadata(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const prefix = state.config.settings?.toolPrefix ?? \"server\";\n\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, serverName, prefix);\n state.toolMetadata.set(serverName, metadata);\n}\n\nexport function updateMetadataCache(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const configHash = computeServerHash(definition);\n const existing = loadMetadataCache();\n const existingEntry = existing?.servers?.[serverName];\n\n const tools = serializeTools(connection.tools);\n let resources = definition.exposeResources === false ? [] : serializeResources(connection.resources);\n\n if (\n definition.exposeResources !== false &&\n resources.length === 0 &&\n existingEntry?.resources?.length &&\n existingEntry.configHash === configHash\n ) {\n resources = existingEntry.resources;\n }\n\n const entry: ServerCacheEntry = {\n configHash,\n tools,\n resources,\n cachedAt: Date.now(),\n };\n\n saveMetadataCache({ version: 1, servers: { [serverName]: entry } });\n}\n\nexport function flushMetadataCache(state: McpExtensionState): void {\n for (const [name, connection] of state.manager.getAllConnections()) {\n if (connection.status === \"connected\") {\n updateMetadataCache(state, name);\n }\n }\n}\n\nexport function updateStatusBar(state: McpExtensionState): void {\n const ui = state.ui;\n if (!ui) return;\n const total = Object.keys(state.config.mcpServers).length;\n if (total === 0) {\n ui.setStatus(\"mcp\", undefined);\n return;\n }\n const connectedCount = state.manager.getAllConnections().size;\n ui.setStatus(\"mcp\", ui.theme.fg(\"accent\", `MCP: ${connectedCount}/${total} servers`));\n}\n\nexport function getFailureAgeSeconds(state: McpExtensionState, serverName: string): number | null {\n const failedAt = state.failureTracker.get(serverName);\n if (!failedAt) return null;\n const ageMs = Date.now() - failedAt;\n if (ageMs > FAILURE_BACKOFF_MS) return null;\n return Math.round(ageMs / 1000);\n}\n\nexport async function lazyConnect(state: McpExtensionState, serverName: string, signal?: AbortSignal): Promise<boolean> {\n const connection = state.manager.getConnection(serverName);\n if (connection?.status === \"needs-auth\") {\n return false;\n }\n if (connection?.status === \"connected\") {\n updateServerMetadata(state, serverName);\n return true;\n }\n\n const failedAgo = getFailureAgeSeconds(state, serverName);\n if (failedAgo !== null) return false;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return false;\n\n try {\n if (state.ui) {\n state.ui.setStatus(\"mcp\", `MCP: connecting to ${serverName}...`);\n }\n const newConnection = await state.manager.connect(serverName, definition, signal);\n if (newConnection.status === \"needs-auth\") {\n return false;\n }\n state.failureTracker.delete(serverName);\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n updateStatusBar(state);\n return true;\n } catch (error) {\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n state.failureTracker.set(serverName, Date.now());\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: lazy connect failed for ${serverName}: ${message}`);\n updateStatusBar(state);\n return false;\n }\n}\n\nfunction getEffectiveIdleTimeoutMinutes(state: McpExtensionState, serverName: string): number {\n const definition = state.config.mcpServers[serverName];\n if (!definition) {\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n }\n if (typeof definition.idleTimeout === \"number\") return definition.idleTimeout;\n const mode = definition.lifecycle ?? \"lazy\";\n if (mode === \"eager\") return 0;\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n}\n"]}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA2BpD,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,CAEhF;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;CAAO,GACnF,OAAO,CAAC,iBAAiB,CAAC,CAqM5B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAWvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA+BtF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAMjE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAU9D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhG;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAuCtH","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { ToolMetadata } from \"./types.ts\";\nimport { existsSync } from \"node:fs\";\nimport { loadMcpConfig } from \"./config.ts\";\nimport { ConsentManager } from \"./consent-manager.ts\";\nimport { McpLifecycleManager } from \"./lifecycle.ts\";\nimport {\n computeServerHash,\n getMetadataCachePath,\n isServerCacheValid,\n loadMetadataCache,\n reconstructToolMetadata,\n saveMetadataCache,\n serializeResources,\n serializeTools,\n type ServerCacheEntry,\n} from \"./metadata-cache.ts\";\nimport { McpServerManager } from \"./server-manager.ts\";\nimport { buildToolMetadata, totalToolCount } from \"./tool-metadata.ts\";\nimport { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport { openUrl, parallelLimit } from \"./utils.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getMissingConfiguredDirectToolServers } from \"./direct-tools.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport function isTuiMode(ctx: Pick<ExtensionContext, \"hasUI\" | \"mode\">): boolean {\n return ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function initializeMcp(\n pi: ExtensionAPI,\n ctx: ExtensionContext,\n options: { signal?: AbortSignal; onState?: (state: McpExtensionState) => void } = {},\n): Promise<McpExtensionState> {\n const signal = options.signal ?? ctx.signal;\n throwIfAborted(signal);\n const configPath = pi.getFlag(\"mcp-config\") as string | undefined;\n const config = loadMcpConfig(configPath, ctx.cwd);\n\n const manager = new McpServerManager(ctx.cwd);\n manager.setDefaultRequestTimeoutMs(config.settings?.requestTimeoutMs);\n const samplingAutoApprove = config.settings?.samplingAutoApprove === true;\n if (config.settings?.sampling !== false && (ctx.hasUI || samplingAutoApprove)) {\n manager.setSamplingConfig({\n autoApprove: samplingAutoApprove,\n ui: ctx.hasUI ? ctx.ui : undefined,\n modelRegistry: ctx.modelRegistry,\n getCurrentModel: () => ctx.model,\n getSignal: () => ctx.signal,\n });\n }\n const elicitationEnabled = config.settings?.elicitation !== false && ctx.hasUI;\n if (elicitationEnabled) {\n manager.setElicitationConfig({\n ui: ctx.ui,\n allowUrl: isTuiMode(ctx),\n });\n }\n const lifecycle = new McpLifecycleManager(manager);\n const toolMetadata = new Map<string, ToolMetadata[]>();\n const failureTracker = new Map<string, number>();\n const uiResourceHandler = new UiResourceHandler(manager);\n const consentManager = new ConsentManager(\"once-per-server\");\n const ui = ctx.hasUI ? ctx.ui : undefined;\n const state: McpExtensionState = {\n manager,\n lifecycle,\n toolMetadata,\n config,\n failureTracker,\n uiResourceHandler,\n consentManager,\n uiServer: null,\n completedUiSessions: [],\n openBrowser: (url: string) => openUrl(pi, url, process.env.BROWSER),\n ui,\n sendMessage: (message, options) => pi.sendMessage(message as unknown as Parameters<typeof pi.sendMessage>[0], options),\n };\n\n options.onState?.(state);\n const serverEntries = Object.entries(config.mcpServers);\n if (serverEntries.length === 0) {\n return state;\n }\n\n const idleSetting = typeof config.settings?.idleTimeout === \"number\" ? config.settings.idleTimeout : 10;\n lifecycle.setGlobalIdleTimeout(idleSetting);\n\n const cachePath = getMetadataCachePath();\n const cacheFileExists = existsSync(cachePath);\n let cache = loadMetadataCache();\n let bootstrapAll = false;\n\n if (!cacheFileExists) {\n bootstrapAll = true;\n saveMetadataCache({ version: 1, servers: {} });\n } else if (!cache) {\n cache = { version: 1, servers: {} };\n saveMetadataCache(cache);\n }\n\n const prefix = config.settings?.toolPrefix ?? \"server\";\n\n for (const [name, definition] of serverEntries) {\n const lifecycleMode = definition.lifecycle ?? \"lazy\";\n const idleOverride = definition.idleTimeout ?? (lifecycleMode === \"eager\" ? 0 : undefined);\n lifecycle.registerServer(\n name,\n definition,\n idleOverride !== undefined ? { idleTimeout: idleOverride } : undefined\n );\n if (lifecycleMode === \"keep-alive\") {\n lifecycle.markKeepAlive(name, definition);\n }\n\n if (cache?.servers?.[name] && isServerCacheValid(cache.servers[name], definition)) {\n const metadata = reconstructToolMetadata(name, cache.servers[name], prefix, definition);\n toolMetadata.set(name, metadata);\n }\n }\n\n const startupServers = bootstrapAll\n ? serverEntries\n : serverEntries.filter(([, definition]) => {\n const mode = definition.lifecycle ?? \"lazy\";\n return mode === \"keep-alive\" || mode === \"eager\";\n });\n\n if (ctx.hasUI && startupServers.length > 0) {\n ctx.ui.setStatus(\"mcp\", `MCP: connecting to ${startupServers.length} servers...`);\n }\n\n const results = await parallelLimit(startupServers, 10, async ([name, definition]) => {\n try {\n throwIfAborted(signal);\n const connection = await manager.connect(name, definition, signal);\n if (connection.status === \"needs-auth\") {\n return { name, definition, connection: null, error: `OAuth authentication required. Run /mcp-auth ${name}.` };\n }\n return { name, definition, connection, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, definition, connection: null, error: message };\n }\n });\n\n throwIfAborted(signal);\n for (const { name, definition, connection, error } of results) {\n if (error || !connection) {\n if (ctx.hasUI) {\n ctx.ui.notify(`MCP: Failed to connect to ${name}: ${error}`, \"error\");\n }\n console.error(`MCP: Failed to connect to ${name}: ${error}`);\n continue;\n }\n\n const { metadata, failedTools } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n\n if (failedTools.length > 0 && ctx.hasUI) {\n ctx.ui.notify(\n `MCP: ${name} - ${failedTools.length} tools skipped`,\n \"warning\"\n );\n }\n }\n\n const connectedCount = results.filter(r => r.connection).length;\n const failedCount = results.filter(r => r.error).length;\n if (ctx.hasUI && connectedCount > 0) {\n const totalTools = totalToolCount(state);\n const msg = failedCount > 0\n ? `MCP: ${connectedCount}/${startupServers.length} servers connected (${totalTools} tools)`\n : `MCP: ${connectedCount} servers connected (${totalTools} tools)`;\n ctx.ui.notify(msg, \"info\");\n }\n\n const envDirect = process.env.MCP_DIRECT_TOOLS;\n if (envDirect !== \"__none__\") {\n const currentCache = loadMetadataCache();\n const missingCacheServers = getMissingConfiguredDirectToolServers(config, currentCache);\n\n if (missingCacheServers.length > 0) {\n const bootstrapResults = await parallelLimit(\n missingCacheServers.filter(name => !results.some(r => r.name === name && r.connection)),\n 10,\n async (name) => {\n const definition = config.mcpServers[name];\n try {\n throwIfAborted(signal);\n const connection = await manager.connect(name, definition, signal);\n if (connection.status === \"needs-auth\") {\n return { name, ok: false };\n }\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: direct-tools bootstrap failed for ${name}: ${message}`);\n return { name, ok: false };\n }\n },\n );\n throwIfAborted(signal);\n const bootstrapped = bootstrapResults.filter(r => r.ok).map(r => r.name);\n if (bootstrapped.length > 0 && ctx.hasUI) {\n ctx.ui.notify(`MCP: direct tools for ${bootstrapped.join(\", \")} will be available after restart`, \"info\");\n }\n }\n }\n\n lifecycle.setReconnectCallback((serverName) => {\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n state.failureTracker.delete(serverName);\n updateStatusBar(state);\n });\n\n lifecycle.setIdleShutdownCallback((serverName) => {\n const idleMinutes = getEffectiveIdleTimeoutMinutes(state, serverName);\n logger.debug(`${serverName} shut down (idle ${idleMinutes}m)`);\n updateStatusBar(state);\n });\n\n lifecycle.startHealthChecks();\n\n return state;\n}\n\nexport function updateServerMetadata(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const prefix = state.config.settings?.toolPrefix ?? \"server\";\n\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, serverName, prefix);\n state.toolMetadata.set(serverName, metadata);\n}\n\nexport function updateMetadataCache(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const configHash = computeServerHash(definition);\n const existing = loadMetadataCache();\n const existingEntry = existing?.servers?.[serverName];\n\n const tools = serializeTools(connection.tools);\n let resources = definition.exposeResources === false ? [] : serializeResources(connection.resources);\n\n if (\n definition.exposeResources !== false &&\n resources.length === 0 &&\n existingEntry?.resources?.length &&\n existingEntry.configHash === configHash\n ) {\n resources = existingEntry.resources;\n }\n\n const entry: ServerCacheEntry = {\n configHash,\n tools,\n resources,\n cachedAt: Date.now(),\n };\n\n saveMetadataCache({ version: 1, servers: { [serverName]: entry } });\n}\n\nexport function flushMetadataCache(state: McpExtensionState): void {\n for (const [name, connection] of state.manager.getAllConnections()) {\n if (connection.status === \"connected\") {\n updateMetadataCache(state, name);\n }\n }\n}\n\nexport function updateStatusBar(state: McpExtensionState): void {\n const ui = state.ui;\n if (!ui) return;\n const total = Object.keys(state.config.mcpServers).length;\n if (total === 0) {\n ui.setStatus(\"mcp\", undefined);\n return;\n }\n const connectedCount = state.manager.getAllConnections().size;\n ui.setStatus(\"mcp\", ui.theme.fg(\"accent\", `MCP: ${connectedCount}/${total} servers`));\n}\n\nexport function getFailureAgeSeconds(state: McpExtensionState, serverName: string): number | null {\n const failedAt = state.failureTracker.get(serverName);\n if (!failedAt) return null;\n const ageMs = Date.now() - failedAt;\n if (ageMs > FAILURE_BACKOFF_MS) return null;\n return Math.round(ageMs / 1000);\n}\n\nexport async function lazyConnect(state: McpExtensionState, serverName: string, signal?: AbortSignal): Promise<boolean> {\n const connection = state.manager.getConnection(serverName);\n if (connection?.status === \"needs-auth\") {\n return false;\n }\n if (connection?.status === \"connected\") {\n updateServerMetadata(state, serverName);\n return true;\n }\n\n const failedAgo = getFailureAgeSeconds(state, serverName);\n if (failedAgo !== null) return false;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return false;\n\n try {\n if (state.ui) {\n state.ui.setStatus(\"mcp\", `MCP: connecting to ${serverName}...`);\n }\n const newConnection = await state.manager.connect(serverName, definition, signal);\n if (newConnection.status === \"needs-auth\") {\n return false;\n }\n state.failureTracker.delete(serverName);\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n updateStatusBar(state);\n return true;\n } catch (error) {\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n state.failureTracker.set(serverName, Date.now());\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: lazy connect failed for ${serverName}: ${message}`);\n updateStatusBar(state);\n return false;\n }\n}\n\nfunction getEffectiveIdleTimeoutMinutes(state: McpExtensionState, serverName: string): number {\n const definition = state.config.mcpServers[serverName];\n if (!definition) {\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n }\n if (typeof definition.idleTimeout === \"number\") return definition.idleTimeout;\n const mode = definition.lifecycle ?? \"lazy\";\n if (mode === \"eager\") return 0;\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n}\n"]}
@@ -14,7 +14,9 @@ const FAILURE_BACKOFF_MS = 60 * 1000;
14
14
  export function isTuiMode(ctx) {
15
15
  return ctx.hasUI && ctx.mode === "tui";
16
16
  }
17
- export async function initializeMcp(pi, ctx) {
17
+ export async function initializeMcp(pi, ctx, options = {}) {
18
+ const signal = options.signal ?? ctx.signal;
19
+ throwIfAborted(signal);
18
20
  const configPath = pi.getFlag("mcp-config");
19
21
  const config = loadMcpConfig(configPath, ctx.cwd);
20
22
  const manager = new McpServerManager(ctx.cwd);
@@ -56,6 +58,7 @@ export async function initializeMcp(pi, ctx) {
56
58
  ui,
57
59
  sendMessage: (message, options) => pi.sendMessage(message, options),
58
60
  };
61
+ options.onState?.(state);
59
62
  const serverEntries = Object.entries(config.mcpServers);
60
63
  if (serverEntries.length === 0) {
61
64
  return state;
@@ -98,7 +101,8 @@ export async function initializeMcp(pi, ctx) {
98
101
  }
99
102
  const results = await parallelLimit(startupServers, 10, async ([name, definition]) => {
100
103
  try {
101
- const connection = await manager.connect(name, definition, ctx.signal);
104
+ throwIfAborted(signal);
105
+ const connection = await manager.connect(name, definition, signal);
102
106
  if (connection.status === "needs-auth") {
103
107
  return { name, definition, connection: null, error: `OAuth authentication required. Run /mcp-auth ${name}.` };
104
108
  }
@@ -109,6 +113,7 @@ export async function initializeMcp(pi, ctx) {
109
113
  return { name, definition, connection: null, error: message };
110
114
  }
111
115
  });
116
+ throwIfAborted(signal);
112
117
  for (const { name, definition, connection, error } of results) {
113
118
  if (error || !connection) {
114
119
  if (ctx.hasUI) {
@@ -141,7 +146,8 @@ export async function initializeMcp(pi, ctx) {
141
146
  const bootstrapResults = await parallelLimit(missingCacheServers.filter(name => !results.some(r => r.name === name && r.connection)), 10, async (name) => {
142
147
  const definition = config.mcpServers[name];
143
148
  try {
144
- const connection = await manager.connect(name, definition, ctx.signal);
149
+ throwIfAborted(signal);
150
+ const connection = await manager.connect(name, definition, signal);
145
151
  if (connection.status === "needs-auth") {
146
152
  return { name, ok: false };
147
153
  }
@@ -156,6 +162,7 @@ export async function initializeMcp(pi, ctx) {
156
162
  return { name, ok: false };
157
163
  }
158
164
  });
165
+ throwIfAborted(signal);
159
166
  const bootstrapped = bootstrapResults.filter(r => r.ok).map(r => r.name);
160
167
  if (bootstrapped.length > 0 && ctx.hasUI) {
161
168
  ctx.ui.notify(`MCP: direct tools for ${bootstrapped.join(", ")} will be available after restart`, "info");
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/init.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { ToolMetadata } from \"./types.ts\";\nimport { existsSync } from \"node:fs\";\nimport { loadMcpConfig } from \"./config.ts\";\nimport { ConsentManager } from \"./consent-manager.ts\";\nimport { McpLifecycleManager } from \"./lifecycle.ts\";\nimport {\n computeServerHash,\n getMetadataCachePath,\n isServerCacheValid,\n loadMetadataCache,\n reconstructToolMetadata,\n saveMetadataCache,\n serializeResources,\n serializeTools,\n type ServerCacheEntry,\n} from \"./metadata-cache.ts\";\nimport { McpServerManager } from \"./server-manager.ts\";\nimport { buildToolMetadata, totalToolCount } from \"./tool-metadata.ts\";\nimport { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport { openUrl, parallelLimit } from \"./utils.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getMissingConfiguredDirectToolServers } from \"./direct-tools.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport function isTuiMode(ctx: Pick<ExtensionContext, \"hasUI\" | \"mode\">): boolean {\n return ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function initializeMcp(\n pi: ExtensionAPI,\n ctx: ExtensionContext\n): Promise<McpExtensionState> {\n const configPath = pi.getFlag(\"mcp-config\") as string | undefined;\n const config = loadMcpConfig(configPath, ctx.cwd);\n\n const manager = new McpServerManager(ctx.cwd);\n manager.setDefaultRequestTimeoutMs(config.settings?.requestTimeoutMs);\n const samplingAutoApprove = config.settings?.samplingAutoApprove === true;\n if (config.settings?.sampling !== false && (ctx.hasUI || samplingAutoApprove)) {\n manager.setSamplingConfig({\n autoApprove: samplingAutoApprove,\n ui: ctx.hasUI ? ctx.ui : undefined,\n modelRegistry: ctx.modelRegistry,\n getCurrentModel: () => ctx.model,\n getSignal: () => ctx.signal,\n });\n }\n const elicitationEnabled = config.settings?.elicitation !== false && ctx.hasUI;\n if (elicitationEnabled) {\n manager.setElicitationConfig({\n ui: ctx.ui,\n allowUrl: isTuiMode(ctx),\n });\n }\n const lifecycle = new McpLifecycleManager(manager);\n const toolMetadata = new Map<string, ToolMetadata[]>();\n const failureTracker = new Map<string, number>();\n const uiResourceHandler = new UiResourceHandler(manager);\n const consentManager = new ConsentManager(\"once-per-server\");\n const ui = ctx.hasUI ? ctx.ui : undefined;\n const state: McpExtensionState = {\n manager,\n lifecycle,\n toolMetadata,\n config,\n failureTracker,\n uiResourceHandler,\n consentManager,\n uiServer: null,\n completedUiSessions: [],\n openBrowser: (url: string) => openUrl(pi, url, process.env.BROWSER),\n ui,\n sendMessage: (message, options) => pi.sendMessage(message as unknown as Parameters<typeof pi.sendMessage>[0], options),\n };\n\n const serverEntries = Object.entries(config.mcpServers);\n if (serverEntries.length === 0) {\n return state;\n }\n\n const idleSetting = typeof config.settings?.idleTimeout === \"number\" ? config.settings.idleTimeout : 10;\n lifecycle.setGlobalIdleTimeout(idleSetting);\n\n const cachePath = getMetadataCachePath();\n const cacheFileExists = existsSync(cachePath);\n let cache = loadMetadataCache();\n let bootstrapAll = false;\n\n if (!cacheFileExists) {\n bootstrapAll = true;\n saveMetadataCache({ version: 1, servers: {} });\n } else if (!cache) {\n cache = { version: 1, servers: {} };\n saveMetadataCache(cache);\n }\n\n const prefix = config.settings?.toolPrefix ?? \"server\";\n\n for (const [name, definition] of serverEntries) {\n const lifecycleMode = definition.lifecycle ?? \"lazy\";\n const idleOverride = definition.idleTimeout ?? (lifecycleMode === \"eager\" ? 0 : undefined);\n lifecycle.registerServer(\n name,\n definition,\n idleOverride !== undefined ? { idleTimeout: idleOverride } : undefined\n );\n if (lifecycleMode === \"keep-alive\") {\n lifecycle.markKeepAlive(name, definition);\n }\n\n if (cache?.servers?.[name] && isServerCacheValid(cache.servers[name], definition)) {\n const metadata = reconstructToolMetadata(name, cache.servers[name], prefix, definition);\n toolMetadata.set(name, metadata);\n }\n }\n\n const startupServers = bootstrapAll\n ? serverEntries\n : serverEntries.filter(([, definition]) => {\n const mode = definition.lifecycle ?? \"lazy\";\n return mode === \"keep-alive\" || mode === \"eager\";\n });\n\n if (ctx.hasUI && startupServers.length > 0) {\n ctx.ui.setStatus(\"mcp\", `MCP: connecting to ${startupServers.length} servers...`);\n }\n\n const results = await parallelLimit(startupServers, 10, async ([name, definition]) => {\n try {\n const connection = await manager.connect(name, definition, ctx.signal);\n if (connection.status === \"needs-auth\") {\n return { name, definition, connection: null, error: `OAuth authentication required. Run /mcp-auth ${name}.` };\n }\n return { name, definition, connection, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, definition, connection: null, error: message };\n }\n });\n\n for (const { name, definition, connection, error } of results) {\n if (error || !connection) {\n if (ctx.hasUI) {\n ctx.ui.notify(`MCP: Failed to connect to ${name}: ${error}`, \"error\");\n }\n console.error(`MCP: Failed to connect to ${name}: ${error}`);\n continue;\n }\n\n const { metadata, failedTools } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n\n if (failedTools.length > 0 && ctx.hasUI) {\n ctx.ui.notify(\n `MCP: ${name} - ${failedTools.length} tools skipped`,\n \"warning\"\n );\n }\n }\n\n const connectedCount = results.filter(r => r.connection).length;\n const failedCount = results.filter(r => r.error).length;\n if (ctx.hasUI && connectedCount > 0) {\n const totalTools = totalToolCount(state);\n const msg = failedCount > 0\n ? `MCP: ${connectedCount}/${startupServers.length} servers connected (${totalTools} tools)`\n : `MCP: ${connectedCount} servers connected (${totalTools} tools)`;\n ctx.ui.notify(msg, \"info\");\n }\n\n const envDirect = process.env.MCP_DIRECT_TOOLS;\n if (envDirect !== \"__none__\") {\n const currentCache = loadMetadataCache();\n const missingCacheServers = getMissingConfiguredDirectToolServers(config, currentCache);\n\n if (missingCacheServers.length > 0) {\n const bootstrapResults = await parallelLimit(\n missingCacheServers.filter(name => !results.some(r => r.name === name && r.connection)),\n 10,\n async (name) => {\n const definition = config.mcpServers[name];\n try {\n const connection = await manager.connect(name, definition, ctx.signal);\n if (connection.status === \"needs-auth\") {\n return { name, ok: false };\n }\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: direct-tools bootstrap failed for ${name}: ${message}`);\n return { name, ok: false };\n }\n },\n );\n const bootstrapped = bootstrapResults.filter(r => r.ok).map(r => r.name);\n if (bootstrapped.length > 0 && ctx.hasUI) {\n ctx.ui.notify(`MCP: direct tools for ${bootstrapped.join(\", \")} will be available after restart`, \"info\");\n }\n }\n }\n\n lifecycle.setReconnectCallback((serverName) => {\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n state.failureTracker.delete(serverName);\n updateStatusBar(state);\n });\n\n lifecycle.setIdleShutdownCallback((serverName) => {\n const idleMinutes = getEffectiveIdleTimeoutMinutes(state, serverName);\n logger.debug(`${serverName} shut down (idle ${idleMinutes}m)`);\n updateStatusBar(state);\n });\n\n lifecycle.startHealthChecks();\n\n return state;\n}\n\nexport function updateServerMetadata(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const prefix = state.config.settings?.toolPrefix ?? \"server\";\n\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, serverName, prefix);\n state.toolMetadata.set(serverName, metadata);\n}\n\nexport function updateMetadataCache(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const configHash = computeServerHash(definition);\n const existing = loadMetadataCache();\n const existingEntry = existing?.servers?.[serverName];\n\n const tools = serializeTools(connection.tools);\n let resources = definition.exposeResources === false ? [] : serializeResources(connection.resources);\n\n if (\n definition.exposeResources !== false &&\n resources.length === 0 &&\n existingEntry?.resources?.length &&\n existingEntry.configHash === configHash\n ) {\n resources = existingEntry.resources;\n }\n\n const entry: ServerCacheEntry = {\n configHash,\n tools,\n resources,\n cachedAt: Date.now(),\n };\n\n saveMetadataCache({ version: 1, servers: { [serverName]: entry } });\n}\n\nexport function flushMetadataCache(state: McpExtensionState): void {\n for (const [name, connection] of state.manager.getAllConnections()) {\n if (connection.status === \"connected\") {\n updateMetadataCache(state, name);\n }\n }\n}\n\nexport function updateStatusBar(state: McpExtensionState): void {\n const ui = state.ui;\n if (!ui) return;\n const total = Object.keys(state.config.mcpServers).length;\n if (total === 0) {\n ui.setStatus(\"mcp\", undefined);\n return;\n }\n const connectedCount = state.manager.getAllConnections().size;\n ui.setStatus(\"mcp\", ui.theme.fg(\"accent\", `MCP: ${connectedCount}/${total} servers`));\n}\n\nexport function getFailureAgeSeconds(state: McpExtensionState, serverName: string): number | null {\n const failedAt = state.failureTracker.get(serverName);\n if (!failedAt) return null;\n const ageMs = Date.now() - failedAt;\n if (ageMs > FAILURE_BACKOFF_MS) return null;\n return Math.round(ageMs / 1000);\n}\n\nexport async function lazyConnect(state: McpExtensionState, serverName: string, signal?: AbortSignal): Promise<boolean> {\n const connection = state.manager.getConnection(serverName);\n if (connection?.status === \"needs-auth\") {\n return false;\n }\n if (connection?.status === \"connected\") {\n updateServerMetadata(state, serverName);\n return true;\n }\n\n const failedAgo = getFailureAgeSeconds(state, serverName);\n if (failedAgo !== null) return false;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return false;\n\n try {\n if (state.ui) {\n state.ui.setStatus(\"mcp\", `MCP: connecting to ${serverName}...`);\n }\n const newConnection = await state.manager.connect(serverName, definition, signal);\n if (newConnection.status === \"needs-auth\") {\n return false;\n }\n state.failureTracker.delete(serverName);\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n updateStatusBar(state);\n return true;\n } catch (error) {\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n state.failureTracker.set(serverName, Date.now());\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: lazy connect failed for ${serverName}: ${message}`);\n updateStatusBar(state);\n return false;\n }\n}\n\nfunction getEffectiveIdleTimeoutMinutes(state: McpExtensionState, serverName: string): number {\n const definition = state.config.mcpServers[serverName];\n if (!definition) {\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n }\n if (typeof definition.idleTimeout === \"number\") return definition.idleTimeout;\n const mode = definition.lifecycle ?? \"lazy\";\n if (mode === \"eager\") return 0;\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n}\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/init.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { ToolMetadata } from \"./types.ts\";\nimport { existsSync } from \"node:fs\";\nimport { loadMcpConfig } from \"./config.ts\";\nimport { ConsentManager } from \"./consent-manager.ts\";\nimport { McpLifecycleManager } from \"./lifecycle.ts\";\nimport {\n computeServerHash,\n getMetadataCachePath,\n isServerCacheValid,\n loadMetadataCache,\n reconstructToolMetadata,\n saveMetadataCache,\n serializeResources,\n serializeTools,\n type ServerCacheEntry,\n} from \"./metadata-cache.ts\";\nimport { McpServerManager } from \"./server-manager.ts\";\nimport { buildToolMetadata, totalToolCount } from \"./tool-metadata.ts\";\nimport { UiResourceHandler } from \"./ui-resource-handler.ts\";\nimport { openUrl, parallelLimit } from \"./utils.ts\";\nimport { logger } from \"./logger.ts\";\nimport { getMissingConfiguredDirectToolServers } from \"./direct-tools.ts\";\nimport { throwIfAborted } from \"./abort.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport function isTuiMode(ctx: Pick<ExtensionContext, \"hasUI\" | \"mode\">): boolean {\n return ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function initializeMcp(\n pi: ExtensionAPI,\n ctx: ExtensionContext,\n options: { signal?: AbortSignal; onState?: (state: McpExtensionState) => void } = {},\n): Promise<McpExtensionState> {\n const signal = options.signal ?? ctx.signal;\n throwIfAborted(signal);\n const configPath = pi.getFlag(\"mcp-config\") as string | undefined;\n const config = loadMcpConfig(configPath, ctx.cwd);\n\n const manager = new McpServerManager(ctx.cwd);\n manager.setDefaultRequestTimeoutMs(config.settings?.requestTimeoutMs);\n const samplingAutoApprove = config.settings?.samplingAutoApprove === true;\n if (config.settings?.sampling !== false && (ctx.hasUI || samplingAutoApprove)) {\n manager.setSamplingConfig({\n autoApprove: samplingAutoApprove,\n ui: ctx.hasUI ? ctx.ui : undefined,\n modelRegistry: ctx.modelRegistry,\n getCurrentModel: () => ctx.model,\n getSignal: () => ctx.signal,\n });\n }\n const elicitationEnabled = config.settings?.elicitation !== false && ctx.hasUI;\n if (elicitationEnabled) {\n manager.setElicitationConfig({\n ui: ctx.ui,\n allowUrl: isTuiMode(ctx),\n });\n }\n const lifecycle = new McpLifecycleManager(manager);\n const toolMetadata = new Map<string, ToolMetadata[]>();\n const failureTracker = new Map<string, number>();\n const uiResourceHandler = new UiResourceHandler(manager);\n const consentManager = new ConsentManager(\"once-per-server\");\n const ui = ctx.hasUI ? ctx.ui : undefined;\n const state: McpExtensionState = {\n manager,\n lifecycle,\n toolMetadata,\n config,\n failureTracker,\n uiResourceHandler,\n consentManager,\n uiServer: null,\n completedUiSessions: [],\n openBrowser: (url: string) => openUrl(pi, url, process.env.BROWSER),\n ui,\n sendMessage: (message, options) => pi.sendMessage(message as unknown as Parameters<typeof pi.sendMessage>[0], options),\n };\n\n options.onState?.(state);\n const serverEntries = Object.entries(config.mcpServers);\n if (serverEntries.length === 0) {\n return state;\n }\n\n const idleSetting = typeof config.settings?.idleTimeout === \"number\" ? config.settings.idleTimeout : 10;\n lifecycle.setGlobalIdleTimeout(idleSetting);\n\n const cachePath = getMetadataCachePath();\n const cacheFileExists = existsSync(cachePath);\n let cache = loadMetadataCache();\n let bootstrapAll = false;\n\n if (!cacheFileExists) {\n bootstrapAll = true;\n saveMetadataCache({ version: 1, servers: {} });\n } else if (!cache) {\n cache = { version: 1, servers: {} };\n saveMetadataCache(cache);\n }\n\n const prefix = config.settings?.toolPrefix ?? \"server\";\n\n for (const [name, definition] of serverEntries) {\n const lifecycleMode = definition.lifecycle ?? \"lazy\";\n const idleOverride = definition.idleTimeout ?? (lifecycleMode === \"eager\" ? 0 : undefined);\n lifecycle.registerServer(\n name,\n definition,\n idleOverride !== undefined ? { idleTimeout: idleOverride } : undefined\n );\n if (lifecycleMode === \"keep-alive\") {\n lifecycle.markKeepAlive(name, definition);\n }\n\n if (cache?.servers?.[name] && isServerCacheValid(cache.servers[name], definition)) {\n const metadata = reconstructToolMetadata(name, cache.servers[name], prefix, definition);\n toolMetadata.set(name, metadata);\n }\n }\n\n const startupServers = bootstrapAll\n ? serverEntries\n : serverEntries.filter(([, definition]) => {\n const mode = definition.lifecycle ?? \"lazy\";\n return mode === \"keep-alive\" || mode === \"eager\";\n });\n\n if (ctx.hasUI && startupServers.length > 0) {\n ctx.ui.setStatus(\"mcp\", `MCP: connecting to ${startupServers.length} servers...`);\n }\n\n const results = await parallelLimit(startupServers, 10, async ([name, definition]) => {\n try {\n throwIfAborted(signal);\n const connection = await manager.connect(name, definition, signal);\n if (connection.status === \"needs-auth\") {\n return { name, definition, connection: null, error: `OAuth authentication required. Run /mcp-auth ${name}.` };\n }\n return { name, definition, connection, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, definition, connection: null, error: message };\n }\n });\n\n throwIfAborted(signal);\n for (const { name, definition, connection, error } of results) {\n if (error || !connection) {\n if (ctx.hasUI) {\n ctx.ui.notify(`MCP: Failed to connect to ${name}: ${error}`, \"error\");\n }\n console.error(`MCP: Failed to connect to ${name}: ${error}`);\n continue;\n }\n\n const { metadata, failedTools } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n\n if (failedTools.length > 0 && ctx.hasUI) {\n ctx.ui.notify(\n `MCP: ${name} - ${failedTools.length} tools skipped`,\n \"warning\"\n );\n }\n }\n\n const connectedCount = results.filter(r => r.connection).length;\n const failedCount = results.filter(r => r.error).length;\n if (ctx.hasUI && connectedCount > 0) {\n const totalTools = totalToolCount(state);\n const msg = failedCount > 0\n ? `MCP: ${connectedCount}/${startupServers.length} servers connected (${totalTools} tools)`\n : `MCP: ${connectedCount} servers connected (${totalTools} tools)`;\n ctx.ui.notify(msg, \"info\");\n }\n\n const envDirect = process.env.MCP_DIRECT_TOOLS;\n if (envDirect !== \"__none__\") {\n const currentCache = loadMetadataCache();\n const missingCacheServers = getMissingConfiguredDirectToolServers(config, currentCache);\n\n if (missingCacheServers.length > 0) {\n const bootstrapResults = await parallelLimit(\n missingCacheServers.filter(name => !results.some(r => r.name === name && r.connection)),\n 10,\n async (name) => {\n const definition = config.mcpServers[name];\n try {\n throwIfAborted(signal);\n const connection = await manager.connect(name, definition, signal);\n if (connection.status === \"needs-auth\") {\n return { name, ok: false };\n }\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, name, prefix);\n toolMetadata.set(name, metadata);\n updateMetadataCache(state, name);\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: direct-tools bootstrap failed for ${name}: ${message}`);\n return { name, ok: false };\n }\n },\n );\n throwIfAborted(signal);\n const bootstrapped = bootstrapResults.filter(r => r.ok).map(r => r.name);\n if (bootstrapped.length > 0 && ctx.hasUI) {\n ctx.ui.notify(`MCP: direct tools for ${bootstrapped.join(\", \")} will be available after restart`, \"info\");\n }\n }\n }\n\n lifecycle.setReconnectCallback((serverName) => {\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n state.failureTracker.delete(serverName);\n updateStatusBar(state);\n });\n\n lifecycle.setIdleShutdownCallback((serverName) => {\n const idleMinutes = getEffectiveIdleTimeoutMinutes(state, serverName);\n logger.debug(`${serverName} shut down (idle ${idleMinutes}m)`);\n updateStatusBar(state);\n });\n\n lifecycle.startHealthChecks();\n\n return state;\n}\n\nexport function updateServerMetadata(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const prefix = state.config.settings?.toolPrefix ?? \"server\";\n\n const { metadata } = buildToolMetadata(connection.tools, connection.resources, definition, serverName, prefix);\n state.toolMetadata.set(serverName, metadata);\n}\n\nexport function updateMetadataCache(state: McpExtensionState, serverName: string): void {\n const connection = state.manager.getConnection(serverName);\n if (!connection || connection.status !== \"connected\") return;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return;\n\n const configHash = computeServerHash(definition);\n const existing = loadMetadataCache();\n const existingEntry = existing?.servers?.[serverName];\n\n const tools = serializeTools(connection.tools);\n let resources = definition.exposeResources === false ? [] : serializeResources(connection.resources);\n\n if (\n definition.exposeResources !== false &&\n resources.length === 0 &&\n existingEntry?.resources?.length &&\n existingEntry.configHash === configHash\n ) {\n resources = existingEntry.resources;\n }\n\n const entry: ServerCacheEntry = {\n configHash,\n tools,\n resources,\n cachedAt: Date.now(),\n };\n\n saveMetadataCache({ version: 1, servers: { [serverName]: entry } });\n}\n\nexport function flushMetadataCache(state: McpExtensionState): void {\n for (const [name, connection] of state.manager.getAllConnections()) {\n if (connection.status === \"connected\") {\n updateMetadataCache(state, name);\n }\n }\n}\n\nexport function updateStatusBar(state: McpExtensionState): void {\n const ui = state.ui;\n if (!ui) return;\n const total = Object.keys(state.config.mcpServers).length;\n if (total === 0) {\n ui.setStatus(\"mcp\", undefined);\n return;\n }\n const connectedCount = state.manager.getAllConnections().size;\n ui.setStatus(\"mcp\", ui.theme.fg(\"accent\", `MCP: ${connectedCount}/${total} servers`));\n}\n\nexport function getFailureAgeSeconds(state: McpExtensionState, serverName: string): number | null {\n const failedAt = state.failureTracker.get(serverName);\n if (!failedAt) return null;\n const ageMs = Date.now() - failedAt;\n if (ageMs > FAILURE_BACKOFF_MS) return null;\n return Math.round(ageMs / 1000);\n}\n\nexport async function lazyConnect(state: McpExtensionState, serverName: string, signal?: AbortSignal): Promise<boolean> {\n const connection = state.manager.getConnection(serverName);\n if (connection?.status === \"needs-auth\") {\n return false;\n }\n if (connection?.status === \"connected\") {\n updateServerMetadata(state, serverName);\n return true;\n }\n\n const failedAgo = getFailureAgeSeconds(state, serverName);\n if (failedAgo !== null) return false;\n\n const definition = state.config.mcpServers[serverName];\n if (!definition) return false;\n\n try {\n if (state.ui) {\n state.ui.setStatus(\"mcp\", `MCP: connecting to ${serverName}...`);\n }\n const newConnection = await state.manager.connect(serverName, definition, signal);\n if (newConnection.status === \"needs-auth\") {\n return false;\n }\n state.failureTracker.delete(serverName);\n updateServerMetadata(state, serverName);\n updateMetadataCache(state, serverName);\n updateStatusBar(state);\n return true;\n } catch (error) {\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n state.failureTracker.set(serverName, Date.now());\n const message = error instanceof Error ? error.message : String(error);\n logger.debug(`MCP: lazy connect failed for ${serverName}: ${message}`);\n updateStatusBar(state);\n return false;\n }\n}\n\nfunction getEffectiveIdleTimeoutMinutes(state: McpExtensionState, serverName: string): number {\n const definition = state.config.mcpServers[serverName];\n if (!definition) {\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n }\n if (typeof definition.idleTimeout === \"number\") return definition.idleTimeout;\n const mode = definition.lifecycle ?? \"lazy\";\n if (mode === \"eager\") return 0;\n return typeof state.config.settings?.idleTimeout === \"number\" ? state.config.settings.idleTimeout : 10;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-cache.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/metadata-cache.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQlF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAYxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAuB5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,CAmBjE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,WAAW,EACvB,QAAQ,GAAE,MAAyB,GAClC,OAAO,CAKT;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,EACnC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC,GAChE,YAAY,EAAE,CAqChB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAU7D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAQ7E","sourcesContent":["// @ts-nocheck\n// metadata-cache.ts - Persistent MCP metadata cache\nimport { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getAgentPath } from \"./agent-dir.ts\";\nimport { createHash } from \"node:crypto\";\nimport { getToolUiResourceUri } from \"@modelcontextprotocol/ext-apps/app-bridge\";\nimport type { McpTool, McpResource, ServerEntry, ToolMetadata } from \"./types.ts\";\nimport { formatToolName, isToolExcluded } from \"./types.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\n\nconst CACHE_VERSION = 1;\nconst CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface CachedTool {\n name: string;\n description?: string;\n inputSchema?: unknown;\n uiResourceUri?: string;\n uiStreamMode?: \"eager\" | \"stream-first\";\n}\n\nexport interface CachedResource {\n uri: string;\n name: string;\n description?: string;\n}\n\nexport interface ServerCacheEntry {\n configHash: string;\n tools: CachedTool[];\n resources: CachedResource[];\n cachedAt: number;\n}\n\nexport interface MetadataCache {\n version: number;\n servers: Record<string, ServerCacheEntry>;\n}\n\nexport function getMetadataCachePath(): string {\n return getAgentPath(\"mcp-cache.json\");\n}\n\nexport function loadMetadataCache(): MetadataCache | null {\n const cachePath = getMetadataCachePath();\n if (!existsSync(cachePath)) return null;\n try {\n const raw = JSON.parse(readFileSync(cachePath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\") return null;\n if (raw.version !== CACHE_VERSION) return null;\n if (!raw.servers || typeof raw.servers !== \"object\") return null;\n return raw as MetadataCache;\n } catch {\n return null;\n }\n}\n\nexport function saveMetadataCache(cache: MetadataCache): void {\n const cachePath = getMetadataCachePath();\n const dir = dirname(cachePath);\n mkdirSync(dir, { recursive: true });\n\n let merged: MetadataCache = { version: CACHE_VERSION, servers: {} };\n try {\n if (existsSync(cachePath)) {\n const existing = JSON.parse(readFileSync(cachePath, \"utf-8\")) as MetadataCache;\n if (existing && existing.version === CACHE_VERSION && existing.servers) {\n merged.servers = { ...existing.servers };\n }\n }\n } catch {\n // Ignore parse errors and proceed with empty cache\n }\n\n merged.version = CACHE_VERSION;\n merged.servers = { ...merged.servers, ...cache.servers };\n\n const tmpPath = `${cachePath}.${process.pid}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(merged, null, 2), \"utf-8\");\n renameSync(tmpPath, cachePath);\n}\n\nexport function computeServerHash(definition: ServerEntry): string {\n // Hash only fields that affect server identity and tool/resource output.\n // Exclude lifecycle, idleTimeout, requestTimeoutMs, debug — those are runtime behavior settings\n // that don't change which tools a server exposes.\n const identity: Record<string, unknown> = {\n command: definition.command,\n args: definition.args,\n env: interpolateEnvRecord(definition.env),\n cwd: resolveConfigPath(definition.cwd),\n url: definition.url,\n headers: interpolateEnvRecord(definition.headers),\n auth: definition.auth,\n bearerToken: resolveBearerToken(definition),\n bearerTokenEnv: definition.bearerTokenEnv,\n exposeResources: definition.exposeResources,\n excludeTools: definition.excludeTools,\n };\n const normalized = stableStringify(identity);\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n}\n\nexport function isServerCacheValid(\n entry: ServerCacheEntry,\n definition: ServerEntry,\n maxAgeMs: number = CACHE_MAX_AGE_MS\n): boolean {\n if (!entry || entry.configHash !== computeServerHash(definition)) return false;\n if (!entry.cachedAt || typeof entry.cachedAt !== \"number\") return false;\n if (maxAgeMs > 0 && Date.now() - entry.cachedAt > maxAgeMs) return false;\n return true;\n}\n\nexport function reconstructToolMetadata(\n serverName: string,\n entry: ServerCacheEntry,\n prefix: \"server\" | \"none\" | \"short\",\n definition: Pick<ServerEntry, \"exposeResources\" | \"excludeTools\">\n): ToolMetadata[] {\n const metadata: ToolMetadata[] = [];\n\n for (const tool of entry.tools ?? []) {\n if (!tool?.name) continue;\n if (isToolExcluded(tool.name, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(tool.name, serverName, prefix),\n originalName: tool.name,\n description: tool.description ?? \"\",\n inputSchema: tool.inputSchema,\n uiResourceUri: tool.uiResourceUri,\n uiStreamMode: tool.uiStreamMode,\n });\n }\n\n if (definition.exposeResources !== false) {\n for (const resource of entry.resources ?? []) {\n if (!resource?.name || !resource?.uri) continue;\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n if (isToolExcluded(baseName, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(baseName, serverName, prefix),\n originalName: baseName,\n description: resource.description ?? `Read resource: ${resource.uri}`,\n resourceUri: resource.uri,\n });\n }\n }\n\n return metadata;\n}\n\nexport function serializeTools(tools: McpTool[]): CachedTool[] {\n return tools\n .filter(t => t?.name)\n .map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n uiResourceUri: tryGetToolUiResourceUri(t),\n uiStreamMode: extractToolUiStreamMode(t._meta),\n }));\n}\n\nexport function serializeResources(resources: McpResource[]): CachedResource[] {\n return resources\n .filter(r => r?.name && r?.uri)\n .map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n }));\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== \"object\") {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? \"undefined\" : serialized;\n }\n if (Array.isArray(value)) {\n return `[${value.map(v => stableStringify(v)).join(\",\")}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return `{${keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(\",\")}}`;\n}\n\nfunction tryGetToolUiResourceUri(tool: McpTool): string | undefined {\n try {\n return getToolUiResourceUri({ _meta: tool._meta });\n } catch {\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"metadata-cache.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/metadata-cache.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQlF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAYxD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAuB5D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,CAmBjE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,WAAW,EACvB,QAAQ,GAAE,MAAyB,GAClC,OAAO,CAKT;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,EACnC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC,GAChE,YAAY,EAAE,CAqChB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAU7D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAQ7E","sourcesContent":["// @ts-nocheck\n// metadata-cache.ts - Persistent MCP metadata cache\nimport { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getAgentPath } from \"./agent-dir.ts\";\nimport { createHash } from \"node:crypto\";\nimport { createRequire } from \"node:module\";\nimport type { McpTool, McpResource, ServerEntry, ToolMetadata } from \"./types.ts\";\nimport { formatToolName, isToolExcluded } from \"./types.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\n\nconst CACHE_VERSION = 1;\nconst CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface CachedTool {\n name: string;\n description?: string;\n inputSchema?: unknown;\n uiResourceUri?: string;\n uiStreamMode?: \"eager\" | \"stream-first\";\n}\n\nexport interface CachedResource {\n uri: string;\n name: string;\n description?: string;\n}\n\nexport interface ServerCacheEntry {\n configHash: string;\n tools: CachedTool[];\n resources: CachedResource[];\n cachedAt: number;\n}\n\nexport interface MetadataCache {\n version: number;\n servers: Record<string, ServerCacheEntry>;\n}\n\nexport function getMetadataCachePath(): string {\n return getAgentPath(\"mcp-cache.json\");\n}\n\nexport function loadMetadataCache(): MetadataCache | null {\n const cachePath = getMetadataCachePath();\n if (!existsSync(cachePath)) return null;\n try {\n const raw = JSON.parse(readFileSync(cachePath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\") return null;\n if (raw.version !== CACHE_VERSION) return null;\n if (!raw.servers || typeof raw.servers !== \"object\") return null;\n return raw as MetadataCache;\n } catch {\n return null;\n }\n}\n\nexport function saveMetadataCache(cache: MetadataCache): void {\n const cachePath = getMetadataCachePath();\n const dir = dirname(cachePath);\n mkdirSync(dir, { recursive: true });\n\n let merged: MetadataCache = { version: CACHE_VERSION, servers: {} };\n try {\n if (existsSync(cachePath)) {\n const existing = JSON.parse(readFileSync(cachePath, \"utf-8\")) as MetadataCache;\n if (existing && existing.version === CACHE_VERSION && existing.servers) {\n merged.servers = { ...existing.servers };\n }\n }\n } catch {\n // Ignore parse errors and proceed with empty cache\n }\n\n merged.version = CACHE_VERSION;\n merged.servers = { ...merged.servers, ...cache.servers };\n\n const tmpPath = `${cachePath}.${process.pid}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(merged, null, 2), \"utf-8\");\n renameSync(tmpPath, cachePath);\n}\n\nexport function computeServerHash(definition: ServerEntry): string {\n // Hash only fields that affect server identity and tool/resource output.\n // Exclude lifecycle, idleTimeout, requestTimeoutMs, debug — those are runtime behavior settings\n // that don't change which tools a server exposes.\n const identity: Record<string, unknown> = {\n command: definition.command,\n args: definition.args,\n env: interpolateEnvRecord(definition.env),\n cwd: resolveConfigPath(definition.cwd),\n url: definition.url,\n headers: interpolateEnvRecord(definition.headers),\n auth: definition.auth,\n bearerToken: resolveBearerToken(definition),\n bearerTokenEnv: definition.bearerTokenEnv,\n exposeResources: definition.exposeResources,\n excludeTools: definition.excludeTools,\n };\n const normalized = stableStringify(identity);\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n}\n\nexport function isServerCacheValid(\n entry: ServerCacheEntry,\n definition: ServerEntry,\n maxAgeMs: number = CACHE_MAX_AGE_MS\n): boolean {\n if (!entry || entry.configHash !== computeServerHash(definition)) return false;\n if (!entry.cachedAt || typeof entry.cachedAt !== \"number\") return false;\n if (maxAgeMs > 0 && Date.now() - entry.cachedAt > maxAgeMs) return false;\n return true;\n}\n\nexport function reconstructToolMetadata(\n serverName: string,\n entry: ServerCacheEntry,\n prefix: \"server\" | \"none\" | \"short\",\n definition: Pick<ServerEntry, \"exposeResources\" | \"excludeTools\">\n): ToolMetadata[] {\n const metadata: ToolMetadata[] = [];\n\n for (const tool of entry.tools ?? []) {\n if (!tool?.name) continue;\n if (isToolExcluded(tool.name, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(tool.name, serverName, prefix),\n originalName: tool.name,\n description: tool.description ?? \"\",\n inputSchema: tool.inputSchema,\n uiResourceUri: tool.uiResourceUri,\n uiStreamMode: tool.uiStreamMode,\n });\n }\n\n if (definition.exposeResources !== false) {\n for (const resource of entry.resources ?? []) {\n if (!resource?.name || !resource?.uri) continue;\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n if (isToolExcluded(baseName, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(baseName, serverName, prefix),\n originalName: baseName,\n description: resource.description ?? `Read resource: ${resource.uri}`,\n resourceUri: resource.uri,\n });\n }\n }\n\n return metadata;\n}\n\nexport function serializeTools(tools: McpTool[]): CachedTool[] {\n return tools\n .filter(t => t?.name)\n .map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n uiResourceUri: tryGetToolUiResourceUri(t),\n uiStreamMode: extractToolUiStreamMode(t._meta),\n }));\n}\n\nexport function serializeResources(resources: McpResource[]): CachedResource[] {\n return resources\n .filter(r => r?.name && r?.uri)\n .map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n }));\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== \"object\") {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? \"undefined\" : serialized;\n }\n if (Array.isArray(value)) {\n return `[${value.map(v => stableStringify(v)).join(\",\")}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return `{${keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(\",\")}}`;\n}\n\nconst requireExtApps = createRequire(import.meta.url);\nlet getToolUiResourceUri: ((tool: { _meta?: Record<string, unknown> }) => string | undefined) | undefined;\n\nfunction tryGetToolUiResourceUri(tool: McpTool): string | undefined {\n try {\n if (!getToolUiResourceUri) {\n getToolUiResourceUri = requireExtApps(\"@modelcontextprotocol/ext-apps/app-bridge\").getToolUiResourceUri;\n }\n return getToolUiResourceUri!({ _meta: tool._meta });\n } catch {\n return undefined;\n }\n}\n"]}
@@ -4,7 +4,7 @@ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from "
4
4
  import { dirname } from "node:path";
5
5
  import { getAgentPath } from "./agent-dir.js";
6
6
  import { createHash } from "node:crypto";
7
- import { getToolUiResourceUri } from "@modelcontextprotocol/ext-apps/app-bridge";
7
+ import { createRequire } from "node:module";
8
8
  import { formatToolName, isToolExcluded } from "./types.js";
9
9
  import { resourceNameToToolName } from "./resource-tools.js";
10
10
  import { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from "./utils.js";
@@ -149,8 +149,13 @@ function stableStringify(value) {
149
149
  const keys = Object.keys(obj).sort();
150
150
  return `{${keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(",")}}`;
151
151
  }
152
+ const requireExtApps = createRequire(import.meta.url);
153
+ let getToolUiResourceUri;
152
154
  function tryGetToolUiResourceUri(tool) {
153
155
  try {
156
+ if (!getToolUiResourceUri) {
157
+ getToolUiResourceUri = requireExtApps("@modelcontextprotocol/ext-apps/app-bridge").getToolUiResourceUri;
158
+ }
154
159
  return getToolUiResourceUri({ _meta: tool._meta });
155
160
  }
156
161
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-cache.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/metadata-cache.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n// metadata-cache.ts - Persistent MCP metadata cache\nimport { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getAgentPath } from \"./agent-dir.ts\";\nimport { createHash } from \"node:crypto\";\nimport { getToolUiResourceUri } from \"@modelcontextprotocol/ext-apps/app-bridge\";\nimport type { McpTool, McpResource, ServerEntry, ToolMetadata } from \"./types.ts\";\nimport { formatToolName, isToolExcluded } from \"./types.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\n\nconst CACHE_VERSION = 1;\nconst CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface CachedTool {\n name: string;\n description?: string;\n inputSchema?: unknown;\n uiResourceUri?: string;\n uiStreamMode?: \"eager\" | \"stream-first\";\n}\n\nexport interface CachedResource {\n uri: string;\n name: string;\n description?: string;\n}\n\nexport interface ServerCacheEntry {\n configHash: string;\n tools: CachedTool[];\n resources: CachedResource[];\n cachedAt: number;\n}\n\nexport interface MetadataCache {\n version: number;\n servers: Record<string, ServerCacheEntry>;\n}\n\nexport function getMetadataCachePath(): string {\n return getAgentPath(\"mcp-cache.json\");\n}\n\nexport function loadMetadataCache(): MetadataCache | null {\n const cachePath = getMetadataCachePath();\n if (!existsSync(cachePath)) return null;\n try {\n const raw = JSON.parse(readFileSync(cachePath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\") return null;\n if (raw.version !== CACHE_VERSION) return null;\n if (!raw.servers || typeof raw.servers !== \"object\") return null;\n return raw as MetadataCache;\n } catch {\n return null;\n }\n}\n\nexport function saveMetadataCache(cache: MetadataCache): void {\n const cachePath = getMetadataCachePath();\n const dir = dirname(cachePath);\n mkdirSync(dir, { recursive: true });\n\n let merged: MetadataCache = { version: CACHE_VERSION, servers: {} };\n try {\n if (existsSync(cachePath)) {\n const existing = JSON.parse(readFileSync(cachePath, \"utf-8\")) as MetadataCache;\n if (existing && existing.version === CACHE_VERSION && existing.servers) {\n merged.servers = { ...existing.servers };\n }\n }\n } catch {\n // Ignore parse errors and proceed with empty cache\n }\n\n merged.version = CACHE_VERSION;\n merged.servers = { ...merged.servers, ...cache.servers };\n\n const tmpPath = `${cachePath}.${process.pid}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(merged, null, 2), \"utf-8\");\n renameSync(tmpPath, cachePath);\n}\n\nexport function computeServerHash(definition: ServerEntry): string {\n // Hash only fields that affect server identity and tool/resource output.\n // Exclude lifecycle, idleTimeout, requestTimeoutMs, debug — those are runtime behavior settings\n // that don't change which tools a server exposes.\n const identity: Record<string, unknown> = {\n command: definition.command,\n args: definition.args,\n env: interpolateEnvRecord(definition.env),\n cwd: resolveConfigPath(definition.cwd),\n url: definition.url,\n headers: interpolateEnvRecord(definition.headers),\n auth: definition.auth,\n bearerToken: resolveBearerToken(definition),\n bearerTokenEnv: definition.bearerTokenEnv,\n exposeResources: definition.exposeResources,\n excludeTools: definition.excludeTools,\n };\n const normalized = stableStringify(identity);\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n}\n\nexport function isServerCacheValid(\n entry: ServerCacheEntry,\n definition: ServerEntry,\n maxAgeMs: number = CACHE_MAX_AGE_MS\n): boolean {\n if (!entry || entry.configHash !== computeServerHash(definition)) return false;\n if (!entry.cachedAt || typeof entry.cachedAt !== \"number\") return false;\n if (maxAgeMs > 0 && Date.now() - entry.cachedAt > maxAgeMs) return false;\n return true;\n}\n\nexport function reconstructToolMetadata(\n serverName: string,\n entry: ServerCacheEntry,\n prefix: \"server\" | \"none\" | \"short\",\n definition: Pick<ServerEntry, \"exposeResources\" | \"excludeTools\">\n): ToolMetadata[] {\n const metadata: ToolMetadata[] = [];\n\n for (const tool of entry.tools ?? []) {\n if (!tool?.name) continue;\n if (isToolExcluded(tool.name, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(tool.name, serverName, prefix),\n originalName: tool.name,\n description: tool.description ?? \"\",\n inputSchema: tool.inputSchema,\n uiResourceUri: tool.uiResourceUri,\n uiStreamMode: tool.uiStreamMode,\n });\n }\n\n if (definition.exposeResources !== false) {\n for (const resource of entry.resources ?? []) {\n if (!resource?.name || !resource?.uri) continue;\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n if (isToolExcluded(baseName, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(baseName, serverName, prefix),\n originalName: baseName,\n description: resource.description ?? `Read resource: ${resource.uri}`,\n resourceUri: resource.uri,\n });\n }\n }\n\n return metadata;\n}\n\nexport function serializeTools(tools: McpTool[]): CachedTool[] {\n return tools\n .filter(t => t?.name)\n .map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n uiResourceUri: tryGetToolUiResourceUri(t),\n uiStreamMode: extractToolUiStreamMode(t._meta),\n }));\n}\n\nexport function serializeResources(resources: McpResource[]): CachedResource[] {\n return resources\n .filter(r => r?.name && r?.uri)\n .map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n }));\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== \"object\") {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? \"undefined\" : serialized;\n }\n if (Array.isArray(value)) {\n return `[${value.map(v => stableStringify(v)).join(\",\")}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return `{${keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(\",\")}}`;\n}\n\nfunction tryGetToolUiResourceUri(tool: McpTool): string | undefined {\n try {\n return getToolUiResourceUri({ _meta: tool._meta });\n } catch {\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"metadata-cache.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/metadata-cache.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n// metadata-cache.ts - Persistent MCP metadata cache\nimport { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { getAgentPath } from \"./agent-dir.ts\";\nimport { createHash } from \"node:crypto\";\nimport { createRequire } from \"node:module\";\nimport type { McpTool, McpResource, ServerEntry, ToolMetadata } from \"./types.ts\";\nimport { formatToolName, isToolExcluded } from \"./types.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport { extractToolUiStreamMode, interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\n\nconst CACHE_VERSION = 1;\nconst CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport interface CachedTool {\n name: string;\n description?: string;\n inputSchema?: unknown;\n uiResourceUri?: string;\n uiStreamMode?: \"eager\" | \"stream-first\";\n}\n\nexport interface CachedResource {\n uri: string;\n name: string;\n description?: string;\n}\n\nexport interface ServerCacheEntry {\n configHash: string;\n tools: CachedTool[];\n resources: CachedResource[];\n cachedAt: number;\n}\n\nexport interface MetadataCache {\n version: number;\n servers: Record<string, ServerCacheEntry>;\n}\n\nexport function getMetadataCachePath(): string {\n return getAgentPath(\"mcp-cache.json\");\n}\n\nexport function loadMetadataCache(): MetadataCache | null {\n const cachePath = getMetadataCachePath();\n if (!existsSync(cachePath)) return null;\n try {\n const raw = JSON.parse(readFileSync(cachePath, \"utf-8\"));\n if (!raw || typeof raw !== \"object\") return null;\n if (raw.version !== CACHE_VERSION) return null;\n if (!raw.servers || typeof raw.servers !== \"object\") return null;\n return raw as MetadataCache;\n } catch {\n return null;\n }\n}\n\nexport function saveMetadataCache(cache: MetadataCache): void {\n const cachePath = getMetadataCachePath();\n const dir = dirname(cachePath);\n mkdirSync(dir, { recursive: true });\n\n let merged: MetadataCache = { version: CACHE_VERSION, servers: {} };\n try {\n if (existsSync(cachePath)) {\n const existing = JSON.parse(readFileSync(cachePath, \"utf-8\")) as MetadataCache;\n if (existing && existing.version === CACHE_VERSION && existing.servers) {\n merged.servers = { ...existing.servers };\n }\n }\n } catch {\n // Ignore parse errors and proceed with empty cache\n }\n\n merged.version = CACHE_VERSION;\n merged.servers = { ...merged.servers, ...cache.servers };\n\n const tmpPath = `${cachePath}.${process.pid}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(merged, null, 2), \"utf-8\");\n renameSync(tmpPath, cachePath);\n}\n\nexport function computeServerHash(definition: ServerEntry): string {\n // Hash only fields that affect server identity and tool/resource output.\n // Exclude lifecycle, idleTimeout, requestTimeoutMs, debug — those are runtime behavior settings\n // that don't change which tools a server exposes.\n const identity: Record<string, unknown> = {\n command: definition.command,\n args: definition.args,\n env: interpolateEnvRecord(definition.env),\n cwd: resolveConfigPath(definition.cwd),\n url: definition.url,\n headers: interpolateEnvRecord(definition.headers),\n auth: definition.auth,\n bearerToken: resolveBearerToken(definition),\n bearerTokenEnv: definition.bearerTokenEnv,\n exposeResources: definition.exposeResources,\n excludeTools: definition.excludeTools,\n };\n const normalized = stableStringify(identity);\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n}\n\nexport function isServerCacheValid(\n entry: ServerCacheEntry,\n definition: ServerEntry,\n maxAgeMs: number = CACHE_MAX_AGE_MS\n): boolean {\n if (!entry || entry.configHash !== computeServerHash(definition)) return false;\n if (!entry.cachedAt || typeof entry.cachedAt !== \"number\") return false;\n if (maxAgeMs > 0 && Date.now() - entry.cachedAt > maxAgeMs) return false;\n return true;\n}\n\nexport function reconstructToolMetadata(\n serverName: string,\n entry: ServerCacheEntry,\n prefix: \"server\" | \"none\" | \"short\",\n definition: Pick<ServerEntry, \"exposeResources\" | \"excludeTools\">\n): ToolMetadata[] {\n const metadata: ToolMetadata[] = [];\n\n for (const tool of entry.tools ?? []) {\n if (!tool?.name) continue;\n if (isToolExcluded(tool.name, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(tool.name, serverName, prefix),\n originalName: tool.name,\n description: tool.description ?? \"\",\n inputSchema: tool.inputSchema,\n uiResourceUri: tool.uiResourceUri,\n uiStreamMode: tool.uiStreamMode,\n });\n }\n\n if (definition.exposeResources !== false) {\n for (const resource of entry.resources ?? []) {\n if (!resource?.name || !resource?.uri) continue;\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n if (isToolExcluded(baseName, serverName, prefix, definition.excludeTools)) {\n continue;\n }\n\n metadata.push({\n name: formatToolName(baseName, serverName, prefix),\n originalName: baseName,\n description: resource.description ?? `Read resource: ${resource.uri}`,\n resourceUri: resource.uri,\n });\n }\n }\n\n return metadata;\n}\n\nexport function serializeTools(tools: McpTool[]): CachedTool[] {\n return tools\n .filter(t => t?.name)\n .map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n uiResourceUri: tryGetToolUiResourceUri(t),\n uiStreamMode: extractToolUiStreamMode(t._meta),\n }));\n}\n\nexport function serializeResources(resources: McpResource[]): CachedResource[] {\n return resources\n .filter(r => r?.name && r?.uri)\n .map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n }));\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined || typeof value !== \"object\") {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? \"undefined\" : serialized;\n }\n if (Array.isArray(value)) {\n return `[${value.map(v => stableStringify(v)).join(\",\")}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return `{${keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(\",\")}}`;\n}\n\nconst requireExtApps = createRequire(import.meta.url);\nlet getToolUiResourceUri: ((tool: { _meta?: Record<string, unknown> }) => string | undefined) | undefined;\n\nfunction tryGetToolUiResourceUri(tool: McpTool): string | undefined {\n try {\n if (!getToolUiResourceUri) {\n getToolUiResourceUri = requireExtApps(\"@modelcontextprotocol/ext-apps/app-bridge\").getToolUiResourceUri;\n }\n return getToolUiResourceUri!({ _meta: tool._meta });\n } catch {\n return undefined;\n }\n}\n"]}
@@ -4,9 +4,11 @@ import { type ReadResourceResult, type UrlElicitationRequiredError } from "@mode
4
4
  import type { McpTool, McpResource, ServerDefinition, ServerStreamResultPatchNotification, Transport } from "./types.ts";
5
5
  import { type ServerSamplingConfig } from "./sampling-handler.ts";
6
6
  import { type ServerElicitationConfig } from "./elicitation-handler.ts";
7
- interface ServerConnection {
7
+ interface PendingConnection {
8
8
  client: Client;
9
9
  transport: Transport;
10
+ }
11
+ interface ServerConnection extends PendingConnection {
10
12
  definition: ServerDefinition;
11
13
  tools: McpTool[];
12
14
  resources: McpResource[];
@@ -19,6 +21,8 @@ export declare class McpServerManager {
19
21
  private readonly defaultCwd?;
20
22
  private connections;
21
23
  private connectPromises;
24
+ private pendingConnections;
25
+ private closing;
22
26
  private uiStreamListeners;
23
27
  private samplingConfig;
24
28
  private elicitationConfig;
@@ -45,6 +49,7 @@ export declare class McpServerManager {
45
49
  registerUiStreamListener(streamToken: string, listener: UiStreamListener): void;
46
50
  removeUiStreamListener(streamToken: string): void;
47
51
  readResource(name: string, uri: string, signal?: AbortSignal): Promise<ReadResourceResult>;
52
+ private disposeConnection;
48
53
  close(name: string): Promise<void>;
49
54
  closeAll(): Promise<void>;
50
55
  getConnection(name: string): ServerConnection | undefined;