@akon-labs/nexus-cli 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +1 -0
  3. package/README.md +3 -2
  4. package/dist/app-bridge.bundle.js +67 -0
  5. package/dist/cli.js +20263 -2158
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +1 -1
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/auto-model.d.ts +1 -1
  10. package/dist/core/auto-model.d.ts.map +1 -1
  11. package/dist/core/auto-model.js +1 -1
  12. package/dist/core/auto-model.js.map +1 -1
  13. package/dist/core/model-resolver.d.ts +2 -2
  14. package/dist/core/model-resolver.d.ts.map +1 -1
  15. package/dist/core/model-resolver.js +3 -3
  16. package/dist/core/model-resolver.js.map +1 -1
  17. package/dist/core/package-manager.d.ts +15 -0
  18. package/dist/core/package-manager.d.ts.map +1 -1
  19. package/dist/core/package-manager.js +50 -0
  20. package/dist/core/package-manager.js.map +1 -1
  21. package/dist/core/sdk.d.ts.map +1 -1
  22. package/dist/core/sdk.js +1 -1
  23. package/dist/core/sdk.js.map +1 -1
  24. package/dist/core/slash-commands.d.ts.map +1 -1
  25. package/dist/core/slash-commands.js +3 -3
  26. package/dist/core/slash-commands.js.map +1 -1
  27. package/dist/core/system-prompt.d.ts.map +1 -1
  28. package/dist/core/system-prompt.js +1 -1
  29. package/dist/core/system-prompt.js.map +1 -1
  30. package/dist/core/tools/index.d.ts +1 -1
  31. package/dist/core/tools/index.d.ts.map +1 -1
  32. package/dist/core/tools/index.js +5 -5
  33. package/dist/core/tools/index.js.map +1 -1
  34. package/dist/core/tools/websearch.d.ts.map +1 -1
  35. package/dist/core/tools/websearch.js +3 -3
  36. package/dist/core/tools/websearch.js.map +1 -1
  37. package/dist/extensions/gitnexus/gateway.d.ts +6 -6
  38. package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
  39. package/dist/extensions/gitnexus/gateway.js +4 -4
  40. package/dist/extensions/gitnexus/gateway.js.map +1 -1
  41. package/dist/extensions/gitnexus/index.d.ts.map +1 -1
  42. package/dist/extensions/gitnexus/index.js +4 -2
  43. package/dist/extensions/gitnexus/index.js.map +1 -1
  44. package/dist/extensions/mcp/abort.d.ts +3 -0
  45. package/dist/extensions/mcp/abort.d.ts.map +1 -0
  46. package/dist/extensions/mcp/abort.js +41 -0
  47. package/dist/extensions/mcp/abort.js.map +1 -0
  48. package/dist/extensions/mcp/agent-dir.d.ts +6 -0
  49. package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
  50. package/dist/extensions/mcp/agent-dir.js +18 -0
  51. package/dist/extensions/mcp/agent-dir.js.map +1 -0
  52. package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
  53. package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
  54. package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
  55. package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
  56. package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
  57. package/dist/extensions/mcp/commands.d.ts +27 -0
  58. package/dist/extensions/mcp/commands.d.ts.map +1 -0
  59. package/dist/extensions/mcp/commands.js +629 -0
  60. package/dist/extensions/mcp/commands.js.map +1 -0
  61. package/dist/extensions/mcp/config.d.ts +121 -38
  62. package/dist/extensions/mcp/config.d.ts.map +1 -1
  63. package/dist/extensions/mcp/config.js +1030 -70
  64. package/dist/extensions/mcp/config.js.map +1 -1
  65. package/dist/extensions/mcp/consent-manager.d.ts +14 -0
  66. package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
  67. package/dist/extensions/mcp/consent-manager.js +60 -0
  68. package/dist/extensions/mcp/consent-manager.js.map +1 -0
  69. package/dist/extensions/mcp/direct-tools.d.ts +11 -0
  70. package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
  71. package/dist/extensions/mcp/direct-tools.js +562 -0
  72. package/dist/extensions/mcp/direct-tools.js.map +1 -0
  73. package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
  74. package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
  75. package/dist/extensions/mcp/elicitation-handler.js +320 -0
  76. package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
  77. package/dist/extensions/mcp/error-signal.d.ts +16 -0
  78. package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
  79. package/dist/extensions/mcp/error-signal.js +22 -0
  80. package/dist/extensions/mcp/error-signal.js.map +1 -0
  81. package/dist/extensions/mcp/errors.d.ts +104 -0
  82. package/dist/extensions/mcp/errors.d.ts.map +1 -0
  83. package/dist/extensions/mcp/errors.js +171 -0
  84. package/dist/extensions/mcp/errors.js.map +1 -0
  85. package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
  86. package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
  87. package/dist/extensions/mcp/glimpse-ui.js +67 -0
  88. package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
  89. package/dist/extensions/mcp/host-html-template.d.ts +17 -0
  90. package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
  91. package/dist/extensions/mcp/host-html-template.js +442 -0
  92. package/dist/extensions/mcp/host-html-template.js.map +1 -0
  93. package/dist/extensions/mcp/index.d.ts +20 -15
  94. package/dist/extensions/mcp/index.d.ts.map +1 -1
  95. package/dist/extensions/mcp/index.js +1064 -82
  96. package/dist/extensions/mcp/index.js.map +1 -1
  97. package/dist/extensions/mcp/init.d.ts +28 -0
  98. package/dist/extensions/mcp/init.d.ts.map +1 -0
  99. package/dist/extensions/mcp/init.js +631 -0
  100. package/dist/extensions/mcp/init.js.map +1 -0
  101. package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
  102. package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
  103. package/dist/extensions/mcp/json-schema-validator.js +53 -0
  104. package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
  105. package/dist/extensions/mcp/lifecycle.d.ts +56 -0
  106. package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
  107. package/dist/extensions/mcp/lifecycle.js +395 -0
  108. package/dist/extensions/mcp/lifecycle.js.map +1 -0
  109. package/dist/extensions/mcp/logger.d.ts +52 -0
  110. package/dist/extensions/mcp/logger.d.ts.map +1 -0
  111. package/dist/extensions/mcp/logger.js +134 -0
  112. package/dist/extensions/mcp/logger.js.map +1 -0
  113. package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
  114. package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
  115. package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
  116. package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
  117. package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
  118. package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
  119. package/dist/extensions/mcp/mcp-auth.js +897 -0
  120. package/dist/extensions/mcp/mcp-auth.js.map +1 -0
  121. package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
  122. package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
  123. package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
  124. package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
  125. package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
  126. package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
  127. package/dist/extensions/mcp/mcp-callback-server.js +454 -0
  128. package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
  129. package/dist/extensions/mcp/mcp-code.d.ts +48 -0
  130. package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
  131. package/dist/extensions/mcp/mcp-code.js +358 -0
  132. package/dist/extensions/mcp/mcp-code.js.map +1 -0
  133. package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
  134. package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
  135. package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
  136. package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
  137. package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
  138. package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
  139. package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
  140. package/dist/extensions/mcp/mcp-output-guard.js +343 -0
  141. package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
  142. package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
  143. package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
  144. package/dist/extensions/mcp/mcp-panel.js +973 -0
  145. package/dist/extensions/mcp/mcp-panel.js.map +1 -0
  146. package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
  147. package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
  148. package/dist/extensions/mcp/mcp-probe.js +155 -0
  149. package/dist/extensions/mcp/mcp-probe.js.map +1 -0
  150. package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
  151. package/dist/extensions/mcp/mcp-setup-panel.d.ts +85 -0
  152. package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
  153. package/dist/extensions/mcp/mcp-setup-panel.js +618 -0
  154. package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
  155. package/dist/extensions/mcp/mcp-status.d.ts +12 -0
  156. package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
  157. package/dist/extensions/mcp/mcp-status.js +98 -0
  158. package/dist/extensions/mcp/mcp-status.js.map +1 -0
  159. package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
  160. package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
  161. package/dist/extensions/mcp/mcp-trace.js +252 -0
  162. package/dist/extensions/mcp/mcp-trace.js.map +1 -0
  163. package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
  164. package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
  165. package/dist/extensions/mcp/metadata-cache.js +318 -0
  166. package/dist/extensions/mcp/metadata-cache.js.map +1 -0
  167. package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
  168. package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
  169. package/dist/extensions/mcp/npx-resolver.js +505 -0
  170. package/dist/extensions/mcp/npx-resolver.js.map +1 -0
  171. package/dist/extensions/mcp/oauth.d.ts +21 -0
  172. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  173. package/dist/extensions/mcp/oauth.js +15 -0
  174. package/dist/extensions/mcp/oauth.js.map +1 -0
  175. package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
  176. package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
  177. package/dist/extensions/mcp/onboarding-state.js +65 -0
  178. package/dist/extensions/mcp/onboarding-state.js.map +1 -0
  179. package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
  180. package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
  181. package/dist/extensions/mcp/package-mcp-loader.js +170 -0
  182. package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
  183. package/dist/extensions/mcp/panel-keys.d.ts +21 -0
  184. package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
  185. package/dist/extensions/mcp/panel-keys.js +29 -0
  186. package/dist/extensions/mcp/panel-keys.js.map +1 -0
  187. package/dist/extensions/mcp/prompts.d.ts +63 -0
  188. package/dist/extensions/mcp/prompts.d.ts.map +1 -0
  189. package/dist/extensions/mcp/prompts.js +297 -0
  190. package/dist/extensions/mcp/prompts.js.map +1 -0
  191. package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
  192. package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
  193. package/dist/extensions/mcp/proxy-modes.js +1421 -0
  194. package/dist/extensions/mcp/proxy-modes.js.map +1 -0
  195. package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
  196. package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
  197. package/dist/extensions/mcp/request-headers-command.js +334 -0
  198. package/dist/extensions/mcp/request-headers-command.js.map +1 -0
  199. package/dist/extensions/mcp/resource-tools.d.ts +2 -0
  200. package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
  201. package/dist/extensions/mcp/resource-tools.js +15 -0
  202. package/dist/extensions/mcp/resource-tools.js.map +1 -0
  203. package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
  204. package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
  205. package/dist/extensions/mcp/runtime-owner.js +84 -0
  206. package/dist/extensions/mcp/runtime-owner.js.map +1 -0
  207. package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
  208. package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
  209. package/dist/extensions/mcp/sampling-handler.js +229 -0
  210. package/dist/extensions/mcp/sampling-handler.js.map +1 -0
  211. package/dist/extensions/mcp/search-ranking.d.ts +25 -0
  212. package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
  213. package/dist/extensions/mcp/search-ranking.js +234 -0
  214. package/dist/extensions/mcp/search-ranking.js.map +1 -0
  215. package/dist/extensions/mcp/server-manager.d.ts +116 -0
  216. package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
  217. package/dist/extensions/mcp/server-manager.js +1052 -0
  218. package/dist/extensions/mcp/server-manager.js.map +1 -0
  219. package/dist/extensions/mcp/session-recovery.d.ts +27 -0
  220. package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
  221. package/dist/extensions/mcp/session-recovery.js +140 -0
  222. package/dist/extensions/mcp/session-recovery.js.map +1 -0
  223. package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
  224. package/dist/extensions/mcp/state.d.ts +62 -0
  225. package/dist/extensions/mcp/state.d.ts.map +1 -0
  226. package/dist/extensions/mcp/state.js +2 -0
  227. package/dist/extensions/mcp/state.js.map +1 -0
  228. package/dist/extensions/mcp/tool-approval.d.ts +11 -0
  229. package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
  230. package/dist/extensions/mcp/tool-approval.js +156 -0
  231. package/dist/extensions/mcp/tool-approval.js.map +1 -0
  232. package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
  233. package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
  234. package/dist/extensions/mcp/tool-metadata.js +264 -0
  235. package/dist/extensions/mcp/tool-metadata.js.map +1 -0
  236. package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
  237. package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
  238. package/dist/extensions/mcp/tool-registrar.js +229 -0
  239. package/dist/extensions/mcp/tool-registrar.js.map +1 -0
  240. package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
  241. package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
  242. package/dist/extensions/mcp/tool-result-renderer.js +345 -0
  243. package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
  244. package/dist/extensions/mcp/ts-shape.d.ts +3 -0
  245. package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
  246. package/dist/extensions/mcp/ts-shape.js +160 -0
  247. package/dist/extensions/mcp/ts-shape.js.map +1 -0
  248. package/dist/extensions/mcp/types.d.ts +521 -0
  249. package/dist/extensions/mcp/types.d.ts.map +1 -0
  250. package/dist/extensions/mcp/types.js +294 -0
  251. package/dist/extensions/mcp/types.js.map +1 -0
  252. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
  253. package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
  254. package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
  255. package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
  256. package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
  257. package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
  258. package/dist/extensions/mcp/ui-resource-handler.js +210 -0
  259. package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
  260. package/dist/extensions/mcp/ui-server.d.ts +52 -0
  261. package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
  262. package/dist/extensions/mcp/ui-server.js +740 -0
  263. package/dist/extensions/mcp/ui-server.js.map +1 -0
  264. package/dist/extensions/mcp/ui-session.d.ts +40 -0
  265. package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
  266. package/dist/extensions/mcp/ui-session.js +477 -0
  267. package/dist/extensions/mcp/ui-session.js.map +1 -0
  268. package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
  269. package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
  270. package/dist/extensions/mcp/ui-stream-types.js +61 -0
  271. package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
  272. package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
  273. package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
  274. package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
  275. package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
  276. package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
  277. package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
  278. package/dist/extensions/mcp/unix-socket-transport.js +85 -0
  279. package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
  280. package/dist/extensions/mcp/utils.d.ts +32 -0
  281. package/dist/extensions/mcp/utils.d.ts.map +1 -0
  282. package/dist/extensions/mcp/utils.js +336 -0
  283. package/dist/extensions/mcp/utils.js.map +1 -0
  284. package/dist/extensions/subagent/index.d.ts +61 -1
  285. package/dist/extensions/subagent/index.d.ts.map +1 -1
  286. package/dist/extensions/subagent/index.js +177 -4
  287. package/dist/extensions/subagent/index.js.map +1 -1
  288. package/dist/extensions/web-access.d.ts.map +1 -1
  289. package/dist/extensions/web-access.js +1 -1
  290. package/dist/extensions/web-access.js.map +1 -1
  291. package/dist/index.d.ts +2 -0
  292. package/dist/index.d.ts.map +1 -1
  293. package/dist/index.js +20057 -1947
  294. package/dist/index.js.map +1 -1
  295. package/dist/mcp-keyring-helper.cjs +89 -0
  296. package/dist/mcp-script-worker.mjs +130 -0
  297. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  298. package/dist/modes/interactive/components/model-selector.js +1 -1
  299. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  300. package/dist/modes/interactive/components/response-separator.d.ts +1 -1
  301. package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/response-separator.js +1 -1
  303. package/dist/modes/interactive/components/response-separator.js.map +1 -1
  304. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  305. package/dist/modes/interactive/interactive-mode.js +7 -5
  306. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  307. package/dist/rpc-entry.js +20263 -2158
  308. package/dist/skills/mcp-scripting/SKILL.md +38 -0
  309. package/dist/vendor/ai.js +280 -205
  310. package/docs/mcp.md +178 -0
  311. package/docs/pi-subagents.md +75 -0
  312. package/docs/quickstart.md +1 -1
  313. package/docs/usage.md +2 -1
  314. package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
  315. package/npm-shrinkwrap.json +763 -6
  316. package/package.json +15 -4
  317. package/dist/extensions/mcp/client.d.ts +0 -86
  318. package/dist/extensions/mcp/client.d.ts.map +0 -1
  319. package/dist/extensions/mcp/client.js +0 -275
  320. package/dist/extensions/mcp/client.js.map +0 -1
