@ashx-j/lunr 0.2.17 → 0.2.19

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 (330) hide show
  1. package/CHANGELOG.md +26 -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/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/index.js +2 -1
  9. package/dist/builtin-extensions/index.js.map +1 -1
  10. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts +4 -0
  11. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  12. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +172 -171
  13. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  14. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +50 -0
  15. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -0
  16. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +131 -0
  17. package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -0
  18. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts +7 -0
  19. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -0
  20. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +211 -0
  21. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -0
  22. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts +0 -5
  23. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.d.ts.map +1 -1
  24. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js +0 -202
  25. package/dist/builtin-extensions/pi-mcp-adapter/direct-tools.js.map +1 -1
  26. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  27. package/dist/builtin-extensions/pi-mcp-adapter/index.js +276 -109
  28. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  29. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts +4 -1
  30. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  31. package/dist/builtin-extensions/pi-mcp-adapter/init.js +10 -3
  32. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  33. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.d.ts.map +1 -1
  34. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.js +6 -1
  35. package/dist/builtin-extensions/pi-mcp-adapter/metadata-cache.js.map +1 -1
  36. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
  37. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  38. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
  39. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  40. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  41. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +2 -1
  42. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  43. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts +1 -1
  44. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  45. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +1 -1
  46. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +68 -15
  50. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +5 -2
  54. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.d.ts.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/shared/fork-context.js.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  63. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +72 -31
  65. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +2 -1
  69. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  70. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  71. package/dist/builtin-extensions/pi-web-access/extract.js +105 -54
  72. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  73. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts +1 -1
  74. package/dist/builtin-extensions/pi-web-access/gemini-search.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-web-access/gemini-search.js +82 -65
  76. package/dist/builtin-extensions/pi-web-access/gemini-search.js.map +1 -1
  77. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-web-access/github-extract.js +2 -0
  79. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  80. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  81. package/dist/builtin-extensions/pi-web-access/index.js +259 -168
  82. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  83. package/dist/builtin-extensions/pi-web-access/lazy.d.ts +18 -0
  84. package/dist/builtin-extensions/pi-web-access/lazy.d.ts.map +1 -0
  85. package/dist/builtin-extensions/pi-web-access/lazy.js +19 -0
  86. package/dist/builtin-extensions/pi-web-access/lazy.js.map +1 -0
  87. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +6 -0
  88. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -0
  89. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +17 -0
  90. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -0
  91. package/dist/cli-runtime.d.ts +3 -0
  92. package/dist/cli-runtime.d.ts.map +1 -0
  93. package/dist/cli-runtime.js +72 -0
  94. package/dist/cli-runtime.js.map +1 -0
  95. package/dist/cli.d.ts.map +1 -1
  96. package/dist/cli.js +11 -60
  97. package/dist/cli.js.map +1 -1
  98. package/dist/config.d.ts +1 -0
  99. package/dist/config.d.ts.map +1 -1
  100. package/dist/config.js +1 -0
  101. package/dist/config.js.map +1 -1
  102. package/dist/core/agent-session.d.ts.map +1 -1
  103. package/dist/core/agent-session.js +6 -3
  104. package/dist/core/agent-session.js.map +1 -1
  105. package/dist/core/extensions/host-static.d.ts.map +1 -1
  106. package/dist/core/extensions/host-static.js +34 -12
  107. package/dist/core/extensions/host-static.js.map +1 -1
  108. package/dist/core/extensions/loader.d.ts +1 -2
  109. package/dist/core/extensions/loader.d.ts.map +1 -1
  110. package/dist/core/extensions/loader.js +10 -64
  111. package/dist/core/extensions/loader.js.map +1 -1
  112. package/dist/core/keybindings.d.ts +2 -2
  113. package/dist/core/keybindings.d.ts.map +1 -1
  114. package/dist/core/keybindings.js +2 -2
  115. package/dist/core/keybindings.js.map +1 -1
  116. package/dist/core/package-manager.d.ts.map +1 -1
  117. package/dist/core/package-manager.js +1 -1
  118. package/dist/core/package-manager.js.map +1 -1
  119. package/dist/core/sdk.d.ts +1 -1
  120. package/dist/core/sdk.d.ts.map +1 -1
  121. package/dist/core/sdk.js +1 -1
  122. package/dist/core/sdk.js.map +1 -1
  123. package/dist/core/timings.d.ts +2 -1
  124. package/dist/core/timings.d.ts.map +1 -1
  125. package/dist/core/timings.js +17 -2
  126. package/dist/core/timings.js.map +1 -1
  127. package/dist/gateway/agent-bridge.d.ts +6 -1
  128. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  129. package/dist/gateway/agent-bridge.js +23 -6
  130. package/dist/gateway/agent-bridge.js.map +1 -1
  131. package/dist/gateway/cron.d.ts +1 -1
  132. package/dist/gateway/cron.d.ts.map +1 -1
  133. package/dist/gateway/cron.js +3 -1
  134. package/dist/gateway/cron.js.map +1 -1
  135. package/dist/main.d.ts.map +1 -1
  136. package/dist/main.js +20 -14
  137. package/dist/main.js.map +1 -1
  138. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  139. package/dist/modes/interactive/interactive-mode.js +10 -8
  140. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  141. package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
  142. package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
  143. package/dist/modes/interactive/thinking-level-slash.js +23 -0
  144. package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
  145. package/dist/node-runtime/agent-session-services-35WNVGMR.js +36 -0
  146. package/dist/node-runtime/benchmark-request-UC7PD3V3.js +57 -0
  147. package/dist/node-runtime/brave-UWDA3I22.js +143 -0
  148. package/dist/node-runtime/builtin-extensions-322XDDEM.js +28 -0
  149. package/dist/node-runtime/chunk-2SJB2AWP.js +47 -0
  150. package/dist/node-runtime/chunk-3NMWLTPV.js +64 -0
  151. package/dist/node-runtime/chunk-3WFAEVKS.js +115 -0
  152. package/dist/node-runtime/chunk-3X3KZKMI.js +49 -0
  153. package/dist/node-runtime/chunk-4CSFRBCN.js +7558 -0
  154. package/dist/node-runtime/chunk-4DJ6HEGH.js +296 -0
  155. package/dist/node-runtime/chunk-4FX25LWP.js +1345 -0
  156. package/dist/node-runtime/chunk-4HXHDDCF.js +16 -0
  157. package/dist/node-runtime/chunk-4I23VTC4.js +429 -0
  158. package/dist/node-runtime/chunk-4TLO4PO2.js +3427 -0
  159. package/dist/node-runtime/chunk-4ZWGEEAS.js +69 -0
  160. package/dist/node-runtime/chunk-53YJI7JU.js +137 -0
  161. package/dist/node-runtime/chunk-5EFIU3OM.js +295 -0
  162. package/dist/node-runtime/chunk-6BEIBLQ3.js +53 -0
  163. package/dist/node-runtime/chunk-6KDIOJL3.js +72 -0
  164. package/dist/node-runtime/chunk-7N3YHTYF.js +26 -0
  165. package/dist/node-runtime/chunk-7NBZ5P7I.js +24 -0
  166. package/dist/node-runtime/chunk-AD6VXAO7.js +342 -0
  167. package/dist/node-runtime/chunk-ARC4KOTI.js +11178 -0
  168. package/dist/node-runtime/chunk-AROOY4BB.js +173 -0
  169. package/dist/node-runtime/chunk-ATGA2WLC.js +5646 -0
  170. package/dist/node-runtime/chunk-AUXVGBO4.js +19 -0
  171. package/dist/node-runtime/chunk-AY6CAJSL.js +30 -0
  172. package/dist/node-runtime/chunk-BHO7O6E5.js +296 -0
  173. package/dist/node-runtime/chunk-BI3DHYCN.js +8845 -0
  174. package/dist/node-runtime/chunk-BOHIDQT4.js +21 -0
  175. package/dist/node-runtime/chunk-BRJX2PRC.js +53 -0
  176. package/dist/node-runtime/chunk-CBGB57XT.js +20211 -0
  177. package/dist/node-runtime/chunk-CCZJ3PYY.js +17 -0
  178. package/dist/node-runtime/chunk-CGBXPL3E.js +1171 -0
  179. package/dist/node-runtime/chunk-CJECDQKP.js +19 -0
  180. package/dist/node-runtime/chunk-CSFI6YXL.js +130 -0
  181. package/dist/node-runtime/chunk-DAPBPCBP.js +53 -0
  182. package/dist/node-runtime/chunk-DDWHZ633.js +37 -0
  183. package/dist/node-runtime/chunk-DMMTJQMQ.js +43 -0
  184. package/dist/node-runtime/chunk-DVGWF6A2.js +1180 -0
  185. package/dist/node-runtime/chunk-FQMM2EZ2.js +248 -0
  186. package/dist/node-runtime/chunk-FVDOXRUD.js +96 -0
  187. package/dist/node-runtime/chunk-G6LRAP36.js +105 -0
  188. package/dist/node-runtime/chunk-GKLEQ3I4.js +860 -0
  189. package/dist/node-runtime/chunk-H2EOZYMP.js +57 -0
  190. package/dist/node-runtime/chunk-HQCKFM2O.js +56 -0
  191. package/dist/node-runtime/chunk-HYHJIRDW.js +19 -0
  192. package/dist/node-runtime/chunk-I6R76AG7.js +22 -0
  193. package/dist/node-runtime/chunk-IRPJXI6U.js +1269 -0
  194. package/dist/node-runtime/chunk-J26TSGDL.js +633 -0
  195. package/dist/node-runtime/chunk-JHYKXIMM.js +378 -0
  196. package/dist/node-runtime/chunk-JZQ7F36T.js +610 -0
  197. package/dist/node-runtime/chunk-KBKMCJDU.js +126 -0
  198. package/dist/node-runtime/chunk-KWA4OC2J.js +100 -0
  199. package/dist/node-runtime/chunk-M3LZLQW2.js +98 -0
  200. package/dist/node-runtime/chunk-MCUNIRD5.js +8388 -0
  201. package/dist/node-runtime/chunk-NUIFPZWX.js +209 -0
  202. package/dist/node-runtime/chunk-OBMWP3I5.js +68 -0
  203. package/dist/node-runtime/chunk-OCVIXVTZ.js +88 -0
  204. package/dist/node-runtime/chunk-OPEK5RRY.js +466 -0
  205. package/dist/node-runtime/chunk-OR4L3IB2.js +42 -0
  206. package/dist/node-runtime/chunk-PL6JKXWI.js +3622 -0
  207. package/dist/node-runtime/chunk-PNJSG3IZ.js +807 -0
  208. package/dist/node-runtime/chunk-PVCDKGR6.js +55 -0
  209. package/dist/node-runtime/chunk-Q4Q6D4IY.js +364 -0
  210. package/dist/node-runtime/chunk-Q5ZU2VRT.js +83 -0
  211. package/dist/node-runtime/chunk-QFWG2RVL.js +5477 -0
  212. package/dist/node-runtime/chunk-QZMODZQ2.js +305 -0
  213. package/dist/node-runtime/chunk-RNBHABBA.js +986 -0
  214. package/dist/node-runtime/chunk-RQ2Q5IYR.js +72 -0
  215. package/dist/node-runtime/chunk-RRIZE6QQ.js +17 -0
  216. package/dist/node-runtime/chunk-SN6G4OU6.js +4753 -0
  217. package/dist/node-runtime/chunk-STERBGUB.js +949 -0
  218. package/dist/node-runtime/chunk-TFBIJTM3.js +966 -0
  219. package/dist/node-runtime/chunk-TXHKBRHZ.js +9450 -0
  220. package/dist/node-runtime/chunk-UWQYRSYQ.js +8973 -0
  221. package/dist/node-runtime/chunk-VRB2IYGG.js +53 -0
  222. package/dist/node-runtime/chunk-VSELYKWU.js +772 -0
  223. package/dist/node-runtime/chunk-W3CVH5RX.js +62 -0
  224. package/dist/node-runtime/chunk-WJVFOIB5.js +24921 -0
  225. package/dist/node-runtime/chunk-WKDK4C5P.js +2834 -0
  226. package/dist/node-runtime/chunk-XATUM2HK.js +46 -0
  227. package/dist/node-runtime/chunk-XBWPBZBN.js +125 -0
  228. package/dist/node-runtime/chunk-XTHQ7XR7.js +509 -0
  229. package/dist/node-runtime/chunk-ZRCBN365.js +1734 -0
  230. package/dist/node-runtime/cli-runtime.js +80 -0
  231. package/dist/node-runtime/clipboard-OZ63BBC6.js +12 -0
  232. package/dist/node-runtime/clipboard-image-7QR6GXVA.js +13 -0
  233. package/dist/node-runtime/command-DWUM5X3U.js +13 -0
  234. package/dist/node-runtime/commands-MV5KOZ64.js +291 -0
  235. package/dist/node-runtime/config-QDD5PUE2.js +73 -0
  236. package/dist/node-runtime/curator-server-XCM43VEF.js +3816 -0
  237. package/dist/node-runtime/customize-XEXL2DGQ.js +12 -0
  238. package/dist/node-runtime/direct-tool-executor-BK7CLEBX.js +188 -0
  239. package/dist/node-runtime/exa-LL64QZR2.js +329 -0
  240. package/dist/node-runtime/export-html-TEXVV5RP.js +150 -0
  241. package/dist/node-runtime/extension-input-O4HSAEM4.js +14 -0
  242. package/dist/node-runtime/extension-selector-X5FCX43D.js +14 -0
  243. package/dist/node-runtime/extract-XLQSJN4V.js +17 -0
  244. package/dist/node-runtime/file-sync-HCOP2QVF.js +117 -0
  245. package/dist/node-runtime/gateway-UZXMFGWY.js +2137 -0
  246. package/dist/node-runtime/gemini-api-QE7ANVDZ.js +29 -0
  247. package/dist/node-runtime/gemini-search-U7SUMPQA.js +330 -0
  248. package/dist/node-runtime/gemini-url-context-PXWCBQHK.js +103 -0
  249. package/dist/node-runtime/gemini-web-MM446SEH.js +14 -0
  250. package/dist/node-runtime/github-extract-F64RZOEA.js +619 -0
  251. package/dist/node-runtime/goal-NJEE5CTU.js +1831 -0
  252. package/dist/node-runtime/index.js +859 -0
  253. package/dist/node-runtime/init-3C7Z24OI.js +28 -0
  254. package/dist/node-runtime/install-cli-EXMJQESX.js +308 -0
  255. package/dist/node-runtime/interactive-mode-QT5IKGQ5.js +56 -0
  256. package/dist/node-runtime/interactive-view-ILS6TAN5.js +247 -0
  257. package/dist/node-runtime/lsp-manager-3ASUSO4T.js +1104 -0
  258. package/dist/node-runtime/lunr-cron-QPBTKBGI.js +272 -0
  259. package/dist/node-runtime/main.js +54 -0
  260. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +32 -0
  261. package/dist/node-runtime/mcp-panel-IIGMXQGP.js +501 -0
  262. package/dist/node-runtime/mcp-setup-panel-FEK7663I.js +355 -0
  263. package/dist/node-runtime/memory-cap-3S4XRLNP.js +20 -0
  264. package/dist/node-runtime/model-tiers-NJLHUEGK.js +20 -0
  265. package/dist/node-runtime/openai-search-B3MSNCQA.js +288 -0
  266. package/dist/node-runtime/package-manager-cli-7RKSZGEN.js +749 -0
  267. package/dist/node-runtime/parallel-AI2MNSCU.js +265 -0
  268. package/dist/node-runtime/parser-manager-TQHWYDH7.js +152 -0
  269. package/dist/node-runtime/pdf-extract-IPE6H4HP.js +57 -0
  270. package/dist/node-runtime/perplexity-QVJW3I35.js +12 -0
  271. package/dist/node-runtime/pi-intercom-EEMBGQID.js +2215 -0
  272. package/dist/node-runtime/pi-mcp-adapter-GUFZWW54.js +428 -0
  273. package/dist/node-runtime/pi-ollama-cloud-2F3Y2QNM.js +1440 -0
  274. package/dist/node-runtime/pi-prompt-template-model-QWTCGLJU.js +3946 -0
  275. package/dist/node-runtime/pi-subagents-7YJ3I4VE.js +6048 -0
  276. package/dist/node-runtime/pi-web-access-2CQGFLT2.js +1867 -0
  277. package/dist/node-runtime/print-mode-XSFM26EL.js +12 -0
  278. package/dist/node-runtime/proxy-modes-V6YVFH3C.js +685 -0
  279. package/dist/node-runtime/rpc-entry.js +62 -0
  280. package/dist/node-runtime/rpc-mode-W5ZTLTMZ.js +13 -0
  281. package/dist/node-runtime/runtime-bridges-3RKBDLNA.js +14 -0
  282. package/dist/node-runtime/session-manager-E7AREDTV.js +33 -0
  283. package/dist/node-runtime/session-selector-FJ7M2AIX.js +14 -0
  284. package/dist/node-runtime/settings-manager-GHPTUN7R.js +21 -0
  285. package/dist/node-runtime/src-BPQFJR76.js +2427 -0
  286. package/dist/node-runtime/subagent-executor-5Q5A4HJ2.js +8499 -0
  287. package/dist/node-runtime/summary-review-YSMXKITO.js +228 -0
  288. package/dist/node-runtime/tavily-WEZFVFP7.js +154 -0
  289. package/dist/node-runtime/timings-UAD5BEAS.js +16 -0
  290. package/dist/node-runtime/tool-renderer-MV5O452K.js +204 -0
  291. package/dist/node-runtime/update-cli-L3JIBH2U.js +70 -0
  292. package/dist/node-runtime/v4-5MNC3H7G.js +424 -0
  293. package/dist/node-runtime/video-extract-OYT5WKS5.js +304 -0
  294. package/dist/node-runtime/workspace-index-6DBXSTJ6.js +163 -0
  295. package/dist/node-runtime/youtube-extract-TQYKGFGS.js +264 -0
  296. package/dist/rpc.d.ts +3 -0
  297. package/dist/rpc.d.ts.map +1 -0
  298. package/dist/rpc.js +18 -0
  299. package/dist/rpc.js.map +1 -0
  300. package/dist/startup/benchmark-request.d.ts +3 -0
  301. package/dist/startup/benchmark-request.d.ts.map +1 -0
  302. package/dist/startup/benchmark-request.js +65 -0
  303. package/dist/startup/benchmark-request.js.map +1 -0
  304. package/dist/startup/interactive-view.d.ts.map +1 -1
  305. package/dist/startup/interactive-view.js +1 -2
  306. package/dist/startup/interactive-view.js.map +1 -1
  307. package/dist/startup/startup-milestones.d.ts +1 -1
  308. package/dist/startup/startup-milestones.d.ts.map +1 -1
  309. package/dist/startup/startup-milestones.js.map +1 -1
  310. package/dist/utils/await-with-abort.d.ts +2 -0
  311. package/dist/utils/await-with-abort.d.ts.map +1 -0
  312. package/dist/utils/await-with-abort.js +19 -0
  313. package/dist/utils/await-with-abort.js.map +1 -0
  314. package/docs/development.md +5 -1
  315. package/docs/features.md +2 -2
  316. package/docs/interactive-startup.md +95 -48
  317. package/docs/keybindings.md +2 -2
  318. package/docs/terminal-setup.md +1 -1
  319. package/docs/usage.md +1 -1
  320. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  321. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  322. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  323. package/examples/extensions/gondolin/package-lock.json +2 -2
  324. package/examples/extensions/gondolin/package.json +1 -1
  325. package/examples/extensions/hidden-thinking-label.ts +1 -1
  326. package/examples/extensions/sandbox/package-lock.json +2 -2
  327. package/examples/extensions/sandbox/package.json +1 -1
  328. package/examples/extensions/with-deps/package-lock.json +2 -2
  329. package/examples/extensions/with-deps/package.json +1 -1
  330. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"direct-tools.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/direct-tools.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { AgentToolResult, AgentToolUpdateCallback, ExtensionContext } from \"@ashx-j/lunr\";\nimport { UrlElicitationRequiredError } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { DirectToolSpec, McpConfig, McpContent } from \"./types.ts\";\nimport type { MetadataCache } from \"./metadata-cache.ts\";\nimport { lazyConnect, getFailureAgeSeconds } from \"./init.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\nimport { isServerCacheValid } from \"./metadata-cache.ts\";\nimport { formatSchema } from \"./tool-metadata.ts\";\nimport { resolveMcpResultContent, transformMcpContent } from \"./tool-registrar.ts\";\nimport { guardMcpOutput, guardedMcpDetails, resolveMcpOutputGuardOptions } from \"./mcp-output-guard.ts\";\nimport { maybeStartUiSession, type UiSessionRuntime } from \"./ui-session.ts\";\nimport { formatToolName, isToolExcluded } from \"./types.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport { authenticate, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { formatAuthRequiredMessage } from \"./utils.ts\";\n\nconst BUILTIN_NAMES = new Set([\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\", \"mcp\"]);\n\ntype DirectAutoAuthResult =\n | { status: \"skipped\" }\n | { status: \"success\" }\n | { status: \"failed\"; message: string };\n\nfunction getDirectAuthRequiredMessage(\n state: McpExtensionState,\n serverName: string,\n defaultMessage = `MCP server \"${serverName}\" requires OAuth authentication. Run mcp({ action: \"auth-start\", server: \"${serverName}\" }) to get a browser URL, or /mcp-auth ${serverName} in an interactive local session.`,\n): string {\n return formatAuthRequiredMessage(state.config, serverName, defaultMessage);\n}\n\nfunction getDirectAuthFailedMessage(state: McpExtensionState, serverName: string, message: string): string {\n const customGuidance = state.config.settings?.authRequiredMessage;\n if (customGuidance) {\n return `OAuth authentication failed for \"${serverName}\": ${message}. ${getDirectAuthRequiredMessage(state, serverName)}`;\n }\n return `OAuth authentication failed for \"${serverName}\": ${message}. Run mcp({ action: \"auth-start\", server: \"${serverName}\" }) to get a browser URL, or /mcp-auth ${serverName} in an interactive local session.`;\n}\n\nasync function attemptDirectAutoAuth(\n state: McpExtensionState,\n serverName: string,\n): Promise<DirectAutoAuthResult> {\n if (state.config.settings?.autoAuth !== true) {\n return { status: \"skipped\" };\n }\n\n const definition = state.config.mcpServers[serverName];\n if (!definition || !supportsOAuth(definition) || !definition.url) {\n return { status: \"skipped\" };\n }\n\n const grantType = definition.oauth ? definition.oauth.grantType ?? \"authorization_code\" : \"authorization_code\";\n if (!state.ui && grantType !== \"client_credentials\") {\n return {\n status: \"failed\",\n message: getDirectAuthRequiredMessage(\n state,\n serverName,\n `MCP server \"${serverName}\" requires OAuth authentication. Run mcp({ action: \"auth-start\", server: \"${serverName}\" }) to get a browser URL, or /mcp-auth ${serverName} in an interactive local session.`,\n ),\n };\n }\n\n try {\n await authenticate(serverName, definition.url, definition);\n return { status: \"success\" };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n status: \"failed\",\n message: getDirectAuthFailedMessage(state, serverName, message),\n };\n }\n}\n\nexport function resolveDirectTools(\n config: McpConfig,\n cache: MetadataCache | null,\n prefix: \"server\" | \"none\" | \"short\",\n envOverride?: string[],\n): DirectToolSpec[] {\n const specs: DirectToolSpec[] = [];\n if (!cache) return specs;\n\n const seenNames = new Set<string>();\n\n const envServers = new Set<string>();\n const envTools = new Map<string, Set<string>>();\n if (envOverride) {\n for (let item of envOverride) {\n item = item.replace(/\\/+$/, \"\");\n if (item.includes(\"/\")) {\n const [server, tool] = item.split(\"/\", 2);\n if (server && tool) {\n if (!envTools.has(server)) envTools.set(server, new Set());\n envTools.get(server)!.add(tool);\n } else if (server) {\n envServers.add(server);\n }\n } else if (item) {\n envServers.add(item);\n }\n }\n }\n\n const globalDirect = config.settings?.directTools;\n\n for (const [serverName, definition] of Object.entries(config.mcpServers)) {\n const serverCache = cache.servers[serverName];\n if (!serverCache || !isServerCacheValid(serverCache, definition)) continue;\n\n let toolFilter: true | string[] | false = false;\n\n if (envOverride) {\n if (envServers.has(serverName)) {\n toolFilter = true;\n } else if (envTools.has(serverName)) {\n toolFilter = [...envTools.get(serverName)!];\n }\n } else {\n if (definition.directTools !== undefined) {\n toolFilter = definition.directTools;\n } else if (globalDirect) {\n toolFilter = globalDirect;\n }\n }\n\n if (!toolFilter) continue;\n\n for (const tool of serverCache.tools ?? []) {\n if (toolFilter !== true && !toolFilter.includes(tool.name)) continue;\n if (isToolExcluded(tool.name, serverName, prefix, definition.excludeTools)) continue;\n const prefixedName = formatToolName(tool.name, serverName, prefix);\n if (BUILTIN_NAMES.has(prefixedName)) {\n console.warn(`MCP: skipping direct tool \"${prefixedName}\" (collides with builtin)`);\n continue;\n }\n if (seenNames.has(prefixedName)) {\n console.warn(`MCP: skipping duplicate direct tool \"${prefixedName}\" from \"${serverName}\"`);\n continue;\n }\n seenNames.add(prefixedName);\n specs.push({\n serverName,\n originalName: tool.name,\n prefixedName,\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 serverCache.resources ?? []) {\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n if (toolFilter !== true && !toolFilter.includes(baseName)) continue;\n if (isToolExcluded(baseName, serverName, prefix, definition.excludeTools)) continue;\n const prefixedName = formatToolName(baseName, serverName, prefix);\n if (BUILTIN_NAMES.has(prefixedName)) {\n console.warn(`MCP: skipping direct resource tool \"${prefixedName}\" (collides with builtin)`);\n continue;\n }\n if (seenNames.has(prefixedName)) {\n console.warn(`MCP: skipping duplicate direct resource tool \"${prefixedName}\" from \"${serverName}\"`);\n continue;\n }\n seenNames.add(prefixedName);\n specs.push({\n serverName,\n originalName: baseName,\n prefixedName,\n description: resource.description ?? `Read resource: ${resource.uri}`,\n resourceUri: resource.uri,\n });\n }\n }\n }\n\n return specs;\n}\n\nexport function getMissingConfiguredDirectToolServers(\n config: McpConfig,\n cache: MetadataCache | null,\n): string[] {\n const missing: string[] = [];\n const globalDirect = config.settings?.directTools;\n\n for (const [serverName, definition] of Object.entries(config.mcpServers)) {\n const hasDirectTools = definition.directTools !== undefined\n ? !!definition.directTools\n : !!globalDirect;\n\n if (!hasDirectTools) continue;\n\n const serverCache = cache?.servers?.[serverName];\n if (!serverCache || !isServerCacheValid(serverCache, definition)) {\n missing.push(serverName);\n }\n }\n\n return missing;\n}\n\nexport function buildProxyDescription(\n config: McpConfig,\n cache: MetadataCache | null,\n directSpecs: DirectToolSpec[],\n): string {\n const prefix = config.settings?.toolPrefix ?? \"server\";\n let desc = `MCP gateway - connect to MCP servers and call their tools. Non-MCP Pi tools should be called directly, not through mcp.\\n`;\n\n const directByServer = new Map<string, number>();\n for (const spec of directSpecs) {\n directByServer.set(spec.serverName, (directByServer.get(spec.serverName) ?? 0) + 1);\n }\n if (directByServer.size > 0) {\n const parts = [...directByServer.entries()].map(\n ([server, count]) => `${server} (${count})`,\n );\n desc += `\\nDirect tools available (call as normal tools): ${parts.join(\", \")}\\n`;\n }\n\n const serverSummaries: string[] = [];\n for (const serverName of Object.keys(config.mcpServers)) {\n const entry = cache?.servers?.[serverName];\n const definition = config.mcpServers[serverName];\n const toolCount = (entry?.tools ?? []).filter(\n (tool) => !isToolExcluded(tool.name, serverName, prefix, definition.excludeTools),\n ).length;\n const resourceCount = definition?.exposeResources !== false\n ? (entry?.resources ?? []).filter((resource) => {\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n return !isToolExcluded(baseName, serverName, prefix, definition.excludeTools);\n }).length\n : 0;\n const totalItems = toolCount + resourceCount;\n if (totalItems === 0) continue;\n const directCount = directByServer.get(serverName) ?? 0;\n const proxyCount = totalItems - directCount;\n if (proxyCount > 0) {\n serverSummaries.push(`${serverName} (${proxyCount} tools)`);\n }\n }\n\n if (serverSummaries.length > 0) {\n desc += `\\nServers: ${serverSummaries.join(\", \")}\\n`;\n }\n\n desc += `\\nUsage:\\n`;\n desc += ` mcp({ }) → Show server status\\n`;\n desc += ` mcp({ server: \"name\" }) → List tools from server\\n`;\n desc += ` mcp({ search: \"query\" }) → Search MCP tools by name/description\\n`;\n desc += ` mcp({ describe: \"tool_name\" }) → Show tool details and parameters\\n`;\n desc += ` mcp({ connect: \"server-name\" }) → Connect to a server and refresh metadata\\n`;\n desc += ` mcp({ tool: \"name\", args: '{\"key\": \"value\"}' }) → Call a tool (args is JSON string)\\n`;\n desc += ` mcp({ action: \"ui-messages\" }) → Retrieve accumulated messages from completed UI sessions\\n`;\n desc += ` mcp({ action: \"auth-start\", server: \"name\" }) → Start manual OAuth and get a browser URL\\n`;\n desc += ` mcp({ action: \"auth-complete\", server: \"name\", args: '{\"redirectUrl\":\"...\"}' }) → Complete manual OAuth\\n`;\n desc += `\\nMode: action > tool (call) > connect > describe > search > server (list) > nothing (status)`;\n\n return desc;\n}\n\ntype DirectToolExecute = (\n toolCallId: string,\n params: Record<string, unknown>,\n signal: AbortSignal | undefined,\n onUpdate: AgentToolUpdateCallback<Record<string, unknown>> | undefined,\n ctx: ExtensionContext,\n) => Promise<AgentToolResult<Record<string, unknown>>>;\n\nexport function createDirectToolExecutor(\n getState: () => McpExtensionState | null,\n getInitPromise: () => Promise<McpExtensionState> | null,\n spec: DirectToolSpec\n): DirectToolExecute {\n return async function execute(_toolCallId, params, signal) {\n throwIfAborted(signal);\n let state = getState();\n const initPromise = getInitPromise();\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 let connected = await lazyConnect(state, spec.serverName, signal);\n let autoAuthAttempted = false;\n\n if (!connected && state.manager.getConnection(spec.serverName)?.status === \"needs-auth\") {\n autoAuthAttempted = true;\n const autoAuth = await attemptDirectAutoAuth(state, spec.serverName);\n if (autoAuth.status === \"failed\") {\n return {\n content: [{ type: \"text\" as const, text: autoAuth.message }],\n details: { error: \"auth_required\", server: spec.serverName, message: autoAuth.message },\n };\n }\n if (autoAuth.status === \"success\") {\n await state.manager.close(spec.serverName);\n state.failureTracker.delete(spec.serverName);\n connected = await lazyConnect(state, spec.serverName, signal);\n }\n }\n\n if (!connected) {\n const authConnection = state.manager.getConnection(spec.serverName);\n if (authConnection?.status === \"needs-auth\") {\n const message = getDirectAuthRequiredMessage(state, spec.serverName);\n return {\n content: [{ type: \"text\" as const, text: message }],\n details: { error: \"auth_required\", server: spec.serverName, message, autoAuthAttempted },\n };\n }\n const failedAgo = getFailureAgeSeconds(state, spec.serverName);\n return {\n content: [{ type: \"text\" as const, text: `MCP server \"${spec.serverName}\" not available${failedAgo !== null ? ` (failed ${failedAgo}s ago)` : \"\"}` }],\n details: { error: \"server_unavailable\", server: spec.serverName },\n };\n }\n\n const connection = state.manager.getConnection(spec.serverName);\n if (!connection || connection.status !== \"connected\") {\n return {\n content: [{ type: \"text\" as const, text: `MCP server \"${spec.serverName}\" not connected` }],\n details: { error: \"not_connected\", server: spec.serverName },\n };\n }\n\n let uiSession: UiSessionRuntime | null = null;\n const requestOptions = state.manager.getRequestOptions?.(spec.serverName, signal) ?? (signal ? { signal } : undefined);\n\n const outputGuardOptions = resolveMcpOutputGuardOptions(state.config.settings);\n\n try {\n state.manager.touch(spec.serverName);\n state.manager.incrementInFlight(spec.serverName);\n\n if (spec.resourceUri) {\n const result = await connection.client.readResource({ uri: spec.resourceUri }, requestOptions);\n const content = (result.contents ?? []).map(c => ({\n type: \"text\" as const,\n text: \"text\" in c ? c.text : (\"blob\" in c ? `[Binary data: ${(c as { mimeType?: string }).mimeType ?? \"unknown\"}]` : JSON.stringify(c)),\n }));\n const guarded = await guardMcpOutput(content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty resource)\" }], outputGuardOptions);\n return {\n content: guarded.content,\n details: { server: spec.serverName, resourceUri: spec.resourceUri, ...guardedMcpDetails(guarded) },\n };\n }\n\n const hasUi = !!spec.uiResourceUri;\n uiSession = hasUi\n ? await maybeStartUiSession(state, {\n serverName: spec.serverName,\n toolName: spec.originalName,\n toolArgs: params ?? {},\n uiResourceUri: spec.uiResourceUri!,\n streamMode: spec.uiStreamMode,\n })\n : null;\n\n const resultPromise = connection.client.callTool({\n name: spec.originalName,\n arguments: params ?? {},\n _meta: uiSession?.requestMeta,\n }, undefined, requestOptions);\n\n const result = await abortable(resultPromise, signal);\n uiSession?.sendToolResult(result as unknown as import(\"@modelcontextprotocol/sdk/types.js\").CallToolResult);\n\n if (result.isError) {\n const mcpContent = (result.content ?? []) as McpContent[];\n const content = transformMcpContent(mcpContent);\n const outputContent = content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty result)\" }];\n const schemaText = spec.inputSchema ? `\\n\\nExpected parameters:\\n${formatSchema(spec.inputSchema)}` : \"\";\n const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, prefix: \"Error: \", suffix: schemaText, emptyTextFallback: \"Tool execution failed\" });\n return {\n content: guarded.content,\n details: { error: \"tool_error\", server: spec.serverName, ...guardedMcpDetails(guarded) },\n };\n }\n\n const content = resolveMcpResultContent(result as Record<string, unknown>);\n const outputContent = content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty result)\" }];\n if (hasUi) {\n const uiMessage = uiSession?.reused\n ? \"Updated the open UI.\"\n : \"📺 Interactive UI is now open in your browser. I'll respond to your prompts and intents as you interact with it.\";\n const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, suffix: `\\n\\n${uiMessage}` });\n return {\n content: guarded.content,\n details: { server: spec.serverName, tool: spec.originalName, uiOpen: true, ...guardedMcpDetails(guarded) },\n };\n }\n\n const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions });\n return {\n content: guarded.content,\n details: { server: spec.serverName, tool: spec.originalName, ...guardedMcpDetails(guarded) },\n };\n } catch (error) {\n if (error instanceof UrlElicitationRequiredError) {\n const action = await state.manager.handleUrlElicitationRequired(spec.serverName, error);\n const message = action === \"accept\"\n ? \"The original MCP tool did not run. Complete the opened browser interaction, then retry the tool.\"\n : `The URL interaction was ${action === \"decline\" ? \"declined\" : \"cancelled\"}.`;\n uiSession?.sendToolCancelled(message);\n return {\n content: [{ type: \"text\" as const, text: message }],\n details: { error: \"url_elicitation_required\", server: spec.serverName, action },\n };\n }\n const message = error instanceof Error ? error.message : String(error);\n uiSession?.sendToolCancelled(message);\n const schemaText = spec.inputSchema ? `\\n\\nExpected parameters:\\n${formatSchema(spec.inputSchema)}` : \"\";\n const guarded = await guardMcpOutput([{ type: \"text\" as const, text: message }], { ...outputGuardOptions, prefix: \"Failed to call tool: \", suffix: schemaText });\n return {\n content: guarded.content,\n details: { error: \"call_failed\", server: spec.serverName, ...guardedMcpDetails(guarded) },\n };\n } finally {\n if (uiSession?.reused) {\n uiSession.close();\n }\n state.manager.decrementInFlight(spec.serverName);\n state.manager.touch(spec.serverName);\n }\n };\n}\n"]}
