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