@@ -0,0 +1,562 @@
1
+ import { UrlElicitationRequiredError } from "@modelcontextprotocol/client";
2
+ import { abortable, throwIfAborted } from "./abort.js";
3
+ import { clearFailure, getFailureAgeSeconds, lazyConnect } from "./init.js";
4
+ import { isServerCacheValid, parseDirectToolSelectors } from "./metadata-cache.js";
5
+ export { getMissingConfiguredDirectToolServers } from "./metadata-cache.js";
6
+ import { authenticate, supportsOAuth } from "./mcp-auth-flow.js";
7
+ import { guardedMcpDetails, guardMcpOutput, resolveMcpOutputGuardOptions } from "./mcp-output-guard.js";
8
+ import { resourceNameToToolName } from "./resource-tools.js";
9
+ import { combineAbortSignals, isAbortError } from "./runtime-owner.js";
10
+ import { SessionRecoveryAuthRequiredError, withSessionRecovery } from "./session-recovery.js";
11
+ import { ensureToolCallApproved } from "./tool-approval.js";
12
+ import { formatSchema } from "./tool-metadata.js";
13
+ import { resolveMcpResultContent, transformMcpContent, transformMcpResourceContents } from "./tool-registrar.js";
14
+ import { createToolSelectorCandidateIndex, formatToolName, getToolNameCandidates, isServerDisabled, isToolAllowed, resolveToolPrefix, } from "./types.js";
15
+ import { maybeStartUiSession, summarizeUiSessionResult } from "./ui-session.js";
16
+ import { isUiToolVisibleToModel } from "./ui-tool-visibility.js";
17
+ import { formatAuthRequiredMessage, normalizeToolArguments, resolveServerUrl, truncateAtWord } from "./utils.js";
18
+ const BUILTIN_NAMES = new Set(["read", "bash", "edit", "write", "grep", "find", "ls", "mcp"]);
19
+ const INSTRUCTIONS_SNIPPET_LENGTH = 150;
20
+ export const DIRECT_TOOLS_ADVISORY_THRESHOLD = 75;
21
+ 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.`) {
22
+ return formatAuthRequiredMessage(state.config, serverName, defaultMessage);
23
+ }
24
+ function getDirectAuthFailedMessage(state, serverName, message) {
25
+ const customGuidance = state.config.settings?.authRequiredMessage;
26
+ if (customGuidance) {
27
+ return `OAuth authentication failed for "${serverName}": ${message}. ${getDirectAuthRequiredMessage(state, serverName)}`;
28
+ }
29
+ 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.`;
30
+ }
31
+ async function attemptDirectAutoAuth(state, serverName, signal) {
32
+ if (state.config.settings?.autoAuth !== true) {
33
+ return { status: "skipped" };
34
+ }
35
+ const definition = state.config.mcpServers[serverName];
36
+ if (!definition || isServerDisabled(definition) || !supportsOAuth(definition)) {
37
+ return { status: "skipped" };
38
+ }
39
+ let serverUrl;
40
+ try {
41
+ serverUrl = resolveServerUrl(definition);
42
+ }
43
+ catch (error) {
44
+ const message = error instanceof Error ? error.message : String(error);
45
+ return { status: "failed", message: getDirectAuthFailedMessage(state, serverName, message) };
46
+ }
47
+ if (!serverUrl) {
48
+ return { status: "skipped" };
49
+ }
50
+ const grantType = definition.oauth ? (definition.oauth.grantType ?? "authorization_code") : "authorization_code";
51
+ if (!state.ui && grantType !== "client_credentials") {
52
+ return {
53
+ status: "failed",
54
+ 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.`),
55
+ };
56
+ }
57
+ try {
58
+ if (state.authStorageOptions) {
59
+ await authenticate(serverName, serverUrl, definition, signal
60
+ ? { authStorageOptions: state.authStorageOptions, signal, runtime: state.oauthRuntime }
61
+ : { authStorageOptions: state.authStorageOptions, runtime: state.oauthRuntime });
62
+ }
63
+ else {
64
+ await authenticate(serverName, serverUrl, definition, {
65
+ ...(signal ? { signal } : {}),
66
+ runtime: state.oauthRuntime,
67
+ });
68
+ }
69
+ return { status: "success" };
70
+ }
71
+ catch (error) {
72
+ if (isAbortError(error, signal))
73
+ throw error;
74
+ const message = error instanceof Error ? error.message : String(error);
75
+ return {
76
+ status: "failed",
77
+ message: getDirectAuthFailedMessage(state, serverName, message),
78
+ };
79
+ }
80
+ }
81
+ export function resolveDirectTools(config, cache, prefix, envOverride) {
82
+ const specs = [];
83
+ if (!cache)
84
+ return specs;
85
+ const seenNames = new Set();
86
+ const envSelection = envOverride ? parseDirectToolSelectors(envOverride) : null;
87
+ const globalDirect = config.settings?.directTools;
88
+ for (const [serverName, definition] of Object.entries(config.mcpServers)) {
89
+ if (isServerDisabled(definition))
90
+ continue;
91
+ const serverCache = cache.servers[serverName];
92
+ if (!serverCache || !isServerCacheValid(serverCache, definition))
93
+ continue;
94
+ let toolFilter = false;
95
+ if (envSelection) {
96
+ if (envSelection.servers.has(serverName)) {
97
+ toolFilter = true;
98
+ }
99
+ else if (envSelection.tools.has(serverName)) {
100
+ toolFilter = [...envSelection.tools.get(serverName)];
101
+ }
102
+ }
103
+ else {
104
+ if (definition.directTools !== undefined) {
105
+ toolFilter = definition.directTools;
106
+ }
107
+ else if (globalDirect) {
108
+ toolFilter = globalDirect;
109
+ }
110
+ }
111
+ if (!toolFilter)
112
+ continue;
113
+ const effectivePrefix = resolveToolPrefix(definition, prefix);
114
+ const hasToolFilters = (Array.isArray(definition.includeTools) && definition.includeTools.length > 0) ||
115
+ (Array.isArray(definition.excludeTools) && definition.excludeTools.length > 0);
116
+ const selectorCandidateIndex = hasToolFilters
117
+ ? (() => {
118
+ const candidates = new Set();
119
+ for (const [otherServerName, otherDefinition] of Object.entries(config.mcpServers)) {
120
+ const otherCache = cache.servers[otherServerName];
121
+ if (!otherCache ||
122
+ !isServerCacheValid(otherCache, otherDefinition) ||
123
+ isServerDisabled(otherDefinition))
124
+ continue;
125
+ const otherPrefix = resolveToolPrefix(otherDefinition, prefix);
126
+ for (const otherTool of otherCache.tools ?? []) {
127
+ if (!isUiToolVisibleToModel(otherTool.uiVisibility))
128
+ continue;
129
+ for (const candidate of getToolNameCandidates(otherTool.name, otherServerName, otherPrefix, false))
130
+ candidates.add(candidate);
131
+ }
132
+ if (otherDefinition.exposeResources !== false) {
133
+ for (const resource of otherCache.resources ?? []) {
134
+ const baseName = `read_${resourceNameToToolName(resource.name)}`;
135
+ for (const candidate of getToolNameCandidates(baseName, otherServerName, otherPrefix, false))
136
+ candidates.add(candidate);
137
+ }
138
+ }
139
+ }
140
+ return createToolSelectorCandidateIndex(candidates);
141
+ })()
142
+ : undefined;
143
+ for (const tool of serverCache.tools ?? []) {
144
+ if (!isUiToolVisibleToModel(tool.uiVisibility))
145
+ continue;
146
+ if (toolFilter !== true && !toolFilter.includes(tool.name))
147
+ continue;
148
+ if (!isToolAllowed(tool.name, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, selectorCandidateIndex))
149
+ continue;
150
+ const prefixedName = formatToolName(tool.name, serverName, effectivePrefix);
151
+ if (BUILTIN_NAMES.has(prefixedName)) {
152
+ console.warn(`MCP: skipping direct tool "${prefixedName}" (collides with builtin)`);
153
+ continue;
154
+ }
155
+ if (seenNames.has(prefixedName)) {
156
+ console.warn(`MCP: skipping duplicate direct tool "${prefixedName}" from "${serverName}"`);
157
+ continue;
158
+ }
159
+ seenNames.add(prefixedName);
160
+ specs.push({
161
+ serverName,
162
+ originalName: tool.name,
163
+ prefixedName,
164
+ description: tool.description ?? "",
165
+ ...(tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {}),
166
+ ...(tool.uiResourceUri !== undefined ? { uiResourceUri: tool.uiResourceUri } : {}),
167
+ ...(tool.uiStreamMode !== undefined ? { uiStreamMode: tool.uiStreamMode } : {}),
168
+ });
169
+ }
170
+ if (definition.exposeResources !== false) {
171
+ for (const resource of serverCache.resources ?? []) {
172
+ const baseName = `read_${resourceNameToToolName(resource.name)}`;
173
+ if (toolFilter !== true && !toolFilter.includes(baseName))
174
+ continue;
175
+ if (!isToolAllowed(baseName, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, selectorCandidateIndex))
176
+ continue;
177
+ const prefixedName = formatToolName(baseName, serverName, effectivePrefix);
178
+ if (BUILTIN_NAMES.has(prefixedName)) {
179
+ console.warn(`MCP: skipping direct resource tool "${prefixedName}" (collides with builtin)`);
180
+ continue;
181
+ }
182
+ if (seenNames.has(prefixedName)) {
183
+ console.warn(`MCP: skipping duplicate direct resource tool "${prefixedName}" from "${serverName}"`);
184
+ continue;
185
+ }
186
+ seenNames.add(prefixedName);
187
+ specs.push({
188
+ serverName,
189
+ originalName: baseName,
190
+ prefixedName,
191
+ description: resource.description ?? `Read resource: ${resource.uri}`,
192
+ resourceUri: resource.uri,
193
+ });
194
+ }
195
+ }
196
+ }
197
+ if (config.settings?.warnOnLargeDirectTools !== false && specs.length >= DIRECT_TOOLS_ADVISORY_THRESHOLD) {
198
+ console.warn(`MCP: ${specs.length} direct tools resolved. Each direct tool adds prompt context; README guidance recommends targeted sets of 5-20 tools and using the proxy or an explicit string[] when 75+ direct tools would be registered.`);
199
+ }
200
+ return specs;
201
+ }
202
+ export function buildProxyDescription(config, cache, directSpecs) {
203
+ const prefix = config.settings?.toolPrefix ?? "server";
204
+ let desc = `MCP gateway — server status, tool search/describe, auth, and single MCP tool calls. When one request needs several MCP calls with logic between them, use mcpScript. Non-MCP Nexus tools should be called directly, not through mcp.\n`;
205
+ const directByServer = new Map();
206
+ for (const spec of directSpecs) {
207
+ directByServer.set(spec.serverName, (directByServer.get(spec.serverName) ?? 0) + 1);
208
+ }
209
+ if (directByServer.size > 0) {
210
+ const parts = [...directByServer.entries()].map(([server, count]) => `${server} (${count})`);
211
+ desc += `\nDirect tools available (call as normal tools): ${parts.join(", ")}\n`;
212
+ }
213
+ const serverSummaries = [];
214
+ for (const serverName of Object.keys(config.mcpServers)) {
215
+ const definition = config.mcpServers[serverName];
216
+ if (!definition || isServerDisabled(definition))
217
+ continue;
218
+ const cachedEntry = cache?.servers?.[serverName];
219
+ const entry = cachedEntry && isServerCacheValid(cachedEntry, definition) ? cachedEntry : undefined;
220
+ const effectivePrefix = resolveToolPrefix(definition, prefix);
221
+ const hasToolFilters = (Array.isArray(definition.includeTools) && definition.includeTools.length > 0) ||
222
+ (Array.isArray(definition.excludeTools) && definition.excludeTools.length > 0);
223
+ const selectorCandidateIndex = hasToolFilters && cache
224
+ ? (() => {
225
+ const candidates = new Set();
226
+ for (const [otherServerName, otherDefinition] of Object.entries(config.mcpServers)) {
227
+ const otherEntry = cache.servers[otherServerName];
228
+ if (!otherEntry ||
229
+ !isServerCacheValid(otherEntry, otherDefinition) ||
230
+ isServerDisabled(otherDefinition))
231
+ continue;
232
+ const otherPrefix = resolveToolPrefix(otherDefinition, prefix);
233
+ for (const otherTool of otherEntry.tools ?? []) {
234
+ if (!isUiToolVisibleToModel(otherTool.uiVisibility))
235
+ continue;
236
+ for (const candidate of getToolNameCandidates(otherTool.name, otherServerName, otherPrefix, false))
237
+ candidates.add(candidate);
238
+ }
239
+ if (otherDefinition.exposeResources !== false) {
240
+ for (const resource of otherEntry.resources ?? []) {
241
+ const baseName = `read_${resourceNameToToolName(resource.name)}`;
242
+ for (const candidate of getToolNameCandidates(baseName, otherServerName, otherPrefix, false))
243
+ candidates.add(candidate);
244
+ }
245
+ }
246
+ }
247
+ return createToolSelectorCandidateIndex(candidates);
248
+ })()
249
+ : undefined;
250
+ const toolCount = (entry?.tools ?? []).filter((tool) => isUiToolVisibleToModel(tool.uiVisibility) &&
251
+ isToolAllowed(tool.name, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, selectorCandidateIndex)).length;
252
+ const resourceCount = definition?.exposeResources !== false
253
+ ? (entry?.resources ?? []).filter((resource) => {
254
+ const baseName = `read_${resourceNameToToolName(resource.name)}`;
255
+ return isToolAllowed(baseName, serverName, effectivePrefix, definition.includeTools, definition.excludeTools, selectorCandidateIndex);
256
+ }).length
257
+ : 0;
258
+ const totalItems = toolCount + resourceCount;
259
+ if (totalItems === 0)
260
+ continue;
261
+ const directCount = directByServer.get(serverName) ?? 0;
262
+ const proxyCount = totalItems - directCount;
263
+ if (proxyCount > 0) {
264
+ serverSummaries.push(`${serverName} (${proxyCount} tools)`);
265
+ }
266
+ }
267
+ if (serverSummaries.length > 0) {
268
+ desc += `\nServers: ${serverSummaries.join(", ")}\n`;
269
+ }
270
+ const disabledServers = Object.entries(config.mcpServers)
271
+ .filter(([, definition]) => isServerDisabled(definition))
272
+ .map(([serverName]) => serverName);
273
+ if (disabledServers.length > 0) {
274
+ desc += `\nDisabled servers (enable with /mcp enable <server> and /reload): ${disabledServers.join(", ")}\n`;
275
+ }
276
+ const instructionSummaries = [];
277
+ for (const serverName of Object.keys(config.mcpServers)) {
278
+ if (isServerDisabled(config.mcpServers[serverName]))
279
+ continue;
280
+ const definition = config.mcpServers[serverName];
281
+ const entry = definition && cache?.servers?.[serverName];
282
+ const instructions = entry && definition && isServerCacheValid(entry, definition) ? entry.instructions : undefined;
283
+ if (!instructions)
284
+ continue;
285
+ const snippet = truncateAtWord(instructions.replace(/\s+/g, " ").trim(), INSTRUCTIONS_SNIPPET_LENGTH);
286
+ instructionSummaries.push(` ${serverName}: ${snippet}`);
287
+ }
288
+ if (instructionSummaries.length > 0) {
289
+ desc += `\nServer instructions (truncated - full text via mcp({ instructions: "name" })):\n${instructionSummaries.join("\n")}\n`;
290
+ }
291
+ desc += `\nUsage:\n`;
292
+ desc += ` mcp({ }) → Show server status\n`;
293
+ desc += ` mcp({ server: "name" }) → List tools from server\n`;
294
+ desc += ` mcp({ search: "query" }) → Search MCP tools by name/description\n`;
295
+ desc += ` mcp({ describe: "tool_name" }) → Show tool details and parameters\n`;
296
+ desc += ` mcp({ instructions: "name" }) → Show full server usage instructions\n`;
297
+ desc += ` mcp({ connect: "server-name" }) → Connect to a server and refresh metadata\n`;
298
+ desc += ` mcp({ tool: "name", args: { key: "value" } }) → Call a tool (object args; JSON string also accepted)\n`;
299
+ desc += ` mcp({ action: "ui-messages" }) → Retrieve accumulated messages from completed UI sessions\n`;
300
+ desc += ` mcp({ action: "auth-start", server: "name" }) → Start manual OAuth and get a browser URL\n`;
301
+ desc += ` mcp({ action: "auth-complete", server: "name", args: { redirectUrl: "..." } }) → Complete manual OAuth\n`;
302
+ desc += `\nMode: action > tool (call) > connect > describe > instructions > search > server (list) > nothing (status)`;
303
+ return desc;
304
+ }
305
+ export function createDirectToolExecutor(getState, getInitPromise, spec) {
306
+ return async function execute(_toolCallId, params, signal) {
307
+ throwIfAborted(signal);
308
+ let state = getState();
309
+ const initPromise = getInitPromise();
310
+ if (!state && initPromise) {
311
+ try {
312
+ state = await initPromise;
313
+ }
314
+ catch (error) {
315
+ const message = error instanceof Error ? error.message : String(error);
316
+ return {
317
+ content: [{ type: "text", text: `MCP initialization failed: ${message}` }],
318
+ details: { error: "init_failed", message },
319
+ };
320
+ }
321
+ }
322
+ if (!state) {
323
+ return {
324
+ content: [{ type: "text", text: "MCP not initialized" }],
325
+ details: { error: "not_initialized" },
326
+ };
327
+ }
328
+ const definition = state.config.mcpServers[spec.serverName];
329
+ if (isServerDisabled(definition)) {
330
+ const message = `MCP server "${spec.serverName}" is disabled. Run /mcp enable ${spec.serverName} and /reload to enable it.`;
331
+ return {
332
+ content: [{ type: "text", text: message }],
333
+ details: { error: "server_disabled", server: spec.serverName, message },
334
+ };
335
+ }
336
+ const ownedSignal = combineAbortSignals(state.owner?.signal, signal);
337
+ throwIfAborted(ownedSignal);
338
+ let connected = await lazyConnect(state, spec.serverName, ownedSignal);
339
+ let autoAuthAttempted = false;
340
+ if (!connected && state.manager.getConnection(spec.serverName)?.status === "needs-auth") {
341
+ autoAuthAttempted = true;
342
+ const autoAuth = await attemptDirectAutoAuth(state, spec.serverName, ownedSignal);
343
+ if (autoAuth.status === "failed") {
344
+ return {
345
+ content: [{ type: "text", text: autoAuth.message }],
346
+ details: { error: "auth_required", server: spec.serverName, message: autoAuth.message },
347
+ };
348
+ }
349
+ if (autoAuth.status === "success") {
350
+ await state.manager.close(spec.serverName);
351
+ clearFailure(state, spec.serverName);
352
+ connected = await lazyConnect(state, spec.serverName, ownedSignal);
353
+ }
354
+ }
355
+ if (!connected) {
356
+ const authConnection = state.manager.getConnection(spec.serverName);
357
+ if (authConnection?.status === "needs-auth") {
358
+ const message = getDirectAuthRequiredMessage(state, spec.serverName);
359
+ return {
360
+ content: [{ type: "text", text: message }],
361
+ details: { error: "auth_required", server: spec.serverName, message, autoAuthAttempted },
362
+ };
363
+ }
364
+ const failedAgo = getFailureAgeSeconds(state, spec.serverName);
365
+ return {
366
+ content: [
367
+ {
368
+ type: "text",
369
+ text: `MCP server "${spec.serverName}" not available${failedAgo !== null ? ` (failed ${failedAgo}s ago)` : ""}`,
370
+ },
371
+ ],
372
+ details: { error: "server_unavailable", server: spec.serverName },
373
+ };
374
+ }
375
+ const connection = state.manager.getConnection(spec.serverName);
376
+ if (!connection || connection.status !== "connected") {
377
+ return {
378
+ content: [{ type: "text", text: `MCP server "${spec.serverName}" not connected` }],
379
+ details: { error: "not_connected", server: spec.serverName },
380
+ };
381
+ }
382
+ const normalizedParams = spec.resourceUri ? params : normalizeToolArguments(params);
383
+ const approval = await ensureToolCallApproved(state, spec.serverName, {
384
+ name: spec.prefixedName,
385
+ originalName: spec.originalName,
386
+ description: spec.description,
387
+ ...(spec.inputSchema !== undefined ? { inputSchema: spec.inputSchema } : {}),
388
+ ...(spec.resourceUri !== undefined ? { resourceUri: spec.resourceUri } : {}),
389
+ ...(spec.uiResourceUri !== undefined ? { uiResourceUri: spec.uiResourceUri } : {}),
390
+ ...(spec.uiStreamMode !== undefined ? { uiStreamMode: spec.uiStreamMode } : {}),
391
+ }, normalizedParams, ownedSignal, spec.resourceUri ? "resource" : "direct");
392
+ if (approval.ok === false) {
393
+ const denied = approval.reason === "denied";
394
+ const message = denied
395
+ ? `The user declined approval to run MCP tool "${spec.originalName}" on server "${spec.serverName}".`
396
+ : `MCP tool "${spec.originalName}" on server "${spec.serverName}" is approval-gated and requires an interactive session.`;
397
+ return {
398
+ content: [{ type: "text", text: message }],
399
+ details: {
400
+ error: denied ? "approval_denied" : "approval_required",
401
+ server: spec.serverName,
402
+ tool: spec.originalName,
403
+ },
404
+ };
405
+ }
406
+ let uiSession = null;
407
+ const requestOptions = state.manager.getRequestOptions?.(spec.serverName, ownedSignal) ??
408
+ (ownedSignal ? { signal: ownedSignal } : undefined);
409
+ const outputGuardOptions = resolveMcpOutputGuardOptions(state.config.settings);
410
+ const recoverAuthConnection = async () => {
411
+ const current = state.manager.getConnection(spec.serverName);
412
+ if (current?.status === "connected")
413
+ return current;
414
+ if (!autoAuthAttempted) {
415
+ autoAuthAttempted = true;
416
+ const autoAuth = await attemptDirectAutoAuth(state, spec.serverName, ownedSignal);
417
+ if (autoAuth.status === "failed") {
418
+ throw new SessionRecoveryAuthRequiredError(spec.serverName, autoAuth.message);
419
+ }
420
+ if (autoAuth.status === "success") {
421
+ const afterAuth = state.manager.getConnection(spec.serverName);
422
+ if (afterAuth?.status === "connected")
423
+ return afterAuth;
424
+ if (afterAuth?.status === "needs-auth") {
425
+ await state.manager.close(spec.serverName);
426
+ }
427
+ clearFailure(state, spec.serverName);
428
+ const reconnected = await lazyConnect(state, spec.serverName, ownedSignal);
429
+ return reconnected ? state.manager.getConnection(spec.serverName) : undefined;
430
+ }
431
+ }
432
+ return state.manager.getConnection(spec.serverName);
433
+ };
434
+ try {
435
+ state.manager.touch(spec.serverName);
436
+ state.manager.incrementInFlight(spec.serverName);
437
+ if (spec.resourceUri) {
438
+ const result = await withSessionRecovery({
439
+ manager: state.manager,
440
+ config: state.config,
441
+ ...(ownedSignal ? { signal: ownedSignal } : {}),
442
+ onNeedsAuth: recoverAuthConnection,
443
+ }, spec.serverName, (conn) => conn.client.readResource({ uri: spec.resourceUri }, requestOptions));
444
+ const content = transformMcpResourceContents(result.contents ?? [], state.owner?.signal);
445
+ const guarded = await guardMcpOutput(content.length > 0 ? content : [{ type: "text", text: "(empty resource)" }], outputGuardOptions);
446
+ return {
447
+ content: guarded.content,
448
+ details: { server: spec.serverName, resourceUri: spec.resourceUri, ...guardedMcpDetails(guarded) },
449
+ };
450
+ }
451
+ const hasUi = !!spec.uiResourceUri;
452
+ uiSession = hasUi
453
+ ? await maybeStartUiSession(state, {
454
+ serverName: spec.serverName,
455
+ toolName: spec.originalName,
456
+ toolArgs: normalizedParams,
457
+ uiResourceUri: spec.uiResourceUri,
458
+ ...(spec.uiStreamMode !== undefined ? { streamMode: spec.uiStreamMode } : {}),
459
+ ...(signal ? { signal } : {}),
460
+ onNeedsAuth: recoverAuthConnection,
461
+ })
462
+ : null;
463
+ const result = await withSessionRecovery({
464
+ manager: state.manager,
465
+ config: state.config,
466
+ ...(ownedSignal ? { signal: ownedSignal } : {}),
467
+ onNeedsAuth: recoverAuthConnection,
468
+ }, spec.serverName, (conn) => abortable(conn.client.callTool({
469
+ name: spec.originalName,
470
+ arguments: normalizedParams,
471
+ _meta: uiSession?.requestMeta,
472
+ }, requestOptions), ownedSignal));
473
+ uiSession?.sendToolResult(result);
474
+ if (result.isError) {
475
+ const mcpContent = (result.content ?? []);
476
+ const content = transformMcpContent(mcpContent, state.owner?.signal);
477
+ const outputContent = content.length > 0 ? content : [{ type: "text", text: "(empty result)" }];
478
+ const schemaText = spec.inputSchema ? `\n\nExpected parameters:\n${formatSchema(spec.inputSchema)}` : "";
479
+ const guarded = await guardMcpOutput(outputContent, {
480
+ ...outputGuardOptions,
481
+ prefix: "Error: ",
482
+ suffix: schemaText,
483
+ emptyTextFallback: "Tool execution failed",
484
+ });
485
+ return {
486
+ content: guarded.content,
487
+ details: { error: "tool_error", server: spec.serverName, ...guardedMcpDetails(guarded) },
488
+ };
489
+ }
490
+ const content = resolveMcpResultContent(result, state.owner?.signal);
491
+ const outputContent = content.length > 0 ? content : [{ type: "text", text: "(empty result)" }];
492
+ if (hasUi) {
493
+ const uiSummary = summarizeUiSessionResult(uiSession);
494
+ const guarded = await guardMcpOutput(outputContent, {
495
+ ...outputGuardOptions,
496
+ suffix: `\n\n${uiSummary.message}`,
497
+ });
498
+ return {
499
+ content: guarded.content,
500
+ details: {
501
+ server: spec.serverName,
502
+ tool: spec.originalName,
503
+ uiOpen: uiSummary.uiOpen,
504
+ uiViewer: uiSummary.uiViewer,
505
+ uiUrl: uiSummary.uiUrl,
506
+ ...guardedMcpDetails(guarded),
507
+ },
508
+ };
509
+ }
510
+ const guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions });
511
+ return {
512
+ content: guarded.content,
513
+ details: { server: spec.serverName, tool: spec.originalName, ...guardedMcpDetails(guarded) },
514
+ };
515
+ }
516
+ catch (error) {
517
+ if (error instanceof SessionRecoveryAuthRequiredError) {
518
+ const message = error.authMessage ?? getDirectAuthRequiredMessage(state, spec.serverName);
519
+ uiSession?.sendToolCancelled(message);
520
+ return {
521
+ content: [{ type: "text", text: message }],
522
+ details: { error: "auth_required", server: spec.serverName, message, autoAuthAttempted },
523
+ };
524
+ }
525
+ if (error instanceof UrlElicitationRequiredError) {
526
+ const action = await state.manager.handleUrlElicitationRequired(spec.serverName, error);
527
+ const message = action === "accept"
528
+ ? "The original MCP tool did not run. Complete the opened browser interaction, then retry the tool."
529
+ : `The URL interaction was ${action === "decline" ? "declined" : "cancelled"}.`;
530
+ uiSession?.sendToolCancelled(message);
531
+ return {
532
+ content: [{ type: "text", text: message }],
533
+ details: { error: "url_elicitation_required", server: spec.serverName, action },
534
+ };
535
+ }
536
+ const message = error instanceof Error ? error.message : String(error);
537
+ uiSession?.sendToolCancelled(message);
538
+ const schemaText = spec.inputSchema ? `\n\nExpected parameters:\n${formatSchema(spec.inputSchema)}` : "";
539
+ const guarded = await guardMcpOutput([{ type: "text", text: message }], {
540
+ ...outputGuardOptions,
541
+ prefix: "Failed to call tool: ",
542
+ suffix: schemaText,
543
+ });
544
+ return {
545
+ content: guarded.content,
546
+ details: {
547
+ error: isAbortError(error, ownedSignal) ? "aborted" : "call_failed",
548
+ server: spec.serverName,
549
+ ...guardedMcpDetails(guarded),
550
+ },
551
+ };
552
+ }
553
+ finally {
554
+ if (uiSession?.reused) {
555
+ uiSession.close();
556
+ }
557
+ state.manager.decrementInFlight(spec.serverName);
558
+ state.manager.touch(spec.serverName);
559
+ }
560
+ };
561
+ }
562
+ //# sourceMappingURL=direct-tools.js.map