1
+ {"version":3,"file":"direct-tools.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/direct-tools.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DirectToolSpec, McpConfig } from \"./types.ts\";\nimport type { MetadataCache } from \"./metadata-cache.ts\";\nimport { isServerCacheValid } from \"./metadata-cache.ts\";\nimport { formatToolName, isToolExcluded } from \"./types.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\n\nconst BUILTIN_NAMES = new Set([\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\", \"mcp\"]);\n\nexport function resolveDirectTools(\n config: McpConfig,\n cache: MetadataCache | null,\n prefix: \"server\" | \"none\" | \"short\",\n envOverride?: string[],\n): DirectToolSpec[] {\n const specs: DirectToolSpec[] = [];\n if (!cache) return specs;\n\n const seenNames = new Set<string>();\n\n const envServers = new Set<string>();\n const envTools = new Map<string, Set<string>>();\n if (envOverride) {\n for (let item of envOverride) {\n item = item.replace(/\\/+$/, \"\");\n if (item.includes(\"/\")) {\n const [server, tool] = item.split(\"/\", 2);\n if (server && tool) {\n if (!envTools.has(server)) envTools.set(server, new Set());\n envTools.get(server)!.add(tool);\n } else if (server) {\n envServers.add(server);\n }\n } else if (item) {\n envServers.add(item);\n }\n }\n }\n\n const globalDirect = config.settings?.directTools;\n\n for (const [serverName, definition] of Object.entries(config.mcpServers)) {\n const serverCache = cache.servers[serverName];\n if (!serverCache || !isServerCacheValid(serverCache, definition)) continue;\n\n let toolFilter: true | string[] | false = false;\n\n if (envOverride) {\n if (envServers.has(serverName)) {\n toolFilter = true;\n } else if (envTools.has(serverName)) {\n toolFilter = [...envTools.get(serverName)!];\n }\n } else {\n if (definition.directTools !== undefined) {\n toolFilter = definition.directTools;\n } else if (globalDirect) {\n toolFilter = globalDirect;\n }\n }\n\n if (!toolFilter) continue;\n\n for (const tool of serverCache.tools ?? []) {\n if (toolFilter !== true && !toolFilter.includes(tool.name)) continue;\n if (isToolExcluded(tool.name, serverName, prefix, definition.excludeTools)) continue;\n const prefixedName = formatToolName(tool.name, serverName, prefix);\n if (BUILTIN_NAMES.has(prefixedName)) {\n console.warn(`MCP: skipping direct tool \"${prefixedName}\" (collides with builtin)`);\n continue;\n }\n if (seenNames.has(prefixedName)) {\n console.warn(`MCP: skipping duplicate direct tool \"${prefixedName}\" from \"${serverName}\"`);\n continue;\n }\n seenNames.add(prefixedName);\n specs.push({\n serverName,\n originalName: tool.name,\n prefixedName,\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 serverCache.resources ?? []) {\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n if (toolFilter !== true && !toolFilter.includes(baseName)) continue;\n if (isToolExcluded(baseName, serverName, prefix, definition.excludeTools)) continue;\n const prefixedName = formatToolName(baseName, serverName, prefix);\n if (BUILTIN_NAMES.has(prefixedName)) {\n console.warn(`MCP: skipping direct resource tool \"${prefixedName}\" (collides with builtin)`);\n continue;\n }\n if (seenNames.has(prefixedName)) {\n console.warn(`MCP: skipping duplicate direct resource tool \"${prefixedName}\" from \"${serverName}\"`);\n continue;\n }\n seenNames.add(prefixedName);\n specs.push({\n serverName,\n originalName: baseName,\n prefixedName,\n description: resource.description ?? `Read resource: ${resource.uri}`,\n resourceUri: resource.uri,\n });\n }\n }\n }\n\n return specs;\n}\n\nexport function getMissingConfiguredDirectToolServers(\n config: McpConfig,\n cache: MetadataCache | null,\n): string[] {\n const missing: string[] = [];\n const globalDirect = config.settings?.directTools;\n\n for (const [serverName, definition] of Object.entries(config.mcpServers)) {\n const hasDirectTools = definition.directTools !== undefined\n ? !!definition.directTools\n : !!globalDirect;\n\n if (!hasDirectTools) continue;\n\n const serverCache = cache?.servers?.[serverName];\n if (!serverCache || !isServerCacheValid(serverCache, definition)) {\n missing.push(serverName);\n }\n }\n\n return missing;\n}\n\nexport function buildProxyDescription(\n config: McpConfig,\n cache: MetadataCache | null,\n directSpecs: DirectToolSpec[],\n): string {\n const prefix = config.settings?.toolPrefix ?? \"server\";\n let desc = `MCP gateway - connect to MCP servers and call their tools. Non-MCP Pi tools should be called directly, not through mcp.\\n`;\n\n const directByServer = new Map<string, number>();\n for (const spec of directSpecs) {\n directByServer.set(spec.serverName, (directByServer.get(spec.serverName) ?? 0) + 1);\n }\n if (directByServer.size > 0) {\n const parts = [...directByServer.entries()].map(\n ([server, count]) => `${server} (${count})`,\n );\n desc += `\\nDirect tools available (call as normal tools): ${parts.join(\", \")}\\n`;\n }\n\n const serverSummaries: string[] = [];\n for (const serverName of Object.keys(config.mcpServers)) {\n const entry = cache?.servers?.[serverName];\n const definition = config.mcpServers[serverName];\n const toolCount = (entry?.tools ?? []).filter(\n (tool) => !isToolExcluded(tool.name, serverName, prefix, definition.excludeTools),\n ).length;\n const resourceCount = definition?.exposeResources !== false\n ? (entry?.resources ?? []).filter((resource) => {\n const baseName = `get_${resourceNameToToolName(resource.name)}`;\n return !isToolExcluded(baseName, serverName, prefix, definition.excludeTools);\n }).length\n : 0;\n const totalItems = toolCount + resourceCount;\n if (totalItems === 0) continue;\n const directCount = directByServer.get(serverName) ?? 0;\n const proxyCount = totalItems - directCount;\n if (proxyCount > 0) {\n serverSummaries.push(`${serverName} (${proxyCount} tools)`);\n }\n }\n\n if (serverSummaries.length > 0) {\n desc += `\\nServers: ${serverSummaries.join(\", \")}\\n`;\n }\n\n desc += `\\nUsage:\\n`;\n desc += ` mcp({ }) → Show server status\\n`;\n desc += ` mcp({ server: \"name\" }) → List tools from server\\n`;\n desc += ` mcp({ search: \"query\" }) → Search MCP tools by name/description\\n`;\n desc += ` mcp({ describe: \"tool_name\" }) → Show tool details and parameters\\n`;\n desc += ` mcp({ connect: \"server-name\" }) → Connect to a server and refresh metadata\\n`;\n desc += ` mcp({ tool: \"name\", args: '{\"key\": \"value\"}' }) → Call a tool (args is JSON string)\\n`;\n desc += ` mcp({ action: \"ui-messages\" }) → Retrieve accumulated messages from completed UI sessions\\n`;\n desc += ` mcp({ action: \"auth-start\", server: \"name\" }) → Start manual OAuth and get a browser URL\\n`;\n desc += ` mcp({ action: \"auth-complete\", server: \"name\", args: '{\"redirectUrl\":\"...\"}' }) → Complete manual OAuth\\n`;\n desc += `\\nMode: action > tool (call) > connect > describe > search > server (list) > nothing (status)`;\n\n return desc;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,iCAAiC,CAAC;AAc9E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,EAAE,YAAY,QA8VlD","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.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,iCAAiC,CAAC;AAqChG,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,EAAE,YAAY,QAqgBlD","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"]}